前兩篇也說明了一些應答的相關內容,對于剛接觸的開發者來說恐怕還是不太容易理解,這里專門列舉一個篇幅來講解如何針對終端設備上報的信息進行應答。
嚴格來講,如果不應答,終端設備會判別為服務平臺斷開連接,就會重復發送相同的信息直到平臺應答。
應答有兩種:注冊應答和通用應答。
注冊應答
顧名思義,注冊應答是指在設備初次連接平臺時會發送注冊信息,消息id一般為:0x0100具體參考部標協議截圖如下:
(圖一)
應答的消息id為:0x8100具體參考部標協議截圖如下:
(圖二)
值得一提是,上圖的內容其實不夠全面,完整的應答格式應該包含部標協議中的消息頭,消息頭必須存在于每一條消息中,不管是終端發給平臺還是平臺發給終端,都必須包含消息頭。
舉例,如果平臺收到一條終端發來的注冊消息如下:
7e0100002c01918051355000110000000037303131325345472d39383838470000000000000000000000303531333535300130353133353530167e
我們該怎么來分析這條消息呢,首先,挑出消息標示,也就是首尾的7e。0100002c0191805135500011這一段是消息頭,標準的字符串長度是:4(消息ID)+4(消息體屬性)+12(終端手機號)+4(消息流水號)=24個字符,12個字節。拆分一下就是這樣:0100`002c0191805135500011`
剩下的就是終端注冊時攜帶的具體內容,可以參考(圖一)去分拆消息。
如何應答這條消息呢?其實也是比較簡單的,消息頭可以直接復用,也就是把終端發送來的消息頭直接截取出來使用,加上圖二中的信息然后加上校驗碼,首位拼接上7e即可。
應答流水號:可以直接為0000
結果:如果設備號存在于平臺則應答:00或者03如果設備號不存在或者平臺不允許不存在于平臺數據庫的設備連接則映帶04或者選擇不應答。具體看需求策略。
鑒權碼:當應答結果為03時無需填寫,01時填寫,設備接收后會保存,下次注冊時攜帶。
綜合下來就是這樣:7e`810000030191805135500001001103b5`7e
需要注意的有兩點:
1 .在封裝完消息后,還未拼接首位的7e時要對消息進行一次轉義,具體就是把消息中所有的7e替換為7d02
所有的7d替換為7d01
2.所有的消息發送完畢后服務端不要立即關閉連接(server->close()),這其實是個常識為題,obd為長連接狀態,關閉后obd會不停觸發注冊信息。
平臺通用應答(0x8001)
這個在上篇中已經說的比較詳細了。相比上面的注冊應答,通用應答更為簡單,在理解了注冊應答后再開看通用應答無非是應答id要隨著終端上報的消息id而改變,應該的結果為:00其他的沒有什么區別。