在树莓派上使用RTL - SDR和Dump1090跟踪飞机

使用RTL - SDR和Dump1090跟踪飞机

我在发条uConsole(运行树莓派CM4)上装好了RTL - SDR后,就想找个项目来测试下这个设备的功能。目前GNU Radio Companion对我来说有点复杂,所以我打算找个入门门槛低些的项目。

GitHub上有个叫dump1090的项目吸引了我。它是个“Mode S”解码器,能利用RTL - SDR解码飞机转发器的信息。虽说这个软件包有点年头了,但还有人在进行最低限度的维护。它的依赖项少,即便在CM4这种硬件资源有限的设备上,通常也能顺利编译,不用安装过多额外的软件包,也不容易出问题。

在本文中,我会逐步介绍如何从源代码编译dump1090命令,然后用该命令跟踪飞机的动态。在Drupal开发中,也有类似的情况,像Drupal模块开发就需要对代码进行编译和配置,来实现不同的功能。Drupal11更是带来了新的特性和优化,就如同dump1090项目也在不断发展一样。

一、安装依赖项

假设你已经按照我之前写的在树莓派上安装RTL - SDR的指南操作过,那应该已经安装了继续进行本文操作所需的所有依赖项。你可以用以下命令确保所有依赖项都已安装。

sudo apt-get install git cmake libusb-1.0-0-dev build-essential

要注意,只有当你要把仓库克隆到本地文件时才需要用到git,你也可以直接以压缩包的形式下载该仓库然后继续后续操作。另外,你可能还得安装一个叫“pkg - config”的软件包,这取决于你在编译过程中是否遇到与pkg - config包相关的错误。

如果你用git,可以下载该软件包,进入刚创建的目录,然后用“make”命令进行编译。

$ git clone https://github.com/antirez/dump1090.git
$ cd dump1090
$ make

要是一切顺利,你现在应该有个叫dump1090的可执行文件。你可以用--help标志来运行该文件,测试一切是否正常。

./dump1090 --help
--device-index <index>   选择RTL设备(默认值:0)。
--gain <db>              设置增益(默认值:最大增益。使用 - 100 表示自动增益)。
--enable-agc             启用自动增益控制(默认值:关闭)。
--freq <hz>              设置频率(默认值:1090兆赫)。
--ifile <filename>       从文件读取数据(使用“ - ”表示标准输入)。
--loop                   与 --ifile 一起使用时,循环读取同一文件。
--interactive            交互式模式,在屏幕上刷新数据。
--interactive-rows <num> 交互式模式中的最大行数(默认值:15)。
--interactive-ttl <sec>  如果空闲 <sec> 秒则从列表中移除(默认值:60)。
--raw                    仅显示消息的十六进制值。
--net                    启用网络功能。
--net-only               仅启用网络功能,不使用RTL设备或文件。
--net-ro-port <port>     原始输出的TCP监听端口(默认值:30002)。
--net-ri-port <port>     原始输入的TCP监听端口(默认值:30001)。
--net-http-port <port>   HTTP服务器端口(默认值:8080)。
--net-sbs-port <port>    基站格式输出的TCP监听端口(默认值:30003)。
--no-fix                 禁用使用CRC进行单比特纠错。
--no-crc-check           禁用CRC校验失败的消息(不建议)。
--aggressive             使用更多CPU来处理更多消息(两比特纠错等)。
--stats                  与 --ifile 一起使用时,退出时打印统计信息。无其他输出。
--onlyaddr               仅显示ICAO地址(用于测试)。
--metric                 使用公制单位(米、公里/小时等)。
--snip <level>           去除IQ文件中小于 <level> 的样本。
--debug <flags>          调试模式(详细信息),详见README。
--help                   显示此帮助信息。
调试模式标志:
d = 记录解码时出错的帧
D = 记录解码时无错误的帧
c = 记录CRC校验失败的帧
C = 记录CRC校验成功的帧
p = 记录前同步码错误的帧
n = 记录网络调试信息
j = 将帧记录到frames.js,可由debug.html加载。

这里选项很多,但最简单的办法是用--interactive标志启动软件定义无线电(SDR),并把结果输出到终端。

./dump1090 --interactive

运行此命令后,你应该会看到类似下面的输出。

