方 興 王步云
(91550部隊 大連 116023)
船載自動識別系統(Automatic Identification System,AIS)是一種新型的海上輔助助航系統及設備,具有船只識別、目標追蹤、碰撞規避等諸多功能,目前已成為船舶交通管理、保障航行安全的重要工具[1]。AIS報文是AIS網絡中交換和傳輸的數據單位,它包含了將要發送的完整的船舶數據信息。而報文解析則是將接收到報文轉換成船舶信息的過程,是實現AIS廣泛應用的基礎。
AIS報文主要可分為明碼和暗碼兩類。明碼以“$”開頭,主要用于傳遞傳感器信息,包括UTC時間、地理位置等[2]。明碼的所有字符均為ASCII文本字符,可以直接提取報文信息。明碼的每條語句不能超過82個ASCII字符,如果超過82個字符,就需要采用暗碼傳輸。
暗碼以“!”開頭,能夠傳遞船舶以及基站的各類信息。暗碼采用一定的方式對Bit位進行壓縮,實現了無線電文的封裝,節省了傳輸帶寬,提高了傳輸效率。暗碼不僅能夠傳送格式不確定的信息,而且還能將內容較長的信息分段傳送。AIS報文的傳輸以暗碼居多。
然而由于暗碼在傳輸之前進行了壓縮,因此在終端上解析時,需要進行解壓縮,首先依據6Bit位表將ASCII字符轉換為中6Bit的二進制數據,并進行拼接;然后依據報文格式分解二進制數據;最后通過整合將二進制數據轉換成相關信息。從整個過程可以看出,暗碼的解析需要以Bit位為單位進行多次轉換,實現較為復雜。
Bit Fields是C語言提供的一種對Bit位進行操作的方法,針對AIS暗碼報文解析的特點,本文提出一種基于Bit Fields的暗碼報文解析的新方法,通過對Bit Fields結構的定義,省去中間的轉換環節,直接對各Bit位進行操作后即可得到相關信息,具備實現簡單、解析高效等特點,具有良好的實用價值。
暗碼包含報頭、傳送電文所需語句總數、語句號、電文識別碼、信道、船舶信息、填充比特數和檢驗碼等部分。如圖1所示為AIS暗碼報文格式及示例。

圖1 暗碼報文格式及示例
“!”表示暗碼報文標志;緊接著的五位字符為會話ID,如“AIVDM”說明是通過VHF數據鏈路進行接收的所有的AIS信息,其它的會話ID還包括“AIVDO、AIACA、AIABK”[3];當將一條長消息分成多條語句進行傳輸時,由第三項表明該消息具體由多少條語句組成,本例中就一條語句;第四項為語句序號,表示當前語句在語句序列中的位置;第五項為消息標識號,它標識該條語句的消息號,當僅一條語句時,該項不填;第六項指定了傳輸的頻道;第七項是按協議定義的封裝消息,如果消息是由多條語句組成,那么在解碼時需要將各條消息提取合并成一個完整的消息碼文才能進行解碼;第八項是比特填充位數;第九項為校驗碼,是“*”前面所有字符異或的結果,十六進制表示,用于數據校驗。

表1 AIS中常用的報文類型
其中第七項封裝消息的第一個字符說明了該報文的類型,報文類型不同,格式也不相同。在AIS中,常用的報文類型如表1所示[4]。
[5]列出了每種報文中Bit的具體分布,如船位報告1、2、3報文的Bit位分布如表2所示。無論哪一類報文,在解析過程中,前六項及第八項的內容可以直接提取,不需要任何轉換,第七項內容的提取才是整個解析過程中的難點。

表2 船位報告1、2、3報文的Bit位分布
1)對于包含相同信息的不同類型報文,相同信息在報文中的位置并不相同,從而導致解析過程中很多模塊難以重用。如報文1、2、3與報文18、19中均含有船舶的經緯度信息,但經緯度信息在前三類中處于報文的第62到117位,而在后兩類則處于第58位到113位。
2)報文的解析主要是對Bit位的操作,整個過程中需多次移位、拼接,操作復雜繁瑣。在PC端解析AIS報文時,首先需將字符轉換為6BitASCII碼,然后對轉換后的6Bit進行拼接操作,形成一個新的字符串;最后再根據報文格式按照Bit位提取相應的信息;在提取過程中,還需要不斷移位、拼接等操作,整個過程較為繁瑣。
3)AIS數據涉及的類型較少,只包括整數和字符兩種類型。而對于經緯度、航速等浮點數類型的信息,也是通過整數類型轉換得到。這在一定程度上也減小了AIS報文解析的復雜度。
Bit Fields是C語言提供的一種對Bit位進行操作的方法。所謂Bit Fields就是把一個字節中的二進制位劃分為不同的區域,每個域占用不同的Bit位并且有一個域名,允許在程序中按照域名進行操作,這樣就可以把不同的變量用一個字節的二進制位域表示。采用這種定義方式節省了存儲空間,處理較為簡便。
Bit Fields的定義與結構的定義相仿,其形式為

上述位域中,Data1結構共占兩個字節16位,其中a占6位,b占2位,c占8位。
對于位域的使用,有如下幾點需要注意:
1)一個位域必須存儲在同一個字節中,不能跨兩個字節,如果一個字節所剩空間不夠存放另一位域時,應從下一字節起開始存放該位域,剩余空間應作為空域。如:

2)每一個位域的長度不能超過前面所指定類型的長度,否則無效。如:

