方 興 王步云
(91550部隊(duì) 大連 116023)
船載自動(dòng)識(shí)別系統(tǒng)(Automatic Identification System,AIS)是一種新型的海上輔助助航系統(tǒng)及設(shè)備,具有船只識(shí)別、目標(biāo)追蹤、碰撞規(guī)避等諸多功能,目前已成為船舶交通管理、保障航行安全的重要工具[1]。AIS報(bào)文是AIS網(wǎng)絡(luò)中交換和傳輸?shù)臄?shù)據(jù)單位,它包含了將要發(fā)送的完整的船舶數(shù)據(jù)信息。而報(bào)文解析則是將接收到報(bào)文轉(zhuǎn)換成船舶信息的過程,是實(shí)現(xiàn)AIS廣泛應(yīng)用的基礎(chǔ)。
AIS報(bào)文主要可分為明碼和暗碼兩類。明碼以“$”開頭,主要用于傳遞傳感器信息,包括UTC時(shí)間、地理位置等[2]。明碼的所有字符均為ASCII文本字符,可以直接提取報(bào)文信息。明碼的每條語句不能超過82個(gè)ASCII字符,如果超過82個(gè)字符,就需要采用暗碼傳輸。
暗碼以“!”開頭,能夠傳遞船舶以及基站的各類信息。暗碼采用一定的方式對(duì)Bit位進(jìn)行壓縮,實(shí)現(xiàn)了無線電文的封裝,節(jié)省了傳輸帶寬,提高了傳輸效率。暗碼不僅能夠傳送格式不確定的信息,而且還能將內(nèi)容較長(zhǎng)的信息分段傳送。AIS報(bào)文的傳輸以暗碼居多。
然而由于暗碼在傳輸之前進(jìn)行了壓縮,因此在終端上解析時(shí),需要進(jìn)行解壓縮,首先依據(jù)6Bit位表將ASCII字符轉(zhuǎn)換為中6Bit的二進(jìn)制數(shù)據(jù),并進(jìn)行拼接;然后依據(jù)報(bào)文格式分解二進(jìn)制數(shù)據(jù);最后通過整合將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成相關(guān)信息。從整個(gè)過程可以看出,暗碼的解析需要以Bit位為單位進(jìn)行多次轉(zhuǎn)換,實(shí)現(xiàn)較為復(fù)雜。
Bit Fields是C語言提供的一種對(duì)Bit位進(jìn)行操作的方法,針對(duì)AIS暗碼報(bào)文解析的特點(diǎn),本文提出一種基于Bit Fields的暗碼報(bào)文解析的新方法,通過對(duì)Bit Fields結(jié)構(gòu)的定義,省去中間的轉(zhuǎn)換環(huán)節(jié),直接對(duì)各Bit位進(jìn)行操作后即可得到相關(guān)信息,具備實(shí)現(xiàn)簡(jiǎn)單、解析高效等特點(diǎn),具有良好的實(shí)用價(jià)值。
暗碼包含報(bào)頭、傳送電文所需語句總數(shù)、語句號(hào)、電文識(shí)別碼、信道、船舶信息、填充比特?cái)?shù)和檢驗(yàn)碼等部分。如圖1所示為AIS暗碼報(bào)文格式及示例。
圖1 暗碼報(bào)文格式及示例
“!”表示暗碼報(bào)文標(biāo)志;緊接著的五位字符為會(huì)話ID,如“AIVDM”說明是通過VHF數(shù)據(jù)鏈路進(jìn)行接收的所有的AIS信息,其它的會(huì)話ID還包括“AIVDO、AIACA、AIABK”[3];當(dāng)將一條長(zhǎng)消息分成多條語句進(jìn)行傳輸時(shí),由第三項(xiàng)表明該消息具體由多少條語句組成,本例中就一條語句;第四項(xiàng)為語句序號(hào),表示當(dāng)前語句在語句序列中的位置;第五項(xiàng)為消息標(biāo)識(shí)號(hào),它標(biāo)識(shí)該條語句的消息號(hào),當(dāng)僅一條語句時(shí),該項(xiàng)不填;第六項(xiàng)指定了傳輸?shù)念l道;第七項(xiàng)是按協(xié)議定義的封裝消息,如果消息是由多條語句組成,那么在解碼時(shí)需要將各條消息提取合并成一個(gè)完整的消息碼文才能進(jìn)行解碼;第八項(xiàng)是比特填充位數(shù);第九項(xiàng)為校驗(yàn)碼,是“*”前面所有字符異或的結(jié)果,十六進(jìn)制表示,用于數(shù)據(jù)校驗(yàn)。
表1 AIS中常用的報(bào)文類型
其中第七項(xiàng)封裝消息的第一個(gè)字符說明了該報(bào)文的類型,報(bào)文類型不同,格式也不相同。在AIS中,常用的報(bào)文類型如表1所示[4]。
[5]列出了每種報(bào)文中Bit的具體分布,如船位報(bào)告1、2、3報(bào)文的Bit位分布如表2所示。無論哪一類報(bào)文,在解析過程中,前六項(xiàng)及第八項(xiàng)的內(nèi)容可以直接提取,不需要任何轉(zhuǎn)換,第七項(xiàng)內(nèi)容的提取才是整個(gè)解析過程中的難點(diǎn)。
表2 船位報(bào)告1、2、3報(bào)文的Bit位分布
1)對(duì)于包含相同信息的不同類型報(bào)文,相同信息在報(bào)文中的位置并不相同,從而導(dǎo)致解析過程中很多模塊難以重用。如報(bào)文1、2、3與報(bào)文18、19中均含有船舶的經(jīng)緯度信息,但經(jīng)緯度信息在前三類中處于報(bào)文的第62到117位,而在后兩類則處于第58位到113位。
2)報(bào)文的解析主要是對(duì)Bit位的操作,整個(gè)過程中需多次移位、拼接,操作復(fù)雜繁瑣。在PC端解析AIS報(bào)文時(shí),首先需將字符轉(zhuǎn)換為6BitASCII碼,然后對(duì)轉(zhuǎn)換后的6Bit進(jìn)行拼接操作,形成一個(gè)新的字符串;最后再根據(jù)報(bào)文格式按照Bit位提取相應(yīng)的信息;在提取過程中,還需要不斷移位、拼接等操作,整個(gè)過程較為繁瑣。
3)AIS數(shù)據(jù)涉及的類型較少,只包括整數(shù)和字符兩種類型。而對(duì)于經(jīng)緯度、航速等浮點(diǎn)數(shù)類型的信息,也是通過整數(shù)類型轉(zhuǎn)換得到。這在一定程度上也減小了AIS報(bào)文解析的復(fù)雜度。
Bit Fields是C語言提供的一種對(duì)Bit位進(jìn)行操作的方法。所謂Bit Fields就是把一個(gè)字節(jié)中的二進(jìn)制位劃分為不同的區(qū)域,每個(gè)域占用不同的Bit位并且有一個(gè)域名,允許在程序中按照域名進(jìn)行操作,這樣就可以把不同的變量用一個(gè)字節(jié)的二進(jìn)制位域表示。采用這種定義方式節(jié)省了存儲(chǔ)空間,處理較為簡(jiǎn)便。
Bit Fields的定義與結(jié)構(gòu)的定義相仿,其形式為
上述位域中,Data1結(jié)構(gòu)共占兩個(gè)字節(jié)16位,其中a占6位,b占2位,c占8位。
對(duì)于位域的使用,有如下幾點(diǎn)需要注意:
1)一個(gè)位域必須存儲(chǔ)在同一個(gè)字節(jié)中,不能跨兩個(gè)字節(jié),如果一個(gè)字節(jié)所剩空間不夠存放另一位域時(shí),應(yīng)從下一字節(jié)起開始存放該位域,剩余空間應(yīng)作為空域。如:
2)每一個(gè)位域的長(zhǎng)度不能超過前面所指定類型的長(zhǎng)度,否則無效。如:
3)由于在PC中字節(jié)序是從左至右,而位序則是從右至左的,因此位域結(jié)構(gòu)在內(nèi)存中的存放有其特殊性。位域定義的先后次序也將影響該位域在內(nèi)存中存放的位置。以Data2為例,其存放如表3所示。
表3 位域在內(nèi)存中的存放示例
從表3中可以看出,位域a存放在第一個(gè)字節(jié)的低6位,第一個(gè)字節(jié)的高2位為空域;位域b則存放在第二個(gè)字節(jié)的低4位,位域c則存放在第二個(gè)字節(jié)的高4位。而位域a所占用的字節(jié)和位域b及c占用的字節(jié)則是從左至右的。
由于AIS的報(bào)文信息是按照Bit位進(jìn)行存儲(chǔ)并傳輸?shù)?,因此非常適合采用Bit Fields的方式進(jìn)行解析。通過位域結(jié)構(gòu)的定義,可以省去大部分轉(zhuǎn)換環(huán)節(jié),直接提取船舶信息。主要方法是:針對(duì)每一類報(bào)文,定義一個(gè)位域結(jié)構(gòu)并聲明一個(gè)該結(jié)構(gòu)的變量,然后將轉(zhuǎn)換得到的6Bit流直接轉(zhuǎn)換為該位域結(jié)構(gòu)類型,這樣就可以通過所定義的變量直接訪問Bit流中信息,從而實(shí)現(xiàn)AIS報(bào)文的解析。在整個(gè)過程中,位域結(jié)構(gòu)的定義就是重點(diǎn)。
以1、2、3類報(bào)文為例,報(bào)文中的每個(gè)字符經(jīng)6Bit位轉(zhuǎn)換后,不進(jìn)行拼接,直接將有效的6Bit位放在一個(gè)字節(jié)的低6位,高2位填“0”。由此整個(gè)報(bào)文的Bit流在內(nèi)存中按照表4存放。
表4 轉(zhuǎn)換后的AIS信息在內(nèi)存中存放
為了使類型轉(zhuǎn)換后的Bit Fields結(jié)構(gòu)變量能夠與Bit流對(duì)應(yīng)起來從而正確地提取船舶信息,可以如下定義位域結(jié)構(gòu):
在上述位域結(jié)構(gòu)中,每一行對(duì)應(yīng)一個(gè)8Bit位字節(jié)。按照表3的存放方式,為了除去無效的高2位,位域結(jié)構(gòu)中每行的最后始終是兩位空域,即每個(gè)字節(jié)的高兩位無效;此外,由于位序從右至左,因此同一字節(jié)里定義不同的位域時(shí)需與報(bào)文格式的先后次序相反,如上述結(jié)構(gòu)的第二行,應(yīng)先定義報(bào)文格式后面的MMSI1,再定義格式前面的Repeat indicator(RPT);而對(duì)于在不同字節(jié)的信息,按照格式次序依次定義即可,如第三、四行,先定義MMSI的第5~10位,后定義第11~16位。最終該位域結(jié)構(gòu)在內(nèi)存中存放方式如表5所示。
表5 Msg123在內(nèi)存中的存放
通過上述定義,整個(gè)位域結(jié)構(gòu)正好與轉(zhuǎn)換后的Bit流對(duì)應(yīng)起來,下一步就可以直接通過位域結(jié)構(gòu)變量提取船舶信息。
第一步:確定收到的AIS報(bào)文ID。依據(jù)AIS格式特點(diǎn),封裝電文的第一個(gè)字符指定了該報(bào)文的ID,如圖1中的“1”指明了該報(bào)文屬于1類報(bào)文。獲取報(bào)文ID主要是為了確定Bit流將要轉(zhuǎn)換的位域結(jié)構(gòu)類型。
第二步:類型轉(zhuǎn)換。依據(jù)報(bào)文ID,將Bit流轉(zhuǎn)換為對(duì)應(yīng)的位域結(jié)構(gòu)類型。仍以1、2、3類報(bào)文為例:
第三步:獲得最終的船舶信息。通過類型轉(zhuǎn)換后,就可以直接采用pMsg訪問船舶信息。如船舶的ID:
而對(duì)于跨字節(jié)的數(shù)據(jù),還需進(jìn)行移位得到最終的信息。如MMSI號(hào)碼,在報(bào)文中占用30位,在位域結(jié)構(gòu)則跨6個(gè)字節(jié),從高位到低位依次是MMSI1到MMSI6,采用移位的方式可得到最終信息:
其它信息均可按照上述方法獲取,不再一一舉例。
本文在 Windows Xp Sp3操作系統(tǒng)上,采用Visual C++6.0平臺(tái)開發(fā)解析軟件并進(jìn)行實(shí)驗(yàn)。解析軟件包括數(shù)據(jù)接收、數(shù)據(jù)校驗(yàn)、數(shù)據(jù)轉(zhuǎn)換、信息提取、信息顯示等模塊。
整個(gè)軟件運(yùn)行流程如圖2所示:數(shù)據(jù)接收模塊從外部接收到AIS語句后,數(shù)據(jù)校驗(yàn)?zāi)K則對(duì)AIS語句進(jìn)行異或校驗(yàn),對(duì)于采用多條語句傳送的消息,還需檢查該消息是否完整;確認(rèn)校驗(yàn)無誤及消息完整后,數(shù)據(jù)轉(zhuǎn)換模塊負(fù)責(zé)報(bào)文的6Bit位ASCII碼字符轉(zhuǎn)換、Bit Fields結(jié)構(gòu)類型轉(zhuǎn)換等一系列工作,最后信息提取模塊依據(jù)報(bào)文格式,從Bit Fields結(jié)構(gòu)變量中提取相對(duì)應(yīng)的船舶信息并交由信息顯示模塊進(jìn)行顯示。
圖2 軟件運(yùn)行流程
按照第二節(jié)所述方法,采用上述解析軟件對(duì)圖1中的示例報(bào)文進(jìn)行解析,解析結(jié)果如表6所示。
表6 根據(jù)報(bào)文解析得到的信息(部分)
結(jié)果表明,采用基于Bit Fields方法能夠?qū)崿F(xiàn)AIS數(shù)據(jù)的正確解析,過程簡(jiǎn)單,邏輯清晰。
AIS報(bào)文解析是實(shí)現(xiàn)AIS廣泛應(yīng)用的基礎(chǔ)。針對(duì)AIS報(bào)文采用Bit流進(jìn)行傳輸、存儲(chǔ)的特點(diǎn),結(jié)合C語言中對(duì)Bit位操作的Bit Fields方法,本文提出一種基于Bit Fields的AIS報(bào)文解析方法。該方法通過對(duì)Bit Fields的定義,省去中間復(fù)雜、繁瑣的轉(zhuǎn)換環(huán)節(jié),直接對(duì)各Bit位進(jìn)行操作后即可得到所需信息,提高了AIS報(bào)文解析效率,具有方法簡(jiǎn)單、邏輯清晰、解析高效等特點(diǎn),對(duì)以后進(jìn)一步開發(fā)ECDIS顯示系統(tǒng)、航標(biāo)系統(tǒng)以及船舶避碰專家系統(tǒng)等都具有借鑒意義。
參考文獻(xiàn)
[1]初秀民,徐海潮,萬劍,等.基于多線程的船載自動(dòng)識(shí)別系統(tǒng)報(bào)文解析[J].中國(guó)航海,2011,34(2):19-23.
[2]江衍煊,張?jiān)娪溃惛=?利用AIS串口數(shù)據(jù)進(jìn)行船舶避碰仿真[J].電腦與信息技術(shù),2010,18(1):24-27.
[3]郭善寧,何祖軍.基于VC++的AIS模擬器的設(shè)計(jì)與實(shí)現(xiàn)[J].艦船電子工程,2008,28(10):148-150.
[4]張文力.船載自動(dòng)識(shí)別系統(tǒng)[M].大連:大連海事大學(xué)出版社,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.