4、数据流捕获基础:使用mavlink-router、mavproxy、Wireshark抓包
做无人机通信调试,说白了就是跟数据流打交道。你写的代码对不对?协议有没有解析错?延迟到底在哪?这些问题,光靠看日志是看不出来的。我个人的习惯是——先把数据流抓到眼前,再谈优化。
这一章,我们就来聊聊怎么把 MAVLink 数据流「看」清楚。我会带你过一遍三个工具:mavlink-router、MAVProxy 和 Wireshark。它们各有各的脾气,但组合起来,基本能覆盖你 90% 的抓包场景。
核心思路:抓包不是为了看热闹,是为了定位问题。所以,你得先搞清楚数据从哪来、到哪去、中间经过了谁。
4.1 为什么需要这三个工具?
你可能在想:一个工具不够吗?嗯,还真不够。每个工具都有自己的「视力范围」。
- mavlink-router:它是个数据搬运工。负责把飞控的串口数据转成 UDP,再分发给多个地面站或记录器。我一般用它做数据分发和简单过滤。
- MAVProxy:这是个全功能地面站,但它的抓包能力被很多人忽略了。它内置了
log和dump命令,可以实时记录原始 MAVLink 报文。 - Wireshark:这是协议分析的王牌。它能解析 MAVLink 2 协议,让你看到每个字节的细节。说白了,它就是你的「协议显微镜」。
我的建议:现场调试用 MAVProxy 快速抓包,事后分析用 Wireshark 深挖。mavlink-router 则适合做长期的数据记录和转发。
4.2 使用 mavlink-router 抓包
mavlink-router 是 Intel 开源的工具,最初是为 Intel Aero 开发的。它轻量、稳定,我曾在几个工业级项目里用它做 7×24 小时的数据记录,没出过问题。
4.2.1 安装与基本配置
# 从源码编译
git clone https://github.com/mavlink-router/mavlink-router.git
cd mavlink-router
meson setup build
ninja -C build
sudo ninja -C build install
安装完后,你需要写一个配置文件。我个人习惯把它放在 /etc/mavlink-router/config.conf。
[General]
DebugLogLevel = info
[UartEndpoint to_fc]
Device = /dev/ttyACM0
Baud = 115200
[UdpEndpoint to_gcs]
Mode = server
Address = 0.0.0.0
Port = 14550
[UdpEndpoint to_logger]
Mode = client
Address = 127.0.0.1
Port = 14560
这个配置做了三件事:
- 从串口
/dev/ttyACM0读取飞控数据 - 转发到 UDP 端口 14550(给地面站)
- 同时转发到本地 14560(给抓包工具)
4.2.2 启动与验证
sudo mavlink-routerd -c /etc/mavlink-router/config.conf
启动后,你可以用 netstat -uln 检查端口是否在监听。我记得有一次,怎么都连不上飞控,最后发现是串口权限没配好——嗯,dialout 用户组别忘了加。
注意:mavlink-router 默认不会记录数据到文件。你需要配合 mavlink-routerd --log-dir /path/to/logs 参数,或者用外部工具从 UDP 端口抓取。
4.3 使用 MAVProxy 抓包
MAVProxy 是我用得最多的地面站,尤其是在野外调试时。它轻量、脚本化,而且抓包功能非常直接。
4.3.1 启动并连接
mavproxy.py --master=tcp:127.0.0.1:5760 --out=udp:127.0.0.1:14550
这里 --master 指定数据源,--out 指定输出。如果你用 mavlink-router 转发,可以直接连它的 UDP 端口。
4.3.2 实时抓包命令
进入 MAVProxy 命令行后,有几个命令你必须要记住:
| 命令 | 作用 | 示例 |
|---|---|---|
log list |
查看当前已记录的日志文件 | 显示所有 .mavlink 文件 |
log start |
开始记录原始 MAVLink 数据 | log start |
log stop |
停止记录 | log stop |
dump |
实时打印报文到终端 | dump 或 dump --raw |
set |
设置过滤条件 | set heartbeat_rate 1 |
举个例子,我只想抓 GPS 相关的报文:
MAV> log start
MAV> set dump_filter GPS_RAW_INT,GLOBAL_POSITION_INT
MAV> dump
这样终端只会显示你关心的报文,不会刷屏。我在一次飞行测试中,就是用这个功能快速定位到了 GPS 数据更新率异常的问题。
小技巧:MAVProxy 的日志文件是二进制的 .mavlink 格式。你可以用 mavlogdump.py 工具把它转成可读的文本或 JSON,方便后续分析。
4.4 使用 Wireshark 深度分析
Wireshark 是协议分析的终点站。当你在 MAVProxy 里看到数据异常,但搞不清原因时,就该请出 Wireshark 了。
4.4.1 配置 Wireshark 解析 MAVLink
Wireshark 从 2.6 版本开始内置了 MAVLink 协议解析器。但你需要告诉它监听哪个端口:
- 打开 Wireshark,选择捕获接口(通常是
lo或你的网卡) - 在过滤栏输入
udp.port == 14560(假设你从 mavlink-router 转发到这个端口) - 右键任意一个 MAVLink 报文,选择 Decode As… → 选择 MAVLink
配置好后,Wireshark 会自动解析每个报文的字段。你会看到类似这样的信息:
MAVLink 2 Message
Header: 0xFD
Payload Length: 28
Sequence Number: 42
System ID: 1
Component ID: 1
Message ID: 33 (GLOBAL_POSITION_INT)
Payload:
Time Boot Ms: 12345678
Latitude: 31.2304°
Longitude: 121.4737°
Altitude: 50.12 m
Relative Altitude: 10.05 m
VX: 0.01 m/s
VY: -0.02 m/s
VZ: -0.05 m/s
Heading: 18000 (cdeg)
4.4.2 常用过滤技巧
Wireshark 的过滤功能非常强大。我常用的几个过滤表达式:
| 过滤表达式 | 作用 |
|---|---|
mavlink.msgid == 0 |
只显示 HEARTBEAT 报文 |
mavlink.sysid == 1 |
只显示系统 ID 为 1 的报文 |
mavlink.payload contains "31.23" |
搜索包含特定数值的报文 |
!mavlink |
排除所有 MAVLink 报文,看其他协议 |
我曾经用 mavlink.msgid == 0 配合 Statistics → IO Graph,画出了心跳包的时序图。结果发现心跳间隔从 1 秒变成了 3 秒——嗯,飞控的调度线程出了问题。
注意:Wireshark 默认只解析 MAVLink 1。如果你的飞控用的是 MAVLink 2,需要在 Edit → Preferences → Protocols → MAVLink 中勾选 Use MAVLink 2。否则你会看到一堆乱码。
4.5 实战:三工具联动抓包
说了这么多,我们来走一遍完整的流程。假设你有一台 Pixhawk 飞控,想同时做实时监控和离线分析。
- 启动 mavlink-router:把飞控串口数据转发到 UDP 14550(给地面站)和 UDP 14560(给抓包工具)。
- 启动 MAVProxy:连接
udp:127.0.0.1:14550,执行log start开始记录。 - 启动 Wireshark:监听
udp.port == 14560,配置 MAVLink 2 解析。 - 执行飞行任务:让无人机起飞、悬停、降落。
- 停止记录:MAVProxy 执行
log stop,Wireshark 保存捕获文件。
这样,你手里就有了两份数据:MAVProxy 的二进制日志(适合回放),Wireshark 的 pcapng 文件(适合深度分析)。
避坑指南:我曾经在抓包时忘了关防火墙,结果 Wireshark 什么都抓不到。如果你发现 Wireshark 里没有报文,先检查 iptables 或 ufw 是否放行了对应端口。
4.6 本章小结
抓包这件事,工具是死的,思路是活的。mavlink-router 负责分发,MAVProxy 负责实时记录,Wireshark 负责深度分析。三者配合,基本能覆盖你从现场调试到事后复盘的所有需求。