通讯类说明

This commit is contained in:
2025-09-16 19:33:25 +08:00
parent bb4eaa3cf9
commit 2860218520
+42
View File
@@ -0,0 +1,42 @@
核心通信层
Endpoint.hpp
定义了一个抽象基类 Endpoint,表示任何数据端点(比如串口、UDP)。
统一接口:open() / close() / writeBytes()。
支持设置回调 setRxHandler(),用于接收原始字节。
所有具体端点(串口/UDP)都继承它。
SerialEndpoint.hpp/.cpp
封装了一个 串口 端点,基于 QSerialPort。
用于和无人机(飞控)进行物理连接。
读串口字节 → 转发给代理;代理写入时 → 原样发给无人机。
UdpHubEndpoint.hpp/.cpp
封装了一个 UDP Hub 端点,允许多个 GCS(地面站)同时连接。
监听一个端口(比如 14550),记录所有发过数据的 (IP,Port)。
上行(GCS→无人机):转发给串口。
下行(无人机→GCS):广播给所有已知 GCS。
自动剔除 30 秒无流量的 GCS。
数据转发和解析
ProxyConnection.hpp/.cpp
实现 双向透明转发:
把无人机来的数据 → UDP Hub。
把地面站来的数据 → 串口。
同时把字节复制给 MavlinkTap(做解析/监控)。
保证 GCS 与无人机的原始通信 不被破坏。
MavlinkTap.hpp/.cpp
被动解析模块。
使用 mavlink_parse_char 对字节流做解析。
收到完整消息就发出 messageParsed 信号。
仅用于监控显示,不修改原始通信。
Injector.hpp/.cpp
提供 注入功能,允许代理自己构造 MAVLink 消息并发送(比如 Heartbeat)。
用于测试或向 GCS/无人机发额外指令。
要注意 sysid/compid 不要和飞控/GCS 冲突。
如果链路启用 MAVLink2 签名,没有密钥的注入会被拒绝。
ProxyService.hpp/.cpp
ProxyService 内部自带 QThread:创建它就准备好了线程,start() 时自动在 IO 线程执行 open()/bind()、开始转发和解析;stop() 会安全关闭。
跨线程安全:对外 API(如 sendHeartbeat()、addStaticPeer())使用 QMetaObject::invokeMethod 以 Queued 方式排队到 IO 线程执行;messageParsed、peerAdded/Removed 等信号已用 Qt::QueuedConnection 跨到主线程。