| | |
| | | public MqttPubMsg result ;//下行命令 |
| | | public Long cachTime ;//缓存时刻 |
| | | public boolean onceReceivedResult ;//已经收到命令应答 |
| | | public long lastSendTime = 0 ;//上次发送时间 |
| | | public int sendTimes = 0 ;//发送次数 |
| | | |
| | | |
| | | public MqttPubMsgNode(MqttPubMsg result){ |
| | | this.result = result ; |
| | | this.cachTime = System.currentTimeMillis() ; |
| | | this.onceReceivedResult = false ; |
| | | this.lastSendTime = 0L ; |
| | | this.sendTimes = 0 ; |
| | | } |
| | | |
| | | /** |
| | |
| | | public boolean dealSelf(Long now){ |
| | | if(this.onceReceivedResult){ |
| | | //已经收到命令结果 |
| | | //记录状态 |
| | | //RtuStatusDealer.commandSuccess(this.result.rtuAddr, this.result.downCode, this.result.downCodeName); |
| | | return true ; |
| | | } |
| | | if(this.sendTimes >= (1 + MqttUnit.confVo.reSendTimesByNoResult)){ |
| | | return this.decideRemoveNodeFromCach(now, null) ; |
| | | } |
| | | if(this.lastSendTime != 0 && now - this.lastSendTime >= MqttUnit.confVo.sendInterval){ |
| | | return this.decideRemoveNodeFromCach(now, null) ; |
| | | } |
| | | boolean noConnect2MqSv = false ; |
| | | MqttManager mqttManager = MqttManager.getInstance() ; |
| | |
| | | noConnect2MqSv = mqttManager.poolIsClose() ; |
| | | if(noConnect2MqSv){ |
| | | //未曾连接MQTT服务器 |
| | | return this.decideRemoveNodeFromCach(now) ; |
| | | return this.decideRemoveNodeFromCach(now, null) ; |
| | | }else{ |
| | | try { |
| | | //如果网络不好或断网,此处用时较长 |
| | |
| | | } |
| | | if(noConnect2MqSv){ |
| | | //未曾连接MQTT服务器 |
| | | return this.decideRemoveNodeFromCach(now) ; |
| | | return this.decideRemoveNodeFromCach(now, null) ; |
| | | }else{ |
| | | if(mqttClient != null && mqttClient.isConnected()){ |
| | | try { |
| | | mqttManager.publishMsg(mqttClient, this.result.topic.longName(), this.result.msg); |
| | | this.sendTimes ++ ; |
| | | this.lastSendTime = System.currentTimeMillis() ; |
| | | DevStatusDealer.afterSendPubMessage(this.result.deviceId); |
| | | RtuLogDealer.log4Mqtt(this.result.deviceId, "发布消息 主题:" + this.result.topic + " 消息:" + this.result.msg); |
| | | log.info("发布MQTT消息(主题=" + this.result.topic + ")" + this.result.msg); |
| | | RtuLogDealer.log4Mqtt(this.result.deviceId, "发布消息 主题:" + this.result.topic.longName() + " 消息:" + this.result.msg); |
| | | log.info("发布MQTT消息(主题=" + this.result.topic.longName() + ")" + this.result.msg); |
| | | }catch (Exception e){ |
| | | log.error("MQTT发布消息失败(主题=" + this.result.topic + ")" , e); |
| | | log.error("MQTT发布消息失败(主题=" + this.result.topic.longName() + ")" , e); |
| | | }finally { |
| | | mqttManager.pushMqttClient(mqttClient); |
| | | } |
| | |
| | | } |
| | | }else{ |
| | | //未曾连接MQTT服务器 |
| | | return this.decideRemoveNodeFromCach(now) ; |
| | | return this.decideRemoveNodeFromCach(now, false) ; |
| | | } |
| | | } |
| | | } |
| | | |
| | | private boolean decideRemoveNodeFromCach(Long now){ |
| | | if(!this.result.isCacheForOffLine){ |
| | | private boolean decideRemoveNodeFromCach(Long now, Boolean isOffLine){ |
| | | if(isOffLine != null && isOffLine.booleanValue() && !this.result.isCacheForOffLine){ |
| | | //不在线命令不缓存 |
| | | return true ; |
| | | }else{ |
| | | //不在线命令缓存 |
| | | if(now - this.cachTime >= ServerProperties.offLineCacheTimeout){ |
| | | if(now - this.cachTime >= MqttUnit.confVo.comCacheTimeout){ |
| | | //缓存超时 |
| | | return true ; |
| | | } |