【JT/T 808協議】808 協議開發筆記 ② ( 終端注冊 | 終端注冊應答 | 字符編碼轉換網站 )

文章目錄

  • 一、消息頭 數據
    • 1、消息頭拼接
    • 2、消息 ID 字段
    • 3、消息體屬性 字段
    • 4、終端手機號 字段
    • 5、終端流水號 字段
  • 二、消息體 數據
  • 三、校驗碼計算
  • 四、最終計算結果
  • 五、終端注冊應答
    • 1、分解終端應答數據
    • 2、終端應答 消息體 數據
  • 六、字符編碼轉換網站





一、消息頭 數據




1、消息頭拼接


808 協議的消息頭結構如下 :

+----------+-------------+----------------+--------+------------+----------------+
| 消息ID   | 消息體屬性   | 終端手機號      | 流水號 | 總包數     | 包序號         |
| 2字節    | 2字節       | 6字節(BCD)     | 2字節  | 2字節(可選)| 2字節(可選)    |
+----------+-------------+----------------+--------+------------+----------------+

這是生成的 終端注冊 消息頭數據 :

消息頭數據 :

01 00 00 36 01 85 11 88 88 88 00 01

參考 下圖進行解析 :

在這里插入圖片描述


2、消息 ID 字段


0 ~ 1 字節 是消息 ID , " 01 00 00 36 01 85 11 88 88 88 00 01 "

0x0100 是 終端注冊的 消息 ID ;

在這里插入圖片描述


3、消息體屬性 字段


2 ~ 3 字節 是消息體屬性 , " 01 00 00 36 01 85 11 88 88 88 00 01 " , 也就是 00 36 ,

將其拆解成二進制形式 為

0000 0000 0011 0110

參考下面的 位數 進行對應 ,

保留位 是 00 , 分包位 是 0 , 數據加密方式是 000 ,

消息體長度是 00 0011 0110 , 對應的十六進制為 0x36 , 十進制為 54 , 消息體長度 54 字節 ;

在這里插入圖片描述


4、終端手機號 字段


4 ~ 9 字節 是 終端手機號 , " 01 00 00 36 01 85 11 88 88 88 00 01 " , 也就是 18511888888 十一位手機號 , 前面加上一個 0 ;

這是 BCD 編碼 , 每個字節 高四位 表示一個數字 , 第四位表示一個數字 ;

