低成本精准航班追踪:Raspberry Pi Zero Wireless、SDR 与 FlightAware
本文展示两种利用 Raspberry Pi Zero Wireless 追踪区域航班的方法,并演示其控制 64×64 RGB 矩阵显示
Raspberry Pi Zero Wireless 是一款 10 美元微型计算机,功能强大。本文展示两种用它追踪区域航班的方法,并演示如何用它控制 64×64 RGB 矩阵显示航班号!
本文包含三个独立项目。项目 1:用 PiAware 创建飞机追踪设备。项目 2:收集上述飞机数据。项目 3:展示用 RPi Zero W 控制 64×64 RGB 矩阵。
项目 1:Raspberry Pi Zero Wireless 飞机追踪器
| 部件 | 成本 | 备注 |
|---|---|---|
| Raspberry Pi Zero Wireless | $10 | |
| SDR 接收机 | $21 | 其他 USB SDR 接收机大概率也适用 |
| 4GB microSD 卡 | $6 | 更大容量卡也可用 |
| USB 转 MicroUSB 转接器 | $5 | |
| MicroUSB 集线器 (可选) | $8 | Pi Zero 仅有 microUSB 口;接外设需集线器/转接器 |
| 宽带天线 (可选) | $50 | 天线须覆盖 1090 MHz |
| 1090 MHz 带通滤波器 (可选) | $20 |
资源
- Raspbian Jessie (安装指南)
- PiAware 安装
本实验用 Raspberry Pi Zero Wireless。但以下代码适用于树莓派 2 代及以上版本。若购买无无线版 Pi Zero,可加 USB 无线网卡补齐。
步骤 1:准备 SD 卡
下载最新 Raspbian Jessie 到电脑。
将镜像写入 SD 卡(此处有 Linux、Mac OS、Windows 指南)。
步骤 2:修改 SD 卡
在 SD 卡根目录创建名为 "ssh" 的文件。无扩展名、无内容。此文件启用 SSH,允许远程访问 Pi。
创建 "wpa_supplicant.conf" 文件,内容如下。将 YourWifiName 和 YourWifiPassword 替换为您连接 Wi-Fi 的名称和密码。
network={
ssid="YourWifiName"
psk="YourWifiPassword"
key_mgmt=WPA-PSK
}
步骤 3:安装与启动
从电脑弹出 SD 卡并装入 Raspberry Pi Zero Wireless。用最靠板端的 MicroUSB 口供电。等待约一分钟 Pi 启动并连 Wi-Fi。有这些配置文件,无需键盘、鼠标、显示器。
步骤 4:定位您的 Pi
识别 Pi IP 地址——登录路由器查看连接设备,或用 IP 扫描器如 Look@Lan (Windows) 或 nmap (Linux/Mac)。若两三分钟未出现,断电、取出 SD 卡重插电脑复核 ssh 和 wpa_supplicant.conf 文件。
步骤 5:连接您的 Pi
Windows:用 Putty 等工具连接 Pi。下载运行,输入 Pi IP,点 "连接"。弹出安全证书窗口点 "是"。
Linux/Mac:打开终端输入 "ssh pi@raspberrypi.local" 或 "ssh pi@ipaddress" (如 "ssh pi@192.168.0.52")。
提示符下默认用户名 "pi"、密码 "raspberry"。
步骤 6:配置您的 Pi
输入 "sudo raspi-config" 回车。
修改密码、时区、本地化。
密码提示时当前密码 "raspberry";应改为更安全密码以增加黑客难度。旁注:应用证书认证而非密码,但本文不展开。
依次运行以下命令:
wget https://flightaware.com/adsb/piaware/files/packages/pool/piaware/p/piaware-support/piaware-repository_3.3.0_all.deb
sudo dpkg -i piaware-repository_3.3.0_all.deb
sudo apt-get update
sudo apt-get dist-upgrade -y
sudo apt-get install -y piaware fail2ban libio-socket-ssl-perl
sudo piaware-config allow-auto-updates yes
sudo piaware-config allow-manual-updates yes
sudo apt-get install dump1090-fa -y
sudo reboot
树莓派启动完成后,电脑浏览器访问 https://raspberrypi.local:8080 (或替换为设备 IP)。缩放至您位置,飞机开始在屏幕出现又消失。
带着 Pi、SDR、天线系统到室外可增加追踪飞机数。加装 1090 MHz 带通滤波器和更好天线可进一步改善。

