|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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){ | 
|---|
|  |  |  | //说明刚建立网络连接,此数据应该是上线数据 | 
|---|
|  |  |  | 
|---|
|  |  |  | 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){ | 
|---|