| | |
| | | |
| | | import java.net.InetSocketAddress; |
| | | |
| | | import com.dy.common.mw.protocol.*; |
| | | import com.dy.common.springUtil.SpringContextUtil; |
| | | import com.dy.common.util.Callback; |
| | | import com.dy.rtuMw.server.upgrade.UpgradeUnit; |
| | | import com.dy.rtuMw.web.com.CommandCtrl; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | import org.apache.mina.core.session.IoSession; |
| | |
| | | import com.dy.common.mw.channel.tcp.TcpIoSessionAttrIdIsRtuAddr; |
| | | import com.dy.common.mw.channel.tcp.TcpUnit; |
| | | import com.dy.common.mw.core.CoreTask; |
| | | import com.dy.common.mw.protocol.DriverParserDataCallback; |
| | | import com.dy.common.mw.protocol.MidResult; |
| | | import com.dy.common.mw.protocol.Driver; |
| | | import com.dy.common.mw.protocol.OnLine; |
| | | import com.dy.common.mw.protocol.OnLineHandle; |
| | | import com.dy.common.mw.protocol.ProtocolCache; |
| | | import com.dy.rtuMw.server.ServerProperties; |
| | | import com.dy.rtuMw.server.forTcp.RtuLogDealer; |
| | | import com.dy.rtuMw.server.forTcp.RtuStatusDealer; |
| | |
| | | e.printStackTrace(); |
| | | log.error("将数据转换为十六进制时出错!" ) ; |
| | | } |
| | | String rtuAddr = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey) ; |
| | | String protocolName = null ; |
| | | Short protocolVersion = null ; |
| | | String rtuAddr = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrRtuAddr) ; |
| | | String protocolName = (String)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolName) ; |
| | | Short protocolVersion = (Short)session.getAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrProtocolVersion) ; |
| | | boolean isOnLine = false ; |
| | | if(rtuAddr == null){ |
| | | //说明刚建立网络连接,此数据应该是上线数据 |
| | | isOnLine = true ; |
| | | Object[] rtuAddrProtocolNameVersion = this.parseOnLine(session, upBuf) ; |
| | | if(rtuAddrProtocolNameVersion.length == 2){ |
| | | if(rtuAddrProtocolNameVersion.length == 3){ |
| | | //解析上线数据成功,并解析出RTU地址及通信协议名称 |
| | | rtuAddr = (String)rtuAddrProtocolNameVersion[0] ; |
| | | protocolName = (String)rtuAddrProtocolNameVersion[1] ; |
| | | protocolVersion = (Short)rtuAddrProtocolNameVersion[2] ; |
| | | |
| | | if(rtuAddr != null && protocolName != null){ |
| | | if(rtuAddr != null && protocolName != null && protocolVersion != null){ |
| | | //设置session的属性ID |
| | | TcpUnit.getInstance().setIoSessionArrId(session, rtuAddr); |
| | | TcpUnit.getInstance().setIoSessionArrs(session, rtuAddr, protocolName, protocolVersion) ; |
| | | //缓存session |
| | | TcpSessionCache.putNewTcpSession(rtuAddr, protocolName, protocolVersion, session); |
| | | TcpSessionCache.putNewTcpSession(rtuAddr, session); |
| | | |
| | | log.info("RTU(地址:" + rtuAddr + ",协议:" + protocolName + ",协议版本号:" + protocolVersion + ")上线了。") ; |
| | | log.info("RTU(地址:" + rtuAddr + ",协议:" + protocolName + ",版本号:" + protocolVersion + ")上线了。") ; |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | if(toDeal){ |
| | | /* |
| | | if(protocolName == null){ |
| | | Object[] objs = TcpSessionCache.getTcpProtocolNameVersion(rtuAddr) ; |
| | | protocolName = (String)objs[0] ; |
| | | protocolVersion = (Short)objs[1] ; |
| | | } |
| | | */ |
| | | |
| | | //设置收到数据时刻 |
| | | TcpSessionCache.cacheUpDataTime(rtuAddr); |
| | | TcpSessionCache.whenUpData(rtuAddr); |
| | | |
| | | if(protocolName != null){ |
| | | //对上行数据进行处理 |
| | |
| | | boolean isOnLine, |
| | | byte[] upBuf, |
| | | String upHex) throws Exception{ |
| | | Driver dri = ProtocolCache.getDriver(protocolName) ; |
| | | Driver dri = ProtocolCache.getDriver(protocolName, protocolVersion) ; |
| | | if(dri == null){ |
| | | log.error("严重错误,未能得到协议" + protocolName + "驱动类实例!"); |
| | | }else{ |
| | | MidResult[] midRs = dri.parseData(ServerProperties.isLowPower, rtuAddrAtHead, upBuf, upHex, new DriverParserDataCallback(){ |
| | | @Override |
| | | public void callback(String rtuAddrAtHead, String code, String codeName, String upHex, Boolean reportOrResponse_trueOrFalse, boolean parseFail, String rtuAddrInData) { |
| | | public void callback(String rtuAddrAtHead, |
| | | String code, |
| | | String codeName, |
| | | String upHex, |
| | | Boolean reportOrResponse_trueOrFalse, |
| | | boolean parseFail, |
| | | String rtuAddrInData, |
| | | Object ...objs) { |
| | | //更新终端状态 |
| | | if(rtuAddrInData != null && !rtuAddrInData.equals(rtuAddrAtHead)){ |
| | | //数据头中的RTU地址与数据中的RTU地址不一致,更换成数据中的RTU地址 |
| | | TcpSessionCache.changeRtuAddr(rtuAddrAtHead, rtuAddrInData, protocolName, protocolVersion, session); |
| | | session.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey, rtuAddrInData) ; |
| | | TcpSessionCache.changeRtuAddr(rtuAddrAtHead, rtuAddrInData, session); |
| | | session.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrRtuAddr, rtuAddrInData) ; |
| | | } |
| | | |
| | | String rtuAddr ; |
| | |
| | | }else{ |
| | | RtuLogDealer.log(rtuAddr, (isOnLine?"上线数据 ":"上行数据 ") + code + ("(" + codeName + ")") + ":" + upHex); |
| | | } |
| | | |
| | | //触发远程RTU软件升级 |
| | | UpgradeUnit.getInstance().trigger(rtuAddr, code, protocolName, protocolVersion, new Callback() { |
| | | @Override |
| | | public void call(Object obj) { |
| | | if(obj != null){ |
| | | Command com = (Command)obj ; |
| | | CommandCtrl comCtrl = SpringContextUtil.getBean(CommandCtrl.class) ; |
| | | if(comCtrl != null){ |
| | | comCtrl.sendOutComFromLocal(com) ; |
| | | } |
| | | } |
| | | } |
| | | @Override |
| | | public void call(Object... objs) { |
| | | } |
| | | @Override |
| | | public void exception(Exception e) { |
| | | } |
| | | }, objs); |
| | | } |
| | | }) ; |
| | | if(midRs != null){ |