读取方式:数据接到网闸,读取的是网闸转发表上的。如下
协议:Modbus-tcp
调试工具试试
代码实现
private static final String REQ_56 = "000000000006010300000070";
@Override
public void channelActive(ChannelHandlerContext ctx) throws InterruptedException {
log.info("channelActive");
sendMsg(ctx);
}
public void sendMsg(ChannelHandlerContext ctx) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(1,2,10L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(1));
pool.execute(new MsgRunnable(ctx));
}
class MsgRunnable implements Runnable {
ChannelHandlerContext ctx;
MsgRunnable(ChannelHandlerContext ctx) {
this.ctx = ctx;
}
@Override
public void run() {
while (true) {
try {
ctx.writeAndFlush(Unpooled.copiedBuffer(Util.hexString2Bytes(REQ_56)));
log.info("send req_56 success,start sleep");
Thread.sleep(50000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf buf = (ByteBuf) msg;
byte[] resp = new byte[buf.readableBytes()];
buf.readBytes(resp);
log.info("收到请求字节长度是:" + resp.length);
String hexRespStr = Util.bytesToHexString(resp);
log.info("收到的请求HEX是:" + hexRespStr);
if(resp.length == 233){
hexRespStr = hexRespStr.substring(18);
while(hexRespStr.length() > 0){
String valueStr = hexRespStr.substring(0,8);
System.out.println("value : "+Util.hexFloat2BigDecimal(valueStr));
hexRespStr = hexRespStr.substring(8);
}
}else{
log.error("invalid return");
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
log.warn("Unexpected exception from downstream:"
+ cause.getMessage());
cause.printStackTrace();
ctx.close();
}
工具类
/**
* 十六进制单精度浮点数,转BigDecimal,保留2为小数,截掉多余小数位
* @param hex
* @return
*/
public static BigDecimal hexFloat2BigDecimal(String hex) {
float value = Float.intBitsToFloat((int)Long.parseLong(hex, 16));
BigDecimal bd = new BigDecimal(Float.toString(value));
return bd.setScale(2, BigDecimal.ROUND_DOWN);
}
/**
* 把字节数组转换成16进制字符串
* @param bArray
* @return
*/
public static final String bytesToHexString(byte[] bArray) {
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]);
if (sTemp.length() < 2){
sb.append(0);
}
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
/**
* 16进制字符转字节
* @param hexString
* @return
*/
public static byte[] hexString2Bytes(String hexString) {
int l = hexString.length() / 2;
byte[] ret = new byte[l];
for (int i = 0; i < l; i++) {
ret[i] = Integer.valueOf(hexString.substring(i * 2, i * 2 + 2), 16).byteValue();
}
return ret;
}