背景介紹#
ADS-B是廣播式自動相關監視,顧名思義,即無需人工操作或者詢問,可以自動地從相關機載設備獲取參數向其他飛機或地面站廣播飛機的位置、高度、速度、航向、識別號等信息,以供管制員對飛機狀態進行監控。(來自百度百科),然而市面上專門的ADS-B最少要200刀,能不能用我們不到20刀的電視棒代替呢,當然可以,因為我國民航飛機的通訊頻率為1090MHz,電視棒(RTL2832U+R820T)接收的頻率范圍為 24 ~ 1766 MHz。而且因為因為航空CNS標准是公開的(脈沖位置,相對幅度等)。而且通過明文傳輸信息(112個未加密的脈沖字),因此編制解調軟件(SDR)可以正確解調信號。
工具#
電視棒+Linux系統(這里用Ubuntu)
ps:不常用Linux系統的同學可以用虛擬機安裝一個,不是很難~可以自行百度一下噻。
開始!!#
首先我們要安裝一個軟件:dump1090
打開終端
養成好習慣先建一個專屬文件夾
mkdir sdr
在github上克隆源碼到虛擬機然后編譯
cd sdr
git clone https://github.com/antirez/dump1090.git
cd dump1090/
make
然后會發現
Package librtlsdr was not found in the pkg-config search path.
Perhaps you should add the directory containing `librtlsdr.pc'
to the PKG_CONFIG_PATH environment variable
No package 'librtlsdr' found
cc -O2 -g -Wall -W -c dump1090.c
dump1090.c:46:21: fatal error: rtl-sdr.h: 沒有那個文件或目錄
#include "rtl-sdr.h"
^
compilation terminated.
Makefile:9: recipe for target 'dump1090.o' failed
make: *** [dump1090.o] Error 1
報錯。。仔細一看是缺少librtlsdr這個包
(經過各種百度之后)
首先更新一下
apt-get update
然后安裝包
apt-get install librtlsdr-dev
之后
make
就可以了。
然后我們要把電視棒導入虛擬機中,怎么做呢。。請百度hh。。
然后用命令檢測一下
lsusb
發現了usb就可以執行命令運行文件
./dump1090
就可以啦
運行命令還可以加參數
./dump1090 --raw
可以看見原始(raw)的16進制消息
./dump1090 --interactive
這會出現比較好的交互模式,我出現的航班信息:
./dump1090 --interactive
*5d780d585dc125;
CRC: 5dc125 (ok)
DF 11: All Call Reply.
Capability : Level 2+3+4 (DF0,4,5,11,20,21,24,code7 - is on airborne)
ICAO Address: 780d58
*8d780d58587176d9e653a62b36c3;
CRC: 2b36c3 (ok)
DF 17: ADS-B message.
Capability : 5 (Level 2+3+4 (DF0,4,5,11,20,21,24,code7 - is on airborne))
ICAO Address : 780d58
Extended Squitter Type: 11
Extended Squitter Sub : 0
Extended Squitter Name: Airborne Position (Baro Altitude)
F flag : odd
T flag : non-UTC
Altitude : 21575 feet
Latitude : 93427 (not decoded)
Longitude: 21414 (not decoded)
*8d780d589940a131488c2c5ec41c;
CRC: 5ec41c (ok)
DF 17: ADS-B message.
Capability : 5 (Level 2+3+4 (DF0,4,5,11,20,21,24,code7 - is on airborne))
ICAO Address : 780d58
Extended Squitter Type: 19
Extended Squitter Sub : 1
Extended Squitter Name: Airborne Velocity
EW direction : 0
EW velocity : 161
NS direction : 0
NS velocity : 394
Vertical rate src : 0
Vertical rate sign: 1
Vertical rate : 35
*8d780d4b588f8358c0f3c89d206f;
CRC: 9d206f (ok)
DF 17: ADS-B message.
Capability : 5 (Level 2+3+4 (DF0,4,5,11,20,21,24,code7 - is on airborne))
ICAO Address : 780d4b
Extended Squitter Type: 11
Extended Squitter Sub : 0
Extended Squitter Name: Airborne Position (Baro Altitude)
F flag : even
T flag : non-UTC
Altitude : 27600 feet
Latitude : 109664 (not decoded)
Longitude: 62408 (not decoded)
當然這樣還是不直觀,不如放在地圖上表示,這兩個參數:
./dump1090 --interactive --net
可以將我們的收到的航班信息放在Google地圖上,然后在瀏覽器中輸入http://localhost:8080/,就得見了
這里說一個常見報錯
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001 (currently selected)
usb_claim_interface error -6
Error opening the RTLSDR device: Device or resource busy
字面上也看得出,就是電視棒被占用。。簡單解決方法就是重新安裝一下。
后記#
對於Linux小白的我開始弄這個項目弄了好幾天的,所以給大家推薦一個Linux學習網站
然后這篇博文也參考諸多大神的博客,在這里表達一下感謝。
然后想要找大神原文的。。嗯,我把GitHub上的一篇分享給大家。
最后希望無論是各位大神發現錯誤指點,還是同好有興趣共同討論,都可以在下面評論區暢所欲言,本豆花感謝各位賞臉hh。