主站数据分析脚本;
This commit is contained in:
@@ -20,7 +20,7 @@ class DeviceMQTT:
|
||||
def __init__(self, broker, port, account=None, device_id=None, callbacks=None, **kwargs):
|
||||
""" 设备初始化 """
|
||||
self.topic = None
|
||||
self.client_id = f'python-DeviceMQTT-{random.randint(0, 1000)}'
|
||||
self.client_id = f'python-DeviceMQTT-{random.randint(0, 10000):04d}'
|
||||
self.client = self.open_connection(broker, port, account, **kwargs)
|
||||
self._subscribe(device_id)
|
||||
|
||||
@@ -37,7 +37,7 @@ class DeviceMQTT:
|
||||
self._frame_maker = lambda self: ''
|
||||
self._frame_parser = lambda self, frame: ''
|
||||
|
||||
self._message = {}
|
||||
self._message = []
|
||||
self.output = {
|
||||
'result': False,
|
||||
'code_func': 0x00,
|
||||
@@ -80,14 +80,14 @@ class DeviceMQTT:
|
||||
reconnect_count += 1
|
||||
print("Reconnect failed after %s attempts. Exiting...", reconnect_count)
|
||||
def on_message(client, userdata, msg):
|
||||
self._message = msg
|
||||
self._message.append(msg)
|
||||
print(f"Received message from `{msg.topic}` topic")
|
||||
|
||||
client = mqtt_client.Client(client_id=self.client_id, callback_api_version=mqtt_client.CallbackAPIVersion.VERSION2)
|
||||
if account is not None:
|
||||
client.username_pw_set(account[0], account[1])
|
||||
client.on_connect = on_connect if 'func_on_connect' not in kwargs.keys() else kwargs['func_on_connect']
|
||||
client.on_disconnect = on_disconnect if 'func_on_disconnect' not in kwargs.keys() else kwargs['func_on_disconnect']
|
||||
# client.on_disconnect = on_disconnect if 'func_on_disconnect' not in kwargs.keys() else kwargs['func_on_disconnect']
|
||||
client.on_message = on_message if 'func_on_message' not in kwargs.keys() else kwargs['func_on_message']
|
||||
client.connect(broker, port)
|
||||
return client
|
||||
@@ -99,11 +99,15 @@ class DeviceMQTT:
|
||||
|
||||
def _subscribe(self, device_id):
|
||||
""" 订阅主题 """
|
||||
if self.topic is not None:
|
||||
self.client.unsubscribe(self.topic[1])
|
||||
|
||||
topic_send = f"ctiot/download/7/0101/{device_id}/function/invoke"
|
||||
topic_read = f"ctiot/upload/7/0101/{device_id}/#"
|
||||
self.client.subscribe(topic_read)
|
||||
|
||||
self.device_id = device_id
|
||||
self.topic = (topic_send, topic_read)
|
||||
self.client.subscribe(topic_read)
|
||||
|
||||
def __send(self, msg: bytearray, topic=None) -> bool:
|
||||
""" 发布消息 """
|
||||
@@ -113,7 +117,7 @@ class DeviceMQTT:
|
||||
"deviceId": self.device_id,
|
||||
"isSubDevice": 0,
|
||||
"requestType": 0,
|
||||
"messageId": "463g3ga53j4k25o9w",
|
||||
"messageId": f"debug-{self.client_id[18:]}",
|
||||
"timestamp": int(time.time()),
|
||||
"functionId": "168493059",
|
||||
"inputs": [
|
||||
@@ -127,23 +131,24 @@ class DeviceMQTT:
|
||||
return result[0] == 1
|
||||
|
||||
def __read(self, timeout=None) -> bytes:
|
||||
self._message = None
|
||||
self._message.clear()
|
||||
timeout = timeout if timeout is not None else 1
|
||||
self.client.loop_start()
|
||||
time.sleep(timeout)
|
||||
self.client.loop_stop()
|
||||
|
||||
if self._message:
|
||||
""" 报文接收成功 """
|
||||
message_data = json.loads(self._message.payload)
|
||||
frame_recv = " ".join((message_data['modbus_msg'][2*i:2*(i+1)] for i in range(len(message_data['modbus_msg'])//2)))
|
||||
frame_recv = ByteConv.trans_str_to_list(frame_recv)
|
||||
return bytearray(frame_recv)
|
||||
else:
|
||||
return b''
|
||||
for message in self._message:
|
||||
message_data = json.loads(message.payload)
|
||||
if message_data['messageId'] == f"debug-{self.client_id[18:]}":
|
||||
""" 报文接收成功 """
|
||||
frame = " ".join((message_data['modbus_msg'][2*i:2*(i+1)] for i in range(len(message_data['modbus_msg'])//2)))
|
||||
frame = ByteConv.trans_str_to_list(frame)
|
||||
return bytearray(frame)
|
||||
return b''
|
||||
|
||||
def __read_frame(self) ->bool:
|
||||
""" 读取报文并解析帧 """
|
||||
frame_recv = b''
|
||||
try:
|
||||
frame_recv = self.__read(timeout=self.time_out)
|
||||
self.output = self._frame_parser(frame_recv)
|
||||
|
||||
Reference in New Issue
Block a user