前篇:
一个TCP长连接设备管理后台工程(一)
一个TCP长连接设备管理后台工程(二)
TCP协议整合JTT808协议
前面简单说明了基于golang的net库进行TCP通讯。现在我们需要将现有的协议整合进去。行业内车辆终端一般都是对接交通部的JTT808协议,此处我们要实现的是JTT808-2019版本。
消息结构
标识位 | 消息头 | 消息体 | 校验码 | 标识位 |
---|---|---|---|---|
0x7e | 0x7e |
标识位应采用0x7e表示,若校验码、消息头以及消息体中出现0x7e及0x7d,则要进行转义处理。转义规则定义如下:
- 先对0x7d进行转义,转换为固定两个字节数据:0x7d 0x01;
- 再对0x7e进行转义,转换为固定两个字节数据:0x7d 0x02。
转义处理过程如下:
发送消息时:先对消息进行封装,然后计算并填充校验码,最后进行转移处理;
接收消息时:先对消息进行转义还原,然后验证校验码,最后解析消息。
示例:发送一包内容为 0x30 0x7e 0x08 0x7d 0x55 的数据包,则经过封装如下:0x7e 0x 30 0x7d 0x02 0x08 0x7d 0x01 0x55 0x7e。
注:多字节按照大端顺序传输
消息头
起始字节 | 字段 | 数据类型 | 描述及要求 |
---|---|---|---|
0 | 消息ID | WORD | -- |
2 | 消息体属性 | WORD | 消息体属性格式结构见下表 |
4 | 协议版本号 | BYTE | 协议版本号,每次关键修订递增,初始版本为1 |
5 | 终端手机号 | BCD[10] | 根据安装后终端自身的手机号码转换。手机号不足位的,则在前面补充数字。 |
15 | 消息流水号 | WORD | 按发送顺序从0开始循环累加 |
17 | 消息包封装选项 | -- | 如果消息体属性中相关标识位确定消息分包处理,则该项有内容,否则无该项 |
消息体属性格式:
15 | 14 | 13 | 12~10 | 9~0 |
---|---|---|---|---|
保留 | 版本标识 | 分包 | 数据加密方式 | 消息体长度 |
注版本标识位固定为1
加密方式按照如下进行:
- bit10~bit12为数据加密标识位;
- 当此三位为0,标识消息体不加密;
- 当第10位为1,标识消息体经过RSA算法加密;
- 其它位为保留位。
消息分包按照如下要求进行处理:
- 当消息体属性中第13位为1时表示消息体为长消息,进行分包发送处理,具体分包消息由消息包封包项决定;
- 若第13位为0,则消息头中无消息包封装项字段。
消息包封装项内容:
起始字节 | 字段 | 数据内容 | 描述及要求 |
---|---|---|---|
0 | 消息总包数 | WORD | 该消息分包后的总包数 |
2 | 包序号 | WORD | 从1开始 |
校验码
校验码的计算规则应从消息头首字节开始,同后一字节进行异或操纵直到消息体末字节结束;校
验码长度为一字节。
消息体
消息体只需要实现以下几个命令即可:
命令 | 消息ID | 说明 |
---|---|---|
终端通用应答 | 0x0001 | 终端通用应答 |
平台通用应答 | 0x8001 | 平台通用应答 |
终端心跳 | 0x0002 | 消息体为空,应答为通用应答 |
终端注册 | 0x0100 | |
终端注册应答 | 0x8100 | |
终端鉴权 | 0x0102 | 应答为通用应答 |
位置信息 | 0x0200 | 应答为通用应答 |
数据格式
终端通用应答:
起始字节 | 字段 | 数据内容 | 描述及要求 |
---|---|---|---|
0 | 应答流水号 | WORD | 该消息分包后的总包数 |
2 | 应答ID | WORD | 对应的平台消息的ID |
4 | 结果 | BYTE | 0:成功/确认;1:失败;2消息有误;3:不支持 |
平台通用应答:
起始字节 | 字段 | 数据内容 | 描述及要求 |
---|---|---|---|
0 | 应答流水号 | WORD | 对应的终端消息流水号 |
2 | 应答ID | WORD | 对应的终端消息的ID |
4 | 结果 | BYTE | 0:成功/确认;1:失败;2消息有误;3:不支持;4:报警处理确认 |
终端注册:
起始字节 | 字段 | 数据内容 | 描述及要求 |
---|---|---|---|
0 | 应答流水号 | WORD | 对应的终端消息流水号 |
2 | 应答ID | WORD | 对应的终端消息的ID |
4 | 结果 | BYTE | 0:成功/确认;1:失败;2消息有误;3:不支持;4:报警处理确认 |
终端注册应答:
起始字节 | 字段 | 数据内容 | 描述及要求 |
---|---|---|---|
0 | 应答流水号 | WORD | 对应的终端注册消息的流水号 |
2 | 结果 | BYTE | 0:成功;1:车辆已被注册;2:数据库中无该车辆;3终端已被注册;4数据库中无该终端 |
3 | 鉴权码 | STRING | 注册结果为成功时,才有该字段 |
鉴权:
起始字节 | 字段 | 数据内容 | 描述及要求 |
---|---|---|---|
0 | 鉴权码长度 | BYTE | --- |
n | 结果 | STRING | n为鉴权码长度 |
n+1 | 终端IMEI | BYTE[15] | --- |
n+16 | 软件版本号 | BYTE[20] | 厂家自定义版本号,位数不足时,后补0x00,n为鉴权码长度 |
以上就是需要实现的808协议内容,从协议中可以看到。对于协议实现,为了后续拓展方便,我们需要将它分割成两个基本部分:协议解析和协议处理。
有疑问加站长微信联系(非本文作者)