使用netty不是一天两天了,但是使用netty和DTU通讯还是第一次,接下来要做DTU的通讯协议,对接工作还没有正式开始,只收到一个简单的DTU协议文档,里面的内容大概是下面表格中的样子。
这里把通讯协议简化了一下,仅剩下心跳和登录,如果有其他参数可以在此基础上进行扩展;从表格中可以看出来,每个字段数据位数还不一样,有的一位,有的两位,数据长度占两位,其他各占用一位。
只有这么一个文档,只有这么一丁点信息,其他就什么也不知道了,这可如何是好?不知道从哪里下手,这个疑问多多的项目就这样放了一段时间。
但是也不能总是这样放着呀,如果对接的人来了,我这边什么也没有,一下子也建不起一个项目呀?转念又想,曾经使用 netty + google protobuf 开发过IM项目,也有些相似之处。这个DTU可否使用google protobuf呢?
于是,写了一个简单的客户端,一个服务端,来进行收发信息,google protobuf是通过对象编码成二进制进行数据通讯的,但文档中是字节数组,压根没有对象一说呀?写完了demo,测试一遍,但是和字节数组对应不起来,最后还是删掉了。
在网上找了很多资料,找来找去只找到这么两篇Java采用Netty实现基于DTU的TCP服务器 + 多端口 + 多协议
Java 使用Socket 实现基于DTU的TCP服务器 + 数据解析 + 心跳检测可以参考,试着把上面的demo扒拉了好几遍,通过这两篇文章,可以获得一些信息:
第一,可以使用netty和dtu进行通信,选择使用netty框架没有错;
第二,和dtu对接,接收到的是字节数组,不能使用google的protobuf框架,需要另做处理。
把参考文档中带netty的demo也试着在本地拷贝了一份,大概知道了对接收到的字节数组如何处理,但是demo中只有接收,没有发送,这是不够完美的;这也是个问题,单方面的,不好运行呀。
另外在处理字节数组的时候,在流程上还不是太标准,后面有可能会遇到半包、粘包的问题,这些都是需要面对的问题。结合自己曾经开发过IM的经验,把编解码处理和数据处理也分离出来,半包、粘包的问题一并考过进去,这样后面再完善就方便多了。
下面就开始SpringBoot2.1.4 + netty + DTU的客户端编码,难点就在于字节数组的解码和编码,一进一出,搞定了这一步,其他的业务逻辑就好处理了。这里的客户端编码是为了测试DTU的请求,以便和服务端互动起来,可以进行测试。
第一步,pom文件引入netty架包,就这两个架包足够用的了;
第二步,对字节数组的编解码,包括半包、粘包处理;
字节数据解码类ByteArrayDecoder:
字节数组编码类ByteArrayEncoder:
在编解码的时候,考虑到DTU那边对接的有可能是C语音,C语言和Java的数据类型不一样,所占用的位数也不一样,这个需要保持一致。
第三步,客户端启动类;
客户端启动类NettyClient,这里在头部加了@Component,只要项目一启动就去建立与服务端的链接,建立链接后登录,登录后保持心跳;
别忘了application.properties文件中的配置:
第四步,handler处理类;
异常处理类ExceptionHandler:
登录处理LoginResponseHandler:
心跳处理HeartBeatHandler:
客户端的核心编码大抵就是这些,看完这些编码是不是有些期待服务端的编码呢,服务端的编码敬请期待下一篇文章。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/12093.html