java netty modbus协议接收iot数据

15 篇文章 0 订阅
5 篇文章 0 订阅

IoTserver

源代码开源在gitee上 : IoT netty java gitee server sample

c++ libuv 的IoT tcp server IoT c++ libuv gitee server sample
c++的代码也给了一个示例,为了方便调试使用了vs。为了调试方便,java下面有一个nodejs 的测试文件:
nodejs 客户端代码

IoTserver的使用最好就是使用固定协议,一种协议写一种接收,这里使用几种语言去接收,如java,c++,nodejs,技巧很多,尤其是使用java的时候,netty的接收协议方式非常方便,下面是主程序message中的定义:

public class Message {
 
    private final Charset charset = Charset.forName("utf-8");
 
    private byte magicType;
    private long deviceid; //设备
    private byte cmd;//命令
    private byte length;
    private String body;
 
    public Message(){
 
    }
 
    public Message(byte magicType,long deviceid, byte cmd, byte[] data) {
        this.magicType = magicType; //0x69
        this.deviceid = deviceid;
        this.cmd =cmd;
        this.length = (byte)data.length;
        this.body = new String(data, charset);
    }
 
    public Message(byte magicType, long deviceid, byte cmd, String body) {
        this.magicType = magicType;
        this.cmd = cmd;
        this.deviceid = deviceid;
        this.length = (byte)body.getBytes(charset).length;
        this.body = body;
    }
    public String GetBody()
    {
        return this.body;
    }
    public byte GetCmd()
    {
        return this.cmd;
    }
}

非常清晰地定义,协议由类型,定义,设备类型,命令字,数据内容长度,最后是内容。下面是主要代码,server启动在多个端口上。

package zhongda.iot.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import redis.clients.jedis.*;
 /**
  * Netty实现的tcp iotserver 程序
  * @author qianbo
  */
 public class TcpServer
 {
     /*端口号*/
    static final int PORT1 = 9002;
    static final int PORT2 = 9003;
     public static void main(String[] args)
     {
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "192.168.1.222", 6379);
		Publisher publish = new Publisher(jedisPool);
		publish.start();
		//publish.join();
         EventLoopGroup bossGroup = null;
         EventLoopGroup workerGroup = null;
         ServerBootstrap b = null;
         System.out.println("the server start at 9002 9003");
         try{
             //1:第一个线程组是用于接收Client连接的
             bossGroup = new NioEventLoopGroup(); 
             //2:第二个线程组是用于实际的业务处理操作的
             workerGroup = new NioEventLoopGroup();
             //3:创建一个启动NIO服务的辅助启动类ServerBootstrap 就是对我们的Server进行一系列的配置
             b = new ServerBootstrap();
             //4:绑定两个线程组
             b.group(bossGroup, workerGroup)
             //5:需要指定使用NioServerSocketChannel这种类型的通道
             .channel(NioServerSocketChannel.class)//(3) 服务端 -->NioServerSocketChannel
             //6:一定要使用childHandler 去绑定具体的事件处理器
             .childHandler(new ChannelInitializer<SocketChannel>() //(4)   childHandler
             {
                 @Override
                 protected void initChannel(SocketChannel sc) throws Exception
                 {
                     //7:将自定义的serverHandler加入到管道中去(多个)
                     
                     ChannelPipeline p = sc.pipeline();
                     p.addLast(new MessageDecoder(255, 6, 1));
                     //p.addLast(new MessageEncoder());
                     p.addLast(new ServerHandler());//handler中实现真正的业务逻辑
                 }
             })
             //8:设置TCP连接的缓冲区
             .option(ChannelOption.SO_BACKLOG, 200)//(5)
             //设置发送缓冲大小 32K发送缓冲
            // .option(ChannelOption.SO_SNDBUF, 32*1024) 
             //设置接收缓冲大小
             // .option(ChannelOption.SO_RCVBUF, 32*1024) 
             //9:保持连接
             .childOption(ChannelOption.SO_KEEPALIVE, true);//(6)
             //10:绑定指定的端口 进行监听
             ChannelFuture cf2= b.bind(PORT1).sync(); // (7)  
             ChannelFuture cf3= b.bind(PORT2).sync(); // (7)   绑定多个端口 
 

             cf2.channel().closeFuture().sync(); //异步等待关闭 
             cf3.channel().closeFuture().sync(); //异步等待关闭

         }catch(Exception e){
             e.printStackTrace();
         }finally{
             workerGroup.shutdownGracefully();
             bossGroup.shutdownGracefully();
         }
     }
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Netty是一个高性能的网络通信框架,可以用于将Modbus协议与网络进行对接。Modbus是一种通信协议,常用于工业领域的设备间通信。下面是一个简单的示例,展示如何使用Netty对接Modbus协议。 首先,你需要引入NettyModbus相关的依赖。可以在项目的构建文件(例如pom.xml)中添加以下依赖: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.63.Final</version> </dependency> <dependency> <groupId>de.gandev</groupId> <artifactId>modbus-client</artifactId> <version>2.1.0</version> </dependency> ``` 接下来,你可以创建一个Netty的客户端来连接Modbus设备。以下是一个简单的示例代码: ```java import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import de.gandev.modjdatabus.ModbusTcpClient; import de.gandev.modjdatabus.ModbusTcpClientHandler; public class ModbusClient { private final String host; private final int port; public ModbusClient(String host, int port) { this.host = host; this.port = port; } public void run() throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap() .group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // 添加Modbus协议处理器 pipeline.addLast(new ModbusTcpClientHandler()); } }); // 连接Modbus设备 ChannelFuture future = bootstrap.connect(host, port).sync(); Channel channel = future.channel(); // 发送Modbus命令 byte[] command = new byte[]{0x01, 0x03, 0x00, 0x00, 0x00, 0x01, (byte) 0x84, (byte) 0x0A}; channel.writeAndFlush(command); // 等待连接关闭 future.channel().closeFuture().sync(); } finally { // 关闭连接 group.shutdownGracefully(); } } public static void main(String[] args) throws Exception { String host = "192.168.0.1"; int port = 502; ModbusClient client = new ModbusClient(host, port); client.run(); } } ``` 在上述示例中,我们首先创建了一个`ModbusTcpClientHandler`,它是一个Netty的ChannelHandler,用于处理Modbus协议的请求和响应。然后,我们使用Netty的`Bootstrap`来设置客户端的配置和处理器。最后,我们连接Modbus设备并发送Modbus命令。 请注意,以上只是一个简单的示例,实际的Modbus通信可能涉及更多的细节和配置。你可以根据具体的需求进行修改和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值