Dump 1090 是一款专门为 RTLSDR 设备设计的 Mode S 解码器。
主要特性如下:
输入 "make"。
要直接从 RTL 设备捕获数据流,并将捕获的数据显示在标准输出上,直接不带任何选项运行程序即可:
./dump1090
仅输出十六进制报文:
./dump1090 --raw
以交互模式运行程序:
./dump1090 --interactive
以交互模式并启用网络支持运行程序,然后用浏览器访问 http://localhost:8080 查看实时数据流:
./dump1090 --interactive --net
在交互模式下,可以切换到信息密度较低但更具"街机风格"的输出,屏幕每秒刷新一次,显示所有最近检测到的飞机,并附带从接收到的 Mode S 数据包中提取的额外信息,如高度和航班号。
要从文件解码数据,请使用:
./dump1090 --ifile /path/to/binfile
该二进制文件应使用 rtl_sdr 按如下方式创建(或使用任何其它能够以 2Mhz 采样率输出 8 位无符号 IQ 采样的程序)。
rtl_sdr -f 1090000000 -s 2000000 -g 50 output.bin
在示例中 rtl_sdr 使用了 50 的增益,简单来说,你应该使用调谐器支持的最高增益。调用 Dump1090 本身时则无需如此,因为它能够自动选择支持的最高增益。
还可以使用 --ifile 选项并将 "-" 作为参数,通过标准输入向程序提供数据。
Dump1090 还可以配合其它命令行选项调用,以设置不同的增益、频率等。要查看选项列表,请使用:
./dump1090 --help
这里没有记载的内容应该都很直观,对大多数用户来说,完全不带参数调用它是最好的做法。
默认情况下,Dump1090 在可用时使用 24 位 CRC 校验和检查解码错误。带有错误的报文会被丢弃。
--fix 命令行选项启用基于 CRC 校验和的单比特错误纠正。从技术上讲,它使用一个由单比特错误导致的预计算校验和差异表,来查找出错的比特位置。
这确实能够修复错误,而且根据我的经验它工作得非常可靠;不过,如果你需要非常可靠的数据,我建议使用 --no-fix 命令行选项来禁用错误修复。
就我有限的经验而言,即使在我使用其它程序遇到问题的情况下,Dump1090 也能解码大量报文;不过由于没有进行过正式测试,我不能断言该程序与其它类似程序相比是更好还是更差。
如果你能捕获到 Dump1090 无法正确解码的数据流,请给我发一封附带下载链接的电子邮件。我可能会在空闲时间尝试改进检测算法(这只是一个业余项目)。
通过 --net 启用网络支持后,Dump1090 会开始在端口 30002 和 30001 上监听客户端连接(如果需要,你可以更改这两个端口,参见 --help 输出)。
连接的客户端会尽快获得来自设备(如果使用了 --ifile,则来自文件)的数据,原始格式类似于以下内容:
*8D451E8B99019699C00B0A81F36E;
每条记录由单个换行符(LF 字符,十六进制 0x0A)分隔。
端口 30001 是原始数据输入端口,可用于向 Dump1090 提供与上述相同格式的数据,即十六进制报文以 * 开头并以 ; 字符结尾。
因此,例如如果有另一个远程 Dump1090 实例正在收集数据,可以通过如下方式将它的输出汇总到本地 Dump1090 实例:
nc remote-dump1090.example.net 30002 | nc localhost 30001
需要特别注意的是,通过端口 30001 接收到的内容也会广播给监听端口 30002 的客户端。
一般来说,从端口 30001 接收到的所有内容都会像来自 RTL 设备的正常数据流(或使用 --ifile 时来自文件的数据)一样被处理。
可以仅将 Dump1090 用作一个集线器(hub),使用 --ifile 并将 /dev/zero 作为参数,如下例所示:
./dump1090 --net-only
或者,也可以在屏幕上查看正在发生的事情:
./dump1090 --net-only --interactive
然后你就可以从互联网上的不同数据源向它提供数据。
连接的客户端会获得 SBS1(BaseStation)格式的报文,类似于:
MSG,4,,,738065,,,,,,,,420,179,,,0,,0,0,0,0
MSG,3,,,738065,,,,,,,35000,,,34.81609,34.07810,,,0,0,0,0
这可用于向各种数据共享网站提供数据,而无需使用另一个解码器。
Mode S 报文在 1090 Mhz 频率上传输。如果你有一根像样的天线,就能接收到离你位置相当远的飞机的信号,尤其是当你在户外且处于视野开阔的位置时。
你可以按照以下链接中的说明轻松制作一根非常便宜的天线:
http://antirez.com/news/46
凭借这根简易天线,我能够接收到 200 多公里外飞机的信号。
如果你对更专业的天线感兴趣,请查看以下资源:
使用 --aggressive 可以激活 激进模式,它是 Mode S 数据包检测与解码的改进版本。激进模式通常会占用更多 CPU(尤其是当有许多飞机发送 DF17 数据包时),但能够多检测到一些报文。
激进模式下的算法在以下方面进行了修改:
建议仅在数据流量较低的环境中使用激进模式,以便有机会捕获更多报文。
调试模式是一种可视化辅助手段,用于改进检测算法,或理解程序为何对给定输入不起作用。
在此模式下,报文以 ASCII 艺术风格的图形表示形式显示,展示以 2Mhz 采样的各个幅度条。
索引显示采样编号,其中 0 是检测到第一个 Mode S 峰值的采样点。在第一个峰值之前还会添加一些额外的背景噪声,以提供上下文。
要启用调试模式并查看可以记录哪些数据包组合,请使用 mode1090 --help 获取可用调试标志列表。
调试模式包含一个可选的 JavaScript 输出,用于通过 Web 浏览器可视化数据包;你可以使用 'tools' 目录下的 debug.html 文件来加载生成的 frames.js 文件。
代码有非常完善的注释,并且编写时力求易于理解。对于手头有 Mode S 规范的勤勉程序员来说,理解其工作原理应该是轻而易举的。
我使用的算法基本上是通过观察许多报文(使用一个临时的 SDL 程序显示)并尝试根据报文的图形外观来建模得到的。
如果你有 RTLSDR 设备,并且恰好身处飞机飞越头顶的区域,只需运行程序并检查信号即可。
不过,如果你没有 RTLSDR 设备,或者你所在地区飞机很少,你可以尝试 Dump1090 发行版中 "testfiles" 目录下附带的示例文件。
像这样运行即可:
./dump1090 --ifile testfiles/modes1.bin
它只是一个简单的过滤器,将原始 IQ 8 位采样作为输入,并输出一个文件,该文件去除了所有 I 和 Q 连续超过 32 个采样点低于指定 的部分。
像这样使用:
cat big.bin | ./dump1090 --snip 25 > small.bin
我用它来创建一个小型测试文件,以包含在该程序源代码发行版中。
Dump1090 是在 2012 年圣诞节期间利用一些空闲时间编写的,这是一个业余项目,因此我只能利用空闲时间处理问题并改进它;不过,我们鼓励你发送 pull request 来改进该程序。源代码发行版中附带的 TODO 列表可以作为一个很好的起点。
Dump1090 由 Salvatore Sanfilippo [email protected] 编写,并根据 BSD 三条款许可证发布。