ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

dump1090 Windows 版搭建 ADS-B 接收站:从驱动到数据接口实战

dump1090 Windows 版搭建 ADS-B 接收站:从驱动到数据接口实战 简介这是基于dump1090的Windows平台飞机追踪工具使用RTL-SDR软件无线电硬件接收并解码广播式自动相关监视信号适合航空爱好者和无线电入门者使用。该版本专为Windows环境优化整合了所需运行库无需额外配置即可运行。压缩包内共十八个文件除主程序、可视化界面、驱动库和运行库外另有八个网页脚本用于地图显示四个动态库负责硬件通信并含启动脚本与说明文档整体约602KB。目前已有八百三十二人学习下载。使用该工具可搭建简易地面站实时查看多架飞机的位置、高度、速度与航向批处理脚本支持一键启动。同时支持数据导出与航线回放便于后期分析既可作为飞行数据观察平台也有助于理解软件定义无线电和航空通信原理是业余无线电与飞行爱好者的实用工具。1. dump1090 Windows 版让台式机变成 ADS-B 接收站的第一步你在电脑前看着雷达地图每一条移动的轨迹都是一架真实的飞机这是 dump1090 的 Windows 版本配合一个几十块钱的 USB 电视棒就能做到的事。ADS-B 是民航客机主动对外广播的定位数据工作在 1090MHz信号本身是明文且不需要破解任何具备相应接收能力的人都可以读取。这个资源把 dump1090 编译成了 Windows 可直接运行的版本省掉了 Linux 虚拟机、Cygwin 编译这些前置折腾适合想用现成 PC 搭一套空域监控的航空爱好者也适合需要在本地采集真实航班数据做分析的开发者。版本号里的 1.10.3010.14 对应一个功能完整的构建解压以后不用自己配环境。2. ADS-B 解码链路1090MHz 信号到地图轨迹的四道工序2.1 信号链路天线、SDR 芯片和 Mode-S 报文格式1090MHz 上的 ADS-B 信号从飞机发出经过十几到几十公里的传输到达接收端时已经非常微弱。一条完整的接收链路是天线把电磁波转成电信号进入 USB 电视棒里的 RTL2832U 芯片完成正交采样采样数据以 I/Q 格式通过 USB 传给驱动最后送到 dump1090 做解码。RTL-SDR 电视棒本身是为 DVB-T 数字电视设计的覆盖 24MHz 到 1.7GHz1090MHz 正好落在范围内不需要额外做下变频。dump1090 要做的事比很多人想的多先检测 1090MHz 脉冲再按幅度判断 0/1 比特然后按 Mode-S 报文格式切出脉冲位置调制信号最后逐字段解析。Mode-S 报文分很多类型ADS-B 里最常见的是 DF17 报文其中按 Type Code 又分成身份、经纬度、气压高度、空中速度等子类型。值得注意的细节是经纬度用的是 CPR紧凑位置报告编码一次传输只携带奇偶其中一帧必须等到奇偶两帧都收到才能解出完整位置。所以飞机刚出现的那一两秒在地图上可能没有位置要等第二帧才“冒”出来。这也解释了为什么单接收机场景下远处飞机的轨迹更新会有几秒延迟这不是软件问题而是协议本身的设计。dump1090 输出的字段是标准化的ICAO 地址、航班号、高度、地速、航向、经纬度和垂直速率这些字段直接对应报文内容不经过任何第三方加工。对做数据采集的人来说本地解码比在线接口更适合当长期数据源因为拿到的是原始广播内容而不是服务商清洗后的结果。2.2 dump1090 各分支的差别为什么专门找 Windows 版dump1090 最早是 Salvatore Sanfilippo 写的研究项目后来社区演化出多个分支。主流分支里mutability 分支补强了网络功能和可靠性FlightAware 的 fa 分支在此基础上扩展了 MLAT 和更多输出端口功能最全但两者都是 Linux 下用 make 编译的源码工程。Windows 用户要跑起来常见的路数是装 WSL、开虚拟机、用 Docker 跑 Linux 容器或者装 Cygwin 自己编译。问题在于ADS-B 接收站的最佳摆放位置是窗边或阳台为这个场景维护一套 Linux 环境显然不划算而 Docker 在 Windows 上的资源占用也不小USB 接收棒透传给容器还要额外配置。这次拆的这个资源价值就在把 exe 和运行依赖都打包齐了。解压后不需要编译也没有复杂的库依赖路径里带 eastixg 字样说明这个构建指向的是 Windows 可执行版本的发布形态。这种方式的代价是功能上不会完全追平 fa 分支基础的网络端口、Web 地图、增益调优都有但 MLAT、多接收机协同这类高级能力支持有限使用前对这些边界要有预期。2.3 这套接收站技术的适用边界一句话概括这套技术栈适合单机单天线、固定位置、长期运行的 ADS-B 数据源不适合拿来做多站点 MLAT 精确定位实验。如果只是想把窗户变成一台“飞机雷达”每天看看头顶航班、记录油耗和航迹那这个版本完全够用。如果项目目标是算出小区域内所有飞机的完整三维坐标那就需要多台接收机做时间同步dump1090-win 只能负责其中单站点的数据出口后面的同步和融合算法要靠下游自己搭建。认清这条边界能少走不少弯路dump1090-win 是入口不是终点。数据从它这里出来后面的分析、可视化、上报都是你自己的施展空间。3. 装驱动、跑通解码Zadig 替换驱动与启动参数逐项拆解3.1 第一步用 Zadig 把接收棒驱动换成 WinUSB把电视棒插到 USB 口之前先打开设备管理器Win X 菜单里能直接进。插上之后系统通常会把 RTL-SDR 识别成一个“Bulk-In, Interface”设备或者带黄色感叹号的未知设备。这个状态下的设备 dump1090 是访问不了的因为默认加载的是电视棒厂商的 DVB-T 驱动功能不对口。解决方法是使用 Zadig 这个驱动替换工具。打开后菜单 Options 里勾选 List All Devices下拉列表里才会出现带 RTL 字样的设备。选中正确的设备后右边的目标驱动选 WinUSB然后点 Install Driver。安装完成后建议把设备拔下来重新插入一次让新驱动重新加载。这一步经常被忽略不重插的话 dump1090 照样报找不到设备。提示同一个电视棒插到不同的 USB 口Windows 会把新口当成新设备驱动可能要重新确认一遍固定使用同一个 USB 口是省心的做法。3.2 第二步命令行启动 dump1090解压资源包后目录下应该有 dump1090.exe 及配套的运行库。打开 CMD 或 PowerShell切到对应目录用下面这条命令做首次启动测试cd D:\dump1090-win.1.10.3010.14 dump1090.exe --net --gain 49.6 --net-http-port 8080如果使用 PowerShell第二行改成.\dump1090.exe --net --gain 49.6 --net-http-port 8080即可。启动后 CMD 窗口会滚动输出设备信息和解码消息说明设备已被正确识别。此时打开浏览器访问 http://127.0.0.1:8080 如果附近空域有航班地图上就会显示轨迹。逐个拆这三个参数。--net 是所有网络功能的开关打开后 dump1090 才会监听 JSON 和 Beast 端口不带这个参数程序只在控制台打印解码结果Web 页面根本不会启动。--gain 49.6 是接收增益单位 dB49.6 是 R820T2 芯片的中间档位适合室内自带小天线这个参数后面细说。--net-http-port 8080 指定 Web 端口本机访问时是 127.0.0.1:8080局域网里其他机器访问时要用你电脑的局域网 IP 加端口。3.3 常用启动参数增益、PPM 校正和端口对照表日常使用中我习惯把启动参数拆成几个固定组合。室外天线配低增益室内小天线配高增益但要小心失真PPM 参数用于校正电视棒晶振的频偏。下面这个表格列出最常用参数方便按需组合参数取值示例说明--device-index--device-index 0插了多根接收棒时按序号选择--gain--gain 40固定增益省略或 -1 表示自动--ppm--ppm 15晶振频偏校正先跑一段时间看统计--freq--freq 1090信号频率默认就是 1090--net--net启用网络输出--net-http-port--net-http-port 8080Web 界面端口--net-beast-port--net-beast-port 30005Beast 二进制协议 TCP 端口--net-ro-port--net-ro-port 30002文本格式 TCP 输出端口增益是最值得手动调的一项。RTL-SDR 的增益范围通常是 0 到 49.6dB我拿自动增益和固定 40dB 做过对比室内窗台环境下自动增益经常被某个强信号瞬间拉高背景噪声跟着抬高小飞机信号反而被淹没固定 40dB 时150 公里外的航班都能稳定解出来。所以如果你看到飞机数量总是稀稀拉拉先怀疑增益别急着怀疑天线。PPM 校正也是新手容易漏掉的一环。电视棒晶振普遍有 10-30ppm 的频偏这会让实际接收频率偏离 1090MHz典型现象是近距离飞机能解出来、远距离信号时断时续。把程序跑上几分钟观察日志里的信号统计再通过 --ppm 参数补偿。同一型号的两根接收棒频偏也可能差十几个 ppm不能照搬别人的参数。3.4 确认解码链路正常跑完启动命令后回到 CMD 窗口看日志。正常输出是持续刷新的解码消息每行以 ICAO 地址开头的十六进制加若干解码字段。如果窗口里只有打开设备的提示但后续没有消息说明设备没有被正确选中或者驱动没换成功如果持续有解码消息但 Web 界面空白多半是 --net 没带或者访问的端口不对回 3.2 的命令逐项对照即可。4. 把数据接出去Web 地图、data.json 实时读取和 Beast 转发4.1 Web 界面除了看地图还能拿到什么dump1090 的 Web 页面是一个完整的监控台根路径 / 是地图视图大约每 1 秒自动刷新飞机图标的位置、高度、航班号都在页面上一目了然。除了地图还有两个关键的数据端点/data.json 提供当前所有飞机的 JSON 快照/db.js 提供航班号和 ICAO 地址的映射关系。先看 /data.json 的典型结构。顶层是当前时间戳、总消息数和 aircraft 数组数组里每个元素是一架飞机的当前状态。我常关注的字段有hex 是 ICAO 24 位地址flight 是航班号字符串解析时注意去掉首尾空格altitude 单位是英尺speed 单位是节track 是航向角lat/lon 是经纬度。只有报文里带位置且被正确解码的飞机才会有 lat/lon 字段解码不满两帧的飞机只有 hex 没有位置这是正常的。4.2 用 Python 拉实时 JSON一个 20 行的数据采集脚本自己写采集脚本能把数据变成可加工的素材。下面这个脚本兼容 Python 3.8 以上直接请求 data.json把解析结果按 CSV 追加写入文件import csv import requests import time URL http://127.0.0.1:8080/data.json def fetch_and_save(pathadsb_log.csv): resp requests.get(URL, timeout5) data resp.json() with open(path, a, newline, encodingutf-8) as f: writer csv.writer(f) for ac in data.get(aircraft, []): if ac.get(lat) is None or ac.get(lon) is None: continue writer.writerow([ data[now], ac.get(hex, ), ac.get(flight, ).strip(), ac.get(altitude), ac.get(speed), ac.get(track), ac.get(lat), ac.get(lon), ]) if __name__ __main__: while True: try: fetch_and_save() except Exception as e: print(frequest failed: {e}) time.sleep(2)脚本逻辑是每 2 秒采集一次当前天空的飞机列表只保留有完整经纬度的记录再追加进 CSV。字段顺序对应时间戳、ICAO 地址、航班号、高度、速度、航向、纬度、经度。循环间隔不建议调到 1 秒以下因为 dump1090 的 data.json 刷新粒度大约就是 1 秒更快的轮询只是在重复拿同一份数据。requests 的 timeout 参数必须固定设置接收站偶尔会因为 USB 供电波动或系统休眠导致服务无响应没有 timeout 时脚本会卡在请求上设置了 timeout 后一次失败会走 except 分支继续下轮健壮得多。4.3 用 Beast 端口把数据转发给其他软件data.json 只用于状态快照若打算对接 tar1090、Virtual Radar Server 这类工具标准做法是用 Beast 二进制协议。这个协议在 1090MHz 接收数据处理上是事实标准启动时加上 --net-beast-port 30005dump1090 就会在 TCP 30005 端口持续广播消息下游软件以客户端身份连接即可分流数据。dump1090.exe --net --gain 40 --net-http-port 8080 --net-beast-port 30005Virtual Radar Server 配置时接收器类型选 Beast端口填 30005IP 填 127.0.0.1 即可。这样的架构把数据采集和解码交叉分离一台接收机可以同时喂多套软件接收端只需要负责解码和对外发布。如果后续要自己解析Python 的 socket 库直接连接 30005 端口就能读到二进制流按 Beast 协议的帧格式逐条解析字段即可。4.4 防火墙与局域网访问Web 页面和 Beast 端口默认监听本机回环地址局域网访问需要检查防火墙状态。Windows 防火墙第一次弹窗时记得允许“专用网络”的访问。比较隐蔽的问题是笔记本睡眠恢复后网络服务已经绑定但响应不正常典型症状是接口一直转圈重启 dump1090 进程即可恢复不需要拔插 USB 设备。另外Windows 上杀毒软件对未签名程序存在误报如果 exe 被拦截先从可信来源确认文件校验值再决定是否加入信任区。5. 避坑Windows 下跑 dump1090 的五个常见故障和排查5.1 报错找不到设备Zadig 驱动没换成功现象启动 dump1090 后日志显示“No RTL-SDR devices found”或者无法打开设备。原因最常见的就是 Zadig 替换驱动没有生效。这个版本依赖 WinUSB 驱动访问 RTL2832U 芯片而系统默认加载的是电视棒厂商的 DVB-T 驱动两者完全不兼容。次要原因是设备插到了 USB 3.0 hub 或前置面板部分 USB 控制器对电视棒供电和信号兼容性较差。解决重新打开 Zadig确认列表里选中的设备对应的是 RTL-SDR 而不是其他 USB 设备目标驱动选 WinUSB安装后拔插一次再启动程序。然后优先把设备插到主板背面的 USB 2.0 口绕开 hub。这两步能解决九成以上的设备识别问题。5.2 Web 页面一直转圈端口被占或防火墙拦截现象dump1090 进程运行正常但浏览器访问 8080 端口一直加载不出来。原因端口被其他程序占用或者 Windows 防火墙阻止了外部访问偶尔也有 IPv6 绑定导致回环地址访问异常的情况。解决先用netstat -ano | findstr 8080查看端口占用情况如果有其他进程占着就换一个端口比如带 --net-http-port 8088 重新启动。如果端口没有被占用检查防火墙入站规则确认 dump1090.exe 对 TCP 8080 的访问被放行。启动时记得确认带了 --net 参数否则服务根本没有监听端口。5.3 增益拉满飞机反而变少接收链路饱和现象窗外视野开阔但 dump1090 只能解出很近的几架飞机稍远一点的都没有。原因增益设置过高。R820T2 在增益接近 50dB 时通常已经进入饱和区强信号让前端放大器过载背景噪声整体抬高小信号被彻底压住。很多人想当然认为增益越高收得越远这实际上是最大的误调。解决把增益从 49.6 往下试每降 4dB 左右观察一次参考 Web 界面的消息数量变化。多数室内窗台场景落在 36-44dB 这个区间。调完后让程序跑 15 分钟再看统计短时间内飞机数量波动没有参考价值。5.4 飞机位置瞬跳多径干扰和天线摆放问题现象地图上某架飞机的位置每隔几秒就跳变一次有时跳到几公里外再跳回来。原因城市环境里信号从楼面反射到天线的路径不止一条反射信号叠加导致报文校验失败偶尔能通过校验的位被解出来就成了错位位置。dump1090 在单天线单机场景下无法判断哪个位置是真实的。解决从接收环境入手。把天线放在距离金属窗框 30cm 以上的位置避免贴墙安装电源适配器和天线保持足够距离。软件侧检查 --ppm 频偏设置是否合理频偏过大会导致持续的间歇性丢帧但如果是偶发跳变核心问题通常在天线位置而不是参数。5.5 杀毒软件把 exe 拦掉未签名程序的误报处理现象解压后启动程序Windows Defender 或其他杀毒软件直接隔离或者弹窗提示有风险。原因这个包不是商业签名的软件exe 和 DLL 属于个人开发者编译产物各家杀软的启发式引擎会把它标成潜在不受欢迎的程序。这是误报概率最高的情况并不代表程序本身就是恶意软件。解决下载后先校验文件的 SHA256 值和包内说明文档对照确认文件完整性。确认无误后在杀毒软件隔离区选择恢复并把解压目录加入信任区避免每次启动都被拦截。如果包内没有校验值至少确认一下文件大小和压缩包体积是否匹配防止下载途中被改包。6. 进阶开机自启与数据留存把接收站变成常驻数据源跑通第一版之后下一步不是去折腾更多功能而是让这套接收站自己养起来。我的习惯是把启动封装成一个脚本再注册到 Windows 任务计划程序里实现开机自启。先写一个 start.bat把参数固定下来echo off cd /d D:\dump1090-win.1.10.3010.14 dump1090.exe --net --gain 42 --ppm 15 --net-http-port 8080 --net-beast-port 30005然后打开任务计划程序Win R 输入 taskschd.msc创建任务触发器选“系统启动时”操作选“启动程序”并指向 start.bat。注意勾选“使用最高权限运行”否则部分 Windows 版本会以低权限启动导致 USB 设备访问异常。笔记本用户还需要把电源设置里的“合盖操作”改成不睡眠否则合盖后 USB 供电中断接收站直接掉线。验证方式也很简单重启后等一分钟访问 http://127.0.0.1:8080 看地图有没有更新。更严谨的做法是直接跑一次 4.2 里的 Python 脚本确认 data.json 有内容。这个验证过程能区分出“程序起来了”和“数据真的在流动”比看端口是否存在靠谱得多。数据留存的价值要长期运行后才体现。连续跑三周之后回看 CSV 能统计出每日航班流量曲线、高峰期时段、常见过境航路甚至能通过 ICAO 地址反推哪些飞机固定出现在这条航线上。这是在线 API 给不了的因为在线 API 很难有完整的原始历史报文。脚本本身不用改2 秒一次的采样频率对这个分析场景完全够用再回看存储数据才是这套接收站真正发光的地方。那以后我每次搭接收站都会强制走一遍“插背板 USB、确认 Zadig 驱动、固定增益、注册计划任务”四步流程把重复踩坑的可能性压到最低希望帮到你。本文还有配套的精品资源点击获取
返回列表