From 7f5d914898c9d05942705ce7d80c0d14a8174df8 Mon Sep 17 00:00:00 2001 From: liurunyu <lry9898@163.com> Date: 星期二, 19 十二月 2023 15:57:14 +0800 Subject: [PATCH] 1、common模块优化代码; 2、通信中间件优化代码,队列遍历由递归调用改为while循环,原因是队列数据量大时递归调易产生栈溢出,HashTable多线程应用时仍有线程安全问题,改为HashMap+同步锁; 3、RTU模拟器和模拟器控制服务增加report命令 --- pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java | 137 ++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 120 insertions(+), 17 deletions(-) diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java b/pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java index 0a07ff7..7575093 100644 --- a/pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java +++ b/pipIrr-platform/pipIrr-mw/pipIrr-mwTest-client/src/main/java/com/dy/testClient/tcpClient/MyThreadJob.java @@ -6,22 +6,27 @@ import com.dy.common.threadPool.ThreadPool; import com.dy.common.util.ByteUtil; import com.dy.testClient.ServerProperties; -import org.apache.mina.core.future.CloseFuture; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.mina.core.session.IoSession; public class MyThreadJob implements ThreadPool.Job { + + private static final Logger log = LogManager.getLogger(MyThreadJob.class) ; public String rtuAddr; public String serverIp; public Integer serverPort; public IoSession session ; + public boolean exceptionOnConnect = false ; public static final int connectTimeout = 3000 ; - public int sendTimes = 0 ;//鍙戦�佹暟鎹鏁� - public int heartbeatTimes = 0 ;//涓婃姤蹇冭烦娆℃暟 + public int sendTimes = 1 ;//鍙戦�佹暟鎹鏁� + public int heartbeatTimes = 1 ;//涓婃姤蹇冭烦娆℃暟 + public long overStart = 0L; public boolean isOver = false ; public MyThreadJob(){ @@ -34,28 +39,35 @@ @Override public void execute() throws Exception { - if(session == null){ - IoSession se = new TcpConnect().createSession(this.rtuAddr, this, this.serverIp, this.serverPort, connectTimeout, new TcpHandler()) ; - if(se != null){ - this.session = se ; - } - }else{ + if(session != null){ if(sendTimes <= ServerProperties.sendTimes){ + log.info("RTU" + rtuAddr + "寮�濮嬩换鍔�"); + log.info("RTU" + rtuAddr + "灏嗚鎵ц" + ServerProperties.sendTimes + "杞浠诲姟锛屽綋鍓嶈疆娆℃槸" + sendTimes); sendDataOfP206V1_0_0() ; }else{ - this.jobOver() ; + log.info("RTU" + rtuAddr + "绛夊緟涓�浼氾紝浠ユ帴鏀堕�氫俊涓棿浠朵笅琛屾暟鎹�"); + if(overStart == 0){ + overStart = System.currentTimeMillis() ; + }else{ + long now = System.currentTimeMillis() ; + if(now - overStart >= 30 * 1000){ + this.jobOver() ; + } + } } } } private void sendDataOfP206V1_0_0(){ try{ - if(heartbeatTimes >= ServerProperties.heartbeatTimes){ - heartbeatTimes = 0 ; + if(heartbeatTimes > ServerProperties.heartbeatTimes){ + heartbeatTimes = 1 ; this.sendReportData() ; + TcpClUnit.clientSendData(); sendTimes++ ; }else{ this.sendHeartbeat() ; + TcpClUnit.clientSendData(); heartbeatTimes++ ; } }catch(Exception e){ @@ -66,23 +78,30 @@ try{ byte[] bs = this.createHeartbeat() ; this.session.write(bs) ; + log.info("RTU" + rtuAddr + "鍙戦�佷簡蹇冭烦鏁版嵁锛�" + ByteUtil.bytes2Hex(bs, false)); }catch (Exception e){ e.printStackTrace(); } } private void sendReportData(){ - TcpClUnit.clientSendData(); + try{ + byte[] bs = this.createReport() ; + this.session.write(bs) ; + log.info("RTU" + rtuAddr + "鍙戦�佷簡涓婃姤鏁版嵁锛�" + ByteUtil.bytes2Hex(bs, false)); + }catch (Exception e){ + e.printStackTrace(); + } } private void jobOver(){ - CloseFuture closeFuture = session.closeOnFlush() ; + session.closeOnFlush() ; this.isOver = true ; TcpClUnit.clientOver() ; } /** - * 鏋勯�犱笅琛屾暟鎹� + * 鏋勯�犲績璺虫暟鎹� * @return 瀛楄妭鏁扮粍 * @throws Exception 寮傚父 */ @@ -100,7 +119,7 @@ bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ; index++ ; - bsHead[index] = commonV1_0_1.createCtrl((byte)0) ; + bsHead[index] = commonV1_0_1.createCtrl((byte)0x80, (byte)0) ;//鎺у埗鍩熷姛鑳界爜锛氱‘璁� 璁ゅ彲 index++ ; GlCreate.createRtuAddr(this.rtuAddr, bsHead, index); @@ -115,7 +134,91 @@ GlCreate.createLen(bytes);//闀垮害鏀惧瓧鑺傛暟缁勪腑 - bytes = GlCreate.createCrcTail(bytes) ;//CRC鍜屽熬鍙犲姞瀛楄妭鏁扮粍涓� + byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC鍜屽熬鍙犲姞瀛楄妭鏁扮粍涓� + + bytes = ByteUtil.bytesMerge(bytes, bsTail) ; + + return bytes ; + } + + /** + * 鏋勯�犱笂鎶ユ暟鎹� + * @return 瀛楄妭鏁扮粍 + * @throws Exception 寮傚父 + */ + public byte[] createReport( ) throws Exception { + CommonV1_0_1 commonV1_0_1 = new CommonV1_0_1() ; + byte[] bytes ; + byte[] bsHead = new byte[ProtocolConstantV206V1_0_0.lenHead2Code] ; + byte index = 0 ; + bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ; + + index++ ; + bsHead[index] = 0 ;//甯ч暱搴� + + index++ ; + bsHead[index] = ProtocolConstantV206V1_0_0.P_Head_Byte ; + + index++ ; + bsHead[index] = commonV1_0_1.createCtrl((byte)0x80, (byte)3) ;//鎺у埗鍩熷姛鑳界爜3锛氳嚜鎶ュ抚锛屾祦閲忥紙姘撮噺锛夊弬鏁� + + index++ ; + GlCreate.createRtuAddr(this.rtuAddr, bsHead, index); + index += 5 ; + + ByteUtil.hex2Bytes("C0", bsHead, index) ; + + byte[] bs = new byte[2] ; + bs[0] = (byte)0x04 ;//鏈夋祦閲忔暟鎹� + bs[1] = (byte)0xE0 ;//鏈夋按鍘嬨�佺數姹犵數鍘嬨�佷俊鍙峰己搴� + + bytes = ByteUtil.bytesMerge(bsHead, bs) ; + + bs = new byte[5] ;//鐬椂娴侀噺 + bs[0] = ByteUtil.int2BCD_LE (21)[0] ; + bs[1] = ByteUtil.int2BCD_LE (43)[0] ; + bs[2] = ByteUtil.int2BCD_LE (65)[0] ; + bytes = ByteUtil.bytesMerge(bytes, bs) ; + + bs = new byte[5] ;//绱娴侀噺 + bs[0] = ByteUtil.int2BCD_LE (21)[0] ; + bs[1] = ByteUtil.int2BCD_LE (43)[0] ; + bs[2] = ByteUtil.int2BCD_LE (65)[0] ; + bs[3] = ByteUtil.int2BCD_LE (87)[0] ; + bytes = ByteUtil.bytesMerge(bytes, bs) ; + + bs = new byte[5] ;//鎹熷け娴侀噺 + bs[0] = ByteUtil.int2BCD_LE (10)[0] ; + bs[1] = ByteUtil.int2BCD_LE (32)[0] ; + bs[2] = ByteUtil.int2BCD_LE (54)[0] ; + bytes = ByteUtil.bytesMerge(bytes, bs) ; + + bs = new byte[4] ;//姘村帇 + bs[0] = ByteUtil.int2BCD_LE (10)[0] ; + bs[1] = ByteUtil.int2BCD_LE (32)[0] ; + bs[2] = ByteUtil.int2BCD_LE (4)[0] ; + bytes = ByteUtil.bytesMerge(bytes, bs) ; + + bs = new byte[4] ;//鐢垫睜鐢靛帇 + bs[0] = ByteUtil.int2BCD_LE (10)[0] ; + bs[1] = ByteUtil.int2BCD_LE (32)[0] ; + bs[2] = ByteUtil.int2BCD_LE (10)[0] ; + bs[3] = ByteUtil.int2BCD_LE (32)[0] ; + bytes = ByteUtil.bytesMerge(bytes, bs) ; + + bs = new byte[1] ;//淇″彿寮哄害 + bs[0] = ByteUtil.int2BCD_LE (21)[0] ; + bytes = ByteUtil.bytesMerge(bytes, bs) ; + + bs = new byte[6] ;//鏃堕挓 + GlCreate.createTp(bs, 0); + bytes = ByteUtil.bytesMerge(bytes, bs) ; + + GlCreate.createLen(bytes);//闀垮害鏀惧瓧鑺傛暟缁勪腑 + + byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC鍜屽熬鍙犲姞瀛楄妭鏁扮粍涓� + + bytes = ByteUtil.bytesMerge(bytes, bsTail) ; return bytes ; } -- Gitblit v1.8.0