解析Jt808报文常用的公用部分

校验码:

 规则:

   校验码指从消息头开始,同后一字节异或,直到校验码前一个字节,占用一个字节。

java实现代码:

/**
 * 根据byteBuf的readerIndex和writerIndex计算校验码
 * 校验码规则:从消息头开始,同后一字节异或,直到校验码前一个字节,占用 1 个字节
 * @param byteBuf
 * @return
 */
public static byte XorSumBytes(ByteBuf byteBuf) {
    byte sum = byteBuf.getByte(byteBuf.readerIndex());
    for (int i = byteBuf.readerIndex() + 1; i < byteBuf.writerIndex(); i++) {
        sum = (byte) (sum ^ byteBuf.getByte(i));
    }
    return sum;
}

判断依据:

//校验 ByteBuf escape 为netty读取的原始报文
byte pkgCheckSum = escape.getByte(escape.writerIndex() - 1);
escape.writerIndex(escape.writerIndex() - 1);//排除校验码
byte calCheckSum = JT808Util.XorSumBytes(escape);
if (pkgCheckSum != calCheckSum) {
    log.warn("校验码错误,pkgCheckSum:{},calCheckSum:{}", pkgCheckSum, calCheckSum);
    ReferenceCountUtil.safeRelease(escape);
    return null;
}

字符串位数不够自动实现补充0:

 String str= StringUtils.leftPad("123", 12, "0"); //不足前补0
 String str1= StringUtils.rightPad("123", 12, "0");//不足后补0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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注册鉴权码报文的方法,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值