123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- """
- 将常见的设备迁移等功能做成易用的接口
- ## 设备管理器人力操作步骤
- 命令使用步骤:
- 1. telnet 到memcached 11211端口
- 2. get <imei> 查看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()
|