| | |
| | | |
| | | public class RtuUpTask extends CoreTask { |
| | | |
| | | private static Logger log = LogManager.getLogger(RtuUpTask.class.getName()); |
| | | private static final Logger log = LogManager.getLogger(RtuUpTask.class.getName()); |
| | | |
| | | @Override |
| | | public Integer excute() { |
| | |
| | | |
| | | /** |
| | | * RTU上行数据 |
| | | * @param session |
| | | * @param upBuf |
| | | * @param session IO会话 |
| | | * @param upBuf 上行数据 |
| | | */ |
| | | private void upData(IoSession session, byte[] upBuf) throws Exception{ |
| | | if(upBuf == null){ |
| | |
| | | //说明刚建立网络连接,此数据应该是上线数据 |
| | | isOnLine = true ; |
| | | String[] rtuAddrProtocolName = this.parseOnLine(session, upBuf) ; |
| | | if(rtuAddrProtocolName != null && rtuAddrProtocolName.length == 2){ |
| | | if(rtuAddrProtocolName.length == 2){ |
| | | //解析上线数据成功,并解析出RTU地址及通信协议名称 |
| | | rtuAddr = rtuAddrProtocolName[0] ; |
| | | protocolName = rtuAddrProtocolName[1] ; |
| | |
| | | |
| | | /** |
| | | * 解析上线数据 |
| | | * @param session |
| | | * @param upBuf |
| | | * @param session IO会话 |
| | | * @param upBuf 上行数据 |
| | | */ |
| | | private String[] parseOnLine(IoSession session, byte[] upBuf){ |
| | | String rtuAddr = null ; |
| | |
| | | |
| | | /** |
| | | * 处理上行数据 |
| | | * @param session |
| | | * @param rtuAddr |
| | | * @param upBuf |
| | | * @param upHex |
| | | * @throws Exception |
| | | * @param session IO会话 |
| | | * @param rtuAddrAtHead 控制器地址头部 |
| | | * @param protocolName 协议名称 |
| | | * @param isOnLine 是否上线数据 |
| | | * @param upBuf 上行数据 |
| | | * @param upHex 上行数据 |
| | | * @throws Exception 异常 |
| | | */ |
| | | private void dealUpData(IoSession session, String rtuAddrAtHead, String protocolName, boolean isOnLine, byte[] upBuf, String upHex) throws Exception{ |
| | | Driver dri = ProtocolCach.getDriver(protocolName) ; |
| | | if(dri == null){ |
| | | log.error("严重错误,未能得到协议" + protocolName + "驱动类实例!"); |
| | | }else{ |
| | | MidResult[] midRses = dri.parseData(ServerProperties.isLowPower, rtuAddrAtHead, upBuf, upHex, new DriverParserDataCallback(){ |
| | | MidResult[] midRs = dri.parseData(ServerProperties.isLowPower, rtuAddrAtHead, upBuf, upHex, new DriverParserDataCallback(){ |
| | | @Override |
| | | public void callback(String rtuAddrAtHead, String meterNoAtHead, String code, String upHex, Boolean reportOrResponse_trueOrFalse, boolean parseFail, String rtuAddrInData, String meterNoInData) { |
| | | //更新终端状态 |
| | |
| | | TcpSessionCach.changeRtuAddr(rtuAddrAtHead, rtuAddrInData, protocolName, session); |
| | | session.setAttribute(TcpIoSessionAttrIdIsRtuAddr.sessionArrIdKey, rtuAddrInData) ; |
| | | } |
| | | |
| | | String rtuAddr = null ; |
| | | |
| | | String rtuAddr ; |
| | | if(rtuAddrInData != null){ |
| | | rtuAddr = rtuAddrInData ; |
| | | rtuAddr = rtuAddrInData ; |
| | | }else{ |
| | | rtuAddr = rtuAddrAtHead ; |
| | | } |
| | | |
| | | |
| | | InetSocketAddress sa = (InetSocketAddress)session.getRemoteAddress() ; |
| | | if(isOnLine){ |
| | | //上线了 |
| | | RtuStatusDealer.onLine(rtuAddr, sa.getAddress().getHostAddress(), sa.getPort()); |
| | | } |
| | | if(reportOrResponse_trueOrFalse != null && reportOrResponse_trueOrFalse.booleanValue()){ |
| | | if(reportOrResponse_trueOrFalse != null && reportOrResponse_trueOrFalse){ |
| | | RtuStatusDealer.upReport(rtuAddr, upBuf.length) ; |
| | | }else{ |
| | | RtuStatusDealer.upData(rtuAddr, upBuf.length) ; |
| | | } |
| | | |
| | | |
| | | //记录日志 |
| | | if(parseFail){ |
| | | RtuLogDealer.log(rtuAddr, (isOnLine?"上线数据 ":"上行数据 ") + "" + code + ":" + upHex + "(解析失败)"); |
| | |
| | | } |
| | | } |
| | | }) ; |
| | | if(midRses != null){ |
| | | for(MidResult rs : midRses){ |
| | | if(midRs != null){ |
| | | for(MidResult rs : midRs){ |
| | | rs.action(); |
| | | } |
| | | } |