import struct import logging import binascii class Command0B0CH: def __init__(self): self.command_0b = 0x0B # 平台心跳命令 self.command_0c = 0x0C # 桩心跳命令 def parse_0c_heartbeat(self, data): """ 解析0CH桩心跳命令 :param data: 完整的0CH命令报文 :return: 解析后的字典或None """ try: # 验证基本帧格式 if len(data) < 14 or data[0:2] != b'JX' or data[2] != 0x0C: logging.warning(f"0CH命令帧格式不正确,原始报文: {binascii.hexlify(data)}") return None # 打印完整的原始报文以便调试 print(f"完整原始报文: {binascii.hexlify(data)}") # 提取桩号 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}" # 解析充电枪数量 gun_count = data[20] # 解析充电枪状态 gun_states = [] current_index = 21 for i in range(gun_count): try: # 每个充电枪的状态信息占2个字节 if current_index + 1 < len(data): gun_state = data[current_index] gun_work_mode = data[current_index + 1] gun_states.append({ "gun_index": i + 1, "state": gun_state, "state_text": self.get_gun_state_text(gun_state), "work_mode": gun_work_mode, "work_mode_text": self.get_work_mode_text(gun_work_mode) }) current_index += 2 except Exception as gun_parse_error: logging.warning(f"解析第 {i + 1} 个充电枪状态时出错: {gun_parse_error}") # 打印解析结果 print("\n0CH桩心跳命令解析结果:") print(f"桩号: {pile_id_bytes.hex()}") print(f"时间标识: {timestamp}") print(f"充电枪数量: {gun_count}") for gun_state in gun_states: print(f"枪 {gun_state['gun_index']}:") print(f" 状态: {gun_state['state_text']} (0x{gun_state['state']:02X})") print(f" 工作模式: {gun_state['work_mode_text']} (0x{gun_state['work_mode']:02X})") return { "pile_id": pile_id_bytes.hex(), "timestamp": timestamp, "gun_count": gun_count, "gun_states": gun_states } except Exception as e: logging.error(f"解析0CH命令失败: {str(e)}") logging.error(f"原始报文: {binascii.hexlify(data)}") return None def generate_0b_heartbeat_response(self, pile_id_bytes): """ 生成0BH平台心跳响应 :param pile_id_bytes: 充电桩桩号字节 :return: 0BH心跳响应报文 """ try: # 构建帧 frame = bytearray() frame.extend(b'JX') # 帧起始标志 frame.append(self.command_0b) # 命令码 frame.extend(pile_id_bytes) # 桩号 frame.append(0x01) # 数据加密方式 # 构建数据域 data = bytearray() # 时间标识(当前时间) from datetime import datetime now = datetime.now() data.extend(struct.pack("