摘要:將接收到的消息還原轉(zhuǎn)義后除去消息標識和校驗位,按位異或得到的結(jié)果就是這條消息的校驗碼,和校驗位比對驗證其的一致性。將要發(fā)出的消息封裝好后出去標示位外,按位異或,得到的校驗碼放在消息尾部,然后轉(zhuǎn)義。
終端是指obd設(shè)備,既車載obd設(shè)備。
平臺是指上文中說到的通過短信設(shè)置的上報IP指向的機器所提供的網(wǎng)關(guān)服務。
這兩種消息一是終端設(shè)備發(fā)出的,一是平臺發(fā)出的,都是通用應答的格式,所謂通用既是可以用于應答其他消息的一種消息格式。
0x0001終端通用應答起始字節(jié) | 字段 | 數(shù)據(jù)類型 | 描述及要求 |
---|---|---|---|
0 | 應答流水號 | WORD | 對應的平臺消息的流水號 |
2 | 應答 ID | WORD | 對應的平臺消息的 ID |
4 | 結(jié)果 | BYTE | 0:成功/確認;1:失敗;2:消息有誤;3:不支持 |
ps.上表省略消息頭部分,默認所有的應答和發(fā)送都帶有消息頭
在平臺下發(fā)指令或者設(shè)置終端參數(shù)(0x8103)時設(shè)備將應答此消息。
應答流水號:一個四位字符的16進制字符串,是平臺消息的流水號,可以為 0000
應答ID: 四位字符16進制的消息id,如(8103,0001等)
應答結(jié)果:兩位字符的16進制字符,如表中的結(jié)果應答為,00:成功,01:失敗,02:消息有誤等
0x8001平臺通用應答設(shè)備發(fā)送的消息,除注冊應答(0x8100)、校時應答(0x8f01)外其他數(shù)據(jù)數(shù)據(jù)發(fā)送都可使用此消息id應答。
如消息:7E80010005013183700516000005D2020000817E
解析如下:
拆分編號 | 消息 | 說明 |
---|---|---|
1 | 7e | 消息標示 |
2 | 8100 | 消息ID |
3 | 000F | 消息體屬性 |
4 | 013183700516 | 設(shè)備號 |
5 | 0000 | 消息流水號 |
6 | 05D2 | 對應的終端消息的流水號,既終端消息的流水號 |
7 | 0200 | 對應的終端消息的 ID |
8 | 00 | 0:成功/確認;1:失敗;2:消息有誤;3:不支持;4:報警確認處理 |
9 | 81 | 校驗碼 |
10 | 7e | 消息標示 |
消息頭就不說了,這里需要注意的是 編號7 行的 0200是設(shè)備位置信息匯報的消息id,這說明這條信息是應答設(shè)備發(fā)出的位置信息匯報(0x0200)的結(jié)果, 回復不同的消息,這里的數(shù)據(jù)是不同的。
校驗碼的計算上篇大概說了一下計算的方法,這里詳細寫下計算校驗碼和驗證校驗碼的細節(jié)。
將接收到的消息還原轉(zhuǎn)義后除去消息標識和校驗位,按位異或得到的結(jié)果就是這條消息的校驗碼,和校驗位比對驗證其的一致性。
將要發(fā)出的消息封裝好后出去標示位外,按位異或,得到的校驗碼放在消息尾部,然后轉(zhuǎn)義。
#按位偽代碼 function bcc(array data) { xor = data[0]; for(i=1; i< data.length; i++) { xor ^= data[i] } return xor }
熟悉上面的過程且看下如下代碼:
轉(zhuǎn)義和還原轉(zhuǎn)義代碼舉例
/** * Jt808協(xié)議解析 */ class Jt808 implements Protocol { public $hex; /** * 消息體內(nèi)容 * @var |body */ public $body; /** * 轉(zhuǎn)義與轉(zhuǎn)義還原時使用 * @var array */ public $search = ["7d01", "7d02"]; public $replace = ["7d", "7e"]; ... ... /** * 轉(zhuǎn)義消息內(nèi)容 * 7d -> 7d01 * 7e -> 7d02 * @return mixed */ public function escape($msg = "") { if ($msg) { return "7e" . str_replace($this->replace, $this->search, $msg) . "7e"; } else { $this->hex = "7e" . str_replace($this->replace, $this->search, substr($this->hex, 2, -2)) . "7e"; } } /** * 還原轉(zhuǎn)義 * 7d01 -> 7d * 7d02 -> 7e * @return mixed */ public function descape($msg = "") { if ($msg) { return str_replace($this->search, $this->replace, $msg); } else { $this->hex = "7e" . str_replace($this->search, $this->replace, substr($this->hex, 2, -2)) . "7e"; } } }
計算&驗證校驗碼舉例
#@param check_code|校驗碼 為空是計算校驗碼,不為空為驗證校驗碼 function bcc($msg, $check_code = "") { //按兩位字符切割字符串 $check_str_array = str_split($msg, 2); $str_len = count($check_str_array); $xor = hexdec($check_str_array[0]); for ($i = 1; $i < $str_len; $i++) { $xor ^= hexdec($check_str_array[$i]); } $xor = dechex($xor); $xor = str_pad($xor, 2, 0, STR_PAD_LEFT); #不足兩位前面填充0 if (!$check_code) { return $xor; } return $xor == $check_code; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29630.html
摘要:從設(shè)備使能信號,由主設(shè)備控制,只有該信號為預先規(guī)定的使能信號,對該芯片的操作才有效,這就允許再統(tǒng)一總線上連接多個設(shè)備。點對點通信中,接口不需要進行尋址操作,但是沒有指定的流控制,沒有應答機制確認是否接收到數(shù)據(jù)。 1、GPIO 通用可編程IO接口,對于簡單的外圍設(shè)備或者電路,需要CPU為之提供...
摘要:總線空閑和均為高電平協(xié)議起始位為高電平時,出現(xiàn)下降沿協(xié)議終止位為高電平時,出現(xiàn)上升沿。主設(shè)備產(chǎn)生所有時鐘脈沖,包括確認位第九個時鐘脈沖。當在第個時鐘脈沖期間保持高時,這被定義為非應答信號。 ...
摘要:是定位協(xié)議通訊協(xié)議基礎(chǔ)協(xié)議其他協(xié)議基于該協(xié)議進行擴展。是轉(zhuǎn)發(fā)協(xié)議監(jiān)管協(xié)議第三方平臺通過向進行數(shù)據(jù)獲取與事件下發(fā)。蘇標主動安全協(xié)議高級駕駛輔助報警駕駛員狀態(tài)報警胎壓監(jiān)測報警盲區(qū)監(jiān)測報警在觸發(fā)報警時需要上報附件視頻圖片文本。 ...
閱讀 2542·2023-04-25 17:37
閱讀 1230·2021-11-24 10:29
閱讀 3744·2021-09-09 11:57
閱讀 725·2021-08-10 09:41
閱讀 2272·2019-08-30 15:55
閱讀 2842·2019-08-30 15:54
閱讀 1972·2019-08-30 15:53
閱讀 930·2019-08-30 15:43