2.3 電子海圖系統(tǒng)解析及開發(fā) 功能開發(fā)

單純的電子海圖顯示功能在實(shí)踐中是遠(yuǎn)遠(yuǎn)不夠的,需要接入諸如計(jì)程儀蝎土、羅經(jīng)视哑、AIS、GPS誊涯、雷達(dá)等數(shù)據(jù)挡毅,才能滿足基本的航海實(shí)踐需要。而不同航海電子傳感器之間數(shù)據(jù)交互主要采用NMEA 0183格式醋拧。

image.png

NMEA 0183是美國國家海洋電子協(xié)會(National Marine Electronics Association )為海用電子設(shè)備制定的標(biāo)準(zhǔn)格式慷嗜,目前已成為船舶各電子設(shè)備(如:測深儀淀弹,電羅經(jīng)丹壕,自動舵,AIS薇溃,GPS菌赖,計(jì)程儀等)之間數(shù)據(jù)傳輸?shù)臉?biāo)準(zhǔn)。該協(xié)議采用ASCII碼沐序,其串行通信默認(rèn)參數(shù)為:波特率=9600bps琉用,數(shù)據(jù)位=8bit,開始位=1bit策幼,停止位=1bit邑时,無奇偶校驗(yàn)。NEMA協(xié)議的數(shù)據(jù)結(jié)構(gòu)如下:

ASCII 十六進(jìn)制 十進(jìn)制 描述
<CR> 0x0d 13 回車
<LF> 0x0a 10 換行
! 0x21 33 封裝語句的開始標(biāo)志
$ 0x24 36 開始標(biāo)志
* 0x2a 42 校驗(yàn)和
, 0x2c 44 字段分隔標(biāo)志
\ 0x5c 92 標(biāo)簽塊標(biāo)志
^ 0x5e 94 用十六進(jìn)制表示ASCII的編碼標(biāo)志
~ 0x7e 126 保留
  • 消息的最大長度為82個(gè)字符特姐,包括開始字符‘$’或‘!’和結(jié)束字符<LF>晶丘;
  • 每個(gè)消息的起始字符可以是‘$’(對于常規(guī)的字段分隔消息)或'!'(對于具有特殊封裝的消息);
  • 接下來的五個(gè)字符標(biāo)識設(shè)備類型TalkID(兩個(gè)字符)和報(bào)文類型(三個(gè)字符)唐含;
  • 后面的所有數(shù)據(jù)字段均以逗號分隔浅浮;
  • 如果沒有數(shù)據(jù),則相應(yīng)的字段保持空白(在下一個(gè)分隔符之前不包含任何字符)捷枯;
  • 在最后一個(gè)數(shù)據(jù)字段字符之后的第一個(gè)字符是星號滚秩,但僅在提供校驗(yàn)和時(shí)才包括在內(nèi);
  • 星號后緊跟一個(gè)校驗(yàn)和淮捆,以兩位十六進(jìn)制數(shù)表示郁油,校驗(yàn)和是‘$’和‘*’之間的所有字符的ASCII碼的按位異或本股。根據(jù)官方規(guī)范,校驗(yàn)和對于大多數(shù)數(shù)據(jù)語句是可選的桐腌,但對有些設(shè)備則是強(qiáng)制性的痊末;
  • <CR> <LF>表示消息結(jié)束。
例1:$GPAAM,A,A,0.10,N,WPTNME*32

表示:常規(guī)消息(‘$’為開始符)哩掺;設(shè)備類型為:GP凿叠;消息類型:AAM;數(shù)據(jù)為:A,A,0.10,N,WPTNME嚼吞,校驗(yàn)和:32盒件。

例2:!AIVDM,1,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C

表示:封裝消息(‘!’為開始符);設(shè)備類型為:AI舱禽;消息類型:VDM炒刁;數(shù)據(jù)為:1,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0,校驗(yàn)和:5C誊稚。

