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.