Dump1090 是一款专为 RTLSDR 设备设计的 Mode S 解码器。
主要功能包括:
虽然我会不定期在我的分支中添加/修复功能,但我追求实现上的极简主义。然而,有一个由 MalcolmRobb 开发的功能更丰富的分支可用。
键入 "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 尝试使用 CRC 校验和修复比特错误。该程序使用预计算的校正子表来快速识别并纠正接收消息中最多两个比特错误。
这确实能够修复错误,并且根据我的经验,它工作可靠。然而,如果您对数据的可靠性要求很高,我建议使用 --no-fix 命令行开关来禁用错误修复。
根据我有限的经验,即使在使用其他程序遇到问题的情况下,Dump1090 也能解码大量消息。不过,没有进行正式测试,因此我无法断言此程序与其他类似程序相比更好或更差。
如果您能捕获 Dump1090 无法正确解码的流量,请发送电子邮件给我并提供下载链接。我可能会在空闲时间尝试改进检测(这只是一个业余项目)。
Dump1090 可以解码地面位置消息(类型代码 5-8),这些消息由飞机在地面时(滑行、在登机口等待等)发送。这些消息包含飞机的位置、地速和地面航迹。
地面位置使用与空中位置不同的编码:CPR(简洁位置报告)格式仅覆盖 90 度而不是 360 度,并且需要参考位置在 45 海里以内才能进行明确解码。
Dump1090 不需要您配置接收器的位置,而是通过平均所有成功解码的空中位置来自动计算参考位置。这是因为,如果您能接收到机场的地面交通,那么您几乎肯定也能接收到空中交通。飞越飞机的平均位置提供了一个足够接近(远在 45 海里要求之内)的参考,以便解码地面位置。
注意:只有在至少成功解码一个空中位置以建立参考后,才会显示地面位置。在地面上的飞机将在交互式显示中以高度 0 显示。
通过 --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 时)的正常流量一样处理。
可以使用 --ifile 并将 /dev/zero 作为参数,仅将 Dump1090 用作集线器,如以下示例所示:
./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 峰值的样本。在第一个峰值之前还会添加一些额外的背景噪声,以提供一些背景信息。
要启用调试模式并检查您可以记录的数据包组合,请使用 dump1090 --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 年圣诞节的空闲时间编写的,这是一个业余项目,因此我只能在空闲时间处理问题并改进它。但是,欢迎您发送拉取请求以改进程序。一个很好的起点是源代码发行版中包含的 TODO 列表。
Dump1090 由 Salvatore Sanfilippo [email protected] 以及随着时间的推移发送补丁的其他贡献者(查看提交历史以获取更多信息)编写,并根据 BSD 三条款许可证发布。