基于Netty的ModbusRtu和云服务器(java)通讯

createh52个月前 (02-01)技术教程12

上篇讲了modbus协议的基础。今天说下问题的场景及过程的困扰,断断续续历时个把月才把问题解决。

场景(农污):站点分散分布在农村,不具备有线网络。每站点现场通过plc接现场设备,比如泵、液位计、鼓风机等设备,然后plc接dtu进行4G数据传输,dtu是透传,云服务器接受数据并进行设备数据的显示及反控。

关键词:modbus rtu over tcp(伪)modbusrtu netty

困扰过程:由于开始对modbus不熟悉,理解有大的误差,关键一点就是从机只等待主机发送信息再回复,从机就是现场的PLC设备。在这一点,一直理解有误。另外此问题据我理解根本不是modbus rtu over tcp方向也偏了。另外一点是本想通过modbus的成熟中间件去解决,但都行不通

在此我借用一张图便于理解场景:

关键思路:dtu发送心跳,建立长连接,然后云服务器向从机发送指令,从机回复消息,这是明显modbusrtu通过4G进行数据传输,而不是通过modbus rtu over tcp。

关于通讯我选择了netty,基于springboot建立了通讯程序。下面我们先说说netty。

一、 选择netty

Netty是一个Java NIO技术的开源异步事件驱动的高性能网络编程框架,用于快速开发可维护的高性能协议服务器和客户端。往通俗了讲,可以将Netty理解为:一个将Java NIO进行了大量封装,并大大降低Java NIO使用难度和上手门槛的超牛逼框架。

Netty的主要组件及概念:

1)I/O:各种各样的流(文件、数组、缓冲、管道。。。)的处理(输入输出);

2)Channel:通道,代表一个连接,每个Client请对会对应到具体的一个Channel;

3)ChannelPipeline:责任链,每个Channel都有且仅有一个ChannelPipeline与之对应,里面是各种各样的Handler;

4)handler:用于处理出入站消息及相应的事件,实现我们自己要的业务逻辑;

5)EventLoopGroup:I/O线程池,负责处理Channel对应的I/O事件;

6)ServerBootstrap:服务器端启动辅助对象;

7)Bootstrap:客户端启动辅助对象;

8)ChannelInitializer:Channel初始化器;

9)ChannelFuture:代表I/O操作的执行结果,通过事件机制,获取执行结果,通过添加监听器,执行我们想要的操作;

10)ByteBuf:字节序列,通过ByteBuf操作基础的字节数组和缓冲区。

二、 基于spring boot的netty

基于spring boot有netty有四种启动方式。

a.注解@PostConstruct

b.利用监听器启动

c.利用 ApplicationListener 上下文监听器

d.commiandLinerunner启动

本次项目选用的注解@PostConstruct。

三、 modbus中间件

java版的modbus中间件有不少。介绍如下:

Jamod:Java Modbus实现:Java Modbus库。该库由Dieter Wimberger实施。

ModbusPal:ModbusPal是一个正在进行的Java项目,用于创建逼真的Modbus从站模拟器。由于预定义的数学函数和/或Python脚本,寄存器值是动态生成的。ModbusPal依赖于RxTx进行串行通信,而Jython则依赖于脚本支持。

Modbus4J:Serotonin Software用Java编写的Modbus协议的高性能且易于使用的实现。支持ASCII,RTU,TCP和UDP传输作为从站或主站,自动请求分区,响应数据类型解析和节点扫描。

JLibModbus:JLibModbus是java语言中Modbus协议的一种实现。jSSC和RXTX用于通过串行端口进行通信。该库是一个经过积极测试和改进的项目。

项目开始时我也modbus4j进行了测试,不过由于项目采用dtu透传,所以并不适合。最终还是使用的netty。

四、 关键代码

项目开始时我也modbus4j进行了测试,不过由于项目采用dtu透传,所以并不适合。最终还是使用的netty。

Netty启动:

数据读取及处理:

以上代码解读:

(1)Dtu发送心跳,建立连接

(2)根据业务,服务器发送读取指令(读取)

(3)服务器处理响应指令,并对数据进行处理(反控)

通过界面按钮触发反控指令:

五、 调试工具

Modbus学习必备的三大神器分别是Modbus Poll、Modbus Slave及VSPD。

Modbus Poll软件主要用于仿真Modbus主站或Modbus客户端。

Modbus Slave软件主要用于仿真Modbus从站或Modbus服务器。

VSPD全称Configure Virtual Serial Port Driver,是用来给电脑创建虚拟串口使用的。

相关文章

MQTT协议介绍及Java教程(mqtt协议运行在哪一层)

一、 概述  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅模式的"轻量级"通讯协议,它和 Modbus TCP 一样都...

ModBus通讯协议:传输模式+地址、功能码、数据域+数据格式

ModBus通讯协议通俗点来讲,ModBus规约了起停电机,主机要分别发送什么命令给从机。ModBus规定主从机之间数据的交互,需要遵循什么样的格式,如何保证数据在传输过程中不发生冲突。只要都遵循这个...

Zookeeper 的通信及会话(zookeeper通俗)

1. 前言在前面的章节中,我们学习了 Zookeeper 的 Java 客户端 ZkClient 和 Curator 的基本使用,那这些客户端是如何与 Zookeeper 服务端建立通信的呢?我们就带...

分布式协议与算法,你了解多少?(分布式协议 paxos)

我这里将主要列举一致性Hash算法、Gossip协议、QuorumNWR算法、PBFT算法、PoW算法、ZAB协议,Paxos会分开单独讲。一致性Hash算法一致性Hash算法是为了解决Hash算法的...

ThingsBoard物联网平台实践 LoRa协议+node-red+mqtt 实现单灯控制

ThingsBoard是一个基于Java的开源物联网平台,可实现物联网项目的快速开发,管理和扩展。ThingsBoard 使用行业标准物联网协议(MQTT,CoAP和HTTP)实现设备连接,并支持云和...

6 张图带你彻底搞懂分布式事务 XA 模式

XA 协议是由 X/Open 组织提出的分布式事务处理规范,主要定义了事务管理器 TM 和局部资源管理器 RM 之间的接口。目前主流的数据库,比如 oracle、DB2 都是支持 XA 协议的。mys...