本来说弄个系列博客,但是在实施的过程中,发现没有想象的复杂.搞清楚下面的,后面的都是体力劳动
现在开始弄交通部808协议解析具体的实施,之前都是在研究框架.今天正式开始实施.本篇主要介绍一些基础知识.另没有源码,cuiyaonan2000@163.com 仅限问题讨论与实施方案的交流.本文使用的参考资料室JTT808-2013协议
位运算(一定要搞明白) 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的命令.
服务器根据处理的结果返回如下:
终端鉴权
终端鉴权发送命令
平台根据结果返回命令:
终端注销