新建一類庫NMEAParser翔始,并添加靜態(tài)類NMEA0813Parser去解析NMEA0813標(biāo)準(zhǔn)ASCII字符,通過識別不同的設(shè)備而采用不用的解碼器里伯。

    public static class NMEA0813Parser
    {
        /// <summary>
        /// 將NMEA數(shù)據(jù)解析城瞎,并封裝成Hashtable。
        /// </summary>
        /// <param name="sentence">NMEA標(biāo)準(zhǔn)的ASCII字符串</param>
        /// <returns>將數(shù)據(jù)解析成Hashtable</returns>
        /// <exception cref="Exception"></exception>
        public static Hashtable Parse(string sentence)
        {
            if (IsChecksumCorrect(sentence))
            {
                var ss = sentence.Split('*');
                switch (ss[0].Substring(0, 6))
                {
                    //GPS數(shù)據(jù) 暫時(shí)只支持以下八種
                    case "$GPRMC":
                    case "$GPGGA":
                    case "$GPGSA":
                    case "$GPGLL":
                    case "$GPGST":
                    case "$GPGSV":
                    case "$GPVTG":
                    case "$GPZDA":
                        return GPSParser.ParseSentence(ss[0]);

                    //AIS數(shù)據(jù) 暫時(shí)只支持以下兩種
                    case "!AIVDM":
                    case "!AIVDO":
                        return AISParser.ParseSentence(ss[0]);

                    default:
                        break;
                }
            }

            return null;
        }
        
        private static bool IsChecksumCorrect(string sentence)
        {
            if (sentence[0] != '!' && sentence[0] != '$') throw new Exception("NMEA數(shù)據(jù)開始標(biāo)志不正確");
            var lastIndex = sentence.LastIndexOf('*');

            if (lastIndex > 1)
            {
                byte checksum = 0;

                for (int i = 1; i < lastIndex; i++)
                {
                    // 使用異或
                    checksum ^= (byte)sentence[i];
                }
                
                // 返回十六進(jìn)制的校驗(yàn)和
                return checksum.ToString("X2") == sentence.Substring(lastIndex+1, 2);
            }
            else //不存在校驗(yàn)和
            {
                return true;
            }
        }
    }

考慮到簡單應(yīng)用疾瓮,代碼并不能完全解析NMEA0813的全部類型的數(shù)據(jù)脖镀。目前,GPS解碼器與AIS解碼器只考慮最常見的情況狼电,具體流程見后文蜒灰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肩碟,隨后出現(xiàn)的幾起案子强窖,更是在濱河造成了極大的恐慌,老刑警劉巖削祈,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翅溺,死亡現(xiàn)場離奇詭異,居然都是意外死亡岩瘦,警方通過查閱死者的電腦和手機(jī)未巫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來启昧,“玉大人叙凡,你說我怎么就攤上這事∶苣” “怎么了握爷?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵跛璧,是天一觀的道長。 經(jīng)常有香客問我新啼,道長追城,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任燥撞,我火速辦了婚禮座柱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘物舒。我一直安慰自己色洞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布冠胯。 她就那樣靜靜地躺著火诸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荠察。 梳的紋絲不亂的頭發(fā)上置蜀,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音悉盆,去河邊找鬼盯荤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舀瓢,可吹牛的內(nèi)容都是我干的廷雅。 我是一名探鬼主播耗美,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼京髓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了商架?” 一聲冷哼從身側(cè)響起堰怨,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛇摸,沒想到半個(gè)月后备图,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赶袄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年揽涮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饿肺。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒋困,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敬辣,到底是詐尸還是另有隱情雪标,我是刑警寧澤零院,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站村刨,受9級特大地震影響告抄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嵌牺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一打洼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逆粹,春花似錦拟蜻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奢方,卻和暖如春搔扁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蟋字。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工稿蹲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苛聘。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像忠聚,于是被迫代替她去往敵國和親设哗。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容