diff --git a/src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java b/src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java index 17f8b37f..12a03b47 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java @@ -25,6 +25,12 @@ public interface IPlatformService { */ boolean add(ParentPlatform parentPlatform); + /** + * 添加级联平台 + * @param parentPlatform 级联平台 + */ + boolean update(ParentPlatform parentPlatform); + /** * 平台上线 * @param parentPlatform 平台信息 diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java index 136689ca..d7d9f6c0 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java @@ -11,8 +11,8 @@ import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IPlatformService; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.dao.GbStreamMapper; -import com.genersoft.iot.vmp.storager.dao.ParentPlatformMapper; +import com.genersoft.iot.vmp.storager.dao.*; +import com.genersoft.iot.vmp.utils.DateUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.slf4j.Logger; @@ -41,6 +41,15 @@ public class PlatformServiceImpl implements IPlatformService { @Autowired private ParentPlatformMapper platformMapper; + @Autowired + private PlatformCatalogMapper catalogMapper; + + @Autowired + private PlatformChannelMapper platformChannelMapper; + + @Autowired + private PlatformGbStreamMapper platformGbStreamMapper; + @Autowired private IRedisCatchStorage redisCatchStorage; @@ -112,6 +121,69 @@ public class PlatformServiceImpl implements IPlatformService { return result > 0; } + @Override + public boolean update(ParentPlatform parentPlatform) { + parentPlatform.setCharacterSet(parentPlatform.getCharacterSet().toUpperCase()); + ParentPlatform parentPlatformOld = platformMapper.getParentPlatById(parentPlatform.getId()); + parentPlatform.setUpdateTime(DateUtil.getNow()); + if (!parentPlatformOld.getTreeType().equals(parentPlatform.getTreeType())) { + // 目录结构发生变化,清空之前的关联关系 + logger.info("保存平台{}时发现目录结构变化,清空关联关系", parentPlatform.getDeviceGBId()); + catalogMapper.delByPlatformId(parentPlatformOld.getServerGBId()); + platformChannelMapper.delByPlatformId(parentPlatformOld.getServerGBId()); + platformGbStreamMapper.delByPlatformId(parentPlatformOld.getServerGBId()); + } + + // 停止心跳定时 + final String keepaliveTaskKey = KEEPALIVE_KEY_PREFIX + parentPlatformOld.getServerGBId(); + dynamicTask.stop(keepaliveTaskKey); + // 停止注册定时 + final String registerTaskKey = REGISTER_KEY_PREFIX + parentPlatformOld.getServerGBId(); + dynamicTask.stop(registerTaskKey); + // 注销旧的 + try { + commanderForPlatform.unregister(parentPlatformOld, null, eventResult -> { + logger.info("[国标级联] 注销成功, 平台:{}", parentPlatformOld.getServerGBId()); + }); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage()); + } + + // 更新数据库 + if (parentPlatform.getCatalogGroup() == 0) { + parentPlatform.setCatalogGroup(1); + } + if (parentPlatform.getAdministrativeDivision() == null) { + parentPlatform.setAdministrativeDivision(parentPlatform.getAdministrativeDivision()); + } + + platformMapper.updateParentPlatform(parentPlatform); + // 更新redis + redisCatchStorage.delPlatformCatchInfo(parentPlatformOld.getServerGBId()); + ParentPlatformCatch parentPlatformCatch = new ParentPlatformCatch(); + parentPlatformCatch.setParentPlatform(parentPlatform); + parentPlatformCatch.setId(parentPlatform.getServerGBId()); + redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch); + // 注册 + if (parentPlatform.isEnable()) { + // 保存时启用就发送注册 + // 注册成功时由程序直接调用了online方法 + try { + commanderForPlatform.register(parentPlatform, eventResult -> { + logger.info("[国标级联] {},添加向上级注册失败,请确定上级平台可用时重新保存", parentPlatform.getServerGBId()); + }, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[命令发送失败] 国标级联: {}", e.getMessage()); + } + } + // 重新开启定时注册, 使用续订消息 + // 重新开始心跳保活 + + + return false; + } + + @Override public void online(ParentPlatform parentPlatform) { logger.info("[国标级联]:{}, 平台上线/更新注册", parentPlatform.getServerGBId()); @@ -137,7 +209,7 @@ public class PlatformServiceImpl implements IPlatformService { ()-> { registerTask(parentPlatform); }, - (parentPlatform.getExpires() - 10) *1000); + (parentPlatform.getExpires()) *1000); } @@ -183,7 +255,7 @@ public class PlatformServiceImpl implements IPlatformService { logger.error("[命令发送失败] 国标级联 发送心跳: {}", e.getMessage()); } }, - (parentPlatform.getKeepTimeout() - 10)*1000); + (parentPlatform.getKeepTimeout())*1000); } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java index 7628f7ca..e233d1b1 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java @@ -205,58 +205,8 @@ public class PlatformController { ) { throw new ControllerException(ErrorCode.ERROR400); } - parentPlatform.setCharacterSet(parentPlatform.getCharacterSet().toUpperCase()); - ParentPlatform parentPlatformOld = storager.queryParentPlatByServerGBId(parentPlatform.getServerGBId()); - parentPlatform.setUpdateTime(DateUtil.getNow()); - if (!parentPlatformOld.getTreeType().equals(parentPlatform.getTreeType())) { - // 目录结构发生变化,清空之前的关联关系 - logger.info("保存平台{}时发现目录结构变化,清空关联关系", parentPlatform.getDeviceGBId()); - storager.cleanContentForPlatform(parentPlatform.getServerGBId()); - } - boolean updateResult = storager.updateParentPlatform(parentPlatform); - - if (updateResult) { - // 保存时启用就发送注册 - if (parentPlatform.isEnable()) { - if (parentPlatformOld != null && parentPlatformOld.isStatus()) { - try { - commanderForPlatform.unregister(parentPlatformOld, null, null); - } catch (InvalidArgumentException | ParseException | SipException e) { - logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage()); - } - try { - Thread.sleep(500); - } catch (InterruptedException e) { - logger.error("[线程休眠失败] : {}", e.getMessage()); - } - // 只要保存就发送注册 - try { - commanderForPlatform.register(parentPlatform, null, null); - } catch (InvalidArgumentException | ParseException | SipException e) { - logger.error("[命令发送失败] 国标级联 注册: {}", e.getMessage()); - } - - } else { - // 只要保存就发送注册 - try { - commanderForPlatform.register(parentPlatform, null, null); - } catch (InvalidArgumentException | ParseException | SipException e) { - logger.error("[命令发送失败] 国标级联 注册: {}", e.getMessage()); - } - } - } else if (parentPlatformOld != null && parentPlatformOld.isEnable() && !parentPlatform.isEnable()) { // 关闭启用时注销 - try { - commanderForPlatform.unregister(parentPlatformOld, null, null); - } catch (InvalidArgumentException | ParseException | SipException e) { - logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage()); - } - // 停止订阅相关的定时任务 - subscribeHolder.removeAllSubscribe(parentPlatform.getServerGBId()); - } - } else { - throw new ControllerException(ErrorCode.ERROR100.getCode(),"写入数据库失败"); - } + platformService.update(parentPlatform); } /** diff --git a/web_src/src/components/dialog/platformEdit.vue b/web_src/src/components/dialog/platformEdit.vue index 2a41e6ac..be7c5058 100644 --- a/web_src/src/components/dialog/platformEdit.vue +++ b/web_src/src/components/dialog/platformEdit.vue @@ -157,7 +157,7 @@ export default { devicePort: null, username: null, password: null, - expires: 300, + expires: 3600, keepTimeout: 60, transport: "UDP", characterSet: "GB2312", @@ -305,7 +305,7 @@ export default { devicePort: null, username: null, password: null, - expires: 300, + expires: 3600, keepTimeout: 60, transport: "UDP", characterSet: "GB2312", @@ -332,7 +332,7 @@ export default { }, checkExpires: function() { if (this.platform.enable && this.platform.expires === "0") { - this.platform.expires = "300"; + this.platform.expires = "3600"; } }, rtcpCheckBoxChange: function (result){