Hex    Flight   Altitude  Speed   Lat       Lon       Track  Messages Seen   .
--------------------------------------------------------------------------------
407e31          14000     238     52.979    -2.359    312   10        32 sec
407fcc BAW9SW   38225     452     53.188    -2.433    153   79        22 sec
4ca643 RYR4UP   36000     496     53.272    -2.898    14    157       48 sec
4bc882          8000      324     53.394    -2.441    351   177       4 sec
39cf08 AFR630   36000     438     53.204    -2.006    306   259       54 sec
400a7c SHT3R    18050     354     53.047    -2.098    150   867       2 sec

我复制这段文本时,能看到六架飞机,其中有几架是未注册航班。这说明软件定义无线电(SDR)能正确捕捉飞机信息。

可以通过查找这些航班号获取更多信息。比如,航班BAW9SW是英国航空运营的从圣地亚哥飞往伦敦的航班。当时该航班从我所在位置由北向南飞过,前往伦敦,所以我才能捕捉到它的信息。其经纬度坐标53.188, - 2.433距离我现在的位置大约25英里。想想我只是用一个小型USB设备和一个桌面天线来接收信号,这真的很厉害。在Drupal升级过程中,我们也会遇到类似的惊喜,新的版本能带来更好的性能和功能体验。

大多数时候我只能捕捉到一两架飞机,这次能在屏幕上看到六架飞机只是巧合。我觉得,如果用更大的天线,或者搬到更靠近航线的地方,我能跟踪到更多飞机。我住的地方离任何机场都远,而且大多数航线都不会直接从我头顶飞过。

这已经很令人印象深刻了,但我们还能通过使用--net标志让它更上一层楼。

二、网络标志(--net)

dump1090有个实用的小功能,它内置了一个Web服务器,这意味着你能在地图上查看飞机信息。可以用--net标志启用此功能。你也可以同时用--interactive标志,获得双重显示效果。

./dump1090 --interactive --net

运行此命令后,会显示和之前一样的列表,但你现在可以打开Web浏览器,访问地址 http://localhost:8080,就能看到一个网页,上面会在地图上显示已识别航班的位置。这是我桌面的截图,交互式模式正在运行,网页在后台显示。

要查看某个航班的更多信息,你只需在地图上点击飞机图标即可。

由于这个地图是由leaflet.js提供支持并使用OpenLayers的,所以可以免费使用。如果你好奇的话,我要说一下,这个地图并不是以我当前的位置为中心的。

如果端口8080不可用(某些系统可能会出现这种情况),你可以用--net - http - port标志将其改为其他端口。

./dump1090 --interactive --net --net-http-port 9001

现在你可以通过地址 http://localhost:9001 查看地图。

地图视图不是最理想的,我常发现它打开的地图位置离实际飞机所在位置很远,而且点击飞机图标有时有点麻烦,通常要尝试几次。不过这个地图功能有趣的地方在于,它只是从地址 /data.json 的内部API获取数据,该API会返回包含飞机信息的JSON数据。这意味着你几乎可以用任何基于Web的服务来获取这些信息,然后将其保存到磁盘或生成自己的精美地图。

三、结论

我在文章开头提到过,antirez/dump1090软件包已经有一定历史了。我确实尝试下载并编译了这个仓库的多个分支版本,但它们要么无法正确编译,要么依赖太多我无法安装的软件包,要么几乎没有用于查看结果的界面。而旧版的antirez/dump1090软件包在跟踪飞机转发器代码方面表现出色,对初学者也很友好,这就如同简单易用的Drupal模块,能满足大多数开发者的入门需求。

我这里用的软件包指向 MalcomRobb的分支,但我没法让它正确编译。代码似乎有些问题,需要手动编辑C文件才能让它正常工作。如果你喜欢挑战,那没问题,但这对初学者可不太友好。

据我了解,FlightAware的dump1090版本可能是这个工具的最前沿版本。虽说它带有一个精美的地图工具,可与航班查询服务集成,但它没有内置Web服务器,所以你得自己配置主机来实现这一功能。

在我装了Ubuntu系统的树莓派上,dump1090工具的编译和运行都挺容易。实际上,让它运行起来并不比在系统上安装RTL - SDR驱动难。RTL - SDR加密狗价格挺便宜(目前售价为40英镑),很值得入手,因为它能开启多个不同的项目,其中飞机跟踪只是用dump1090实现的功能之一。就像Drupal开发能为网站带来丰富的功能一样,RTL - SDR也能为我们开启多样的探索。