device.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. 将常见的设备迁移等功能做成易用的接口
  5. ## 设备管理器人力操作步骤
  6. 命令使用步骤:
  7. 1. telnet 到memcached 11211端口
  8. 2. get <imei> 查看server
  9. 3. telnet 到server
  10. 4. 执行命令
  11. ## 设备管理器接口汇总
  12. 事件开关: {"cmd":202,"IMEI":"865024038093674","report_set":1}
  13. 网络支付: {"cmd":203,"IMEI":"865024038093674","app_pay":1}
  14. 查询设备: {"cmd":201,"IMEI":"865024038093674"}
  15. 心跳设置: {"cmd":202,"IMEI":"865024038093674","cycle_set":60}
  16. {"cmd":202,"IMEI":"865024038093674","cycle_set":300}
  17. 恢复出厂: {"cmd":202,"IMEI":"865024038093674","factory_set":1}
  18. 改服务器:{"cmd":202,"IMEI":"865024038093674","addr_set":{"ip1":"120.26.227.50","port1":30018}}
  19. {"cmd":202,"IMEI":"865024038093674","addr_set":{"ip1":"112.74.180.175","port1":30018}}
  20. {"cmd":202,"IMEI":"999990000000000","addr_set":{"ip1":"192.168.0.201","port1":30018}}
  21. {"cmd":202,"IMEI":"999990000000000","addr_set":{"ip1":"192.168.0.106","port1":30018}}
  22. {"cmd":202,"IMEI":"865024038093674","addr_set":{"ip1":"121.41.75.233","port1":30018}}
  23. {"cmd":202,"IMEI":"865024038093674","pulse_set":{"pwm_wid":50,"pwm_inter":400,"pwm_idle":1}}
  24. {"cmd":202,"IMEI":"865024038093674","max_coin":5}
  25. 心跳事件: {"cmd":207,"IMEI":"865024038093674","coin":3,"total_coin":15,"pay_cnt":34,"status":0,"signal":23}
  26. 远程登录: 112.74.180.175 30010
  27. http://www.washpayer.com/userLogin?imei=865024038219469
  28. http://www.5tao5ai.com/userLogin?imei=865024038093674
  29. http://www.5tao5ai.com/userLogin?l=999990000000000
  30. http://www.5tao5ai.com/agents/index.html
  31. http://www.5tao5ai.com/app/index.html
  32. http://www.washpayer.com/agents/login.html
  33. http://www.washpayer.com/app/index.html
  34. 测试服务器:
  35. 查询所有模拟设备设备
  36. telnet 192.168.1.106 30000
  37. {"cmd":"find"}
  38. {"cmd":"find","device":"9999900000000*"}
  39. {"cmd":"find","device":"999990000000*"}
  40. 投币:
  41. {"cmd":"coin","device":"999990000000000"}
  42. {"cmd":"coin","device":"9999900000000*"}
  43. {"cmd":"coin","device":"999990000000*"}
  44. 工作:
  45. {"cmd":"work","device":"999990000000000"}
  46. {"cmd":"work","device":"9999900000000*"}
  47. {"cmd":"work","device":"999990000000*"}
  48. 停机:
  49. {"cmd":"stop","device":"999990000000000"}
  50. 启动:
  51. {"cmd":"boot","device":"999990000000000"}
  52. """
  53. import click
  54. import simplejson as json
  55. import pprint
  56. from bidict import bidict
  57. from base import init_env
  58. init_env(interactive=True)
  59. from django.conf import settings
  60. from apps.web.device.models import Device
  61. from apps.web.core.networking import MessageSender
  62. SERVERS = bidict({'testing': '121.40.97.20:1883', 'production':'120.27.251.159:1883'})
  63. @click.group()
  64. def cli():
  65. """
  66. 一系列方便操作设备的函数
  67. :return:
  68. """
  69. click.echo(u"欢迎进入操作设备脚本")
  70. send = MessageSender.send
  71. def _device_command(imei, cmd, payload, server=None):
  72. dev = Device.get_dev(imei)
  73. click.echo('executing cmd(%s), payload(%s)' % (cmd, json.dumps(payload)) )
  74. r = send(dev, cmd, payload)
  75. click.echo('result=%s' % json.dumps(r))
  76. return r
  77. @cli.command()
  78. @click.option('-i', '--imei', help=u'请输入imei')
  79. @click.option('-l', '--logical_code', help=u'请输入逻辑码')
  80. def get(imei=None, logical_code=None):
  81. if not any([imei, logical_code]):
  82. raise SystemExit(u'imei logical_code 必提供其一')
  83. if imei:
  84. pprint.pprint(Device.get_dev(imei))
  85. else:
  86. pprint.pprint(Device.get_dev_by_logicalCode(logical_code))
  87. @cli.command()
  88. @click.option('-i','--imei', help=u'请输入设备号')
  89. @click.option('-l', '--logical_code', help=u'请输入逻辑码')
  90. def get_info(imei=None, logical_code=None):
  91. """
  92. e.g. {"cmd":201,"IMEI":"865024038093674"}
  93. :param imei:
  94. :param logical_code
  95. :return:
  96. """
  97. if not any([imei, logical_code]):
  98. raise SystemExit(u'imei logical_code 必提供其一')
  99. if not imei:
  100. imei = Device.get_devNo_by_logicalCode(logical_code)
  101. if not imei:
  102. raise SystemExit(u'无法找到对应设备号!')
  103. return _device_command(imei, cmd=201, payload={"cmd":201,"IMEI":imei})
  104. @cli.command()
  105. @click.option('-i','--imei', help=u'请输入设备号')
  106. @click.option('-l', '--logical_code', help=u'请输入逻辑码')
  107. def which_env(imei=None, logical_code=None):
  108. """
  109. 一个命令告诉设备在哪个环境
  110. :param imei:
  111. :param logical_code:
  112. :return:
  113. """
  114. if not any([imei, logical_code]):
  115. raise SystemExit(u'imei logical_code 必提供其一')
  116. if not imei:
  117. imei = Device.get_devNo_by_logicalCode(logical_code)
  118. if not imei:
  119. raise SystemExit(u'无法找到对应设备号!')
  120. for server in SERVERS.values():
  121. result = _device_command(imei, cmd=201, payload={"cmd":201,"IMEI":imei}, server=server)
  122. if result['rst'] != -1:
  123. click.echo(u'设备在%s环境' % (SERVERS.inv[server],))
  124. break
  125. else:
  126. click.echo(u'不知道设备在哪里')
  127. @cli.command()
  128. @click.option('-i', '--imei', help=u'请输入设备号')
  129. @click.option('-l', '--logical_code', help=u'逻辑码')
  130. @click.option('--ip', help=u'请输入IP地址')
  131. @click.option('--port', help=u'请输入端口')
  132. @click.option('-d', '--direction', help=u'转移方向')
  133. def migrate_server(imei, logical_code=None, ip=None, port=None, direction=None):
  134. """
  135. e.g. {"cmd":202,"IMEI":"865024038093674","addr_set":{"ip1":"120.26.227.50","port1":30018}}
  136. testing & staging: 121.40.97.20
  137. production: 120.27.251.159
  138. :param imei:
  139. :param logical_code:
  140. :param ip:
  141. :param port:
  142. :param direction:
  143. :return:
  144. """
  145. direction_config = {
  146. 'prod2test': ('121.40.97.20', 1883),
  147. 'test2prod': ('120.27.251.159', 1883)
  148. }
  149. if not any([imei, logical_code]):
  150. raise SystemExit(u'imei logical_code 必提供其一')
  151. if not imei:
  152. imei = Device.get_devNo_by_logicalCode(logical_code)
  153. if not imei:
  154. raise SystemExit(u'无法找到对应设备号!')
  155. if direction and direction in direction_config:
  156. ip, port = direction_config[direction]
  157. else:
  158. ip = settings.MQTT_HOSTNAME if ip is None else ip
  159. port = 1883 if port is None else port
  160. if not all([ip, port]):
  161. raise SystemExit(u'必须提供ip,port或转移方向')
  162. return _device_command(imei, cmd=202, payload={"cmd":202,"IMEI":imei, "addr_set":{"ip1":ip,"port1":port}})
  163. @cli.command()
  164. @click.option('-i', '--imei', help=u'请输入设备号')
  165. def factory_reset(imei):
  166. """
  167. e.g. {"cmd":202,"IMEI":"865024038093674","factory_set":1}
  168. :param imei:
  169. :return:
  170. """
  171. return _device_command(imei, cmd=202, payload={"cmd":202,"IMEI":imei,"factory_set":1})
  172. @cli.command()
  173. @click.option('-i', '--imei', help=u'请输入设备号')
  174. @click.option('-p', '--path', help=u'请输入文件地址')
  175. @click.option('-v', '--version', help=u'版本号 如v1.7.5')
  176. def push_upgrade(imei, version, path=None):
  177. """
  178. 向设备推送升级包
  179. e.g.
  180. {"cmd":202,"IMEI":"868575025777667","ota_set":{"fw_url":"http://www.5tao5ai.com/uploaded/SMARTBOX_1.0.0_Luat_V0016_8955_SSL.bin"}}
  181. :param imei:
  182. :param path:
  183. :param version:
  184. :return:
  185. """
  186. dev = Device.get_dev(imei)
  187. if dev['softVer'] != version:
  188. return _device_command(imei, cmd=202,
  189. payload={
  190. 'cmd':202,
  191. 'IMEI':imei,
  192. 'ota_set': {
  193. 'fw_url': 'http://www.5tao5ai.com/uploaded/SMARTBOX_1.0.0_Luat_V0016_8955_SSL.bin'
  194. }
  195. })
  196. if __name__ == '__main__':
  197. cli()