package com.mh.common.utils; import com.mh.common.core.domain.entity.CollectionParamsManage; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; /** * @author ljf * @title : * @description : 发送指令工具类 * @updateTime 2021-01-26 * @throws : */ @Slf4j public class SendOrderUtils { // 发送所有类型采集报文 public static void sendAllOrder(CollectionParamsManage paramsManage, ChannelHandlerContext ctx, int num, int size) { // 开始创建指令 String mtCode = paramsManage.getMtCode(); // 采集编号 String funCode = paramsManage.getFuncCode(); // 功能码 String registerAddr = paramsManage.getRegisterAddr(); // 寄存器地址 String registerNum = String.valueOf(paramsManage.getRegisterSize()); // 寄存器数量 // 拼接指令 String sendOrderStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(mtCode), 2) + ExchangeStringUtil.addZeroForNum(funCode, 2) + ExchangeStringUtil.addZeroForNum(registerAddr, 4) + ExchangeStringUtil.addZeroForNum(registerNum, 4); byte[] strOrder = ExchangeStringUtil.hexStrToBinaryStr(sendOrderStr); int checkNum = CRC16.CRC16_MODBUS(strOrder); String checkWord = ExchangeStringUtil.decToHex(String.valueOf(checkNum)); checkWord = checkWord.substring(2, 4) + checkWord.substring(0, 2); sendOrderStr = sendOrderStr + checkWord; ByteBuf buffer = getByteBuf(ctx, sendOrderStr); // 发送数据 ctx.channel().writeAndFlush(buffer); log.info("sends :" + sendOrderStr + ",num:" + num + ",records:" + size); try { Thread.sleep(500); } catch (InterruptedException e) { log.error("线程休眠异常", e); } } private static ByteBuf getByteBuf(ChannelHandlerContext ctx, String sendStr) { // 申请一个数据结构存储信息 ByteBuf buffer = ctx.alloc().buffer(); // 将信息放入数据结构中 buffer.writeBytes(ExchangeStringUtil.hexStrToBinaryStr(sendStr));//对接需要16进制 return buffer; } public static void sendOrderToDTU(ChannelHandlerContext ctx, String sendStr) { ByteBuf buffer = getByteBuf(ctx, sendStr); // 发送数据 ctx.channel().writeAndFlush(buffer); try { Thread.sleep(500); } catch (InterruptedException e) { log.error("线程休眠异常", e); } } }