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
表示,若校验码、消息头以及消息体中出现0x7e
及0x7d
,则要进行转义处理。转义规则定义如下:
- 先对
0x7d
进行转义,转换为固定两字节数据:0x7d0x01
- 再对
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