123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import threading
- import time
- from typing import TYPE_CHECKING, Dict
- from smart_box import SimulatorSmartBox
- from utils import fill_2_hexByte, calc_crc, make_six_bytes_session_id
- if TYPE_CHECKING:
- pass
- class PortStatus(object):
- IDLE = 0x01
- USEING = 0x02
- FORBIDDEN = 0x03
- FAULT = 0x04
- class LoopPortsThread(threading.Thread):
- def __init__(self, ports):
- # type: (Ports)->None
- threading.Thread.__init__(self)
- self.ports = ports
- self.exit = False
- def set_exit(self):
- self.exit = True
- def run(self):
- while True and not self.exit:
- for port_no, state in self.ports.port_state.iteritems():
- # print 'port = {}; status = {}; start_time = {}; end_time = {}; now = {}'.format(
- # port_no, state['status'], state['start_time'], state['end_time'], int(time.time())
- # )
- status = state['status']
- if status == PortStatus.USEING:
- end_time = state['end_time']
- if end_time <= int(time.time()):
- duration = int(time.time()) - state['start_time']
- duration = 0 if duration <= 0 else duration
- simulator = self.ports.simulator # type: DianchuanDevice
- left_time = state['left_time']
- data = 'EE1305' + make_six_bytes_session_id() + \
- fill_2_hexByte(hex(int(port_no)), 2) + \
- fill_2_hexByte(hex(int(left_time)), 2) + \
- '0000000000000000'
- data = data + calc_crc(data)
- simulator.publish_message(
- 100,
- {
- 'ts': int(time.time()),
- 'IMEI': simulator.imei,
- 'duration': duration / 60,
- 'data': data,
- 'cmd': 100
- }
- )
- self.ports.port_state[port_no]['status'] = PortStatus.IDLE
- self.ports.port_state[port_no]['start_time'] = 0
- self.ports.port_state[port_no]['end_time'] = 0
- self.ports.port_state[port_no]['left_time'] = 0
- time.sleep(1)
- class Ports(object):
- def __init__(self, simulator):
- # type: (DianchuanDevice)->None
- self.simulator = simulator # type: DianchuanDevice
- self.port_state = {
- 1: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 2: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 3: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 4: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 5: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 6: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 7: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 8: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 9: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- },
- 10: {
- 'status': PortStatus.IDLE,
- 'start_time': 0,
- 'end_time': 0
- }
- }
- def func_01(self):
- data = '661301' + make_six_bytes_session_id() + '0A'
- for port_no, state in self.port_state.iteritems():
- status = state['status']
- data = data + fill_2_hexByte(hex(int(status)), 2)
- data = data + calc_crc(data)
- return data
- class DianchuanDevice(SimulatorSmartBox):
- def __init__(self, mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei):
- super(DianchuanDevice, self).__init__(mqtt_server, mqtt_port, mqtt_user, mqtt_pwd, imei)
- self.ports = Ports(self)
- self.ports_loop_thread = LoopPortsThread(self.ports)
- self.ports_loop_thread.start()
- def exit(self):
- self.ports_loop_thread.set_exit()
- super(DianchuanDevice, self).exit()
- def do_message(self, cmd, payload):
- # type: (str, Dict)->None
- message = None
- if cmd >= 210:
- func = payload['funCode']
- if func == '01':
- message = {
- 'data': self.ports.func_01()
- }
- elif func == '02':
- port = int(payload['data'][0:2], 16)
- _time = int(payload['data'][6:10], 16)
- _consume_time = 1
- _left_time = (_time - _consume_time)
- # print(
- # 'port = {}; time = {}; consume = {}; left time = {}'.format(
- # port, _time, _consume_time, _left_time))
- port_state = self.ports.port_state[port]
- if port_state['status'] == PortStatus.USEING:
- port_state['end_time'] = port_state['end_time'] + _consume_time * 60
- else:
- port_state['status'] = PortStatus.USEING
- port_state['start_time'] = int(time.time())
- port_state['end_time'] = port_state['start_time'] + _consume_time * 60
- port_state['left_time'] = _left_time
- data = '660A02' + make_six_bytes_session_id() + fill_2_hexByte(hex(int(port)), 2) + '01'
- data = data + calc_crc(data)
- message = {
- 'data': data
- }
- if cmd == 201:
- message = self.get_device_info()
- if message and 'rst' not in message:
- message.update({
- 'IMEI': self.imei,
- 'rst': 0,
- 'cmd': cmd
- })
- return self.publish_message(cmd = cmd, payload = message)
- super(DianchuanDevice, self).do_message(cmd, payload)
- @property
- def device_extend_info(self):
- return {
- 'driverCode': '100210',
- 'driverVersion': 'v2.0.2'
- }
- class myThread(threading.Thread): # 继承父类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):
- DianchuanDevice(self.mqtt_server, self.mqtt_port, self.mqtt_user, self.mqtt_pwd, self.imei).start()
- if __name__ == '__main__':
- imei_list = {
- 'DIANCHUAN_DUMMY': 'DIANCHUAN_DUMMY_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)
|