dianchuan.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import threading
  4. import time
  5. from typing import TYPE_CHECKING, Dict
  6. from smart_box import SimulatorSmartBox
  7. from utils import fill_2_hexByte, calc_crc, make_six_bytes_session_id
  8. if TYPE_CHECKING:
  9. pass
  10. class PortStatus(object):
  11. IDLE = 0x01
  12. USEING = 0x02
  13. FORBIDDEN = 0x03
  14. FAULT = 0x04
  15. class LoopPortsThread(threading.Thread):
  16. def __init__(self, ports):
  17. # type: (Ports)->None
  18. threading.Thread.__init__(self)
  19. self.ports = ports
  20. self.exit = False
  21. def set_exit(self):
  22. self.exit = True
  23. def run(self):
  24. while True and not self.exit:
  25. for port_no, state in self.ports.port_state.iteritems():
  26. # print 'port = {}; status = {}; start_time = {}; end_time = {}; now = {}'.format(
  27. # port_no, state['status'], state['start_time'], state['end_time'], int(time.time())
  28. # )
  29. status = state['status']
  30. if status == PortStatus.USEING:
  31. end_time = state['end_time']
  32. if end_time <= int(time.time()):
  33. duration = int(time.time()) - state['start_time']
  34. duration = 0 if duration <= 0 else duration
  35. simulator = self.ports.simulator # type: DianchuanDevice
  36. left_time = state['left_time']
  37. data = 'EE1305' + make_six_bytes_session_id() + \
  38. fill_2_hexByte(hex(int(port_no)), 2) + \
  39. fill_2_hexByte(hex(int(left_time)), 2) + \
  40. '0000000000000000'
  41. data = data + calc_crc(data)
  42. simulator.publish_message(
  43. 100,
  44. {
  45. 'ts': int(time.time()),
  46. 'IMEI': simulator.imei,
  47. 'duration': duration / 60,
  48. 'data': data,
  49. 'cmd': 100
  50. }
  51. )
  52. self.ports.port_state[port_no]['status'] = PortStatus.IDLE
  53. self.ports.port_state[port_no]['start_time'] = 0
  54. self.ports.port_state[port_no]['end_time'] = 0
  55. self.ports.port_state[port_no]['left_time'] = 0
  56. time.sleep(1)
  57. class Ports(object):
  58. def __init__(self, simulator):
  59. # type: (DianchuanDevice)->None
  60. self.simulator = simulator # type: DianchuanDevice
  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_01(self):
  114. data = '661301' + make_six_bytes_session_id() + '0A'
  115. for port_no, state in self.port_state.iteritems():
  116. status = state['status']
  117. data = data + fill_2_hexByte(hex(int(status)), 2)
  118. data = data + calc_crc(data)
  119. return data
  120. class DianchuanDevice(SimulatorSmartBox):
  121. def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
  122. super(DianchuanDevice, self).__init__(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
  123. self.ports = Ports(self)
  124. self.ports_loop_thread = LoopPortsThread(self.ports)
  125. self.ports_loop_thread.start()
  126. def exit(self):
  127. self.ports_loop_thread.set_exit()
  128. super(DianchuanDevice, self).exit()
  129. def do_message(self, cmd, payload):
  130. # type: (str, Dict)->None
  131. message = None
  132. if cmd >= 210:
  133. func = payload['funCode']
  134. if func == '01':
  135. message = {
  136. 'data': self.ports.func_01()
  137. }
  138. elif func == '02':
  139. port = int(payload['data'][0:2], 16)
  140. _time = int(payload['data'][6:10], 16)
  141. _consume_time = 1
  142. _left_time = (_time - _consume_time)
  143. # print(
  144. # 'port = {}; time = {}; consume = {}; left time = {}'.format(
  145. # port, _time, _consume_time, _left_time))
  146. port_state = self.ports.port_state[port]
  147. if port_state['status'] == PortStatus.USEING:
  148. port_state['end_time'] = port_state['end_time'] + _consume_time * 60
  149. else:
  150. port_state['status'] = PortStatus.USEING
  151. port_state['start_time'] = int(time.time())
  152. port_state['end_time'] = port_state['start_time'] + _consume_time * 60
  153. port_state['left_time'] = _left_time
  154. data = '660A02' + make_six_bytes_session_id() + fill_2_hexByte(hex(int(port)), 2) + '01'
  155. data = data + calc_crc(data)
  156. message = {
  157. 'data': data
  158. }
  159. if cmd == 201:
  160. message = self.get_device_info()
  161. if message and 'rst' not in message:
  162. message.update({
  163. 'IMEI': self.imei,
  164. 'rst': 0,
  165. 'cmd': cmd
  166. })
  167. return self.publish_message(cmd = cmd, payload = message)
  168. super(DianchuanDevice, self).do_message(cmd, payload)
  169. @property
  170. def device_extend_info(self):
  171. return {
  172. 'driverCode': '100210',
  173. 'driverVersion': 'v2.0.2'
  174. }
  175. class myThread(threading.Thread): # 继承父类threading.Thread
  176. def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
  177. threading.Thread.__init__(self)
  178. self.mqtt_server = mqtt_server
  179. self.mqtt_port = mqtt_port
  180. self.mqtt_user = mqtt_user
  181. self.mqtt_pwd = mqtt_pwd
  182. self.imei = imei
  183. self.setDaemon(False)
  184. def run(self):
  185. DianchuanDevice(self.mqtt_server, self.mqtt_port, self.mqtt_user, self.mqtt_pwd, self.imei).start()
  186. if __name__ == '__main__':
  187. imei_list = {
  188. 'DIANCHUAN_DUMMY': 'DIANCHUAN_DUMMY_IMEI'
  189. }
  190. mqtt_server = '211.159.224.10'
  191. mqtt_port = 1883
  192. mqtt_user = '20160528@vivestone'
  193. mqtt_pwd = 'j429QXqI5CTv'
  194. threads = []
  195. for imei in imei_list.values():
  196. thread = myThread(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
  197. thread.start()
  198. threads.append(thread)