import struct import logging import binascii class Command191A: def __init__(self): self.command_19 = 0x19 # 卡鉴权上报命令 self.command_1a = 0x1A # 平台回复卡鉴权命令 def parse_19_card_auth(self, data): """ 解析19H卡鉴权上报命令 :param data: 完整的19H命令报文 :return: 解析后的字典或None """ try: # 验证基本帧格式 if len(data) < 14 or data[0:2] != b'JX' or data[2] != 0x19: logging.warning(f"19H命令帧格式不正确,原始报文: {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}" # 提取卡号(通常是ASCII字符串) card_number_start = 22 card_number_end = card_number_start + 16 card_number = data[card_number_start:card_number_end].decode('ascii').rstrip('\x00') # 打印解析结果 print("\n19H卡鉴权上报命令解析结果:") print(f"桩号: {pile_id_bytes.hex()}") print(f"时间标识: {timestamp}") print(f"卡号: {card_number}") return { "pile_id": pile_id_bytes.hex(), "timestamp": timestamp, "card_number": card_number } except Exception as e: logging.error(f"解析19H命令失败: {str(e)}") logging.error(f"原始报文: {binascii.hexlify(data)}") return None def generate_1a_card_auth_response(self, card_number): """ 生成1AH卡鉴权响应命令 :param card_number: 卡号 :return: 1AH响应报文 """ try: # 构建帧 frame = bytearray() frame.extend(b'JX') # 帧起始标志 frame.append(self.command_1a) # 命令码 frame.extend(bytes.fromhex('0317665611360637')) # 桩号(固定值) frame.append(0x01) # 数据加密方式 # 构建数据域 data = bytearray() # 时间标识(当前时间) from datetime import datetime now = datetime.now() data.extend(struct.pack("