import struct import logging class Command03: def __init__(self): self.command = 0x03 # 03H命令码 def parse_03h(self, data): """ 解析03H登录信息命令 :param data: 完整的03H命令报文 :return: 解析后的字典或None """ try: # 验证基本帧格式 if len(data) < 14 or data[0:2] != b'JX' or data[2] != 0x03: logging.warning("03H命令帧格式不正确") return None # 提取桩号 pile_id_bytes = data[3:11] # 提取时间标识 time_bytes = data[14:20] year = time_bytes[0] + 2000 month, day, hour, minute, second = time_bytes[1:6] timestamp = f"{year:04d}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}" # 解析桩型号 (16字节ASCII) pile_type = data[6:22].decode('ascii').rstrip('\x00') # 解析硬件版本 (2字节压缩BCD) hw_version_bytes = data[22:24] hw_version_major = hw_version_bytes[0] >> 4 hw_version_minor = hw_version_bytes[0] & 0x0F hw_version_patch = hw_version_bytes[1] >> 4 hw_version = f"{hw_version_major}.{hw_version_minor}.{hw_version_patch}" # 解析软件版本 (2字节压缩BCD) sw_version_bytes = data[24:26] sw_version_major = sw_version_bytes[0] >> 4 sw_version_minor = sw_version_bytes[0] & 0x0F sw_version_patch = sw_version_bytes[1] >> 4 sw_version = f"{sw_version_major}.{sw_version_minor}.{sw_version_patch}" # 解析次级单元硬件版本 sub_hw_version_bytes = data[26:28] sub_hw_version_major = sub_hw_version_bytes[0] >> 4 sub_hw_version_minor = sub_hw_version_bytes[0] & 0x0F sub_hw_version_patch = sub_hw_version_bytes[1] >> 4 sub_hw_version = f"{sub_hw_version_major}.{sub_hw_version_minor}.{sub_hw_version_patch}" # 解析次级单元软件版本 sub_sw_version_bytes = data[28:30] sub_sw_version_major = sub_sw_version_bytes[0] >> 4 sub_sw_version_minor = sub_sw_version_bytes[0] & 0x0F sub_sw_version_patch = sub_sw_version_bytes[1] >> 4 sub_sw_version = f"{sub_sw_version_major}.{sub_sw_version_minor}.{sub_sw_version_patch}" # 解析直流模块类型 dc_module_type = data[30] # 解析直流模块总数 dc_module_count = data[31] # 解析直流模块单模块功率 dc_module_power = data[32] # 解析计费模型版本 fee_model_version = struct.unpack("