123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import threading
- from typing import TYPE_CHECKING, Dict
- from smart_box import SimulatorSmartBox
- from utils import fill_2_hexByte
- if TYPE_CHECKING:
- pass
- class LockStatus(object):
- LOCKED = '00'
- OPEN = '11'
- FAULT = '02'
- class CellDevice(SimulatorSmartBox):
- def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
- super(CellDevice, self).__init__(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
- self.locks = {}
- for borad_no in range(1, 33):
- self.locks[borad_no] = {}
- for lock_no in range(1, 25):
- self.locks[borad_no][lock_no] = LockStatus.LOCKED
- def do_message(self, cmd, payload):
- # type: (str, Dict)->None
- message = None
- if cmd == 210 or cmd == 220:
- func = payload['funCode']
- if func == '80':
- board_no = int(payload['data'][2:4], 16)
- lock_no = int(payload['data'][4:6], 16)
- print('try to get board = {}, lock = {}'.format(board_no, lock_no))
- if lock_no == 0:
- board_status = self.locks[board_no]
- data = '80' + fill_2_hexByte(hex(board_no), 2)
- status_bin_data = ''
- for lock_no in range(len(board_status.values()), 0, -1):
- status = board_status.get(lock_no)
- if status == LockStatus.LOCKED:
- status_bin_data += '0'
- else:
- status_bin_data += '1'
- group_1 = fill_2_hexByte(hex(int(status_bin_data[0:8], 2)), 2)
- data += group_1
- group_2 = fill_2_hexByte(hex(int(status_bin_data[8:16], 2)), 2)
- data += group_2
- group_3 = fill_2_hexByte(hex(int(status_bin_data[16:24], 2)), 2)
- data += group_3
- data += '33B2'
- message = {
- 'data': data
- }
- else:
- status = self.locks[board_no][lock_no]
- if status == LockStatus.LOCKED:
- data = '80' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '0091'
- else:
- data = '80' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '1180'
- message = {
- 'data': data
- }
- elif func == '8A':
- board_no = int(payload['data'][2:4], 16)
- lock_no = int(payload['data'][4:6], 16)
- print('open lock. board no = {}; lock no = {}'.format(board_no, lock_no))
- self.locks[board_no][lock_no] = LockStatus.OPEN
- if self.locks[board_no][lock_no] == LockStatus.OPEN:
- message = {
- 'data': '8A' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '118A'
- }
- elif self.locks[board_no][lock_no] == LockStatus.LOCKED:
- message = {
- 'data': '8A' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '009B'
- }
- else:
- message = {
- 'data': '8A' + fill_2_hexByte(hex(board_no), 2) + fill_2_hexByte(hex(lock_no), 2) + '028A'
- }
- elif func == '90':
- board_no = int(payload['data'][2:4], 16)
- map = {
- 1: 0,
- 2: 1,
- 4: 2,
- 8: 3,
- 16: 4,
- 32: 5,
- 64: 6,
- 128: 7
- }
- lock_group_1 = int(payload['data'][4:6], 16)
- for yu, yi in map.iteritems():
- status = (lock_group_1 & yu) >> yi
- if status == 1:
- self.locks[board_no][1 + yi] = LockStatus.OPEN
- else:
- self.locks[board_no][1 + yi] = LockStatus.LOCKED
- lock_group_2 = int(payload['data'][6:8], 16)
- for yu, yi in map.iteritems():
- status = (lock_group_2 & yu) >> yi
- if status == 1:
- self.locks[board_no][1 + 8 + yi] = LockStatus.OPEN
- else:
- self.locks[board_no][1 + 8 + yi] = LockStatus.LOCKED
- lock_group_3 = int(payload['data'][8:10], 16)
- for yu, yi in map.iteritems():
- status = (lock_group_3 & yu) >> yi
- if status == 1:
- self.locks[board_no][1 + 8 + 8 + yi] = LockStatus.OPEN
- else:
- self.locks[board_no][1 + 8 + 8 + yi] = LockStatus.LOCKED
- message = {
- }
- if message is not None:
- message.update({
- 'IMEI': self.imei,
- 'rst': 0,
- 'cmd': cmd
- })
- return self.publish_message(
- cmd = cmd,
- payload = message)
- super(CellDevice, self).do_message(cmd, payload)
- @property
- def device_extend_info(self):
- return {
- 'driverCode': '110000',
- 'driverVersion': 'v1.0.2'
- }
- class myThread(threading.Thread):
- def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
- threading.Thread.__init__(self)
- self.mqtt_server = mqtt_server
- self.mqtt_port = mqtt_port
- self.mqtt_user = mqtt_user
- self.mqtt_pwd = mqtt_pwd
- self.imei = imei
- self.setDaemon(False)
- def run(self):
- CellDevice(self.mqtt_server, self.mqtt_port, self.mqtt_user, self.mqtt_pwd, imei).start()
- if __name__ == '__main__':
- imei_list = {
- 'DUMMY_CELL': 'DUMMY_CELL_IMEI'
- }
- mqtt_server = '211.159.224.10'
- mqtt_port = 1883
- mqtt_user = '20160528@vivestone'
- mqtt_pwd = 'j429QXqI5CTv'
- threads = []
- for imei in imei_list.values():
- thread = myThread(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
- thread.start()
- threads.append(thread)
|