| .. | ||
| __init__.py | ||
| data_structures.py | ||
| main.py | ||
| module1_receiver.py | ||
| module2_sender.py | ||
| module3_data_sender.py | ||
| README.md | ||
| test_client.py | ||
UDP交互程序
基于Python3的完整UDP交互系统,包含三个独立模块,用于实现雷达控制系统的通信功能。
系统架构
三个模块
模块1:UDP接收模块(module1_receiver.py)
- 功能:监听38101端口,接收来自主控的控制指令
- 主类:
UDPReceiver - 关键方法:
start():启动接收模块stop():停止接收模块set_callback(callback):设置接收回调函数
模块2:UDP发送响应包模块(module2_sender.py)
- 功能:向37001端口发送控制指令的执行结果和状态包
- 主类:
ResponseSender、StatusPacketSender - 关键方法:
send_response(remote_addr, status, device_status):发送响应包send_status_packet(remote_addr, device_status):发送设备状态包
模块3:UDP数据包发送模块(module3_data_sender.py)
- 功能:向37004端口发送回波和图像数据
- 主类:
DataSender - 关键方法:
send_echo_data(remote_addr, echo_data, sequence, max_packet_size):发送回波数据(自动分包)send_image_data(remote_addr, image_data, imaging_params):发送图像数据
通信端口
| 模块 | 端口 | 方向 | 功能 |
|---|---|---|---|
| 模块1 | 38101 | 接收 | 接收控制指令 |
| 模块2 | 37001 | 发送 | 发送响应包和状态包 |
| 模块3 | 37004 | 发送 | 发送回波和图像数据 |
数据格式
控制包格式(表4)
帧头(4B) + 设备编号(1B) + 预留(3B) + 控制数据(192B) + 校验和(4B) + 帧尾(4B)
总长度:208字节
控制数据格式(表3)
工作模式(1B) + 工作指令(1B) + 成像模式(1B) + 分辨率(1B) + 预留(4B) +
航线参数(多个) + 飞行参数(多个) + 其他参数(多个)
总长度:192字节(小端模式)
响应包格式(表9)
帧头(4B) + 状态包类型(8B) + 设备编号(1B) + 预留(3B) + 系统版本(4B) +
错误包(8B) + 设备状态(64B) + 校验和(4B) + 帧尾(4B)
总长度:100字节
回波数据包格式(表12)
同步码(2B) + 设备编号(2B) + 序号(2B) + 分包编号(2B) + 分包个数(2B) +
包大小(2B) + 负载数据(可变) + 校验和(1B) + 帧尾(1B)
最大长度:1472字节
工作指令
| 指令 | 工作模式 | 工作指令 | 说明 |
|---|---|---|---|
| 连接 | 0 | 4 | 建立连接,启动状态包发送 |
| 断开连接 | 0 | 5 | 断开连接,停止状态包发送 |
| 上传航线 | 4 | 0 | 上传航线参数 |
| 开始计算 | 4 | 1 | 开始计算开关机 |
| 手动开机 | 4 | 2 | 手动开启雷达 |
| 结束当前任务 | 4 | 3 | 关闭当前任务 |
| 结束所有任务 | 0 | 3 | 停止所有任务 |
使用示例
启动服务器
from main import RadarControlSystem
# 创建系统
system = RadarControlSystem()
# 启动系统
system.start()
# 保持运行
import time
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
system.stop()
运行测试客户端
# 在一个终端启动服务器
python3 main.py
# 在另一个终端运行测试客户端
python3 test_client.py
自定义使用
from module1_receiver import UDPReceiver
from module2_sender import ResponseSender
from module3_data_sender import DataSender
from data_structures import ControlPacket, ExecutionStatus
# 创建接收模块
def on_packet_received(packet, remote_addr):
print(f"Received packet from {remote_addr}")
print(f"Work Mode: {packet.control_data.work_mode}")
print(f"Work Instruction: {packet.control_data.work_instruction}")
receiver = UDPReceiver(callback=on_packet_received)
receiver.start()
# 创建发送模块
sender = ResponseSender()
sender.send_response(('127.0.0.1', 12345), ExecutionStatus.SUCCESS)
# 创建数据发送模块
data_sender = DataSender()
echo_data = b'Echo data test' * 100
data_sender.send_echo_data(('127.0.0.1', 12345), echo_data)
文件结构
udp_program/
├── __init__.py # 包初始化文件
├── data_structures.py # 数据结构定义
├── module1_receiver.py # 模块1:接收模块
├── module2_sender.py # 模块2:发送响应模块
├── module3_data_sender.py # 模块3:数据发送模块
├── main.py # 主程序
├── test_client.py # 测试客户端
└── README.md # 本文档
关键特性
- 完整的数据结构支持:根据文档表格完整实现所有数据结构
- 自动分包处理:回波数据自动分包,最大1472字节/包
- 校验和验证:支持Uint32和Uint8校验和计算和验证
- 小端模式:所有数据采用小端模式序列化
- 线程安全:接收和发送在独立线程中运行
- 完整日志:详细的日志输出便于调试
- 回调机制:接收模块支持自定义回调处理
校验机制
控制包校验
- 帧头:0x7EFFDC01
- 帧尾:0x7EFFDC02
- 校验和:从帧头到校验和(不包含)的所有字节Uint32无符号累加
回波数据包校验
- 同步码:0x650F(回波)或0x750F(图像)
- 帧尾标志:0xCB
- 校验和:除校验字节外所有字节Uint8累加
连接流程
- 主控发送"连接"指令到38101端口
- 雷达接收并校验
- 雷达通过37001端口发送响应包(状态包类型=0,执行状态=0)
- 连接成功后,雷达开始向37001端口发送状态包(1s/次)
- 主控发送"断开连接"指令
- 雷达停止发送状态包
日志输出
系统使用Python标准logging库,支持以下日志级别:
- INFO:一般信息
- WARNING:警告信息
- ERROR:错误信息
- DEBUG:调试信息
可通过修改日志级别来控制输出详细程度:
import logging
logging.basicConfig(level=logging.DEBUG)
性能指标
- 接收延迟:< 1ms
- 发送延迟:< 1ms
- 状态包发送频率:1Hz(可配置)
- 最大分包大小:1472字节
- 支持并发客户端:无限制
故障排查
端口被占用
# 查看端口占用情况
lsof -i :38101
lsof -i :37001
lsof -i :37004
# 杀死占用进程
kill -9 <PID>
接收不到数据
- 检查防火墙设置
- 确认服务器正在运行
- 检查客户端发送地址是否正确
- 查看日志输出
校验和错误
- 确认数据格式正确
- 检查字节序(应为小端模式)
- 验证校验和计算逻辑
扩展功能
添加自定义指令处理
在RadarControlSystem类中添加新的处理方法:
def _handle_custom_instruction(self, remote_addr, control_data):
"""处理自定义指令"""
# 添加处理逻辑
self._send_response(remote_addr, ExecutionStatus.SUCCESS)
添加数据持久化
可以添加数据库支持来存储接收到的指令和状态信息。
添加Web界面
可以使用Flask/Django等框架添加Web管理界面。
版本历史
- v1.0.0 (2026-01-19):初始版本,完整实现三个模块
许可证
MIT License
联系方式
如有问题或建议,请联系开发团队。