PiAware 接收机截图,显示 2017/3/14 (Pi Day!) 加州洛杉矶东部区域。顶部线性轨迹为准备降落 LAX 的飞机。也可见政府飞机盘旋。
最后,创建 FlightAware.com 账号并关联您的接收机。
ADS-B、PiAware 与 dump1090
飞机应答机广播四位八进制标识符 (Mode-A 即 "Squawk")、高度 (Mode-C)、24 位唯一 ICAO 编号 (Mode-S)、含额外信息的 24 位 ICAO 编号 (Mode S Extended Squitter)。最后模式即 ADS-B。
自动相关监视广播 (ADS-B) 取飞机位置 (GPS/GLONASS 等确定),结合识别信息,在 1090 MHz 广播。与仅回复雷达询问的其他应答机代码不同,ADS-B 约每秒广播两次。
PiAware 和 dump1090 用调谐 1090 MHz 的软件定义无线电 (SDR) 接收解码周围所有飞机广播,发送至 FlightAware 服务器。信息显示在树莓派 8080 端口托管的网页上。

John Macneil 插画,www.aopa.org。
所有飞机须在 2020 年 1 月 1 日前装备 ADS-B Out 应答机。在此之前,FlightAware 用多边定位确定不广播经纬度飞机位置。多边定位用至少三个已知位置接收机和消息接收时间计算飞机位置。
项目 2:用 Pi Zero Wireless 从 FlightAware.com 收集飞机数据
FlightAware.com 提供两个应用程序接口 (API) 供数据挖掘利用:FlightXML 和 Firehose。根据所需信息类型和月查询数选择。本项目 All About Circuits 获免费一个月访问权。跟进需联系 FlightAware.com 申请 API 密钥。
资源:
- Flight Aware Firehose 文档
步骤 1:测试连通性
SSH 连接 Pi Zero 测试 Firehose API 连通性。
openssl s_client -host firehose.flightaware.com -port 1501 -tls1
若见一两页证书详情,连通正常。
步骤 2:获取样本文件和数据
FlightAware 在 GitHub 托管样本文件。下载编辑样本文件填入用户名和 API 密钥。
git clone https://github.com/flightaware/firehose_examples.git
cd firehose_examples/perl/example1
sudo nano example1.pl
修改 username 和 apikey 字段匹配您信息,退出 ([Ctrl]+[x]) 保存。
perl example1.pl
应见 JSON 格式数据:
$VAR1 = {
'aircrafttype' => 'B738',
'heading' => '105',
'pitr' => '1490038420',
'gs' => '334',
'clock' => '1490038413',
....
'hexid' => 'A44591',
'ident' => 'DAL751'
'alt' => '25100',
'lon' => '-117.38051',
'lat' => '33.53288'
};
步骤 3:配置 Pi 收集数据
Firehose 名副其实,极短时间可产生海量数据 (~1 GB/天)——填满磁盘并增加账户费用。所以创建收集脚本时应定期检查,否则极快填满磁盘耗尽费用。
视 MicroSD 卡大小和收集目标,可能需加存储或回 raspi-config 扩展文件系统 (选项 7、选项 A1)。
示例中我收集 2°×2° 地理区域数据,含 LGB、LAX、ONT、SNA 等 (34° N ±1°、118° W ±1°)。选此区域因接收范围近似。

