博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
部标JT808协议处理方案
阅读量:2069 次
发布时间:2019-04-29

本文共 1916 字,大约阅读时间需要 6 分钟。

序言

       本来说弄个系列博客,但是在实施的过程中,发现没有想象的复杂.搞清楚下面的,后面的都是体力劳动

       现在开始弄交通部808协议解析具体的实施,之前都是在研究框架.今天正式开始实施.本篇主要介绍一些基础知识.另没有源码,cuiyaonan2000@163.com 仅限问题讨论与实施方案的交流.本文使用的参考资料室JTT808-2013协议

 

位运算(一定要搞明白)

<<表示左移移,不分正负数,低位补0; 

注:以下数据类型默认为byte-8位

左移时不管正负,低位补0(左移一位就乘以2,两位就乘以4,依次类推)

正数:r = 20 << 2

  20的二进制补码:0001 0100

  向左移动两位后:0101 0000

         结果:r = 80

负数:r = -20 << 2

  -20 的二进制原码 :1001 0100

  -20 的二进制反码 1110 1011

  -20 的二进制补码 :1110 1100

  左移两位后的补码:1011 0000

        反码:1010 1111

        原码:1101 0000 

        结果:r = -80

>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;

注:以下数据类型默认为byte-8位

正数:r = 20 >> 2

  20的二进制补码:0001 0100

  向右移动两位后:0000 0101

       结果:r = 5

负数:r = -20 >> 2

  -20 的二进制原码 :1001 0100

  -20 的二进制反码 :1110 1011

  -20 的二进制补码 :1110 1100 

  右移两位后的补码:1111 1011 

        反码:1111 1010

        原码:1000 0101

        结果:r = -5

>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0

正数: r = 20 >>> 2

    的结果与 r = 20 >> 2 相同;

负数: r = -20 >>> 2

注:以下数据类型默认为int 32位

  -20:源码:10000000 00000000 00000000 00010100

    反码:11111111  11111111   11111111   11101011

    补码:11111111  11111111   11111111   11101100

    右移:00111111  11111111   11111111   11111011

    结果:r = 1073741819

 

Netty

Netty用来接收终端的连接,并且解决TCP粘包,终端心跳.这个都很容易实现.但是Netty的不同版本,实操起来还是有很大的差距的.一定要合理的设计好.(另暂时不考虑udp的连接处理)

 

上行命令解析

协议的结构如下所示.可以看出,标识位,消息头,检验码,标识位都是相对固定的.只有消息体不是固定的.所以我们可以使用策略模式根据消息头的消息ID来选择哪种方式来解析消息体.当然了这个是最复杂和最重要的.(要搞清楚位运算才能更好地去解析.)

下行命令

下行命令没什么好说的.就是根据上上行的规则进行编码发送就行了.

 

首先获取整段的一条命令

这个由Netty完成了,当然有些时候需要自己写代码弄.比如为了兼容不同年份的协议的时候~~~~~

 

转义还原

          我们收到的数据都是经过了转义的所以要先还原.

 

校验位算法

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

/**	 * 异或运算和	 * @param bytes	 * @return	 */	public static byte[] byteOrbyte(byte[] bytes){		byte[] orbyte = new byte[1];		byte value = bytes[0];		for (int i = 1; i < bytes.length; i++) {			value = (byte) (value^bytes[i]);		}		orbyte[0] = value;		return orbyte;	}

 

关于终端连接

首次终端连接,需要先注册获取鉴权码.后面再次连接就直接走鉴权命令了,就不需要走注册命令.具体流程参考如下:

终端注册

首先进行终端注册,解析对应消息ID为0X0100的命令.

服务器根据处理的结果返回如下:

 

终端鉴权

终端鉴权发送命令

平台根据结果返回命令:

 

终端注销

 

 

 

转载地址:http://ufcmf.baihongyu.com/

你可能感兴趣的文章
数据重生:让神经机器翻译中的不活跃样本“复活”
查看>>
【Java】【28】提高List的removeAll方法的效率
查看>>
【JS】【31】读取json文件
查看>>
OpenSSL源代码学习[转]
查看>>
google app api相关(商用)
查看>>
linux放音乐cd
查看>>
GridView+存储过程实现'真分页'
查看>>
flask_migrate
查看>>
解决activemq多消费者并发处理
查看>>
UDP连接和TCP连接的异同
查看>>
hibernate 时间段查询
查看>>
java操作cookie 实现两周内自动登录
查看>>
Tomcat 7优化前及优化后的性能对比
查看>>
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>