哈Ha 可能曾经在飞机上认识或陪伴亲戚或朋友的每个人都使用了免费的Flightradar24服务。 这是实时跟踪飞机位置的非常方便的方法。
第一部分描述了这种在线服务的操作原理。 现在,我们将走得更远,找出从飞机向接收站发送和接收的数据,并使用Python独立解码它们。
故事
显然,有关飞机的数据不会传输,因此用户可以在智能手机上看到它们。 该系统称为ADS – B(自动相关监视-广播),用于将飞机信息自动传输到控制中心-传输其标识符,坐标,方向,速度,高度和其他数据。 以前,在此类系统出现之前,调度员只能在雷达上看到一个点。 当飞机过多时,这还不够。
从技术上讲,ADS-B由飞机上的发射器组成,该发射器以1090 MHz的相当高的频率定期发送带有信息的数据包(还有其他模式,但它们对我们而言并不那么有趣,因为坐标仅在此处传输)。 当然,除了发射器外,在机场某处还有一个接收器,但是对于我们和用户来说,我们自己的接收器很有趣。
顺便说一下,作为比较,第一个这样的系统,Airnav Radarbox,是为普通用户设计的,于2007年问世,价格约为900美元,每年约250美元值得订购网络服务。

您可以在
radioscanner论坛上阅读这些第一批俄罗斯车主的评论。 现在,RTL-SDR接收器已经广泛使用,可以以30美元的价格组装类似的设备,有关更多信息,请参见
第一部分 。 我们将继续进行协议本身-让我们看看它是如何工作的。
接收信号
首先,需要记录信号。 整个信号的持续时间仅为120微秒,因此,为了舒适地拆卸其组件,需要采样频率至少为5 MHz的SDR接收器。

记录后,我们得到一个WAV文件,其采样频率为5,000,000个样本/秒,这样的记录“称量” 30秒大约需要500 MB。 当然,用媒体播放器收听它是没有用的-文件不包含声音,而是直接数字化的无线电信号-这就是软件无线电的工作方式。
我们将使用Python打开并处理文件。 那些希望自己尝试的人可以
从链接中下载样本记录。
下载文件,查看其中的内容。
from scipy.io import wavfile import matplotlib.pyplot as plt import numpy as np fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav") data = data.astype(float) I, Q = data[:, 0], data[:, 1] A = np.sqrt(I*I + Q*Q) plt.plot(A) plt.show()
结果:在噪声背景下,我们看到了明显的“冲动”。

如果增加图形的分辨率,则每个“脉冲”都是一个信号,其结构清晰可见。

如您所见,该图片与以上描述中描述的一致。 您可以开始处理数据。
解码方式
首先,您需要获得一个比特流。 信号本身使用曼彻斯特编码进行编码:

从半字节的级别差异中,很容易获得真实的“ 0”和“ 1”。
bits_str = "" for p in range(8): pos = start_data + bit_len*p p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len] avg1, avg2 = np.average(p1), np.average(p2) if avg1 < avg2: bits_str += "0" elif avg1 > avg2: bits_str += "1"
信号本身的结构如下:

让我们更详细地考虑这些字段。
DF (下行格式,5位)-定义消息的类型。 它们有几种类型:

(
表来源 )
我们只对DF17类型感兴趣,因为 它包含飞机的坐标。
国际民航组织 (24位)是国际上唯一的飞机代码。 您可以通过
网站上的代码检查飞机(不幸的是,作者已停止更新数据库,但仍然有用)。 例如,对于代码3c5ee2,我们具有以下信息:

编辑:在
文章的
评论中,更详细地给出了ICAO代码说明;我建议您使自己熟悉那些人。
DATA (56或112位)-实际上是我们将解码的数据。 数据的前5位是
类型代码字段,其中包含存储数据的子类型(不要与DF混淆)。 这些类型有很多:

(
表来源 )
让我们看一些示例包。
飞机识别二进制示例:
00100 011 000101 010111 000111 110111 110001 111000
资料栏位:
+------+------+------+------+------+------+------+------+------+------+ | TC,5 | EC,3 | C1,6 | C2,6 | C3,6 | C4,6 | C5,6 | C6,6 | C7,6 | C8,6 | +------+------+------+------+------+------+------+------+------+------+
TC = 00100b = 4,每个C1-C8字符包含与字符串中的索引相对应的代码:
#ABCDEFGHIJKLMNOPQRSTUVWXYZ ##### _ ################ 0123456789 ######
对线进行解码后,很容易获得平面代码:EWG7184
symbols = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######" code_str = "" for p in range(8): c = int(bits_str[8 + 6*p:8 + 6*(p + 1)], 2) code_str += symbols[c] print("Aircraft Identification:", code_str.replace('#', ''))
空降位置如果名称很简单,则坐标会更复杂。 它们以2x偶数和奇数帧的形式传输。 域代码TC = 01011b = 11。

偶数和奇数包的示例:
01011 000 000101110110 00 10111000111001000 10000110101111001 01011 000 000110010000 01 10010011110000110 10000011110001000
坐标的计算是根据一个相当聪明的公式进行的:

(
来源 )
我不是GIS专家,所以我不知道它来自哪里。 谁在知道,在评论中写。
高度被认为更容易-根据特定的位,它可以以25或100英尺的倍数显示。
空降速度TC = 19的数据包 有趣的是,相对于地面而言,速度可以是准确的(地面速度),也可以是由飞机传感器测得的相对准确的速度(空速)。 还传输许多不同的字段:

(
来源 )
结论
如您所见,当标准不仅适用于专业人员,而且适用于普通用户时,ADS-B技术已成为一种有趣的共生方式。 但是,当然,其中的关键作用在于数字SDR接收器技术的廉价化,这使得该设备能够以“一分钱”的价格接收设备上频率高于千兆赫的信号。
在标准本身中,当然比什么都重要。 有兴趣的人可以在
ICAO页面上查看PDF或访问上面已经提到的
网站 。
上面的许多内容不太可能派上用场,但我希望至少仍然有一个大致的思路。
顺便说一句,现成的Python解码器已经存在,可以在
这里进行研究。 SDR接收器的所有者可以
从页面组装并运行完成的ADS-B解码器,有关更多信息,请参见
第一部分 。
这篇文章中描述的解析器的源代码已被删减。 这是一个不冒充生产的测试示例,但是其中起作用了,您可以解析上面记录的文件。
源代码(Python) from __future__ import print_function from scipy.io import wavfile from scipy import signal import matplotlib.pyplot as plt import numpy as np import math import sys def parse_message(data, start, bit_len): max_len = bit_len*128 A = data[start:start + max_len] A = signal.resample(A, 10*max_len) bits = np.zeros(10*max_len) bit_len *= 10 start_data = bit_len*8
希望有人感兴趣,感谢您的关注。