关注区域范围 33° N 至 35° N、117° W 至 119° W。
以下代码为 example1.pl 修改第 18 和 45 行。全行展示供读者无需下载文件即可跟进。复制 example1.pl 为 position.pl 并用 nano 编辑 position.pl。
cp example1.pl position.pl
sudo nano position.pl
作必要修改,[Ctrl]+[x] 退出。
1 #!/usr/local/bin/perl
2
3 use strict;
4 use IO::Socket::SSL;
5 use JSON::PP;
6 use IO::Uncompress::Inflate qw($InflateError);
7 use Data::Dumper;
8
9 my $username = 'allaboutcircuits';
10 my $apikey = 'allaboutcircuitsreallylongapikey';
11 my $compression = 0;
12
13 # 打开到 FlightAware 的 TLS 套接字连接。
14 my $sock = IO::Socket::SSL->new('firehose.flightaware.com:1501') or die $!;
15 # print "Connected!\n";
16
17 # 向未压缩套接字发送初始化命令。
18 my $initcmd = "live version 8.0 user $username password $apikey events \"position\" latlong \"33 -117 35 -119\"";
19 if ($compression) {
20 $initcmd .= " compression compress";
21 }
22 binmode $sock;
23 print $sock "$initcmd\n";
24
25 # 如请求启用压缩。
26 my $zsock;
27 if ($compression) {
28 $zsock = new IO::Uncompress::Inflate $sock
29 or die "IO::Uncompress::Inflate failed: $InflateError\n";
30 } else {
31 $zsock = $sock;
32 }
33
34 # 主循环,读取服务器 JSON 行。
35 my $i = 1;
36 while (my $line = $zsock->getline()) {
37 #print "LINE $i\n";
38 #print "LINE $i: ", $line, "\n";
39
40 my $data = eval { decode_json $line };
41 die "Failed to decode JSON: $line" if !defined($data) || $@;
42
43 print $data->{ident}." \t".$data->{lat}." \t " . $data->{lon} . " \t". $data->{alt}." \n";
44
45 last if ($i++ >= 10);
46 }
47 close $sock;
48
49 # print "All done.\n";
第 18 行限制请求 117° W 至 119° W 间飞机 (用 -117 和 -119 表示)。第 43 行修改演示仅输出关注字段:航班号、纬度、经度、高度。第 45 行请求服务器 10 架飞机 (最终脚本可注释此行)。
下两命令执行程序并监控进度:
sudo perl position.pl >> position.txt &
tail -f position.txt
第一行用超级用户权限跑 perl 运行 position.pl 并追加 (>>) 输出至 position.txt,& 符号使程序后台运行。
第二行用 tail 跟踪 (-f) position.txt 变化,允许监控完成。完成用 [Ctrl]+[c] 退出 tail。不再收集数据时,用 fg 将 position.pl 调前台停止或 [Ctrl]+[c] 中断。
下方 .zip 含修改程序和输出,演示语法微调如何聚焦不同信息,含程序样本输出。
- arrivals.pl 输出刚着陆飞机 JSON (到达或离开 LAX)
- test_landing.pl 可读输出 (如 AAL1155 landed at 03/21/2017 22:00:01)
- position.pl 地理矩形内所有飞机 JSON (34° N ±1°、118° W ±1°)
- test_overhead.pl 输出航班标识、纬度、经度、高度 (如 N721PP 34.36011 -118.37837 18100)
这些文件基于 FlightAware 提供的 example1.pl 微调。要制作仅捕获感兴趣数据的脚本,用 FlightAware Firehose API 文档请求 JSON 格式适当信息,再在文件内用正确语法仅输出所需信息。
项目 3:用 Pi Zero Wireless 控制 64×64 RGB 矩阵
| 部件 | 成本 | 备注 |
|---|---|---|
| (2) 2×32×32 RGB 显示矩阵 + 电源 | $75 ($150) | 需四块 32×32 RGB 矩阵组成 64×64 像素显示 |
| Adafruit RGB 矩阵 HAT + RTC 时钟 | $25 | 数据手册 |
| 20-pin IDC 线缆 (Hub75) | $7-$13 | 长度取决于面板配置和到 Pi 距离 |
| 0.1" 公排针 (40-pin, 2×20) | $1 | 2.54 mm |
步骤 1:Adafruit 矩阵 HAT 准备
按 Adafruit.com 指南焊接公/母排针到 Adafruit HAT。然后在引脚 4 和 18 间焊线或接跳线。本项目不需接 DC 筒型插座或螺丝端子。
步骤 2:树莓派准备
焊接 2×20 公排针到位。
步骤 3:RGB 矩阵准备
调整 RGB 矩阵使底行箭头朝下、顶行箭头朝上 (见此图)。用 2×10 IDC 线缆连 Adafruit HAT 输出到第一块板输入。再连第一块输出到第二块输入、第二块输出到第三块输入,以此类推。

