jiuheng.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import random
  4. import threading
  5. import time
  6. from typing import TYPE_CHECKING, Dict
  7. from script.simulator.utils import fill_2_hexByte, calc_crc
  8. from smart_box import SimulatorSmartBox
  9. if TYPE_CHECKING:
  10. pass
  11. class PortStatus(object):
  12. IDLE = 0x01
  13. USING = 0x02
  14. FORBIDDEN = 0x03
  15. FAULT = 0x04
  16. class LoopPortsThread(threading.Thread):
  17. def __init__(self, ports):
  18. # type: (Ports)->None
  19. threading.Thread.__init__(self)
  20. self.ports = ports
  21. self.exit = False
  22. def set_exit(self):
  23. self.exit = True
  24. def run(self):
  25. while True and not self.exit:
  26. for port_no, state in self.ports.port_state.iteritems():
  27. # print 'port = {}; status = {}; start_time = {}; end_time = {}; now = {}'.format(
  28. # port_no, state['status'], state['start_time'], state['end_time'], int(time.time())
  29. # )
  30. status = state['status']
  31. if status == PortStatus.USING:
  32. end_time = state['end_time']
  33. if end_time <= int(time.time()):
  34. duration = int(time.time()) - state['start_time']
  35. duration = 0 if duration <= 0 else duration
  36. simulator = self.ports.simulator # type: JHDevice
  37. left_time = state['left_time']
  38. left_elec = state['left_elec']
  39. data = 'AA091601{}{}{}02'.format(fill_2_hexByte(hex(int(port_no)), 2),
  40. fill_2_hexByte(hex(int(left_time)), 4),
  41. fill_2_hexByte(hex(int(left_elec)), 4))
  42. data = data + calc_crc(data)
  43. simulator.publish_message(
  44. 100,
  45. {
  46. 'ts': int(time.time()),
  47. 'IMEI': simulator.imei,
  48. 'duration': duration / 60,
  49. 'data': data,
  50. 'cmd': 100
  51. }
  52. )
  53. self.ports.port_state[port_no]['status'] = PortStatus.IDLE
  54. self.ports.port_state[port_no]['start_time'] = 0
  55. self.ports.port_state[port_no]['end_time'] = 0
  56. time.sleep(1)
  57. class Ports(object):
  58. def __init__(self, simulator):
  59. # type: (JHDevice)->None
  60. self.simulator = simulator # type: JHDevice
  61. self.port_state = {
  62. 1: {
  63. 'status': PortStatus.IDLE,
  64. 'start_time': 0,
  65. 'end_time': 0
  66. },
  67. 2: {
  68. 'status': PortStatus.IDLE,
  69. 'start_time': 0,
  70. 'end_time': 0
  71. },
  72. 3: {
  73. 'status': PortStatus.IDLE,
  74. 'start_time': 0,
  75. 'end_time': 0
  76. },
  77. 4: {
  78. 'status': PortStatus.IDLE,
  79. 'start_time': 0,
  80. 'end_time': 0
  81. },
  82. 5: {
  83. 'status': PortStatus.IDLE,
  84. 'start_time': 0,
  85. 'end_time': 0
  86. },
  87. 6: {
  88. 'status': PortStatus.IDLE,
  89. 'start_time': 0,
  90. 'end_time': 0
  91. },
  92. 7: {
  93. 'status': PortStatus.IDLE,
  94. 'start_time': 0,
  95. 'end_time': 0
  96. },
  97. 8: {
  98. 'status': PortStatus.IDLE,
  99. 'start_time': 0,
  100. 'end_time': 0
  101. },
  102. 9: {
  103. 'status': PortStatus.IDLE,
  104. 'start_time': 0,
  105. 'end_time': 0
  106. },
  107. 10: {
  108. 'status': PortStatus.IDLE,
  109. 'start_time': 0,
  110. 'end_time': 0
  111. }
  112. }
  113. def func_0F(self):
  114. _data = '55180F010A'
  115. for port_no, state in self.port_state.items():
  116. status = state['status']
  117. _data = _data + fill_2_hexByte(hex(int(port_no)), 2)
  118. _data = _data + fill_2_hexByte(hex(int(status)), 2)
  119. _data = _data + calc_crc(_data)
  120. return _data
  121. def func_15(self, port):
  122. return '550C1501{}00000000FFFFFFFF19'.format(port)
  123. class JHDevice(SimulatorSmartBox):
  124. def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
  125. super(JHDevice, self).__init__(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
  126. self.ports = Ports(self)
  127. self.ports_loop_thread = LoopPortsThread(self.ports)
  128. self.ports_loop_thread.start()
  129. def exit(self):
  130. self.ports_loop_thread.set_exit()
  131. super(JHDevice, self).exit()
  132. def do_message(self, cmd, payload):
  133. # type: (int, Dict)->None
  134. if cmd >= 210:
  135. _data = payload['data']
  136. func = payload['funCode']
  137. if func == '0F' and _data == '00':
  138. message = {
  139. 'data': self.ports.func_0F()
  140. }
  141. elif func == '15':
  142. message = {
  143. 'data': self.ports.func_15(payload['data'])
  144. }
  145. elif func == '14':
  146. port = int(payload['data'][0:2], 16)
  147. _money = int(payload['data'][2:6], 16)
  148. _time = int(payload['data'][6:10], 16)
  149. _elec = int(payload['data'][10:15], 16)
  150. _consume_time = 1
  151. _left_time = (_time - _consume_time)
  152. _left_elec = int(_elec * float(_left_time) / float(_time))
  153. port_state = self.ports.port_state[port]
  154. if port_state['status'] == PortStatus.USING:
  155. port_state['end_time'] += _consume_time * 60
  156. else:
  157. port_state['status'] = PortStatus.USING
  158. port_state['start_time'] = int(time.time())
  159. port_state['end_time'] = port_state['start_time'] + _consume_time * 60
  160. port_state['left_time'] = _left_time
  161. port_state['left_elec'] = _left_elec
  162. _data = '550514010201'
  163. _data = _data + calc_crc(_data)
  164. message = {
  165. 'data': _data
  166. }
  167. # 获取参数设置
  168. elif func == '1E':
  169. message = {
  170. 'data': '551A1E0100B400B41E1E1E03E807D00DAC0DAC3219190101141EFFE0'
  171. }
  172. else:
  173. message = dict()
  174. if message and 'rst' not in message:
  175. message.update({
  176. 'IMEI': self.imei,
  177. 'rst': 0,
  178. 'cmd': cmd
  179. })
  180. else:
  181. message = {
  182. 'IMEI': self.imei,
  183. 'rst': 1,
  184. 'cmd': cmd
  185. }
  186. return self.publish_message(cmd = cmd, payload = message)
  187. else:
  188. super(JHDevice, self).do_message(cmd, payload)
  189. @property
  190. def device_extend_info(self):
  191. return {
  192. 'driverCode': '100206',
  193. 'driverVersion': 'v2.0.2'
  194. }
  195. class myThread(threading.Thread): # 继承父类threading.Thread
  196. def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
  197. threading.Thread.__init__(self)
  198. self.mqtt_server = mqtt_server
  199. self.mqtt_port = mqtt_port
  200. self.mqtt_user = mqtt_user
  201. self.mqtt_pwd = mqtt_pwd
  202. self.imei = imei
  203. self.setDaemon(False)
  204. def run(self):
  205. JHDevice(self.mqtt_server, self.mqtt_port, self.mqtt_user, self.mqtt_pwd, self.imei).start()
  206. if __name__ == '__main__':
  207. imei_list = {
  208. 'JH_DUMMY': 'JH_DUMMY_IMEI'
  209. }
  210. mqtt_server = '211.159.224.10'
  211. mqtt_port = 1883
  212. mqtt_user = '20160528@vivestone'
  213. mqtt_pwd = 'j429QXqI5CTv'
  214. threads = []
  215. for imei in imei_list.values():
  216. thread = myThread(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
  217. thread.start()
  218. threads.append(thread)