| 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 ; | 
|             } | 
|         } | 
|     } | 
|   | 
| } |