刚拿到部标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最后那个86就是平台回复消息的校验码,它是由81开始到最后一个31结束这一串字符生成的,BCC校验网址:http://www.ip33.com/bcc.html
这样下来,应该可以收到终端的0x0102的鉴权消息了。校验码就分析到这里。
我们继续用那个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.