【JT/T 808协议】808 协议开发笔记 ② ( 终端注册 | 终端注册应答 | 字符编 ...

打印 上一主题 下一主题

主题 1042|帖子 1042|积分 3126

一、消息头 数据




1、消息头拼接


808 协议的消息头结构如下 :
  1. +----------+-------------+----------------+--------+------------+----------------+
  2. | 消息ID   | 消息体属性   | 终端手机号      | 流水号 | 总包数     | 包序号         |
  3. | 2字节    | 2字节       | 6字节(BCD)     | 2字节  | 2字节(可选)| 2字节(可选)    |
  4. +----------+-------------+----------------+--------+------------+----------------+
复制代码
这是生成的 终端注册 消息头数据 :
消息头数据 :
  1. 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 ,
将其拆解成二进制情势 为
  1. 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 编码 到 数字字符串 之间的转换 ;
  1.     /**
  2.      * 读入数据时通过按位与操作将bcd编码转换成设备编号devId
  3.      *
  4.      * @param bcd
  5.      * @return
  6.      */
  7.     public static String bcdToString(byte[] bcd) {
  8.         // 存储转码后的字符串
  9.         StringBuilder sb = new StringBuilder();
  10.         // 循环数组解码 先将每个位上的
  11.         for (int i = 0; i < bcd.length; i++) {
  12.             // 转换低字节 十六进制的  0x0f 等于十进制的 15,二进制表示为00001111,直接取到低4位
  13.             int low = (bcd[i] & 0x0f);
  14.             // 转换高字节 十六进制的  0xf0 等于十进制的 240,二进制表示为11110000,右移4位的意思是取高4位
  15.             int high = ((bcd[i] & 0xf0) >> 4);
  16.             // 如果高字节等于0xf(二进制1111)说明是补的字节,直接抛掉
  17.             if (high != 0xf) {
  18.                 sb.append(high);
  19.             }
  20.             sb.append(low);
  21.         }
  22.         // 返回解码字符串
  23.         return sb.toString();
  24.     }
  25.     /**
  26.      * 写出数据时将我们业务中的devId转换成bcd编码
  27.      *
  28.      * @param bcd
  29.      * @return
  30.      */
  31.     public static byte[] strToBcd(String bcd) {
  32.         // 获取字节数组长度
  33.         int size = bcd.length() / 2;
  34.         int remainder = bcd.length() % 2;
  35.         // 存储BCD码字节
  36.         byte[] bcdByte = new byte[size + remainder];
  37.         // 转BCD码
  38.         for (int i = 0; i < size; i++) {
  39.             int high = Integer.parseInt(bcd.substring(2 * i, 2 * i + 1));
  40.             int low = Integer.parseInt(bcd.substring(2 * i + 1, 2 * i + 2));
  41.             bcdByte[i] = (byte) ((high << 4) | low);
  42.         }
  43.         // 如果存在余数,需要填F
  44.         if (remainder > 0) {
  45.             int low = Integer.parseInt(bcd.substring(bcd.length() - 1));
  46.             bcdByte[bcdByte.length - 1] = (byte) ((0xf << 4) | low);
  47.         }
  48.         // 返回BCD码字节数组
  49.         return bcdByte;
  50.     }
复制代码

5、终端流水号 字段


10 ~ 11 字节 是 终端流水号 , " 00 00 00 36 01 85 11 88 88 88 00 01 " ,
终端流水号 , 每次发送数据后 , 自增 1 ;




二、消息体 数据



终端注册 消息体 数据如下 :
  1. 0000 - 0015: 00 00 00 00 42 59 44 00 00 32 00 00 00 00 00 00    ....BYD..2......
  2. 0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
  3. 0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
  4. 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




三、校验码计算



终端注册


  • 消息头 :
  1.         0000 - 0015: 01 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......
  2.     0016 - 0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
  3.     0032 - 0047: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
  4.     0048 - 0063: 00 00 00 00 00 00                                  ......                                  ....~
复制代码


  • 校验位 :
  1.         0000 - 0015: E4
复制代码
将 消息头 + 消息体 两个字节数组 归并后 进行校验 , 使用如下函数 从第一字节开始 进行校验 直到末了一位 ,
  1.     /**
  2.      * 校验位 校验码指从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。
  3.      *
  4.      * @return
  5.      */
  6.     public static byte crc(ByteBuf byteBuf) {
  7.         ByteBuf buf = byteBuf.copy();
  8.         byte checksum = 0;
  9.         while (buf.readableBytes() > 0) {
  10.             checksum ^= buf.readUnsignedByte();
  11.         }
  12.         return checksum;
  13.     }
复制代码




四、终极计算效果



将上述 消息头 + 消息体 + 校验位 拼装起来 ,
查看 数据中是否有 0x7e 和 0x7d , 进行转义更换 ;
出现 0x7e 的转义处理 : 0x7e <————> 0x7d 后紧跟一个 0x02;
出现 0x7d 的转义处理 : 0x7d <————> 0x7d 后紧跟一个 0x01。

终极的 终端注册数据包为 :
  1.         0000 - 0015: 7E 01 00 00 36 01 85 11 88 88 88 00 01
  2. 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                                     ....~
复制代码




五、终端注册应答



返回 终端注册应答 数据 :
  1.         0000 - 0015: 7E 81 00 00 10 01 36 00 10 10 89 00 02
  2. 00 01 00    ~.....6.........
  3.     0016 - 0031: BB CE CE D6 88 E2 47 AC BB 21 30 CE 39 48 7E       ..........089H~
复制代码

1、分解终端应答数据


前后的 0x7E 是 标识位 ;
倒数第二位 0x48 是 校验位 ;
消息头的结构 :
  1. +----------+-------------+----------------+--------+------------+----------------+
  2. | 消息ID   | 消息体属性   | 终端手机号      | 流水号 | 总包数     | 包序号         |
  3. | 2字节    | 2字节       | 6字节(BCD)     | 2字节  | 2字节(可选)| 2字节(可选)    |
  4. +----------+-------------+----------------+--------+------------+----------------+
复制代码
消息头提取出来 :
  1. 81 00 00 10 01 36 00 10 10 89 00 02
复制代码
消息体数据提取出来 :
  1. 00 01 00 BB CE CE D6 88 E2 47 AC BB 21 30 CE 39 48 7E
复制代码

参考下图进行解析 ;


2、终端应答 消息体 数据


消息体数据 :
  1. 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 编码转换

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表