3)由于在PC中字節序是從左至右,而位序則是從右至左的,因此位域結構在內存中的存放有其特殊性。位域定義的先后次序也將影響該位域在內存中存放的位置。以Data2為例,其存放如表3所示。

表3 位域在內存中的存放示例
從表3中可以看出,位域a存放在第一個字節的低6位,第一個字節的高2位為空域;位域b則存放在第二個字節的低4位,位域c則存放在第二個字節的高4位。而位域a所占用的字節和位域b及c占用的字節則是從左至右的。
由于AIS的報文信息是按照Bit位進行存儲并傳輸的,因此非常適合采用Bit Fields的方式進行解析。通過位域結構的定義,可以省去大部分轉換環節,直接提取船舶信息。主要方法是:針對每一類報文,定義一個位域結構并聲明一個該結構的變量,然后將轉換得到的6Bit流直接轉換為該位域結構類型,這樣就可以通過所定義的變量直接訪問Bit流中信息,從而實現AIS報文的解析。在整個過程中,位域結構的定義就是重點。
以1、2、3類報文為例,報文中的每個字符經6Bit位轉換后,不進行拼接,直接將有效的6Bit位放在一個字節的低6位,高2位填“0”。由此整個報文的Bit流在內存中按照表4存放。

表4 轉換后的AIS信息在內存中存放
為了使類型轉換后的Bit Fields結構變量能夠與Bit流對應起來從而正確地提取船舶信息,可以如下定義位域結構:

在上述位域結構中,每一行對應一個8Bit位字節。按照表3的存放方式,為了除去無效的高2位,位域結構中每行的最后始終是兩位空域,即每個字節的高兩位無效;此外,由于位序從右至左,因此同一字節里定義不同的位域時需與報文格式的先后次序相反,如上述結構的第二行,應先定義報文格式后面的MMSI1,再定義格式前面的Repeat indicator(RPT);而對于在不同字節的信息,按照格式次序依次定義即可,如第三、四行,先定義MMSI的第5~10位,后定義第11~16位。最終該位域結構在內存中存放方式如表5所示。

表5 Msg123在內存中的存放
通過上述定義,整個位域結構正好與轉換后的Bit流對應起來,下一步就可以直接通過位域結構變量提取船舶信息。
第一步:確定收到的AIS報文ID。依據AIS格式特點,封裝電文的第一個字符指定了該報文的ID,如圖1中的“1”指明了該報文屬于1類報文。獲取報文ID主要是為了確定Bit流將要轉換的位域結構類型。
第二步:類型轉換。依據報文ID,將Bit流轉換為對應的位域結構類型。仍以1、2、3類報文為例:

第三步:獲得最終的船舶信息。通過類型轉換后,就可以直接采用pMsg訪問船舶信息。如船舶的ID:

而對于跨字節的數據,還需進行移位得到最終的信息。如MMSI號碼,在報文中占用30位,在位域結構則跨6個字節,從高位到低位依次是MMSI1到MMSI6,采用移位的方式可得到最終信息:

其它信息均可按照上述方法獲取,不再一一舉例。
本文在 Windows Xp Sp3操作系統上,采用Visual C++6.0平臺開發解析軟件并進行實驗。解析軟件包括數據接收、數據校驗、數據轉換、信息提取、信息顯示等模塊。
整個軟件運行流程如圖2所示:數據接收模塊從外部接收到AIS語句后,數據校驗模塊則對AIS語句進行異或校驗,對于采用多條語句傳送的消息,還需檢查該消息是否完整;確認校驗無誤及消息完整后,數據轉換模塊負責報文的6Bit位ASCII碼字符轉換、Bit Fields結構類型轉換等一系列工作,最后信息提取模塊依據報文格式,從Bit Fields結構變量中提取相對應的船舶信息并交由信息顯示模塊進行顯示。

圖2 軟件運行流程
按照第二節所述方法,采用上述解析軟件對圖1中的示例報文進行解析,解析結果如表6所示。

表6 根據報文解析得到的信息(部分)
結果表明,采用基于Bit Fields方法能夠實現AIS數據的正確解析,過程簡單,邏輯清晰。
AIS報文解析是實現AIS廣泛應用的基礎。針對AIS報文采用Bit流進行傳輸、存儲的特點,結合C語言中對Bit位操作的Bit Fields方法,本文提出一種基于Bit Fields的AIS報文解析方法。該方法通過對Bit Fields的定義,省去中間復雜、繁瑣的轉換環節,直接對各Bit位進行操作后即可得到所需信息,提高了AIS報文解析效率,具有方法簡單、邏輯清晰、解析高效等特點,對以后進一步開發ECDIS顯示系統、航標系統以及船舶避碰專家系統等都具有借鑒意義。
參考文獻
[1]初秀民,徐海潮,萬劍,等.基于多線程的船載自動識別系統報文解析[J].中國航海,2011,34(2):19-23.
[2]江衍煊,張詩永,陳福金.利用AIS串口數據進行船舶避碰仿真[J].電腦與信息技術,2010,18(1):24-27.
[3]郭善寧,何祖軍.基于VC++的AIS模擬器的設計與實現[J].艦船電子工程,2008,28(10):148-150.
[4]張文力.船載自動識別系統[M].大連:大連海事大學出版社,2004.
[5]RECOMMENDATION ITU-R M.1371-4*.Technical characteristics for an automatic identification system using time-division multiple access in the VHF maritime mobile band[R].International Telecommunication Union,2010:4.