本文共 1916 字,大约阅读时间需要 6 分钟。
本来说弄个系列博客,但是在实施的过程中,发现没有想象的复杂.搞清楚下面的,后面的都是体力劳动
现在开始弄交通部808协议解析具体的实施,之前都是在研究框架.今天正式开始实施.本篇主要介绍一些基础知识.另没有源码,cuiyaonan2000@163.com 仅限问题讨论与实施方案的交流.本文使用的参考资料室JTT808-2013协议
注:以下数据类型默认为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
注:以下数据类型默认为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
正数: 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用来接收终端的连接,并且解决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/