基于Python的Asterix Cat 021数据格式解析分析与实现
2019-08-12刘云丰廖盈庭刘书博
刘云丰,廖盈庭,刘书博
基于Python的Asterix Cat 021数据格式解析分析与实现
刘云丰1,廖盈庭1,刘书博2
(1.中国民用航空飞行学院,四川 广汉 618307;2.中国民用航空中南地区空中交通管理局湖南分局,湖南 长沙 410137)
ADS-B(广播式自动相关监视)是目前空管系统中应用较广泛、技术成熟的空中交通监视手段。介绍了Asterix Category 021协议各数据项组成、编码的内容以及在空管自动相关监视中的应用,并介绍了Python对该协议的实现方法。
ADS-B;Asterix Category 021协议;Python数据项
随着国内航空运输快速的发展,航空运输的交通密度、复杂度也随之上升,实现空中交通管制的安全、高效运行,需要一种先进且安全可靠的监视手段。ADS-B技术是新航行系统中非常重要的通信和监视技术,基于卫星定位和地空数据通信技术[1]。
相比于传统的监视手段,ADS-B克服了传统系统远程截获能力差、原始信息格式纷杂、信息处理成本高且不易实现指定航迹的筛选、难以实现信息共享的缺点,极大地推动了空中交通管制的一体化建设。本文对Asterix Category 021协议各数据项组成、编码的内容进行了分析,并利用目前较为流行的编程语言Python对其进行实现,以便于对ADS-B数据的软件的开发和应用提供一定的参考。
1 Asterix Category 021协议的基本架构
Asterix Category 021是欧洲航空安全组织一系列标准文件的一部分,该协议主要描叙了ADS-B(广播式自动相关监视)报文传输的基本构架,定义了协议中各数据项的格式以及与其他标准文件之间的关系。
1.1 Asterix Category 021的基本结构
Asterix Category 021数据格式文件包含数据项目录(Catalogue of Data Items)、数据块(Data Block)、数据类型(Data Category)、数据字段(Data Field)、数据项(Data Item)、记录(Record)、用户应用程序框架(User Application Profile,UAP)[2-3]。
其中,数据项是数据类型中最小单元,而用户应用程序框架(UAP)是一种数据分配规范,根据UAP将数据项分配到数据字段。UAP中所用到的每个数据项都有相应的字段参考编号,数据项的出现以UAP作为判断条件。
1.2 数据项和用户应用规范的分析
数据项的构成信息如下例所示[3]。数据项I021/145(飞行高度)结构如图1所示,数据项I021/145为飞行高度的数据结构,飞行高度由2个八位的二进制数据组成。第1个位为LSB,表示为1/4个飞行高度层,数据项2~8位表示飞行高度,将数据项2~8位二进制数据转换十进制,乘以LSB就得到了所需要的飞行高度。Asterix Category 021的其他数据项也可用相同的方式类推。
用户应用程序框架(UAP)是Asterix Category 021协议中制定的,用于应用程序系统的报文设计的数据项组成框架,包括数据项顺序、编码规则等。
图1 数据项I021/145(飞行高度)结构
不同版本的协议,用户应用程序框架(UAP)中包含的数据项也有所差别,根据ADS-B适用的UAP,可以确定数据项在报文中的使用规则。某版本Asterix Category 021协议的UAP部分信息如表1所示,UAP包括FRN、数据项编号、数据项信息、数据项长度四个部分。其中,FRN列中FX为域扩展指示符,其余部分则分别表示对应的数据项。
表1中最后一列表示各个数据项的长度,在对数据项解码的过程中,需要灵活地根据各个数据项的长度分配数据进行解码。
表1 某版本Asterix Category 021协议的UAP部分信息
FRN数据项信息长度 1I021/010数据源识别2 2I021/040目标报告描述符1+ 3I021/030日时间3 4I021/130在WGS-84坐标中的位置6 5I021/080目标地址3 6I021/140几何高度2 7I021/090品质因数2 FX—字段扩展标识—
2 Asterix Category 021的Python实现方法
Python是一种计算机程序设计语言,是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多地被用于独立的、大型项目的开发[5]。
2.1 Asterix Category 021协议模块分析
Asterix Category 021协议格式如表2所示,CAT为数据类型,且CAT=021,占一个字节,表示数据为ADS-B;LEN为长度标识,表示整个数据块的总长度;FSPEC为字段说明,其后为一个数据项。ADS-B报文由数据项组成,数据项的顺序由UAP确定,并按规定的顺序组合在一起。当报文中含有某个数据项时,该数据项相应的FSPEC设置为1。
表2 Asterix Category 021协议格式
CAT=021LENFSPEC第一个记录的数据项……FSPEC最后一个记录的数据项
2.2 编程实现
根据表1,可将ADS-B的数据解码可简单的分成4个部分。第一部分为对数据类型和长度表示进行处理,核心代码如下:
cat_and_len (_):
cat = int(_[0], 2) #数据类型
len = int(_[1:], 2) #数据长度
cat, len
传入3个8位二进制数据,将第一个8位二进制数据换算成10进制,对应的值为CAT=021,将第二、三个8位二进制数据转换为十进制,则为数据长度的值。
第二个部分为解析标识符所占字节,核心代码如下:
#判断是否是符号字节
is_more_fspec(_):
int(_[7]) == 0
#取出标识符字节段
is_fspecbytes():
count = 0
fspecbytes = list()
is_more_fspec([count]):
count += 1
irange(0, count):
fspecbytes.append([i])
fspecbytes
该部分is_more_fspec函数为判断FSPEC字节FX域扩展部分的值,当FX=1时,FSPEC向后扩展一个字节。is_fspecbyte函数与is_more_fspec函数嵌套取出对应的FSPEC字节段,根据对应的UAP表格可确定发送的数据项。
第三部分为根据对应的FSPEC字节段对数据段进行解析,以表1所对应的UAP表格为例,假设该部分的FSPEC字节段为“00010000”,FSPEC字节的每一位与UAP表格中的第一列FRN一一对应,0表示不发送此项,1表示发送,由此可以得到,域扩展指示符为0,故不向后扩展,发送的数据项为I021/130(WGS-84坐标中的位置),该数据项的结构如图2所示[3]。
代码如下:
positionWGS_84(bytes):
lat_bytes =[0] +[1] +[2]
lon_bytes =[3] +[4] +[5]
latitude = int(lat_bytes, 2) * (2.145767E-5)
longitude = int(lon_bytes, 2) * (2.145767E-5)
latitude, longitude
图2 数据项I021/130数据结构(LSB=2.14 576 7×10-5度)
由图2可知,数据项I021/130共有六个字节,前三个字节为纬度信息,后三字节为经度信息,根据1.2节中的方法,可编程解析得到该项的经纬度信息。
3 总结
ADS-B监视相比于传统的航行监视系统有着一系列优势,克服了一系列旧航行系统的缺点,极大地推动了空中交通管制的一体化建设。通过以上对Asterix Category 021协议内容的分析,可以很好地了解Asterix Category 021协议的基本架构及其中各数据项的基本内容;通过Python对Asterix Category 021协议的解析,可以更深入地了解该协议的架构,同时也对该协议的编程实现具有一定的参考价值。
[1]魏光兴.通信导航监视设施[M].成都:西南交通大学出版社,2016.
[2]杨珊,时宏伟.Asterix Category 021协议的应用与分析[J].电讯技术,2011,51(10):132-136.
[3]DOUKAS D.SUR.ET1.ST05.2000-STD-12-01 Eurocontrol standard document for surveillance data exchange-part 12:Category 021 ADS-B Reports[S].出版社不详,2011.
[4]ALI B S,OCHIENG W Y,ZAINUDIN R.An analysis and model for automatic dependent surveillance broadcast (ADS-B)continuity[J].Original Artical,2017,21(4):1841-1854.
[5]PILGRIM M.Dive Into Python 3[M].出版社不详,2009.
[6]黄晋.广播式自动相关监视(ADS-B)在中国民航飞行学院的应用研究[D].成都:西南交通大学,2008.
TP393.04
A
10.15913/j.cnki.kjycx.2019.14.018
2095-6835(2019)14-0046-02
〔编辑:王霞〕