# modbus-gateway-iot **Repository Path**: tsingtsi/modbus-gateway-iot ## Basic Information - **Project Name**: modbus-gateway-iot - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-05-21 - **Last Updated**: 2022-05-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 注意 拉取仓库之后建立自己的分支,在自己的分支进行开发!mater分支不允许修改 ## 主要分包情况 * connector 负责设备的接入,Modbus的编解码,提供发送modbus指令的方法 * framework 与框架有关的配置等文件就放在这个位置,比如spring配置文件/数据库配置文件等等 * adapter Aliyun适配层,用于提供连接阿里云的服务,模拟程序作为一个网关,对数据进行上报,以及接收下发的指令 * bussiness 主要完成业务层操作,解析modbus返回的响应,解析相关的数据,维护设备的信息,接收下发的指令并转换为对modbus指令的调用 > framework中放置公共的代码,比如mapper/异常/实体类 > > 数据库实体放到entity下 > > 用于和平台或者程序中间传输数据的对象放到 entity/dto > > 常量相关的文件放到 constant 中 > > 通用工具类放到 util 中 ## 开发情况 ### 目前已经有的 * 可以和设备进行连接,在设备发回注册包的时候 **抛出设备上线事件**,当channel不活动的时候 **抛出设备离线事件** * ModbusResponseHandler中会调用在 business/processor/Processor.java 来处理netty接收到的modbus响应 * 通过注入 ChannelAsyncSender 对象可以调用其方法,对指定的设备+指定的从机地址 下发 指定的指令 * BitVector 的用法如下 ```java BitVector bv = new BitVector(8); // 新建一个8位的BitVector,默认每一位都是0 bv.setBit(0, true); // 设置第0位为1 for (int i = 0; i < bv.size; i++) { boolean status = bv.getBit(i); } ``` ### 后续开发 * 监听设备上线/下线消息,进行业务处理 * 实现 business/processor/Processor.java 来处理响应 * 读取多个线圈状态需要注意的点: > 因为读取线圈状态时必须发送整数个字节,那么对于读取10个线圈(10个bit位)就需要3个字节(3 * 4Bit = 12Bit),Modbus的响应中就会有12个Bit,所以读取的时候,必须从数据库查询地址信息,判断这个地址是不是在使用,如果没有使用则不需要解析!! > > 比如线圈起始地址为 1000,读10个线圈,地址范围就是 1000-1009,那么对于第11个Bit位,它的地址是 1010,就需要从数据库中查询对应的地址是不是有数据/是不是和前面的数据类型相同,如果是则进行解析,如果不是,就不需要解析第11个Bit以及之后的Bit