|
@@ -0,0 +1,145 @@
|
|
|
|
+package com.gyee.edge.gddlly.clientworker.iec102;
|
|
|
|
+
|
|
|
|
+import com.gyee.edge.gddlly.clientworker.EndPoint;
|
|
|
|
+import com.gyee.edge.gddlly.clientworker.IClientWorker;
|
|
|
|
+import com.gyee.edge.gddlly.exception.InitErrorException;
|
|
|
|
+import io.netty.bootstrap.Bootstrap;
|
|
|
|
+import io.netty.channel.*;
|
|
|
|
+import io.netty.channel.oio.OioEventLoopGroup;
|
|
|
|
+import io.netty.channel.rxtx.RxtxChannel;
|
|
|
|
+import io.netty.channel.rxtx.RxtxChannelConfig;
|
|
|
|
+import io.netty.channel.rxtx.RxtxDeviceAddress;
|
|
|
|
+import io.netty.handler.codec.LineBasedFrameDecoder;
|
|
|
|
+import io.netty.handler.codec.string.StringDecoder;
|
|
|
|
+import io.netty.handler.codec.string.StringEncoder;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+
|
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
|
+
|
|
|
|
+@Slf4j
|
|
|
|
+public class IEC102SerialClientWorker implements IClientWorker {
|
|
|
|
+
|
|
|
|
+ private EndPoint endPoint;
|
|
|
|
+
|
|
|
|
+ private SerialPortConfig serialPortConfig;
|
|
|
|
+
|
|
|
|
+ private IEC102RxtxClientHandler defaultHandler;
|
|
|
|
+
|
|
|
|
+ private EventLoopGroup eventLoop;
|
|
|
|
+
|
|
|
|
+ private volatile Channel channel;
|
|
|
|
+
|
|
|
|
+ public IEC102SerialClientWorker(EndPoint endPoint) {
|
|
|
|
+ this.serialPortConfig = getSerialPortConfig(endPoint);
|
|
|
|
+ this.endPoint = endPoint;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public SerialPortConfig getSerialPortConfig(EndPoint endPoint) {
|
|
|
|
+ if (endPoint.getSerialPort() == null ||
|
|
|
|
+ endPoint.getSerialPort().equals("") ||
|
|
|
|
+ endPoint.getBaudRate() < 100 ||
|
|
|
|
+ endPoint.getParityBit() < 0 ||
|
|
|
|
+ endPoint.getDataBit() < 0 ||
|
|
|
|
+ endPoint.getStopBit() < 0) {
|
|
|
|
+ throw new InitErrorException("串口配置参数错误,endpoint : " + endPoint.getId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ SerialPortConfig serialPortConfig = new SerialPortConfig();
|
|
|
|
+ serialPortConfig.setSerialPortName(endPoint.getSerialPort());
|
|
|
|
+ serialPortConfig.setBaudRate(endPoint.getBaudRate());
|
|
|
|
+ try {
|
|
|
|
+ serialPortConfig.setDataBits(RxtxChannelConfig.Databits.valueOf(endPoint.getDataBit()));
|
|
|
|
+ } catch (Exception e) {}
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ serialPortConfig.setStopBits(RxtxChannelConfig.Stopbits.valueOf(endPoint.getStopBit()));
|
|
|
|
+ } catch (Exception e) {}
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ serialPortConfig.setParity(RxtxChannelConfig.Paritybit.valueOf(endPoint.getParityBit()));
|
|
|
|
+ } catch (Exception e) {}
|
|
|
|
+
|
|
|
|
+ return serialPortConfig;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public EndPoint getEndPoint() {
|
|
|
|
+ return endPoint;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void start() {
|
|
|
|
+ try {
|
|
|
|
+ log.info("启动串口102数据采集线程...");
|
|
|
|
+ //串口使用阻塞io
|
|
|
|
+ EventLoopGroup group = new OioEventLoopGroup();
|
|
|
|
+ try {
|
|
|
|
+ Bootstrap bootstrap = new Bootstrap();
|
|
|
|
+ bootstrap.group(group)
|
|
|
|
+ .channelFactory(() -> {
|
|
|
|
+ RxtxChannel rxtxChannel = new RxtxChannel();
|
|
|
|
+ rxtxChannel.config()
|
|
|
|
+ .setBaudrate(endPoint.getBaudRate())
|
|
|
|
+ .setDatabits(RxtxChannelConfig.Databits.DATABITS_8)
|
|
|
|
+ .setParitybit(RxtxChannelConfig.Paritybit.NONE)
|
|
|
|
+ .setStopbits(RxtxChannelConfig.Stopbits.STOPBITS_1);
|
|
|
|
+ return rxtxChannel ;
|
|
|
|
+ })
|
|
|
|
+ .handler(new ChannelInitializer<RxtxChannel>() {
|
|
|
|
+ @Override
|
|
|
|
+ protected void initChannel(RxtxChannel rxtxChannel) {
|
|
|
|
+ rxtxChannel.pipeline().addLast(
|
|
|
|
+ new LineBasedFrameDecoder(60000),
|
|
|
|
+ new StringEncoder(StandardCharsets.UTF_8),
|
|
|
|
+ new StringDecoder(StandardCharsets.UTF_8),
|
|
|
|
+ new IEC102RxtxClientHandler()
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ ChannelFuture f = bootstrap.connect(new RxtxDeviceAddress(serialPortConfig.getSerialPortName())).sync();
|
|
|
|
+ f.addListener(new ChannelFutureListener() {
|
|
|
|
+ @Override
|
|
|
|
+ public void operationComplete(ChannelFuture future) throws Exception {
|
|
|
|
+ log.info("连接成功! endpoint : " + endPoint.getId());
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ this.channel = f.channel();
|
|
|
|
+ this.eventLoop = group;
|
|
|
|
+ //此处阻塞主线程;
|
|
|
|
+ f.channel().closeFuture().sync();
|
|
|
|
+ } finally {
|
|
|
|
+ group.shutdownGracefully();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void shutdown() {
|
|
|
|
+ if (channel != null && channel.isOpen())
|
|
|
|
+ channel.close();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int getStatus() {
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ChannelFuture sendMessage(Object message) {
|
|
|
|
+ return null;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ChannelFuture sendBytes(Byte[] bytes) {
|
|
|
|
+ return null;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|