部标JT808协议处理方案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/cuiyaonan2000/article/details/101055993

序言

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

       现在开始弄交通部808协议解析具体的实施,之前都是在研究框架.今天正式开始实施.本篇主要介绍一些基础知识.另没有源码,[email protected] 仅限问题讨论与实施方案的交流.本文使用的参考资料室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的命令.

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

终端鉴权

终端鉴权发送命令

平台根据结果返回命令:

终端注销

猜你喜欢

转载自blog.csdn.net/cuiyaonan2000/article/details/101055993
今日推荐