This commit is contained in:
zj
2026-03-22 17:17:44 +08:00
commit b64c39ecbd
29 changed files with 2720 additions and 0 deletions

128
bin/sender_udp.py Executable file
View File

@@ -0,0 +1,128 @@
#!/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 = {
"open1": "000100000008010F006400010001",
"close1": "000100000008010F006400010000",
"open2": "000100000008010F006500010001",
"close2": "000100000008010F006500010000",
"open3": "000100000008010F006600010001",
"close3": "000100000008010F006600010000",
"open4": "000100000008010F006700010001",
"close4": "000100000008010F006700010000",
"openall4": "000100000008010F00640004000F",
"closeall4": "000100000008010F006400040000",
"open5": "000100000008010F006800010001",
"close5": "000100000008010F006800010000",
"open6": "000100000008010F006900010001",
"close6": "000100000008010F006900010000",
"open7": "000100000008010F006A00010001",
"close7": "000100000008010F006A00010000",
"open8": "000100000008010F006B00010001",
"close8": "000100000008010F006B00010000",
"getstat": "fe010000000429C6",
"getstat01": "fe010100000429C6",
}
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)