From e8d33efc4260a48e65e8fbc77afe5ba14a79f7f2 Mon Sep 17 00:00:00 2001 From: "MATRIX\\29620" <2962004889@qq.com> Date: Mon, 20 Jan 2025 10:34:41 +0800 Subject: [PATCH] no message --- charging_pile_proxy/commands/__init__.py | 5 +- .../__pycache__/__init__.cpython-311.pyc | Bin 1201 -> 1354 bytes .../__pycache__/command_1F_20.cpython-311.pyc | Bin 0 -> 10600 bytes .../__pycache__/command_23_24.cpython-311.pyc | Bin 16845 -> 12074 bytes .../__pycache__/command_25.cpython-311.pyc | Bin 9221 -> 9556 bytes charging_pile_proxy/commands/command_02.py | 205 ++++++++++-------- .../__pycache__/proxy_server.cpython-311.pyc | Bin 18147 -> 23234 bytes charging_pile_proxy/core/proxy_server.py | 91 +++++++- charging_pile_proxy/test.log | 1 + 9 files changed, 197 insertions(+), 105 deletions(-) create mode 100644 charging_pile_proxy/commands/__pycache__/command_1F_20.cpython-311.pyc diff --git a/charging_pile_proxy/commands/__init__.py b/charging_pile_proxy/commands/__init__.py index 232848b..e7e222d 100644 --- a/charging_pile_proxy/commands/__init__.py +++ b/charging_pile_proxy/commands/__init__.py @@ -10,9 +10,10 @@ from commands.command_0A import Command0A from commands.command_25 import Command25 from commands.command_30 import Command30 from commands.command_19_1A import Command191A +from commands.command_1F_20 import Command1F20 from commands.command_21_22 import Command2122 from commands.command_23_24 import Command2324 -#from commands.command_26_27 import Command2627 +from commands.command_26_27 import Command2627 __all__ = ['Command02', 'Command03', 'CommandHeartbeat','Command07','Command08','Command09', - 'Command0A','Command25','Command30','Command191A','Command2122','Command2324'] \ No newline at end of file + 'Command0A','Command25','Command30','Command191A','Command2122','Command2324','Command1F20'] \ No newline at end of file diff --git a/charging_pile_proxy/commands/__pycache__/__init__.cpython-311.pyc b/charging_pile_proxy/commands/__pycache__/__init__.cpython-311.pyc index 1c28149f323a7237986588c9ea69cfc0c5587d75..900d997c4ad3e5328c9f96ef32c1ab225c350f48 100644 GIT binary patch delta 210 zcmdnUd5Vj7IWI340}z~9)|=iokyn!O+(h-YYAGx!d^u9N(oxck3_v!2j!dp>lq@4d zIzx)UBE~4W6v1EyO`(a87O)t)85vA2XOtIUyv6ODpPQSQmttgQWUk3Oc{-!9AV1LL zA^{M=2PFJ782o|XT)d2vl7%_AJ delta 140 zcmX@bwULu|IWI340}yP|=uY>X$ScXXZKC>GzI28ZzD0~tQYrkw44MKHe=V52l2L?_ zXYyG_V;(-B>LPw1;ioCRS&+$qadI3p8zbLjK4vj?Bjb1@lOq1f^O<9~lz>VYfw)+5 bGb;-VqwEJZM(!xa4-5#hfgJ>k6o85VA%-4Y diff --git a/charging_pile_proxy/commands/__pycache__/command_1F_20.cpython-311.pyc b/charging_pile_proxy/commands/__pycache__/command_1F_20.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06aa9845a2eccaacdbe17caa8ea86d75a8501986 GIT binary patch literal 10600 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 z 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 literal 16845 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 GzwuxEI04N7 delta 1912 zcmZ`(ZA?>F7(VCT-uB*>en4AV%B5T=9~J=_V`L?)wq!1_J=Az7I11}{NvtpD^e9tdY|`w zpXWUv?|Dy}T61W%?TpoGMle2D@$s(v-XCliuq6*d9=c>Cm47;anLJ5CC;T^3xzu4Am&-dl&1;AOq@F7VmUhFByM0T=toA6 z9=l0C%ivx80)1$x)Hx6FJ~hir3K-*oEQDa)0^&Qw6|e&ILBHWWxrN_hgwDa28F4ek zoU5D2PtqLHjIe-@6lE_kXHF6EKR<^QpR`3yk;mI1L=^frF2W@Yg;LE#0(456FO-2- zu6q^WRWc9HV>#|1#8tCJkof}!QcbUj#qJtVYM)XT=t>Jg2e*l%;bi_+`Du7SNZmdibzrqW?;@I=cecmB9L2 zHPZ$ZK#}~Jjv!Qq)SXc=Vwq*Sa%Oz8DpEM(LyyHwOXzJW=wAICMb04xB6i!Nk|xFN z(C$(Nqb-PtQE|UW#0`(UKHP`i;kTeZ9DIfLS%wbSU>_%ZcTPe3Vn{+7A~>s1t{=oG z29}>?qa4JBteA&b$chaR8?#~oVpCRZoOvuFE0c&sqHQ_z=oGegm^BRjvS^%+JYbGy z0JLg?j>ZA>WzLgt6eA528*~w75xZ`A-NH=W!rVvJNbJ;Tt>hdUjhDFDhI}r`W1Am< z%W_6d`%T0Jm!*4Im*ws~3I{bSPmP-cL+PWZZ=Lxz{nfE_?BZl>XySbA){*z7hCfNi z;*%#2hL^YA`sw@hr>CBo8hL9^=k^`%Mml@a@!^T#&+4a!Pi&p|aj05JpZpLYcACM( zYGvZX!_~^oGhb|bW(hiC3t0MHt(`l1cPTZ>MtZ|~2?uG+HovOhJ;Sc;P7_fPauWKLx^@QHHX|flJQ(1ph_U?K(07X&RzoP1=$LuY50ZrQfu)G0pw zwNpp#MNe1^ThNHbyxhi*xNDb7{LhjAJ{`|nN`J|7nI>1lfhOAqz0PZ#=upeq@qF~2 zyOGxCH)1pG%5Rd#Ec^6=x08-Yhg!>0wgB|7TBzC6ApK|1YcTAlt2{}2zO`x^J%)vY zzkBQO#>%*Qwlvcau|83rs$7(mn^JPqpwIU?C$Dv&5&NqM%&5b>9`U2T zWrgcPd@>}gM}xo07jQ{CJ8=brbqqE!*bERfs1ozH(i8qL?xo}YyOwrFyve{z|0)jU zbz#9fjk0j_U{Gn`D|{^FwVC7~KW5t9@iyu1RL3NEev!;o?V#@m0>U21IzrC{Zj>=k wB@Fb(!Ty`{2k}5$yk{@z?e1Kv?xp9;8tcLwE|^Ah<87V4o2{;)uJV@u0Y^RBLI3~& diff --git a/charging_pile_proxy/commands/command_02.py b/charging_pile_proxy/commands/command_02.py index 0cd9b2f..7c2c85b 100644 --- a/charging_pile_proxy/commands/command_02.py +++ b/charging_pile_proxy/commands/command_02.py @@ -46,111 +46,122 @@ class Command02: def validate_frame(self, data): """验证帧格式""" try: - print(f"\n验证帧格式:") - print(f"数据内容: {data.hex()}") + print("\n开始验证帧格式:") + print(f"数据内容: {data.hex().upper()}") print(f"数据长度: {len(data)}字节") - # 1. 基本长度检查 + # 1. 基本格式检查 if len(data) < 14: - print("数据长度不足14字节,无效") + print("数据长度不足14字节") return False - # 2. 检查帧起始标志 if data[0:2] != b'JX': - print("帧起始标志不是'JX',无效") + print("帧起始标志不是'JX'") return False - # 3. 获取并检查数据域长度 + # 2. 获取数据域长度 data_len = struct.unpack(" expected_total_len: + print(f"截断多余数据") + data = data[:expected_total_len] + else: + print("数据不完整") + return False - if len(data) != expected_len: - print("数据总长度不匹配") - return False + # 3. 显示数据结构 + print(f"\n数据结构分析:") + print(f"起始标识: {data[0:2].hex().upper()}") + print(f"命令字: {data[2]:02X}") + print(f"桩号: {data[3:11].hex().upper()}") + print(f"加密方式: {data[11]:02X}") + print(f"数据长度: {data_len}") + print(f"数据域: {data[14:14 + data_len].hex().upper()}") + print(f"校验码: {data[-1]:02X}") - # 5. 验证校验码 - check_data = data[2:-1] # 从命令字节到校验码前的数据 + # 4. 校验码验证 + check_data = data[2:-1] calculated_check = 0 for b in check_data: calculated_check ^= b - received_check = data[-1] - print(f"计算得到的校验码: {calculated_check:02X}") - print(f"接收到的校验码: {received_check:02X}") - - if calculated_check != received_check: - print("校验码不匹配") + if calculated_check != data[-1]: + print(f"校验码不匹配: 计算值={calculated_check:02X}, 接收值={data[-1]:02X}") return False - print("帧格式验证通过") return True except Exception as e: - print(f"帧格式验证出错: {str(e)}") + print(f"验证帧格式异常: {str(e)}") return False + def debug_print_fields(self, data): + """打印数据包的详细字段""" + print("\n===== 数据包解析 =====") + print("1. 固定头部:") + print(f" 起始标识 (2字节): {data[0:2].hex().upper()}") + print(f" 命令码 (1字节): {data[2]:02X}") + print(f" 桩号 (8字节): {data[3:11].hex().upper()}") + print(f" 加密方式 (1字节): {data[11]:02X}") + print(f" 数据域长度 (2字节): {struct.unpack(' expected_len: + print(f"\n警告: 发现多余字节:") + print(f"多余字节内容: {data[expected_len:].hex().upper()}") + def parse_01h(self, data): """解析01H命令数据""" try: print("\n开始解析01H命令...") - if not self.validate_frame(data): raise ValueError("帧格式验证失败") + # 提取基本信息 command = data[2] pile_id = data[3:11] encrypt_mode = data[11] - data_len = struct.unpack(" 600: # 超过10分钟 + logging.warning(f"时间差异过大: {time_diff}秒") + response = self.build_02h_response(pile_id, False, 6) # 拒绝原因6-时差过大 + else: + # 这里可以添加更多的验证逻辑 + response = self.build_02h_response(pile_id, True, 0) + + if response and hasattr(sock, 'send'): sock.send(response) + logging.info(f"成功发送02H响应, 长度: {len(response)}字节") + return True - return True + return False except Exception as e: - logging.error(f"处理和响应失败: {str(e)}") - print(f"处理失败: {str(e)}") + logging.error(f"处理01H命令失败: {str(e)}") return False @@ -243,29 +254,31 @@ def test_command(): """测试函数""" print("开始测试01H/02H命令处理...") - # 配置日志 - # logging.basicConfig( - # filename='command_response_02h.log', - # level=logging.INFO, - # format='%(asctime)s - %(levelname)s - %(message)s', - # encoding='utf-8' - # ) - # 创建响应处理器 handler = Command02() - # 测试数据 - 使用实际收到的数据 - test_data = bytes.fromhex("4A5801031767631136065701100019010909371501000000000000000000004D") + # 原始测试数据 + hex_string = "4A5801031767631136065701100019010909371501000000000000000000004D" + + # 解析数据长度字段以确定正确的数据包长度 + expected_len = 14 + 16 + 1 # 头部(14字节) + 数据域(16字节) + 校验码(1字节) + + # 确保只取需要的字节 + test_data = bytes.fromhex(hex_string[:expected_len * 2]) # *2是因为hex字符串中一个字节用两个字符表示 print("\n测试数据:") - print(f"十六进制: {test_data.hex()}") - print(f"长度: {len(test_data)}字节") + print(f"原始数据: {hex_string}") + print(f"处理后数据: {test_data.hex().upper()}") + print(f"数据长度: {len(test_data)}字节") + + # 打印详细字段解析 + handler.debug_print_fields(test_data) # 创建模拟socket class MockSocket: def send(self, data): print(f"\n模拟发送响应数据:") - print(f"数据内容: {data.hex()}") + print(f"数据内容: {data.hex().upper()}") print(f"数据长度: {len(data)}字节") mock_sock = MockSocket() diff --git a/charging_pile_proxy/core/__pycache__/proxy_server.cpython-311.pyc b/charging_pile_proxy/core/__pycache__/proxy_server.cpython-311.pyc index 95f007d5f29817bbce06dabf1ac1c91012f7f191..6d14b28442a1c09f86d05da709b3a5f43bcd8194 100644 GIT binary patch delta 7239 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 60: + msg = f"充电桩 {pile_id.hex().upper()} 心跳超时 {time_diff:.1f}秒" + logging.warning(msg) + print(msg) + self.mqtt_client.publish_message(msg) + disconnected_piles.append(pile_id) + + # 从心跳信息中移除断开的充电桩 + for pile_id in disconnected_piles: + del self.heartbeat_info[pile_id] + self.handle_pile_disconnect(pile_id) + + # 每5秒检查一次 + time.sleep(5) + + except Exception as e: + logging.error(f"心跳检测错误: {str(e)}") + time.sleep(5) + + def update_heartbeat(self, pile_id): + """更新心跳时间戳""" + try: + self.heartbeat_info[pile_id] = time.time() + logging.debug(f"更新充电桩 {pile_id.hex().upper()} 心跳时间") + except Exception as e: + logging.error(f"更新心跳时间戳失败: {str(e)}") + + def handle_pile_disconnect(self, pile_id): + """处理充电桩断开连接""" + try: + msg = f"充电桩 {pile_id.hex().upper()} 断开连接" + logging.info(msg) + print(msg) + self.mqtt_client.publish_message(msg) + + # 可以在这里添加充电桩断开后的清理逻辑 + # 例如:中断正在进行的充电等 + + except Exception as e: + logging.error(f"处理充电桩断开连接失败: {str(e)}") def start(self): """启动代理服务器""" @@ -139,16 +193,21 @@ class ChargingPileProxyServer: # 根据命令字节处理不同命令 if command == 0x01: # 01H命令 + logging.info(f"收到01H连接请求命令: {data.hex().upper()}") if self.command_02_handler.process_and_respond(data, destination_socket): - continue - + logging.info("01H命令处理完成") + continue # 跳过后续转发,避免重复转发 elif command == 0x03: # 03H命令 - + logging.info(f"收到03H登录命令: {data.hex().upper()}") if self.command_03_handler.process_03h(data): + logging.info("03H命令处理完成") continue elif command == 0x0C: # 0CH桩心跳命令 + # 提取桩号并更新心跳 + pile_id = data[3:11] + self.update_heartbeat(pile_id) logging.info(f"收到0CH心跳命令: {data.hex().upper()}") if self.heartbeat_handler.process_and_respond(data, destination_socket): logging.info("0CH心跳命令处理完成") @@ -160,16 +219,27 @@ class ChargingPileProxyServer: logging.info("19H卡鉴权命令处理完成") continue # 跳过后续转发 + + elif command == 0x1F: # 1FH启动充电命令 + + logging.info(f"收到1FH启动充电命令: {data.hex()}") + + if self.start_charge_handler.process_and_respond(data, destination_socket): + logging.info("1FH命令处理完成") + + continue + + elif command == 0x20: # 20H启动充电回复 + logging.info(f"收到20H启动充电回复: {data.hex()}") + self.start_charge_handler.parse_20h(data) - elif command == 0x21: # 21H启动充电结果命令 - logging.info(f"收到21H启动充电结果命令: {data.hex()}") - if self.charge_result_handler.process_and_respond(data, destination_socket): + logging.info("21H命令处理完成") continue # 跳过后续转发 elif command == 0x23: # 23H充电订单命令 @@ -179,6 +249,7 @@ class ChargingPileProxyServer: continue + elif command == 0x25: # 25H充电信息命令 logging.info(f"收到25H充电信息命令: {data.hex()}") @@ -186,13 +257,19 @@ class ChargingPileProxyServer: if self.charge_info_handler.process_25h(data): logging.info("25H命令处理完成") + elif command == 0x26: # 26H停止充电命令 + logging.info(f"收到26H停止充电命令: {data.hex()}") + if self.stop_charge_handler.build_26h_command(data, destination_socket): + logging.info("26H命令处理完成") + continue + elif command == 0x27: # 27H停止充电回复 logging.info(f"收到27H停止充电回复: {data.hex()}") self.stop_charge_handler.parse_27h(data) elif command == 0x30: # 30H BMS信息命令 logging.info(f"收到30H BMS信息命令: {data.hex().upper()}") - if self.bms_handler.process_30h(data): + if self.bms_handler.parse_30h_bms_status(data): logging.info("30H BMS信息命令处理完成") else: diff --git a/charging_pile_proxy/test.log b/charging_pile_proxy/test.log index 400bb1d..88c8f52 100644 --- a/charging_pile_proxy/test.log +++ b/charging_pile_proxy/test.log @@ -4,3 +4,4 @@ 2025-01-17 14:41:09,050 - ERROR - 代理服务器错误: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。 2025-01-17 14:58:36,033 - ERROR - 代理服务器错误: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。 2025-01-17 17:12:27,913 - ERROR - 代理服务器错误: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。 +2025-01-20 09:45:44,376 - INFO - 代理服务器已启动,监听地址: 0.0.0.0:52461