# -*- coding: utf-8 -*- # !/usr/bin/env python """ 将常见的设备迁移等功能做成易用的接口 ## 设备管理器人力操作步骤 命令使用步骤: 1. telnet 到memcached 11211端口 2. get 查看server 3. telnet 到server 4. 执行命令 ## 设备管理器接口汇总 事件开关: {"cmd":202,"IMEI":"865024038093674","report_set":1} 网络支付: {"cmd":203,"IMEI":"865024038093674","app_pay":1} 查询设备: {"cmd":201,"IMEI":"865024038093674"} 心跳设置: {"cmd":202,"IMEI":"865024038093674","cycle_set":60} {"cmd":202,"IMEI":"865024038093674","cycle_set":300} 恢复出厂: {"cmd":202,"IMEI":"865024038093674","factory_set":1} 改服务器:{"cmd":202,"IMEI":"865024038093674","addr_set":{"ip1":"120.26.227.50","port1":30018}} {"cmd":202,"IMEI":"865024038093674","addr_set":{"ip1":"112.74.180.175","port1":30018}} {"cmd":202,"IMEI":"999990000000000","addr_set":{"ip1":"192.168.0.201","port1":30018}} {"cmd":202,"IMEI":"999990000000000","addr_set":{"ip1":"192.168.0.106","port1":30018}} {"cmd":202,"IMEI":"865024038093674","addr_set":{"ip1":"121.41.75.233","port1":30018}} {"cmd":202,"IMEI":"865024038093674","pulse_set":{"pwm_wid":50,"pwm_inter":400,"pwm_idle":1}} {"cmd":202,"IMEI":"865024038093674","max_coin":5} 心跳事件: {"cmd":207,"IMEI":"865024038093674","coin":3,"total_coin":15,"pay_cnt":34,"status":0,"signal":23} 远程登录: 112.74.180.175 30010 http://www.washpayer.com/userLogin?imei=865024038219469 http://www.5tao5ai.com/userLogin?imei=865024038093674 http://www.5tao5ai.com/userLogin?l=999990000000000 http://www.5tao5ai.com/agents/index.html http://www.5tao5ai.com/app/index.html http://www.washpayer.com/agents/login.html http://www.washpayer.com/app/index.html 测试服务器: 查询所有模拟设备设备 telnet 192.168.1.106 30000 {"cmd":"find"} {"cmd":"find","device":"9999900000000*"} {"cmd":"find","device":"999990000000*"} 投币: {"cmd":"coin","device":"999990000000000"} {"cmd":"coin","device":"9999900000000*"} {"cmd":"coin","device":"999990000000*"} 工作: {"cmd":"work","device":"999990000000000"} {"cmd":"work","device":"9999900000000*"} {"cmd":"work","device":"999990000000*"} 停机: {"cmd":"stop","device":"999990000000000"} 启动: {"cmd":"boot","device":"999990000000000"} """ import click import simplejson as json import pprint from bidict import bidict from base import init_env init_env(interactive=True) from django.conf import settings from apps.web.device.models import Device from apps.web.core.networking import MessageSender SERVERS = bidict({'testing': '121.40.97.20:1883', 'production':'120.27.251.159:1883'}) @click.group() def cli(): """ 一系列方便操作设备的函数 :return: """ click.echo(u"欢迎进入操作设备脚本") send = MessageSender.send def _device_command(imei, cmd, payload, server=None): dev = Device.get_dev(imei) click.echo('executing cmd(%s), payload(%s)' % (cmd, json.dumps(payload)) ) r = send(dev, cmd, payload) click.echo('result=%s' % json.dumps(r)) return r @cli.command() @click.option('-i', '--imei', help=u'请输入imei') @click.option('-l', '--logical_code', help=u'请输入逻辑码') def get(imei=None, logical_code=None): if not any([imei, logical_code]): raise SystemExit(u'imei logical_code 必提供其一') if imei: pprint.pprint(Device.get_dev(imei)) else: pprint.pprint(Device.get_dev_by_logicalCode(logical_code)) @cli.command() @click.option('-i','--imei', help=u'请输入设备号') @click.option('-l', '--logical_code', help=u'请输入逻辑码') def get_info(imei=None, logical_code=None): """ e.g. {"cmd":201,"IMEI":"865024038093674"} :param imei: :param logical_code :return: """ if not any([imei, logical_code]): raise SystemExit(u'imei logical_code 必提供其一') if not imei: imei = Device.get_devNo_by_logicalCode(logical_code) if not imei: raise SystemExit(u'无法找到对应设备号!') return _device_command(imei, cmd=201, payload={"cmd":201,"IMEI":imei}) @cli.command() @click.option('-i','--imei', help=u'请输入设备号') @click.option('-l', '--logical_code', help=u'请输入逻辑码') def which_env(imei=None, logical_code=None): """ 一个命令告诉设备在哪个环境 :param imei: :param logical_code: :return: """ if not any([imei, logical_code]): raise SystemExit(u'imei logical_code 必提供其一') if not imei: imei = Device.get_devNo_by_logicalCode(logical_code) if not imei: raise SystemExit(u'无法找到对应设备号!') for server in SERVERS.values(): result = _device_command(imei, cmd=201, payload={"cmd":201,"IMEI":imei}, server=server) if result['rst'] != -1: click.echo(u'设备在%s环境' % (SERVERS.inv[server],)) break else: click.echo(u'不知道设备在哪里') @cli.command() @click.option('-i', '--imei', help=u'请输入设备号') @click.option('-l', '--logical_code', help=u'逻辑码') @click.option('--ip', help=u'请输入IP地址') @click.option('--port', help=u'请输入端口') @click.option('-d', '--direction', help=u'转移方向') def migrate_server(imei, logical_code=None, ip=None, port=None, direction=None): """ e.g. {"cmd":202,"IMEI":"865024038093674","addr_set":{"ip1":"120.26.227.50","port1":30018}} testing & staging: 121.40.97.20 production: 120.27.251.159 :param imei: :param logical_code: :param ip: :param port: :param direction: :return: """ direction_config = { 'prod2test': ('121.40.97.20', 1883), 'test2prod': ('120.27.251.159', 1883) } if not any([imei, logical_code]): raise SystemExit(u'imei logical_code 必提供其一') if not imei: imei = Device.get_devNo_by_logicalCode(logical_code) if not imei: raise SystemExit(u'无法找到对应设备号!') if direction and direction in direction_config: ip, port = direction_config[direction] else: ip = settings.MQTT_HOSTNAME if ip is None else ip port = 1883 if port is None else port if not all([ip, port]): raise SystemExit(u'必须提供ip,port或转移方向') return _device_command(imei, cmd=202, payload={"cmd":202,"IMEI":imei, "addr_set":{"ip1":ip,"port1":port}}) @cli.command() @click.option('-i', '--imei', help=u'请输入设备号') def factory_reset(imei): """ e.g. {"cmd":202,"IMEI":"865024038093674","factory_set":1} :param imei: :return: """ return _device_command(imei, cmd=202, payload={"cmd":202,"IMEI":imei,"factory_set":1}) @cli.command() @click.option('-i', '--imei', help=u'请输入设备号') @click.option('-p', '--path', help=u'请输入文件地址') @click.option('-v', '--version', help=u'版本号 如v1.7.5') def push_upgrade(imei, version, path=None): """ 向设备推送升级包 e.g. {"cmd":202,"IMEI":"868575025777667","ota_set":{"fw_url":"http://www.5tao5ai.com/uploaded/SMARTBOX_1.0.0_Luat_V0016_8955_SSL.bin"}} :param imei: :param path: :param version: :return: """ dev = Device.get_dev(imei) if dev['softVer'] != version: return _device_command(imei, cmd=202, payload={ 'cmd':202, 'IMEI':imei, 'ota_set': { 'fw_url': 'http://www.5tao5ai.com/uploaded/SMARTBOX_1.0.0_Luat_V0016_8955_SSL.bin' } }) if __name__ == '__main__': cli()