python 语言实现jtt808协议终端报文上报及交互1
此次我们采用的协议时jtt808-2013
首先我们要了解jtt808协议是什么,这个只做简介。
先给一段报文,网上随便找的:
7E0200005B014141138693224E00000100000000000157E6DE06CBEC600000000000001703090019200104000026F5EB3700060089FFFFFFFD000700B400FFFFFFFF002400A901CC000627BD0FABCC27910000B727911287BF27BD1159C327BD0000BB27910ED1B5C97E
详细解释
原始数据为十六进制,转换成十进制后得到标准数据
7E --标识符
02 00 --消息头(消息ID)
00 5B --消息头(消息体属性)
01 41 41 13 86 93 --消息头(终端手机号)
22 4E --消息头(消息流水号)
00 00 01 00 --报警标志
00 00 00 00 --状态
01 57 E6 DE --纬度
06 CB EC 60 --经度
00 00 --高程
00 00 --速度
00 00 --方向
17 03 09 00 19 20 --时间(GTM+8)
01 --附加消息ID(0x01)
04 --附加消息长度(DWORD)
00 00 26 F5 --附加消息(里程)
EB --附加消息(0xEB,这里是厂商自定义的)
37 --附加消息长度(DWORD,16进制的37,10进制为55,剩下的消息55个长度)
0006 0089 FFFFFFFD --附加消息(厂商自定)
0007 00B4 00 FFFF FFFF --附加消息(厂商自定)
0024 00A9 01CC 00 06 --附加消息(厂商自定)
27BD 0FAB CC --附加消息(厂商自定)
2791 0000 B7 --附加消息(厂商自定)
2791 1287 BF --附加消息(厂商自定)
27BD 1159 C3 --附加消息(厂商自定)
27BD 0000 BB --附加消息(厂商自定)
2791 0ED1 B5 --附加消息(厂商自定)
C9 --校验码
7E --标识符
协议基础:
通信协议采用TCP方式,服务端和客户端
协议中采用大端模式(Big-Endian)的网络字节序来传递字和双字。
平台、设备数据交换间隔最长**秒一次 否则平台会自动断开连接。
平台、设备数据交互字符类型采用GBK编码。
从上面的解析可以看出,一条报文可以分为几个部分,
该消息结构包括:消息开始标识符、消息头(header)、消息体(body)、校验码(CRC)和消息结束标识符。
消息开始标识符(7e) |
消息头 |
消息体 |
校验码 |
消息结束标识符(7e) |
消息开始标识符:
标识位:采用0x7e表示,若校验码!消息头以及消息体中出现 0x7e ,则要进行转义处理
转义规则定义如下
0x7e → 0x7d 后紧跟一个 0x02
0x7d → 0x7d 后紧跟一个 0x01
发送一条内容为 0x30 0x7e 0x08 0x7d 0x55的数据包,则经过封装如下0x30 0x7d 0x02 0x08 0x7d 0x01 0x55
数据类型 |
说明 |
BYTE |
无符号整型,1byte |
WORD |
无符号整型,2byte |
DWORD |
无符号整型,4byte |
BYTE[n] |
n字节 |
BCD[n] |
8421码,nbyte |
STRING |
GBK编码,采用0终结符,如无数据,则放一个0x00终结符 |
2.数据类型:
数据类型 |
说明 |
INT8 |
有符号整型,1byte |
BYTE(UINT8) |
无符号整型,1byte |
INT16 |
有符号整型,2byte |
WORD (UINT16) |
无符号整型,2byte |
INT32 |
有符号整型,4byte |
DWORD(UINT32) |
无符号整型,4byte |
BCD[n] |
8421码,nbyte |
BYTE[n] |
nbyte |
STRING |
GBK编码,采用0终结符,如无数据,则放一个0x00终结符 |
效验码:
检验码指从消息头开始,同后一字节异或,直到校验码前一个字节,校验码占用一个字节
消息处理:
消息处理过程如下
发送消息时: 消息体加密 > 消息封装(消息头、消息体) > 计算并填充校验码 > 转义
接收消息时: 转义还原 > 验证校验码 > 消息拆分(消息体、消息体) > 消息体解密
以上先写协议内容及大概,第二部分写python实现