使用 如下代碼 , 可以實現 BCD 編碼 到 數字字符串 之間的轉換 ;

    /*** 讀入數據時通過按位與操作將bcd編碼轉換成設備編號devId** @param bcd* @return*/public static String bcdToString(byte[] bcd) {// 存儲轉碼后的字符串StringBuilder sb = new StringBuilder();// 循環數組解碼 先將每個位上的for (int i = 0; i < bcd.length; i++) {// 轉換低字節 十六進制的  0x0f 等于十進制的 15,二進制表示為00001111,直接取到低4位int low = (bcd[i] & 0x0f);// 轉換高字節 十六進制的  0xf0 等于十進制的 240,二進制表示為11110000,右移4位的意思是取高4位int high = ((bcd[i] & 0xf0) >> 4);// 如果高字節等于0xf(二進制1111)說明是補的字節,直接拋掉if (high != 0xf) {sb.append(high);}sb.append(low);}// 返回解碼字符串return sb.toString();}/*** 寫出數據時將我們業務中的devId轉換成bcd編碼** @param bcd* @return*/public static byte[] strToBcd(String bcd) {// 獲取字節數組長度int size = bcd.length() / 2;int remainder = bcd.length() % 2;// 存儲BCD碼字節byte[] bcdByte = new byte[size + remainder];// 轉BCD碼for (int i = 0; i < size; i++) {int high = Integer.parseInt(bcd.substring(2 * i, 2 * i + 1));int low = Integer.parseInt(bcd.substring(2 * i + 1, 2 * i + 2));bcdByte[i] = (byte) ((high << 4) | low);}// 如果存在余數,需要填Fif (remainder > 0) {int low = Integer.parseInt(bcd.substring(bcd.length() - 1));bcdByte[bcdByte.length - 1] = (byte) ((0xf << 4) | low);}// 返回BCD碼字節數組return bcdByte;}

5、終端流水號 字段


10 ~ 11 字節 是 終端流水號 , " 00 00 00 36 01 85 11 88 88 88 00 01 " ,

終端流水號 , 每次發送數據后 , 自增 1 ;





二、消息體 數據



終端注冊 消息體 數據如下 :

0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00    ....BYD..2......
0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
0048 - 0063: 00 00 00 00 00 00                                  ......

參考下圖進行解析 :

在這里插入圖片描述

  • 0 ~ 1 字節 : 是 省域 ID , short 雙字節整型 , 下面 藍色部分是 省域 ID 數據 ;

    0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00 …BYD…2…
    0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0048 - 0063: 00 00 00 00 00 00 …

  • 2 ~ 3 字節 : 市縣域 ID , short 整型 , 下面藍色部分對應數據 ;

    0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00 …BYD…2…
    0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0048 - 0063: 00 00 00 00 00 00

  • 4 ~ 8 字節 : 5 字節數據 , 制造商編碼 , 下面藍色部分是 " BYD " 字符串對應的 ASCII 碼 , 后面是 兩個 0 ;

    0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00 …BYD…2…
    0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0048 - 0063: 00 00 00 00 00 00

  • 9 ~ 28 字節 : 20 字節的數據 , 終端型號 , 字符 2 對應的 ASCII 碼 ; 下面藍色字體部分 ;

    0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00 …BYD…2…
    0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0048 - 0063: 00 00 00 00 00 00

  • 29 ~ 35 字節 : 7 字節的 二進制數據 , 這里設置的是 0 ;

    0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00 …BYD…2…
    0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0048 - 0063: 00 00 00 00 00 00

  • 36 ~ 36 字節 : 1 字節的 二進制數據 , 顏色代碼 ;

    0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00 …BYD…2…
    0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0048 - 0063: 00 00 00 00 00 00

  • 37 ~ 53 字節 : 17 字節的 二進制數據 , VIN 碼 , 車架號 , 這里設置默認 0 ;

    0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00 …BYD…2…
    0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
    0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    0048 - 0063: 00 00 00 00 00 00





三、校驗碼計算



終端注冊

  • 消息頭 :
	0000 - 0015: 01 00 00 36 01 85 11 88 88 88 00 01
  • 消息體 :
	0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00    ....BYD..2......0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................0048 - 0063: 00 00 00 00 00 00                                  ......                                  ....~
  • 校驗位 :
	0000 - 0015: E4

將 消息頭 + 消息體 兩個字節數組 合并后 進行校驗 , 使用如下函數 從第一字節開始 進行校驗 直到最后一位 ,

    /*** 校驗位 校驗碼指從消息頭開始,同后一字節異或,直到校驗碼前一個字節,占用一個字節。** @return*/public static byte crc(ByteBuf byteBuf) {ByteBuf buf = byteBuf.copy();byte checksum = 0;while (buf.readableBytes() > 0) {checksum ^= buf.readUnsignedByte();}return checksum;}




四、最終計算結果



將上述 消息頭 + 消息體 + 校驗位 拼裝起來 ,

查看 數據中是否有 0x7e 和 0x7d , 進行轉義替換 ;

出現 0x7e 的轉義處理 : 0x7e <————> 0x7d 后緊跟一個 0x02;
出現 0x7d 的轉義處理 : 0x7d <————> 0x7d 后緊跟一個 0x01。


最終的 終端注冊數據包為 :

	0000 - 0015: 01 00 00 36 01 85 11 88 88 88 00 01 00 00 00 00    ~...6.6.........0016 - 0031: 00 42 59 44 00 00 32 00 00 00 00 00 00 00 00 00    .BYD..2.........0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................0048 - 0063: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................0064 - 0079: 00 00 00 E4 7E                                     ....~




五、終端注冊應答



返回 終端注冊應答 數據 :

	0000 - 0015: 7E 81 00 00 10 01 36 00 10 10 89 00 02 00 01 00    ~.....6.........0016 - 0031: BB CE CE D6 88 E2 47 AC BB 21 30 CE 39 48 7E       ..........089H~

1、分解終端應答數據


前后的 0x7E 是 標識位 ;

倒數第二位 0x48 是 校驗位 ;

消息頭的結構 :

+----------+-------------+----------------+--------+------------+----------------+
| 消息ID   | 消息體屬性   | 終端手機號      | 流水號 | 總包數     | 包序號         |
| 2字節    | 2字節       | 6字節(BCD)     | 2字節  | 2字節(可選)| 2字節(可選)    |
+----------+-------------+----------------+--------+------------+----------------+

消息頭提取出來 :

81 00 00 10 01 36 00 10 10 89 00 02

消息體數據提取出來 :

00 01 00 BB CE CE D6 88 E2 47 AC BB 21 30 CE 39 48 7E

參考下圖進行解析 ;

在這里插入圖片描述


2、終端應答 消息體 數據


消息體數據 :

00 01 00 BB CE CE D6 88 E2 47 AC BB 21 30 CE 39 48 7E

在這里插入圖片描述

  • 00 01 是 應答 流水號 ;
  • 00 表示 終端注冊 成功 ;
  • BB CE CE D6 88 E2 47 AC BB 21 30 CE 39 是 鑒權碼 字符串對應的 二進制數據 ;




六、字符編碼轉換網站



字符編碼轉換網站 :

  • GBK 編碼轉換
  • UTF-8 編碼轉換
  • URL 編碼轉換

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70427.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用ezuikit-js封裝一個對接攝像頭的組件

ezuikit-js 是一個基于 JavaScript 的視頻播放庫&#xff0c;主要用于在網頁中嵌入實時視頻流播放功能。它通常用于與支持 RTSP、RTMP、HLS 等協議的攝像頭或視頻流服務器進行交互&#xff0c;提供流暢的視頻播放體驗。 主要功能 多協議支持&#xff1a;支持 RTSP、RTMP、HLS …

一周學會Flask3 Python Web開發-flask3模塊化blueprint配置

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程&#xff1a; 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 我們在項目開發的時候&#xff0c;多多少少會劃分幾個或者幾十個業務模塊&#xff0c;如果把這些模塊的視圖方法都寫在app.py…

DSC數字選擇性呼叫

GMDSS Digital Selective Calling WAVECOM Decoder Online Help 12.0.0 VHF Marine GMDSS/DSC Decode & Scicos Simulation Black Cat Systems &#xff08;一&#xff09;DSC調制方式 DSC&#xff08;Digital Selective Calling&#xff0c;數字選擇性呼叫&#xff0…

科普:你的筆記本電腦中有三個IP:127.0.0.1、無線網 IP 和局域網 IP;兩個域名:localhost和host.docker.internal

三個IP 你的筆記本電腦中有三個IP&#xff1a;127.0.0.1、無線網 IP 和局域網 IP。 在不同的場景下&#xff0c;需要選用不同的 IP 地址&#xff0c;如下為各自的特點及適用場景&#xff1a; 127.0.0.1&#xff08;回環地址&#xff09; 特點 127.0.0.1 是一個特殊的 IP 地…

《AI與NLP:開啟元宇宙社交互動新紀元》

在科技飛速發展的當下&#xff0c;元宇宙正從概念逐步走向現實&#xff0c;成為人們關注的焦點。而在元宇宙諸多令人矚目的特性中&#xff0c;社交互動體驗是其核心魅力之一。人工智能&#xff08;AI&#xff09;與自然語言處理&#xff08;NLP&#xff09;技術的迅猛發展&…

量化方法bitsandbytes hqq eetq區別

量化方法bitsandbytes、HQQ&#xff08;Half-Quadratic Quantization&#xff09;和EETQ&#xff08;Efficient and Effective Ternary Quantization&#xff09;在深度學習模型壓縮和加速中各有特點&#xff0c;以下是它們的區別&#xff1a; 1. bitsandbytes 概述: bitsand…

Hutool - Log:自動識別日志實現的日志門面

一、簡介 在 Java 開發中&#xff0c;日志記錄是一項非常重要的功能&#xff0c;它可以幫助開發者在開發和生產環境中監控程序的運行狀態、排查問題。然而&#xff0c;Java 生態系統中有多種日志實現框架&#xff0c;如 Log4j、Logback、JDK 自帶的日志框架等。為了在不同的項…

偽404兼容huawei生效顯示404

根據上述思考&#xff0c;以下是詳細的中文分步說明&#xff1a; --- **步驟 1&#xff1a;獲取目標設備的User-Agent信息** 首先&#xff0c;我們需要收集目標設備的User-Agent字符串&#xff0c;包括&#xff1a; 1. **iPhone設備的User-Agent**&#xff1a; Mozi…

github配置sshkey

使用命令生成sshkey ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 依此會要求輸入以下信息&#xff0c;可以使用默認值 設置保存密鑰的路徑 設置SSH密鑰密碼&#xff08;備注&#xff1a;空內容表示不設置SSH密鑰密碼&#xff09; 再次確認SSH密鑰密…

深入理解WebSocket接口:如何使用C++實現行情接口

在現代網絡應用中&#xff0c;實時數據傳輸變得越來越重要。通過WebSocket&#xff0c;我們可以建立一個持久連接&#xff0c;讓服務器和客戶端之間進行雙向通信。這種技術不僅可以提供更快的響應速度&#xff0c;還可以減少不必要的網絡流量。本文將詳細介紹如何使用C來實現We…

FFMPEG編碼容錯處理解決辦法之途徑----升級庫文件

在qt開發環境下接收網絡數據&#xff0c;調用ffmpeg解碼播放視頻&#xff0c;出現閃屏現象&#xff0c;具體現象可以使用操作系統自帶的ffplay播放器播放原始視頻流可復現&#xff1b;而使用操作系統自帶的mpv播放器播放視頻則不會出現閃屏&#xff1b;閃屏時會報Could not fin…

什么是超越編程(逾編程)(元編程?)

超越編程(逾編程)(元編程&#xff1f;)(meta-programming) 目錄 1. meta- 的詞源 2. 逾編程(meta-programming) 的直實含義 2.1 定義 2.2 說明 3. 翻譯成“元編程”應該是一種錯誤 1. meta- 的詞源 這是一個源自希臘語的構詞元素&#xff0c;其有三種含義&#xff…

基于Martin的全國基礎底圖實現

概述 前面有文章基于Martin實現MapboxGL自定義底圖分享了Martin的使用&#xff0c;本文使用網絡收集的數據實現了全國基礎數據的收集和基礎底圖。 實現后效果 實現 1. 數據準備 實例中包含如下數據&#xff1a; 邊界線和九段線數據省邊界面數據省會城市點數據市邊界面數據…

新版Tomcat MySQL IDEA 安裝配置過程遇到的問題

一、IDEA閃退 打不開了 IDEA環境變量路徑不對 二、Tomcat 一閃而過 主要是JDK環境變量不對 三、MySQL 重新安裝、是否備份以及默認盤問題 看清楚教程基本沒問題&#xff1a;Windows 安裝配置及卸載MySQL8超詳細保姆級教程_mysql8卸載-CSDN博客

鏈表_兩兩交換鏈表中的節點

鏈表_兩兩交換鏈表中的節點 一、leetcode-24二、題解1.引庫2.代碼 一、leetcode-24 兩兩交換鏈表中的節點 給你一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題&#xff08;即&#xff0c;只能…

DAY08 List接口、Collections接口、Set接口

學習目標 能夠說出List集合特點1.有序2.允許存儲重復的元素3.有帶索引的方法(練習 add,remove,set,get) 能夠使用集合工具類Collections類:static void sort(List<T> list) 根據元素的自然順序 對指定列表按升序進行排序。static <T> void sort(List<T> lis…

Zookeeper(58)如何在Zookeeper中實現分布式鎖?

在 Zookeeper 中實現分布式鎖是一種常見的用例。Zookeeper 提供了強一致性、高可用性的分布式協調服務&#xff0c;使得它非常適合用來實現分布式鎖。以下是詳細的步驟和代碼示例&#xff0c;展示如何在 Zookeeper 中實現分布式鎖。 1. Zookeeper 分布式鎖的基本原理 Zookeep…

帆軟報表FineReport入門:簡單報表制作[擴展|左父格|上父格]

FineReport幫助文檔 - 全面的報表使用教程和學習資料 數據庫連接 點擊號>>JDBC 選擇要連接的數據庫>>填寫信息>>點擊測試連接 數據庫SQLite是帆軟的內置數據庫, 里面有練習數據 選擇此數據庫后,點擊測試連接即可 數據庫查詢 方法一: 在左下角的模板數據集…

后臺管理系統-項目初始化

認識vue-admin **核心交付:** 為什么要基于現成架子二次開發 什么是二次開發:基于已有的代碼(項目工程,腳手架)開進行新功能的開發 所以看懂已有的框架中的既有代碼,變得很重要了 1. 背景知識 后臺管理系統是一種最常見的應用模式,不同的管理系統之間有很多相似的地方…

DAY07 Collection、Iterator、泛型、數據結構

學習目標 能夠說出集合與數組的區別數組:1.是引用數據類型的一種2.可以存儲多個元素3.數組的長度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.數組即可以存儲基本類型的數據,又可以存儲引用數據類型的數據int[],double[],String[],Student[]集合:1.是引用數據類…