JT808教程:消息的结构

REDISANT 提供互联网与物联网开发测试套件 #


在JT808协议的学习和调试过程中,一款终端模拟器非常重要,推荐 JT808 Terminal Simulator,官网下载地址:https://www.redisant.cn/jt808terminal


通信方式 #

JT/T 808 协议主要基于 TCP 连接进行通信,也支持 UDP,但使用较少。使用TCP的优势如下:

  • 保证消息顺序、有序可靠传输;
  • 支持平台对接多个终端并持续维持连接;
  • 天然支持心跳机制(0x0002)、应答机制等;

JT/T 808 标准正文并没有禁止使用 UDP,但一般只有在对实时性要求极高、对丢包容忍度高的场景中才会使用 UDP,例如:

  • 高频率位置信息上报;
  • 摄像头视频预览/抓拍传输;
  • 或企业内部私有定制。

数据类型介绍 #

协议消息中使用的数据类型入下:

数据类型 描述及要求
BYTE 无符号单字节整型(字节,8位)
WORD 无符号双字节整型(字节,16位)
DWORD 无符号四字节整型(双字,32位)
BYTE[n] n字节
BCD[n] 8421码,n字节
STRING GBK编码,若无数据,置空

协议应采用大端模式的网络字节序来传递字和双字。传输规则约定如下:

  • 字节(BYTE)的传输,按照字节流的方式传输;
  • 字(WORD)的传输,先传递高八位,再传递低八位;
  • 双字( DWORI)的传输,先传递高二十四位,然后传递高十六位,再传递高八位,最后传递低位

消息的组成 #

每条消息由标识位、消息头、消息体和校验码组成,消息结构如下图所示。

标识位 #

标识位应采用0x7e表示,若校验码、消息头以及消息体中出现0x7e0x7d,则要进行转义处理。转义规则定义如下:

  1. 先对0x7d进行转义,转换为固定两字节数据:0x7d0x01
  2. 再对0x7e进行转义,转换为固定两字节数据:0x7d0x02

转义处理过程如下:

  • 发送消息时:先对消息进行封装,然后计算并填充校验码,最后进行转义处理;
  • 接收消息时:先对消息进行转义还原处理,然后验证校验码,最后解析消息。

示例:发送一包内容为0x30 0x7e 0x08 0x7d 0x55的数据包,则经过封装如下:0x7e 0x30 0x7d 0x02 0x08 0x7d 0x01 0x55 0x7e

消息头 #

消息头的结构如下所示:

起始字节 字段 数据类型 描述及要求
0 消息ID WORD
2 消息体属性 WORD 消息体属性格式结构
4 协议版本号 BYTE 协议版本,每次关键修订递增,初始版本为1
5 终端手机号 BCD[10] 根据安装后终端自身的手机号转换。手机号不足位的,则在前补充数字0
15 消息流水号 WORD 按发送顺序从0开始循环累加
17 消息包封装项 如果消息体属性中相关标识位确定消息分包处理,则该项有内容,否则无该项

其中消息体属性格式结构如下图所示:

数据应按照如下方式进行加密:

  • bit10-bit12为数据加密标识位;
  • 当此三位都为0,表示消息体不加密;
  • 当第10位为1,表示消息体经过RSA算法加密;
  • 其他位为保留位。

消息分包应按照如下要求进行处理:

  • 当消息体属性中第13位为1时表示消息体为长消息,进行分包发送处理,具体分包信息由消息包封装项决定;
  • 若第13位为0,则消息头中无消息包封装项字段。

消息包封装项内容如下:

起始字节 字段 数据类型 描述及要求
0 消息总包数 WORD 该消息分包后的总包数
2 包序号 WORD 从1开始

消息体 #

每个不同的命令消息体格式内容由各命令确定,后续章节会详细介绍各类JT808消息类型。

校验码 #

校验码的计算规则应从消息头首字节开始,同后一字节进行异或操纵,直到消息体末字节结束;校验码长度为1字节。

报文举例 #

下面是一条终端注册消息,原始的报文如下:

7E 01 00 40 54 01 00 00 00 00 00 02 23 45 67 89 00 00 00 0B 00 65 01 23 45 67 89 AB CD EF 00 00 00 01 23 45 67 89 AB CD EF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 23 45 67 89 AB CD EF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 BE A9 44 31 32 33 34 35 93 7E

我们逐个字段的分析后得到(该分析结果由 JT808 Terminal Simulator生成,软件下载地址:https://www.redisant.cn/jt808terminal):

{
  "消息头": {
    "协议版本号": 1,
    "消息ID": 256,
    "消息体属性": {
      "版本标识": true,
      "是否分包": false,
      "数据加密方式": 0,
      "消息体长度": 84
    },
    "终端手机号": "00000000000223456789",
    "消息流水号": 0,
    "消息包封装项": null
  },
  "消息体": {
    "省域ID": 11,
    "市县域ID": 101,
    "制造商ID": "0123456789ABCDEF000000",
    "终端型号": "0123456789ABCDEF00000000000000000000000000000000000000000000",
    "终端ID": "0123456789ABCDEF00000000000000000000000000000000000000000000",
    "车牌颜色": 1,
    "车牌号": "京D12345"
  }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.redisant.cn