# 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 | 停止所有任务 | ## 使用示例 ### 启动服务器 ```python from main import RadarControlSystem # 创建系统 system = RadarControlSystem() # 启动系统 system.start() # 保持运行 import time try: while True: time.sleep(1) except KeyboardInterrupt: system.stop() ``` ### 运行测试客户端 ```bash # 在一个终端启动服务器 python3 main.py # 在另一个终端运行测试客户端 python3 test_client.py ``` ### 自定义使用 ```python 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 # 本文档 ``` ## 关键特性 1. **完整的数据结构支持**:根据文档表格完整实现所有数据结构 2. **自动分包处理**:回波数据自动分包,最大1472字节/包 3. **校验和验证**:支持Uint32和Uint8校验和计算和验证 4. **小端模式**:所有数据采用小端模式序列化 5. **线程安全**:接收和发送在独立线程中运行 6. **完整日志**:详细的日志输出便于调试 7. **回调机制**:接收模块支持自定义回调处理 ## 校验机制 ### 控制包校验 - 帧头:0x7EFFDC01 - 帧尾:0x7EFFDC02 - 校验和:从帧头到校验和(不包含)的所有字节Uint32无符号累加 ### 回波数据包校验 - 同步码:0x650F(回波)或0x750F(图像) - 帧尾标志:0xCB - 校验和:除校验字节外所有字节Uint8累加 ## 连接流程 1. 主控发送"连接"指令到38101端口 2. 雷达接收并校验 3. 雷达通过37001端口发送响应包(状态包类型=0,执行状态=0) 4. 连接成功后,雷达开始向37001端口发送状态包(1s/次) 5. 主控发送"断开连接"指令 6. 雷达停止发送状态包 ## 日志输出 系统使用Python标准logging库,支持以下日志级别: - INFO:一般信息 - WARNING:警告信息 - ERROR:错误信息 - DEBUG:调试信息 可通过修改日志级别来控制输出详细程度: ```python import logging logging.basicConfig(level=logging.DEBUG) ``` ## 性能指标 - 接收延迟:< 1ms - 发送延迟:< 1ms - 状态包发送频率:1Hz(可配置) - 最大分包大小:1472字节 - 支持并发客户端:无限制 ## 故障排查 ### 端口被占用 ```bash # 查看端口占用情况 lsof -i :38101 lsof -i :37001 lsof -i :37004 # 杀死占用进程 kill -9 ``` ### 接收不到数据 1. 检查防火墙设置 2. 确认服务器正在运行 3. 检查客户端发送地址是否正确 4. 查看日志输出 ### 校验和错误 1. 确认数据格式正确 2. 检查字节序(应为小端模式) 3. 验证校验和计算逻辑 ## 扩展功能 ### 添加自定义指令处理 在`RadarControlSystem`类中添加新的处理方法: ```python 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 ## 联系方式 如有问题或建议,请联系开发团队。