RGB 矩阵面板背面。信号按 "C" 形板间传递。
若有激光切割或 CNC 设备,我附带可容纳四块 RGB 矩阵板的背板图纸。安装孔改为长槽,允许从公共中心点对齐。

四块 32×32 面板组装成大 64×64 面板模板;多种面板排列可能。
Hughes_4x4RGBMatrix.zip
Hennen Zeller 完整文档和源代码。
所有电气连接完成后,给树莓派上电。约一分钟后,尝试用 Putty 或 SSH 登录 Pi。
登入后输入以下禁用 Pi 声音 (文档指示声音子系统与 RGB 矩阵硬件冲突)。
cat << EOF | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf
blacklist snd_bcm2835
EOF
sudo update-initramfs -u
然后用 apt-get 安装 Python 和成像库。
sudo apt-get install -y build-essential libconfig++-dev python-dev python-imaging libgraphicsmagick++-dev libio-socket-ssl-perl
获取运行 RGB 矩阵必要文件并编译。
git clone https://github.com/hzeller/rpi-rgb-led-matrix
cd rpi-rgb-led-matrix
HARDWARE_DESC=adafruit-hat-pwm make -C examples-api-use
sudo examples-api-use/demo -L -D0
cd utils/
HARDWARE_DESC=adafruit-hat-pwm make
可选:若 Pi 连摄像头,可捕获 64×64 像素图像送显示。
raspistill -w 64 -h 64 -o myimg.png
sudo ./led-image-viewer -L -f myimg.png
前两行捕获 64×64 图像到显示,用前节编译的 led-image-viewer 在大显示器 (-L) 永久 (-f) 显示。
下一步?
您现在拥有一台 10 美元计算机,能追踪周围飞机 (天线+SDR 或 API 调用),在 64×64 像素显示器或 Raspberry Pi Zero W HDMI 输出上显示任意飞机信息。
能做什么只受想象力限制。
既然本文仅介绍工具,建议第一步读显示器和 FlightAware 文档,再打开两者示例程序更好理解能力。
别忘了 Raspberry Pi Zero 是功能完整 Linux 安装,常用 Cron、Grep、Awk 等命令。Pi 上没有的东西只需短 apt-get install 即可获取。
查看下方视频见项目最终效果!
亲自尝试项目!获取 BOM。
工业设备
- 8 种经验证实的数字化维护软件降本增收策略
- 树莓派多路DS18B20 1-Wire温度监测:接线与编程全指南
- 树莓派+Nagios高效监控机房温度
- 家庭能源中心:树莓派与 Moteino 监测光伏、光热与室温
- 基于 Sensorflare 与树莓派的 433 MHz 智能家居控制器构建指南
- 树莓派配合 MCP3008 ADC 与 Zabbix 监控模拟传感器:分步指南
- 树莓派 + DHT11 + ThingSpeak:打造你的第一个物联网项目
- 树莓派自动化气雾栽培系统:湿度传感器智能控制
- 基于 RAK831 模块与树莓派 3 构建 LoRa 网关:分步指南
- 树莓派与Python构建机器人:完整指南
- Arduino与树莓派构建互联网控制视频流机器人完整指南
- Pixus Technologies:面向任务关键环境的尖端坚固化软件定义无线电