JT808终端校验码校验规则,位置信息解析规则

发布于 2018-10-23 | 作者: 不二东 | 来源: blog.csdn.net | 转载于: blog.csdn.net

1、校验码的生成规则

刚拿到部标808协议的设备时,我们从网上一篇开源JAVA平台下载了实例,地址:https://blog.csdn.net/hylexus/article/details/54987786

设备设置了IP地址、TCP端口以及联网规则,打开java平台监听到了终端的申请注册请求,但在回复请求的时候出了一点问题,就是校验码生成有误。网上看到一位大神回复校验码规则,又仔细读了部标协议里面的语句,下面借着大神的例子分析一下:

终端发回来注册消息0100:

7E 01 00 00 36 06 47 19 70 13 35 00 10 00 00 00 00 5A 4E 4B 4A 00 4B 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 32 30 33 39 37 39 00 58 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 2A 7E
其中,064719701335是物联网卡号,后面的0010是流水号,最后结尾的2A就是终端的校验码,它是由从01开始一直到最后一个30结束的这一串字符生成的,大家可以去下面那个BCC校验网址去查,这个网址也是大神提供的。
平台应该回复8100注册成功:
7E 81 00 00 09 06 47 19 70 13 35 00 10 00 10 00 31 31 31 31 31 31 86 7E
要连续两个00 10 00 10,一个属于消息头的,一个属于消息体的。后面的111111是鉴权码,相当于密码。

最后那个86就是平台回复消息的校验码,它是由81开始到最后一个31结束这一串字符生成的,BCC校验网址:http://www.ip33.com/bcc.html

这样下来,应该可以收到终端的0x0102的鉴权消息了。校验码就分析到这里。

2、位置信息的解析

我们继续用那个java平台,收取位置信息发现返回的消息体是一个长度为50的数组,数组如下:

[0, 0, 0, 0, 0, 12, 0, 3, 2, 97, 51, 52, 6, -18, -9, -15, 0, -113, 0, 0, 0, 0, 24, 4, 17, 9, 71, 1, 1, 4, 0, 0, 0, 3, 3, 2, 0, 0, 37, 4, 0, 0, 0, 0, 48, 1, 15, 49, 1, 11]

源码中的注释有说明经纬度的解析位数:

// 3. byte[8-11] 纬度(DWORD(32)) 以度为单位的纬度值乘以10^6,精确到百万分之一度

这是源码提供的转换方法:ret.setLatitude(this.parseFloatFromBytes(data, 8, 4));

最终把parseFloatFromBytes改成了转换为整型的方法,我来手动还原一遍这个过程:

首先【8-11】为【2, 97, 51, 52】转换成2进制为:

2:0000 0010

97:0110 0001

51:00110011

52:00110100

拼接在一起:00000010011000010011001100110100

转换成10进制:39924532

除以百万:39.924532

至此纬度解析完成。

// 4. byte[12-15] 经度(DWORD(32)) 以度为单位的经度值乘以10^6,精确到百万分之一度

ret.setLongitude(this.parseFloatFromBytes(data, 12, 4));

经度同理:【12-15】为【6, -18, -9, -15】转换2进制为:

6:00000110

-18:11101110

-9:11110111

-15:11110001

拼接在一起:00000110111011101111011111110001

转换成10进制:116324337

除以百万:116.324337

至此经度解析完成。

坐标为116.324337,39.924532,坐标系为WGS84.