一個TCP長鏈接設備管理後臺工程(一)
一個TCP長鏈接設備管理後臺工程(二)git
Github倉庫地址github
前面簡單說明了基於golang的net庫進行TCP通信。如今咱們須要將現有的協議整合進去。行業內車輛終端通常都是對接交通部的JTT808協議,此處咱們要實現的是JTT808-2019版本。golang
標識位 | 消息頭 | 消息體 | 校驗碼 | 標識位 |
---|---|---|---|---|
0x7e | 0x7e |
標識位應採用0x7e表示,若校驗碼、消息頭以及消息體中出現0x7e及0x7d,則要進行轉義處理。轉義規則定義以下:算法
轉義處理過程以下:數據庫
發送消息時:先對消息進行封裝,而後計算並填充校驗碼,最後進行轉移處理;segmentfault
接收消息時:先對消息進行轉義還原,而後驗證校驗碼,最後解析消息。加密
示例:發送一包內容爲 0x30 0x7e 0x08 0x7d 0x55 的數據包,則通過封裝以下:0x7e 0x 30 0x7d 0x02 0x08 0x7d 0x01 0x55 0x7e。get
注:多字節按照大端順序傳輸
起始字節 | 字段 | 數據類型 | 描述及要求 |
---|---|---|---|
0 | 消息ID | WORD | -- |
2 | 消息體屬性 | WORD | 消息體屬性格式結構見下表 |
4 | 協議版本號 | BYTE | 協議版本號,每次關鍵修訂遞增,初始版本爲1 |
5 | 終端手機號 | BCD[10] | 根據安裝後終端自身的手機號碼轉換。手機號不足位的,則在前面補充數字。 |
15 | 消息流水號 | WORD | 按發送順序從0開始循環累加 |
17 | 消息包封裝選項 | -- | 若是消息體屬性中相關標識位肯定消息分包處理,則該項有內容,不然無該項 |
消息體屬性格式:it
15 | 14 | 13 | 12~10 | 9~0 |
---|---|---|---|---|
保留 | 版本標識 | 分包 | 數據加密方式 | 消息體長度 |
注版本標識位固定爲1
加密方式按照以下進行:table
消息分包按照以下要求進行處理:
消息包封裝項內容:
起始字節 | 字段 | 數據內容 | 描述及要求 |
---|---|---|---|
0 | 消息總包數 | WORD | 該消息分包後的總包數 |
2 | 包序號 | WORD | 從1開始 |
校驗碼的計算規則應從消息頭首字節開始,同後一字節進行異或操縱直到消息體末字節結束;校
驗碼長度爲一字節。
消息體只須要實現如下幾個命令便可:
命令 | 消息ID | 說明 |
---|---|---|
終端通用應答 | 0x0001 | 終端通用應答 |
平臺通用應答 | 0x8001 | 平臺通用應答 |
終端心跳 | 0x0002 | 消息體爲空,應答爲通用應答 |
終端註冊 | 0x0100 | |
終端註冊應答 | 0x8100 | |
終端鑑權 | 0x0102 | 應答爲通用應答 |
位置信息 | 0x0200 | 應答爲通用應答 |
終端通用應答:
起始字節 | 字段 | 數據內容 | 描述及要求 |
---|---|---|---|
0 | 應答流水號 | WORD | 該消息分包後的總包數 |
2 | 應答ID | WORD | 對應的平臺消息的ID |
4 | 結果 | BYTE | 0:成功/確認;1:失敗;2消息有誤;3:不支持 |
平臺通用應答:
起始字節 | 字段 | 數據內容 | 描述及要求 |
---|---|---|---|
0 | 應答流水號 | WORD | 對應的終端消息流水號 |
2 | 應答ID | WORD | 對應的終端消息的ID |
4 | 結果 | BYTE | 0:成功/確認;1:失敗;2消息有誤;3:不支持;4:報警處理確認 |
終端註冊:
起始字節 | 字段 | 數據內容 | 描述及要求 |
---|---|---|---|
0 | 應答流水號 | WORD | 對應的終端消息流水號 |
2 | 應答ID | WORD | 對應的終端消息的ID |
4 | 結果 | BYTE | 0:成功/確認;1:失敗;2消息有誤;3:不支持;4:報警處理確認 |
終端註冊應答:
起始字節 | 字段 | 數據內容 | 描述及要求 |
---|---|---|---|
0 | 應答流水號 | WORD | 對應的終端註冊消息的流水號 |
2 | 結果 | BYTE | 0:成功;1:車輛已被註冊;2:數據庫中無該車輛;3終端已被註冊;4數據庫中無該終端 |
3 | 鑑權碼 | STRING | 註冊結果爲成功時,纔有該字段 |
鑑權:
起始字節 | 字段 | 數據內容 | 描述及要求 |
---|---|---|---|
0 | 鑑權碼長度 | BYTE | --- |
n | 結果 | STRING | n爲鑑權碼長度 |
n+1 | 終端IMEI | BYTE[15] | --- |
n+16 | 軟件版本號 | BYTE[20] | 廠家自定義版本號,位數不足時,後補0x00,n爲鑑權碼長度 |
以上就是須要實現的808協議內容,從協議中能夠看到。對於協議實現,爲了後續拓展方便,咱們須要將它分割成兩個基本部分:協議解析和協議處理。