45 lines
1.9 KiB
Python
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 # 返回解析结果 |