【转】jt808终端校验码校验规则,位置信息解析规则

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.


  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
JT808国车载移动通信标准,用于车辆监控、定位、调度等领域。其注册鉴权码报文是在车辆终端与上级平台建立连接时的必要流程,本文将介绍如何使用C语言解析JT808注册鉴权码报文。 首先,我们需要了解JT808注册鉴权码报文的格式。其数据包含有消息ID、消息体属性、终端手机号、鉴权码等字段。具体格式如下: | 消息ID | 消息体属性 | 终端手机号 | 鉴权码 | |:-----:|:--------:|:-------:|:----:| | 0x0102 | 2字节 | 6字节 | 不定长 | 其,消息ID固定为0x0102,消息体属性包括消息体长度和加密方式等信息终端手机号为注册时分配的手机号,鉴权码为平台向终端下发的鉴权码。 接下来,我们可以使用C语言解析JT808注册鉴权码报文。我们可以定义一个结构体来存储报文的各个字段,如下所示: ```c typedef struct { uint16_t msg_id; uint16_t msg_len; uint8_t phone_num[6]; uint8_t auth_code[MAX_AUTH_CODE_LEN]; } JT808Auth; ``` 其,msg_id和msg_len分别表示消息ID和消息体属性的消息体长度,phone_num表示终端手机号,auth_code则用一个字符数组来存储鉴权码,MAX_AUTH_CODE_LEN为鉴权码的最大长度。 接着,我们可以编写解析函数,如下所示: ```c int parse_jt808_auth(uint8_t *buf, size_t buf_len, JT808Auth *auth) { if (buf_len < JT808_AUTH_MIN_LEN) { return -1; // 数据不足,解析失败 } uint8_t *p = buf; auth->msg_id = ntohs(*(uint16_t*)p); // 解析消息ID p += 2; uint16_t msg_attr = ntohs(*(uint16_t*)p); // 解析消息体属性 auth->msg_len = msg_attr & 0x3ff; // 取出消息体长度 p += 2; memcpy(auth->phone_num, p, 6); // 解析终端手机号 p += 6; memcpy(auth->auth_code, p, auth->msg_len - 6); // 解析鉴权码 auth->auth_code[auth->msg_len - 6] = '\0'; // 在鉴权码后面添加'\0',方便字符串操作 return 0; } ``` 在解析函数,首先判断数据长度是否足够,如果不足则直接返回解析失败。接着,使用指针p来指向数据缓冲区,根据JT808注册鉴权码报文的格式依次解析消息ID、消息体属性、终端手机号和鉴权码等字段。其,消息ID和消息体属性需要使用ntohs函数将网络字节序换成主机字节序。最后,将鉴权码后面添加一个'\0',方便后续的字符串操作。 最后,我们可以编写一个简单的测试程序来验证解析函数的正确性,如下所示: ```c int main() { uint8_t buf[] = {0x01, 0x02, 0x00, 0x0a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, '1', '2', '3', '4', '5', '6'}; JT808Auth auth; int ret = parse_jt808_auth(buf, sizeof(buf), &auth); if (ret != 0) { printf("parse failed\n"); return -1; } printf("msg_id: 0x%04x\n", auth.msg_id); printf("msg_len: %d\n", auth.msg_len); printf("phone_num: %02x%02x%02x%02x%02x%02x\n", auth.phone_num[0], auth.phone_num[1], auth.phone_num[2], auth.phone_num[3], auth.phone_num[4], auth.phone_num[5]); printf("auth_code: %s\n", auth.auth_code); return 0; } ``` 在测试程序,我们构造一个长度为10的JT808注册鉴权码报文,其鉴权码为"123456"。然后调用解析函数,将解析结果打印出来,验证解析函数的正确性。 以上就是使用C语言解析JT808注册鉴权码报文的方法,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值