2025-03-14 11:02:02 +08:00

45 lines
1.9 KiB
Python

import struct
import logging
class Command03:
def process_03h(self, data):
if len(data) < 14:
logging.warning("03H数据长度不足")
return None
pile_id = data[3:11]
data_start = 14
data_len = struct.unpack('<H', data[12:14])[0]
data_end = data_start + data_len
if len(data) < data_end + 1:
logging.warning("03H数据域长度不匹配")
return None
# 提取字段
timestamp = data[data_start:data_start + 6]
login_data = data[data_start + 6:data_end]
# 解析登录数据
device_model = login_data[0:16].decode('ascii', errors='ignore').rstrip('\x00') # 设备型号
protocol_version = login_data[16] # 协议版本
gun_count = login_data[17] # 枪数量
max_power = struct.unpack('<H', login_data[18:20])[0] # 最大功率
last_heartbeat_time = login_data[20:26] # 上次心跳时间
# 其他字段根据协议解析
parsed_login_data = {
"device_model": device_model,
"protocol_version": f"0x{protocol_version:02X}",
"gun_count": gun_count,
"max_power_w": max_power,
"last_heartbeat_time": f"20{last_heartbeat_time[0]:02X}-{last_heartbeat_time[1]:02X}-{last_heartbeat_time[2]:02X} {last_heartbeat_time[3]:02X}:{last_heartbeat_time[4]:02X}:{last_heartbeat_time[5]:02X}",
"raw_login_data": login_data.hex().upper()
}
# 转换为键值对
parsed_data = {
"pile_id": pile_id.hex().upper(),
"timestamp": f"20{timestamp[0]:02X}-{timestamp[1]:02X}-{timestamp[2]:02X} {timestamp[3]:02X}:{timestamp[4]:02X}:{timestamp[5]:02X}",
"login_data": parsed_login_data
}
logging.info(f"03H解析结果: {parsed_data}")
return parsed_data # 返回解析结果