skyeyesystem/MiniSAR-Simulator-Py-main/README.md
2026-01-29 09:47:15 +08:00

7.0 KiB
Raw Permalink Blame History

UDP交互程序

基于Python3的完整UDP交互系统包含三个独立模块用于实现雷达控制系统的通信功能。

系统架构

三个模块

模块1UDP接收模块module1_receiver.py

  • 功能监听38101端口接收来自主控的控制指令
  • 主类UDPReceiver
  • 关键方法
    • start():启动接收模块
    • stop():停止接收模块
    • set_callback(callback):设置接收回调函数

模块2UDP发送响应包模块module2_sender.py

  • 功能向37001端口发送控制指令的执行结果和状态包
  • 主类ResponseSenderStatusPacketSender
  • 关键方法
    • send_response(remote_addr, status, device_status):发送响应包
    • send_status_packet(remote_addr, device_status):发送设备状态包

模块3UDP数据包发送模块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                # 本文档

关键特性

  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调试信息

可通过修改日志级别来控制输出详细程度:

import logging
logging.basicConfig(level=logging.DEBUG)

性能指标

  • 接收延迟:< 1ms
  • 发送延迟:< 1ms
  • 状态包发送频率1Hz可配置
  • 最大分包大小1472字节
  • 支持并发客户端:无限制

故障排查

端口被占用

# 查看端口占用情况
lsof -i :38101
lsof -i :37001
lsof -i :37004

# 杀死占用进程
kill -9 <PID>

接收不到数据

  1. 检查防火墙设置
  2. 确认服务器正在运行
  3. 检查客户端发送地址是否正确
  4. 查看日志输出

校验和错误

  1. 确认数据格式正确
  2. 检查字节序(应为小端模式)
  3. 验证校验和计算逻辑

扩展功能

添加自定义指令处理

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

联系方式

如有问题或建议,请联系开发团队。