4. 地面站通信协议测试基础
地面站与无人系统之间的“对话”并不是单一协议完成的。一架典型的多旋翼或固定翼平台,飞控内部可能通过 CAN 连接电调与电池管理单元,飞控与机载计算机之间走串口或 UDP,机载链路再通过数传电台把 MAVLink 报文送到地面站。地面站自动化测试首先要分清:哪些协议负责“语义”,哪些协议负责“承载”,哪些协议负责“设备互联”。只有把角色分清,才能设计出有针对性的自动化验证用例。
四类协议在地面站中的角色分工
MAVLink 是应用层消息协议,定义心跳、姿态、GPS、命令、任务、参数等消息的字段、编号与打包规则。它不关心底层是串口还是 UDP,只关心“这条消息代表什么”。地面站测试中,MAVLink 层要验证消息 ID、字段取值范围、CRC 校验、序列号递增、系统 ID/组件 ID 是否符合约定。
串口(UART/USB 虚拟串口)是点对点字节流承载,常见参数为波特率 57600 或 115200、8 数据位、无校验、1 停止位。它没有寻址能力,也没有重传机制,因此串口测试重点是链路是否打开、字节流是否连续、MAVLink 帧是否在字节流中正确切分。
UDP/TCP 是网络承载。UDP 无连接、可能丢包、可能乱序,适合遥测高频广播;TCP 面向连接、可靠有序,适合参数下载、日志回传等场景。地面站测试要区分:UDP 下丢包是正常现象,需验证丢包统计与重连逻辑;TCP 下断链必须触发重连,且不能把半包当成完整 MAVLink 帧。
CAN 是设备级总线,常用于飞控与电调、电池、云台之间的通信。它有自己的仲裁、帧 ID 与错误帧机制。地面站通常不直接“说 CAN”,而是通过飞控转发或调试接口读取 CAN 设备状态。因此 CAN 测试更多是验证飞控是否正确聚合了 CAN 节点数据,并在 MAVLink 遥测中体现出来。
协议一致性验证:从字段到行为
协议一致性不是“能收到消息”就算通过。以 MAVLink 心跳为例,HEARTBEAT 消息包含 type、autopilot、base_mode、custom_mode、system_status、mavlink_version 等字段。自动化测试应构造一个“期望值表”,逐字段断言:type 是否为固定翼或多旋翼对应值,autopilot 是否为 ArduPilot 或 PX4,base_mode 的 armed 位是否与解锁状态一致。若地面站显示“已解锁”但 base_mode 的 bit7 为 0,就是典型的一致性缺陷。
对于串口和 UDP/TCP,一致性体现在“帧边界”处理上。MAVLink v2 帧以 0xFD 开头,包含长度、序列号、系统 ID、组件 ID、消息 ID、载荷和 CRC。自动化测试可以注入一段人为拼接的字节流:前半帧 + 噪声 + 后半帧,验证解析器是否能丢弃噪声并重新同步。若解析器把噪声当成载荷,后续所有消息都会错位,表现为“心跳正常但姿态数据乱跳”。
心跳、丢包与重连的自动化验证方法
心跳是链路存活的“脉搏”。地面站通常以 1 Hz 接收 HEARTBEAT,若连续 3 秒未收到,应判定链路超时并进入重连流程。自动化测试可以用一个可编程的 MAVLink 模拟器,按脚本控制心跳发送:正常发送 5 秒,然后暂停 4 秒,再恢复发送。测试脚本记录地面站状态变化的时间戳,断言“超时判定时间在 3.0~3.5 秒之间”“恢复后 1 秒内重新显示在线”。
丢包验证要区分承载类型。UDP 下,模拟器可以按 10% 概率丢弃遥测包,地面站应统计丢包率并在界面上显示,同时不能因为丢包而误判为断链。TCP 下,模拟器直接关闭 socket,地面站应在 1 秒内检测到连接断开并尝试重连,重连成功后重新订阅数据流。串口下,可以拔插 USB 或使用软件模拟串口关闭,验证地面站是否释放端口并允许重新打开。
# 示例:用 pymavlink 模拟心跳与丢包(教学示例,非实测)
from pymavlink import mavutil
import time, random
master = mavutil.mavlink_connection('udpout:127.0.0.1:14550')
for i in range(50):
if random.random() < 0.10:
time.sleep(0.1)
continue # 模拟 10% 丢包
master.mav.heartbeat_send(
mavutil.mavlink.MAV_TYPE_QUADROTOR,
mavutil.mavlink.MAV_AUTOPILOT_ARDUPILOTMEGA,
0, 0, mavutil.mavlink.MAV_STATE_ACTIVE)
time.sleep(0.1)
重连验证的关键是“状态可观测”。地面站应暴露连接状态、重连次数、最后一次心跳时间等内部状态,供自动化脚本读取。若地面站只提供界面显示而无接口,测试只能靠截图比对,效率低且不稳定。因此,在测试设计阶段就应推动地面站提供日志或状态查询接口,例如通过本地 TCP 端口输出 JSON 状态。
CAN 与串口的特殊注意点
CAN 总线测试通常不直接在地面站侧进行,而是通过飞控的 MAVLink 遥测间接验证。例如,电池管理单元通过 CAN 上报电压、电流、温度,飞控将其映射为 BATTERY_STATUS 消息。自动化测试可以断开某个 CAN 节点,观察地面站是否在 2 秒内显示电池数据失效,而不是继续显示旧值。串口测试则要注意流控:若使用 RTS/CTS 硬件流控,自动化脚本应能控制流控信号,验证地面站在缓冲区满时是否正确暂停发送。
可参考的自动化测试用例表
| 用例编号 | 协议 | 测试条件 | 预期结果 |
|---|---|---|---|
| HB-01 | MAVLink/UDP | 心跳正常 1 Hz 发送 5 秒 | 地面站显示在线,心跳计数递增 |
| HB-02 | MAVLink/UDP | 心跳暂停 4 秒后恢复 | 3~3.5 秒内判定超时,恢复后 1 秒内重新在线 |
| PK-01 | UDP | 按 10% 概率丢弃遥测包 | 丢包率统计约 10%,不触发断链 |
| RC-01 | TCP | 服务端主动关闭连接 | 1 秒内检测断开,自动重连并恢复数据 |
| SR-01 | 串口 | 注入半帧+噪声+半帧 | 解析器丢弃噪声,后续帧正确解析 |
| CN-01 | CAN→MAVLink | 断开电池 CAN 节点 | 2 秒内 BATTERY_STATUS 失效或告警 |
把上述用例写成脚本后,每次地面站版本更新都可以自动跑一遍,输出通过/失败列表和关键时间戳。这样,协议测试就从“人工点界面”变成了“可回归、可度量、可定位”的工程能力。