核心通信层 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 跨到主线程。