#!/usr/bin/env python3 # -*- coding: UTF-8 -*- # Auto-generated from template. DO NOT EDIT DIRECTLY! import sys import socket import time import logging def udp_command_send(upc_addr, upc_command, data, timeout=2): """通过UDP发送数据并接收响应""" sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(timeout) try: logging.debug(f"尝试发送UDP数据到 {{upc_addr[0]}}:{{upc_addr[1]}}...") logging.info(f"正在发送UDP命令 '{{upc_command}}' 到 {{upc_addr}}: {{data!r}} (原始字节)") sock.sendto(data, upc_addr) logging.debug(f"UDP数据发送完成。") # 尝试接收响应 recv_buffer_size = 1024 try: logging.debug(f"等待从 {{upc_addr}} 接收UDP响应...") response_bytes, addr = sock.recvfrom(recv_buffer_size) if response_bytes: logging.info(f"从 {{addr}} 收到UDP原始响应字节: {{response_bytes!r}}") try: response_str = response_bytes.decode('utf-8', errors='ignore') logging.info(f"从 {{addr}} 收到UDP解码响应字符串: '{{response_str}}'") except Exception as decode_e: logging.warning(f"解码UDP响应时发生错误: {{decode_e}}") else: logging.info(f"未收到UDP响应数据。") except socket.timeout: logging.warning(f"接收UDP响应超时(设备可能不返回响应,这通常是正常的)。") except OSError as recv_e: logging.error(f"接收UDP响应时发生网络错误: {{recv_e}}") sock.close() logging.debug(f"UDP socket关闭。") return True except OSError as e: logging.error(f"UDP命令 '{{upc_command}}' 发送至 {{upc_addr}} 失败: {{e}}") return False finally: try: sock.close() except: pass # 指令定义表(从配置文件读取) COMMAND_DEFINITIONS = {command_definitions} def upc_send_command(upc_addr, upc_command, log_file): """将命令发送给终端设备""" data = None # 查找指令定义 if upc_command in COMMAND_DEFINITIONS: hex_str = COMMAND_DEFINITIONS[upc_command] data = bytes.fromhex(hex_str) if data is None: datetime_str = time.strftime(ISOTIMEFORMAT, time.localtime(time.time())) logstr = f"{{datetime_str}} 未知命令: {{upc_command}},没有对应的数据可发送。" logging.warning(logstr) print(logstr) else: i = 1 while i <= 3: # 尝试发送3次 if udp_command_send(upc_addr, upc_command, data): datetime_str = time.strftime(ISOTIMEFORMAT, time.localtime(time.time())) logstr = f"{{datetime_str}} {{upc_command}}命令第{{i}}次发送成功" logging.info(logstr) return else: datetime_str = time.strftime(ISOTIMEFORMAT, time.localtime(time.time())) logstr = f"{{datetime_str}} {{upc_command}}命令第{{i}}次发送失败,3秒后进行第{{i+1}}次尝试" logging.warning(logstr) time.sleep(3) i = i + 1 datetime_str = time.strftime(ISOTIMEFORMAT, time.localtime(time.time())) logstr = f"{{datetime_str}} {{upc_command}}命令在3次尝试后发送均失败!" logging.error(logstr) if __name__ == '__main__': ISOTIMEFORMAT = '%Y-%m-%d %X' UPC_DEV_IP = sys.argv[1] UPC_DEV_PORT = int(sys.argv[2]) upc_command = sys.argv[3] LOG_FILE = sys.argv[4] logging.basicConfig(filename=LOG_FILE, filemode="a", level=logging.DEBUG) UPC_ADDR = (UPC_DEV_IP, UPC_DEV_PORT) # UDP 是无连接的,无需像TCP那样预先检查端口连通性 # 直接发送数据 logging.info(f"UDP模式:准备发送命令到 {{UPC_ADDR}}") upc_send_command(UPC_ADDR, upc_command, LOG_FILE)