skyeyesystem/MiniSAR-Simulator-Py-main/README.md

260 lines
7.0 KiB
Markdown
Raw Permalink Normal View History

# UDP交互程序
基于Python3的完整UDP交互系统包含三个独立模块用于实现雷达控制系统的通信功能。
## 系统架构
### 三个模块
#### 模块1UDP接收模块module1_receiver.py
- **功能**监听38101端口接收来自主控的控制指令
- **主类**`UDPReceiver`
- **关键方法**
- `start()`:启动接收模块
- `stop()`:停止接收模块
- `set_callback(callback)`:设置接收回调函数
#### 模块2UDP发送响应包模块module2_sender.py
- **功能**向37001端口发送控制指令的执行结果和状态包
- **主类**`ResponseSender`、`StatusPacketSender`
- **关键方法**
- `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 | 停止所有任务 |
## 使用示例
### 启动服务器
```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 <PID>
```
### 接收不到数据
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
## 联系方式
如有问题或建议,请联系开发团队。