# -*- 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)