1
This commit is contained in:
107
templates/sender_udp.py.tpl
Normal file
107
templates/sender_udp.py.tpl
Normal file
@@ -0,0 +1,107 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user