package com.dy.testClient.rmiClient; import com.dy.testClient.ServerProperties; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.dy.common.mw.UnitAdapterInterface; import com.dy.common.mw.UnitInterface; import com.dy.common.mw.UnitCallbackInterface; import com.dy.common.mw.channel.rmi.RmiFrameWork; public class RmiClUnit implements UnitInterface { private static final Logger log = LogManager.getLogger(RmiClUnit.class) ; private static final String id = "" + System.nanoTime() ;//自己的id public static String token ;//服务端发的token private static final RmiClUnit instance = new RmiClUnit() ; private static RmiFrameWork frmWork = null ; public static RmiClUnitAdapter adapter ; public static RmiClUnitConfigVo confVo ; private RmiClUnit(){} public static RmiClUnit getInstance(){ return instance ; } @Override public void setAdapter(UnitAdapterInterface adapter) throws Exception { if(adapter == null){ throw new Exception("Rmi Client模块适配器对象不能为空!") ; } RmiClUnit.adapter = (RmiClUnitAdapter)adapter ; RmiClUnit.confVo = RmiClUnit.adapter.getConfig() ; if(RmiClUnit.confVo == null){ throw new Exception("Rmi Client模块配置对象不能为空!") ; } } @Override public void start(UnitCallbackInterface callback) throws Exception { System.out.println("Rmi Client模块成功启动"); this.doStart(); callback.call(null) ; } @Override public void stop(UnitCallbackInterface callback) throws Exception { callback.call(null); } private void doStart(){ new Thread(() -> { while(true){ try { Thread.sleep(100L); frmWork = getRmiFrameWork() ; if(frmWork != null){ break ; } } catch (Exception e) { log.error("得到rmiFramWork失败" + e.getMessage()); continue ; } } register(frmWork) ; }).start(); } public RmiFrameWork getRmiFrameWork(){ System.setProperty("java.rmi.server.hostname", confVo.svUrl) ; System.out.println("Rmi建立连接请求服务端:" + confVo.svUrl + ":" + confVo.svPort + "/" + confVo.svContext); RmiClient rmiCl = new RmiClient(confVo.svUrl, confVo.svPort, confVo.svContext) ; return rmiCl.getRmiInterface() ; } //把上报数据的数量上报给mwTestServer public void reportHadReportCount(Integer count){ try { Thread.sleep(100L); RmiRequestVo rqVo = new RmiRequestVo() ; rqVo.id = id ; rqVo.token = token ; rqVo.code = Code.cd5; rqVo.count = count ; String json = rqVo.toJson() ; frmWork.syncRequest(json) ; } catch (Exception e) { log.error("把上报数据的数量上报给mwTestServer失败" + e.getMessage()); } } //把数据上报完成情况 上报给mwTestServer public void reportHadReportOver(Integer count){ try { Thread.sleep(100L); RmiRequestVo rqVo = new RmiRequestVo() ; rqVo.id = id ; rqVo.token = token ; rqVo.code = Code.cd6; rqVo.overCount = count ; String json = rqVo.toJson() ; frmWork.syncRequest(json) ; } catch (Exception e) { log.error("把数据上报完成情况 上报给mwTestServer失败" + e.getMessage()); } } //把数据上报完成情况 上报给mwTestServer public void allOver(Long seconds){ try { Thread.sleep(100L); RmiRequestVo rqVo = new RmiRequestVo() ; rqVo.id = id ; rqVo.token = token ; rqVo.code = Code.cd7; rqVo.over = true ; rqVo.seconds = seconds ; String json = rqVo.toJson() ; frmWork.syncRequest(json) ; } catch (Exception e) { log.error("把数据上报完成情况 上报给mwTestServer失败" + e.getMessage()); } } //向mwTestServer注册 private void register(RmiFrameWork frmWork){ boolean error = false ; while(true){ try { Thread.sleep(100L); RmiRequestVo rqVo = new RmiRequestVo() ; rqVo.id = id ; rqVo.code = Code.cd1 ; String json = rqVo.toJson() ; Object rObj = frmWork.syncRequest(json) ; if(rObj != null){ RmiResponseVo rspVo = RmiResponseVo.jsonToObject(String.valueOf(rObj), ResRegisterVo.class) ; if(rspVo != null){ if(rspVo.success){ if(rspVo.obj != null && rspVo.obj instanceof ResRegisterVo){ ResRegisterVo rVo = (ResRegisterVo)rspVo.obj ; token = rVo.token ; log.info("注册成功,得到token=" + token); break ; }else{ log.error("rmi注册失败:服务端返回ResRegisterVo为null"); error = true ; } }else{ log.error("rmi注册失败:服务端返回错误:" + rspVo.errorInfo); error = true ; } }else{ log.error("rmi注册失败:服务端返回的RmiResponseVo为null"); error = true ; } }else{ log.error("rmi注册失败:服务端返回json为null"); error = true ; } } catch (Exception e) { log.error("rmi注册失败" + e.getMessage()); error = true ; continue ; } } if(!error){ getConfig(frmWork) ; } } //从mwTestServer得到配置 private void getConfig(RmiFrameWork frmWork){ boolean error = false ; while(true){ try { Thread.sleep(100L); RmiRequestVo rqVo = new RmiRequestVo() ; rqVo.id = id ; rqVo.token = token ; rqVo.code = Code.cd2 ; String json = rqVo.toJson() ; Object rObj = frmWork.syncRequest(json) ; if(rObj != null){ RmiResponseVo rspVo = RmiResponseVo.jsonToObject(String.valueOf(rObj), ResConfigVo.class) ; if(rspVo != null){ if(rspVo.success){ if(rspVo.obj != null && rspVo.obj instanceof ResConfigVo){ ResConfigVo rVo = (ResConfigVo)rspVo.obj ; if(rVo != null){ ServerProperties.rtuAddrStart = rVo.rtuAddrStart; ServerProperties.rtuAddrEnd = rVo.rtuAddrEnd; ServerProperties.tcpServerIp = rVo.tcpServerIp; ServerProperties.tcpServerPort = rVo.tcpServerPort; ServerProperties.sendInterval = rVo.sendInterval ; ServerProperties.heartbeatTimes = rVo.heartbeatTimes ; ServerProperties.sendTimes = rVo.sendTimes ; ServerProperties.sendOverThenCloseConnect = rVo.sendOverThenCloseConnect ; log.info("得到配置成功"); log.info(" 开始RtuAddr=" + ServerProperties.rtuAddrStart); log.info(" 截止RtuAddr=" + ServerProperties.rtuAddrEnd); log.info(" mwAccept服务IP=" + ServerProperties.tcpServerIp); log.info(" mwAccept服务端口=" + ServerProperties.tcpServerPort); log.info(" 发送数据间隔=" + ServerProperties.sendTimes); log.info(" 每轮次发送心跳次数=" + ServerProperties.heartbeatTimes); log.info(" 每RTU上报数据轮次=" + ServerProperties.sendTimes); log.info(" 发送完数据后,是否关闭TCP连接(1是,0否)=" + ServerProperties.sendOverThenCloseConnect); break ; }else{ log.error("rmi得到配置失败:json转ResConfigVo为null"); error = true ; } }else{ log.error("rmi得到配置失败:服务端返回ResConfigVo为null"); error = true ; } }else{ log.error("rmi得到配置失败:服务端返回错误:" + rspVo.errorInfo); error = true ; } }else{ log.error("rmi得到配置失败:服务端返回的RmiResponseVo为null"); error = true ; } }else{ log.error("rmi得到配置失败:服务端返回json为null"); error = true ; } } catch (Exception e) { log.error("rmi得到配置失败" + e.getMessage()); error = true ; continue ; } } if(!error){ getStartTcpConnect(frmWork) ; } } //从mwTestServer得到开始TCP连接的请允许 private void getStartTcpConnect(RmiFrameWork frmWork){ log.info("等待服务端允许网络连接"); boolean error = false ; while(true){ try { Thread.sleep(100L); RmiRequestVo rqVo = new RmiRequestVo() ; rqVo.id = id ; rqVo.token = token ; rqVo.code = Code.cd3 ; String json = rqVo.toJson() ; Object rObj = frmWork.syncRequest(json) ; if(rObj != null){ RmiResponseVo rspVo = RmiResponseVo.jsonToObject(String.valueOf(rObj), ResStartTcpConnectVo.class) ; if(rspVo != null){ if(rspVo.success){ if(rspVo.obj != null && rspVo.obj instanceof ResStartTcpConnectVo){ ResStartTcpConnectVo rVo = (ResStartTcpConnectVo)rspVo.obj ; if(rVo != null){ if(rVo.start){ ServerProperties.startTcpConnectWork = true ; log.info("允许TCP网络连接了( ^_^ )"); error = false ; break ; } }else{ error = true ; log.error("rmi请求TCP网络连接失败:json转ResStartTcpConnectVo为null"); } }else{ error = true ; log.error("rmi请求TCP网络连接失败:服务端返回ResStartTcpConnectVo为null"); } }else{ error = true ; log.error("rmi请求TCP网络连接失败:服务端返回错误:" + rspVo.errorInfo); } }else{ error = true ; log.error("rmi请求TCP网络连接失败:服务端返回的RmiResponseVo为null"); } }else{ error = true ; log.error("rmi请求TCP网络连接失败:服务端返回json为null"); } } catch (Exception e) { error = true ; log.error("rmi请求TCP网络连接失败" + e.getMessage()); continue ; } } if(!error){ getStartRtuReport(frmWork) ; } } //从mwTestServer得到开始RTU上报数据的请允许 private void getStartRtuReport(RmiFrameWork frmWork){ log.info("等待服务端允许上报数据"); while(true){ try { Thread.sleep(100L); RmiRequestVo rqVo = new RmiRequestVo() ; rqVo.id = id ; rqVo.token = token ; rqVo.code = Code.cd4 ; String json = rqVo.toJson() ; Object rObj = frmWork.syncRequest(json) ; if(rObj != null){ RmiResponseVo rspVo = RmiResponseVo.jsonToObject(String.valueOf(rObj), ResStartRtuReportVo.class) ; if(rspVo != null){ if(rspVo.success){ if(rspVo.obj != null && rspVo.obj instanceof ResStartRtuReportVo){ ResStartRtuReportVo rVo = (ResStartRtuReportVo)rspVo.obj ; if(rVo != null){ if(rVo.report){ ServerProperties.startRtuReportWork = true ; log.info("允许RTU上报数据工作了( ^_^ )"); break ; } }else{ log.error("rmi请求Rtu上报数据失败:json转ResStartRtuReportVo为null"); } }else{ log.error("rmi请求Rtu上报数据失败:服务端返回ResStartRtuReportVo为null"); } }else{ log.error("rmi请求Rtu上报数据失败:服务端返回错误:" + rspVo.errorInfo); } }else{ log.error("rmi请求Rtu上报数据失败:服务端返回的RmiResponseVo为null"); } }else{ log.error("rmi请求Rtu上报数据失败:服务端返回json为null"); } } catch (Exception e) { log.error("rmi请求Rtu上报数据失败" + e.getMessage()); continue ; } } } }