cell.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import threading
  4. from typing import TYPE_CHECKING, Dict
  5. from smart_box import SimulatorSmartBox
  6. from utils import fill_2_hexByte
  7. if TYPE_CHECKING:
  8. pass
  9. class LockStatus(object):
  10. LOCKED = '00'
  11. OPEN = '11'
  12. FAULT = '02'
  13. class CellDevice(SimulatorSmartBox):
  14. def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
  15. super(CellDevice, self).__init__(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
  16. self.locks = {}
  17. for borad_no in range(1, 33):
  18. self.locks[borad_no] = {}
  19. for lock_no in range(1, 25):
  20. self.locks[borad_no][lock_no] = LockStatus.LOCKED
  21. def do_message(self, cmd, payload):
  22. # type: (str, Dict)->None
  23. message = None
  24. if cmd == 210 or cmd == 220:
  25. func = payload['funCode']
  26. if func == '80':
  27. board_no = int(payload['data'][2:4], 16)
  28. lock_no = int(payload['data'][4:6], 16)
  29. print('try to get board = {}, lock = {}'.format(board_no, lock_no))
  30. if lock_no == 0:
  31. board_status = self.locks[board_no]
  32. data = '80' + fill_2_hexByte(hex(board_no), 2)
  33. status_bin_data = ''
  34. for lock_no in range(len(board_status.values()), 0, -1):
  35. status = board_status.get(lock_no)
  36. if status == LockStatus.LOCKED:
  37. status_bin_data += '0'
  38. else:
  39. status_bin_data += '1'
  40. group_1 = fill_2_hexByte(hex(int(status_bin_data[0:8], 2)), 2)
  41. data += group_1
  42. group_2 = fill_2_hexByte(hex(int(status_bin_data[8:16], 2)), 2)
  43. data += group_2
  44. group_3 = fill_2_hexByte(hex(int(status_bin_data[16:24], 2)), 2)
  45. data += group_3
  46. data += '33B2'
  47. message = {
  48. 'data': data
  49. }
  50. else:
  51. status = self.locks[board_no][lock_no]
  52. if status == LockStatus.LOCKED:
  53. data = '80' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '0091'
  54. else:
  55. data = '80' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '1180'
  56. message = {
  57. 'data': data
  58. }
  59. elif func == '8A':
  60. board_no = int(payload['data'][2:4], 16)
  61. lock_no = int(payload['data'][4:6], 16)
  62. print('open lock. board no = {}; lock no = {}'.format(board_no, lock_no))
  63. self.locks[board_no][lock_no] = LockStatus.OPEN
  64. if self.locks[board_no][lock_no] == LockStatus.OPEN:
  65. message = {
  66. 'data': '8A' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '118A'
  67. }
  68. elif self.locks[board_no][lock_no] == LockStatus.LOCKED:
  69. message = {
  70. 'data': '8A' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '009B'
  71. }
  72. else:
  73. message = {
  74. 'data': '8A' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '028A'
  75. }
  76. elif func == '90':
  77. board_no = int(payload['data'][2:4], 16)
  78. map = {
  79. 1: 0,
  80. 2: 1,
  81. 4: 2,
  82. 8: 3,
  83. 16: 4,
  84. 32: 5,
  85. 64: 6,
  86. 128: 7
  87. }
  88. lock_group_1 = int(payload['data'][4:6], 16)
  89. for yu, yi in map.iteritems():
  90. status = (lock_group_1 & yu) >> yi
  91. if status == 1:
  92. self.locks[board_no][1 + yi] = LockStatus.OPEN
  93. else:
  94. self.locks[board_no][1 + yi] = LockStatus.LOCKED
  95. lock_group_2 = int(payload['data'][6:8], 16)
  96. for yu, yi in map.iteritems():
  97. status = (lock_group_2 & yu) >> yi
  98. if status == 1:
  99. self.locks[board_no][1 + 8 + yi] = LockStatus.OPEN
  100. else:
  101. self.locks[board_no][1 + 8 + yi] = LockStatus.LOCKED
  102. lock_group_3 = int(payload['data'][8:10], 16)
  103. for yu, yi in map.iteritems():
  104. status = (lock_group_3 & yu) >> yi
  105. if status == 1:
  106. self.locks[board_no][1 + 8 + 8 + yi] = LockStatus.OPEN
  107. else:
  108. self.locks[board_no][1 + 8 + 8 + yi] = LockStatus.LOCKED
  109. message = {
  110. }
  111. if message is not None:
  112. message.update({
  113. 'IMEI': self.imei,
  114. 'rst': 0,
  115. 'cmd': cmd
  116. })
  117. return self.publish_message(
  118. cmd = cmd,
  119. payload = message)
  120. super(CellDevice, self).do_message(cmd, payload)
  121. @property
  122. def device_extend_info(self):
  123. return {
  124. 'driverCode': '110000',
  125. 'driverVersion': 'v1.0.2'
  126. }
  127. class myThread(threading.Thread):
  128. def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
  129. threading.Thread.__init__(self)
  130. self.mqtt_server = mqtt_server
  131. self.mqtt_port = mqtt_port
  132. self.mqtt_user = mqtt_user
  133. self.mqtt_pwd = mqtt_pwd
  134. self.imei = imei
  135. self.setDaemon(False)
  136. def run(self):
  137. CellDevice(self.mqtt_server, self.mqtt_port, self.mqtt_user, self.mqtt_pwd, imei).start()
  138. if __name__ == '__main__':
  139. imei_list = {
  140. 'DUMMY_CELL': 'DUMMY_CELL_IMEI'
  141. }
  142. mqtt_server = '211.159.224.10'
  143. mqtt_port = 1883
  144. mqtt_user = '20160528@vivestone'
  145. mqtt_pwd = 'j429QXqI5CTv'
  146. threads = []
  147. for imei in imei_list.values():
  148. thread = myThread(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
  149. thread.start()
  150. threads.append(thread)