劉云豐,廖盈庭,劉書博
基于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數據的軟件的開發和應用提供一定的參考。
Asterix Category 021是歐洲航空安全組織一系列標準文件的一部分,該協議主要描敘了ADS-B(廣播式自動相關監視)報文傳輸的基本構架,定義了協議中各數據項的格式以及與其他標準文件之間的關系。
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作為判斷條件。
數據項的構成信息如下例所示[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—字段擴展標識—
Python是一種計算機程序設計語言,是一種面向對象的動態類型語言,最初被設計用于編寫自動化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多地被用于獨立的、大型項目的開發[5]。
Asterix Category 021協議格式如表2所示,CAT為數據類型,且CAT=021,占一個字節,表示數據為ADS-B;LEN為長度標識,表示整個數據塊的總長度;FSPEC為字段說明,其后為一個數據項。ADS-B報文由數據項組成,數據項的順序由UAP確定,并按規定的順序組合在一起。當報文中含有某個數據項時,該數據項相應的FSPEC設置為1。
表2 Asterix Category 021協議格式

CAT=021LENFSPEC第一個記錄的數據項……FSPEC最后一個記錄的數據項
根據表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節中的方法,可編程解析得到該項的經緯度信息。
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
〔編輯:王霞〕