4、数据流捕获基础:使用mavlink-router、mavproxy、Wireshark抓包

做无人机通信调试,说白了就是跟数据流打交道。你写的代码对不对?协议有没有解析错?延迟到底在哪?这些问题,光靠看日志是看不出来的。我个人的习惯是——先把数据流抓到眼前,再谈优化。

这一章,我们就来聊聊怎么把 MAVLink 数据流「看」清楚。我会带你过一遍三个工具:mavlink-router、MAVProxy 和 Wireshark。它们各有各的脾气,但组合起来,基本能覆盖你 90% 的抓包场景。

核心思路:抓包不是为了看热闹,是为了定位问题。所以,你得先搞清楚数据从哪来、到哪去、中间经过了谁。

MAVLink 数据流捕获工具关系图 MAVLink 数据流捕获工具关系图 飞控 (FCU / PX4 / ArduPilot) 串口 / UDP mavlink-router UDP 转发 UDP 转发 MAVProxy Wireshark 说明: mavlink-router 作为数据分发中心,将飞控数据同时转发给 MAVProxy(用于实时监控)和 Wireshark(用于深度分析)。 三者配合,既能看实时状态,又能抓包做离线分析。

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 协议解析器。但你需要告诉它监听哪个端口:

  1. 打开 Wireshark,选择捕获接口(通常是 lo 或你的网卡)
  2. 在过滤栏输入 udp.port == 14560(假设你从 mavlink-router 转发到这个端口)
  3. 右键任意一个 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 飞控,想同时做实时监控和离线分析。

  1. 启动 mavlink-router:把飞控串口数据转发到 UDP 14550(给地面站)和 UDP 14560(给抓包工具)。
  2. 启动 MAVProxy:连接 udp:127.0.0.1:14550,执行 log start 开始记录。
  3. 启动 Wireshark:监听 udp.port == 14560,配置 MAVLink 2 解析。
  4. 执行飞行任务:让无人机起飞、悬停、降落。
  5. 停止记录:MAVProxy 执行 log stop,Wireshark 保存捕获文件。

这样,你手里就有了两份数据:MAVProxy 的二进制日志(适合回放),Wireshark 的 pcapng 文件(适合深度分析)。

避坑指南:我曾经在抓包时忘了关防火墙,结果 Wireshark 什么都抓不到。如果你发现 Wireshark 里没有报文,先检查 iptables 或 ufw 是否放行了对应端口。

4.6 本章小结

抓包这件事,工具是死的,思路是活的。mavlink-router 负责分发,MAVProxy 负责实时记录,Wireshark 负责深度分析。三者配合,基本能覆盖你从现场调试到事后复盘的所有需求。