From b9a33f03d649d786315e345a00c004d96158df62 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 22 九月 2023 17:46:31 +0800 Subject: [PATCH] 国标级联支持添加通道后主动推动到上级 --- src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java | 2 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java | 42 ++++++++++++++ web_src/src/components/dialog/platformEdit.vue | 8 ++ src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java | 38 +++++++++++- src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java | 11 +++ sql/初始化.sql | 1 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java | 24 ++++--- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java | 8 ++ src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java | 5 + src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java | 6 +- src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java | 2 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java | 14 ++-- sql/2.6.9更新.sql | 5 + src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java | 1 14 files changed, 138 insertions(+), 29 deletions(-) diff --git "a/sql/2.6.9\346\233\264\346\226\260.sql" "b/sql/2.6.9\346\233\264\346\226\260.sql" index 2e04794..514b39e 100644 --- "a/sql/2.6.9\346\233\264\346\226\260.sql" +++ "b/sql/2.6.9\346\233\264\346\226\260.sql" @@ -1,2 +1,5 @@ alter table wvp_device_channel - change stream_id stream_id varying(255) \ No newline at end of file + change stream_id stream_id varying(255) + +alter table wvp_platform + add auto_push_channel bool default false diff --git "a/sql/\345\210\235\345\247\213\345\214\226.sql" "b/sql/\345\210\235\345\247\213\345\214\226.sql" index 93eef4e..64c404f 100644 --- "a/sql/\345\210\235\345\247\213\345\214\226.sql" +++ "b/sql/\345\210\235\345\247\213\345\214\226.sql" @@ -194,6 +194,7 @@ create_time character varying(50), update_time character varying(50), as_message_channel bool default false, + auto_push_channel bool default false, constraint uk_platform_unique_server_gb_id unique (server_gb_id) ); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java index fbc95ed..1638c71 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java @@ -186,6 +186,9 @@ @Schema(description = "鏄惁浣滀负娑堟伅閫氶亾") private boolean asMessageChannel; + @Schema(description = "鏄惁浣滀负娑堟伅閫氶亾") + private boolean autoPushChannel; + public Integer getId() { return id; } @@ -425,4 +428,12 @@ public void setAsMessageChannel(boolean asMessageChannel) { this.asMessageChannel = asMessageChannel; } + + public boolean isAutoPushChannel() { + return autoPushChannel; + } + + public void setAutoPushChannel(boolean autoPushChannel) { + this.autoPushChannel = autoPushChannel; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java index d385d9a..d932a20 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java @@ -32,11 +32,13 @@ public void putCatalogSubscribe(String platformId, SubscribeInfo subscribeInfo) { catalogMap.put(platformId, subscribeInfo); - // 娣诲姞璁㈤槄鍒版湡 - String taskOverdueKey = taskOverduePrefix + "catalog_" + platformId; - // 娣诲姞浠诲姟澶勭悊璁㈤槄杩囨湡 - dynamicTask.startDelay(taskOverdueKey, () -> removeCatalogSubscribe(subscribeInfo.getId()), - subscribeInfo.getExpires() * 1000); + if (subscribeInfo.getExpires() > 0) { + // 娣诲姞璁㈤槄鍒版湡 + String taskOverdueKey = taskOverduePrefix + "catalog_" + platformId; + // 娣诲姞浠诲姟澶勭悊璁㈤槄杩囨湡 + dynamicTask.startDelay(taskOverdueKey, () -> removeCatalogSubscribe(subscribeInfo.getId()), + subscribeInfo.getExpires() * 1000); + } } public SubscribeInfo getCatalogSubscribe(String platformId) { @@ -63,11 +65,13 @@ dynamicTask.startCron(key, new MobilePositionSubscribeHandlerTask(platformId), subscribeInfo.getGpsInterval() * 1000); String taskOverdueKey = taskOverduePrefix + "MobilePosition_" + platformId; - // 娣诲姞浠诲姟澶勭悊璁㈤槄杩囨湡 - dynamicTask.startDelay(taskOverdueKey, () -> { - removeMobilePositionSubscribe(subscribeInfo.getId()); - }, - subscribeInfo.getExpires() * 1000); + if (subscribeInfo.getExpires() > 0) { + // 娣诲姞浠诲姟澶勭悊璁㈤槄杩囨湡 + dynamicTask.startDelay(taskOverdueKey, () -> { + removeMobilePositionSubscribe(subscribeInfo.getId()); + }, + subscribeInfo.getExpires() * 1000); + } } public SubscribeInfo getMobilePositionSubscribe(String platformId) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java index 07176f2..e5c5045 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java @@ -18,6 +18,9 @@ } + public SubscribeInfo() { + } + private String id; private SIPRequest request; @@ -32,6 +35,21 @@ */ private String sn; private int gpsInterval; + + /** + * 妯℃嫙鐨凢romTag + */ + private String simulatedFromTag; + + /** + * 妯℃嫙鐨凾oTag + */ + private String simulatedToTag; + + /** + * 妯℃嫙鐨凜allID + */ + private String simulatedCallId; public String getId() { return id; @@ -96,4 +114,28 @@ public void setGpsInterval(int gpsInterval) { this.gpsInterval = gpsInterval; } + + public String getSimulatedFromTag() { + return simulatedFromTag; + } + + public void setSimulatedFromTag(String simulatedFromTag) { + this.simulatedFromTag = simulatedFromTag; + } + + public String getSimulatedCallId() { + return simulatedCallId; + } + + public void setSimulatedCallId(String simulatedCallId) { + this.simulatedCallId = simulatedCallId; + } + + public String getSimulatedToTag() { + return simulatedToTag; + } + + public void setSimulatedToTag(String simulatedToTag) { + this.simulatedToTag = simulatedToTag; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java index 9a00c17..a3f1a21 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java @@ -227,11 +227,11 @@ SipURI fromSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort()); Address fromAddress = SipFactory.getInstance().createAddressFactory().createAddress(fromSipURI); - FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, subscribeInfo.getResponse().getToTag()); + FromHeader fromHeader = SipFactory.getInstance().createHeaderFactory().createFromHeader(fromAddress, subscribeInfo.getResponse() != null ? subscribeInfo.getResponse().getToTag(): subscribeInfo.getSimulatedToTag()); // to SipURI toSipURI = SipFactory.getInstance().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerGBDomain()); Address toAddress = SipFactory.getInstance().createAddressFactory().createAddress(toSipURI); - ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, subscribeInfo.getRequest().getFromTag()); + ToHeader toHeader = SipFactory.getInstance().createHeaderFactory().createToHeader(toAddress, subscribeInfo.getRequest() != null ?subscribeInfo.getRequest().getFromTag(): subscribeInfo.getSimulatedFromTag()); // Forwards MaxForwardsHeader maxForwards = SipFactory.getInstance().createHeaderFactory().createMaxForwardsHeader(70); @@ -241,7 +241,7 @@ // 璁剧疆缂栫爜锛� 闃叉涓枃涔辩爜 messageFactory.setDefaultContentEncodingCharset("gb2312"); - CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(subscribeInfo.getRequest().getCallIdHeader().getCallId()); + CallIdHeader callIdHeader = SipFactory.getInstance().createHeaderFactory().createCallIdHeader(subscribeInfo.getRequest() != null ? subscribeInfo.getRequest().getCallIdHeader().getCallId(): subscribeInfo.getSimulatedCallId()); request = (SIPRequest) messageFactory.createRequest(requestURI, Request.NOTIFY, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java index 06a08e2..473ca91 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java @@ -148,13 +148,13 @@ CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); - Request request = headerProviderPlatformProvider.createMessageRequest( - parentPlatform, - keepaliveXml.toString(), - SipUtils.getNewFromTag(), - SipUtils.getNewViaTag(), - callIdHeader); - sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, errorEvent, okEvent); + Request request = headerProviderPlatformProvider.createMessageRequest( + parentPlatform, + keepaliveXml.toString(), + SipUtils.getNewFromTag(), + SipUtils.getNewViaTag(), + callIdHeader); + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, errorEvent, okEvent); return callIdHeader.getCallId(); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java index 4ff4e98..8aa3b0d 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; +import com.genersoft.iot.vmp.service.IPlatformService; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.message.SIPResponse; @@ -49,6 +50,10 @@ @Autowired private SIPSender sipSender; + + + @Autowired + private IPlatformService platformService; @Override public void afterPropertiesSet() throws Exception { @@ -191,5 +196,8 @@ } catch (SipException | InvalidArgumentException | ParseException e) { logger.error("鏈鐞嗙殑寮傚父 ", e); } + if (subscribeHolder.getCatalogSubscribe(platformId) == null && platform.isAutoPushChannel()) { + platformService.addSimulatedSubscribeInfo(platform); + } } } 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 e9cddff..7b249d0 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java @@ -55,4 +55,6 @@ * @param platformId 骞冲彴 */ void sendNotifyMobilePosition(String platformId); + + void addSimulatedSubscribeInfo(ParentPlatform parentPlatform); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java index 054b6ff..26b4f3e 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java @@ -18,6 +18,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import java.util.ArrayList; 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 d295ed4..b67fcc5 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java @@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.session.SSRCFactory; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; +import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; @@ -16,17 +17,22 @@ import com.genersoft.iot.vmp.utils.DateUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import gov.nist.javax.sip.message.SIPRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.sip.InvalidArgumentException; +import javax.sip.PeerUnavailableException; import javax.sip.SipException; +import javax.sip.SipFactory; +import javax.sip.address.Address; +import javax.sip.address.SipURI; +import javax.sip.header.*; +import javax.sip.message.Request; import java.text.ParseException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author lin @@ -182,6 +188,7 @@ } } + return false; } @@ -256,6 +263,31 @@ }, (parentPlatform.getKeepTimeout())*1000); } + if (parentPlatform.isAutoPushChannel()) { + if (subscribeHolder.getCatalogSubscribe(parentPlatform.getServerGBId()) == null) { + addSimulatedSubscribeInfo(parentPlatform); + } + }else { + SubscribeInfo catalogSubscribe = subscribeHolder.getCatalogSubscribe(parentPlatform.getServerGBId()); + if (catalogSubscribe != null && catalogSubscribe.getExpires() == -1) { + subscribeHolder.removeCatalogSubscribe(parentPlatform.getServerGBId()); + } + } + } + + @Override + public void addSimulatedSubscribeInfo(ParentPlatform parentPlatform) { + // 鑷姩娣诲姞涓�鏉℃ā鎷熺殑璁㈤槄淇℃伅 + SubscribeInfo subscribeInfo = new SubscribeInfo(); + subscribeInfo.setId(parentPlatform.getServerGBId()); + subscribeInfo.setExpires(-1); + subscribeInfo.setEventType("Catalog"); + int random = (int) Math.floor(Math.random() * 10000); + subscribeInfo.setEventId(random + ""); + subscribeInfo.setSimulatedCallId(UUID.randomUUID().toString().replace("-", "") + "@" + parentPlatform.getServerIP()); + subscribeInfo.setSimulatedFromTag(UUID.randomUUID().toString().replace("-", "")); + subscribeInfo.setSimulatedToTag(UUID.randomUUID().toString().replace("-", "")); + subscribeHolder.putCatalogSubscribe(parentPlatform.getServerGBId(), subscribeInfo); } private void registerTask(ParentPlatform parentPlatform, SipTransactionInfo sipTransactionInfo){ diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java index dcaab9e..bc34162 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java @@ -440,7 +440,7 @@ } } - if (streamPushItemListFroPlatform.size() > 0) { + if (!streamPushItemListFroPlatform.isEmpty()) { platformGbStreamMapper.batchAdd(streamPushItemListFroPlatform); // 鍙戦�侀�氱煡 for (String platformId : platformForEvent.keySet()) { diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java index 10958a8..9dc0503 100755 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java @@ -16,10 +16,10 @@ public interface ParentPlatformMapper { @Insert("INSERT INTO wvp_platform (enable, name, server_gb_id, server_gb_domain, server_ip, server_port,device_gb_id,device_ip,"+ - "device_port,username,password,expires,keep_timeout,transport,character_set,ptz,rtcp,as_message_channel,"+ + "device_port,username,password,expires,keep_timeout,transport,character_set,ptz,rtcp,as_message_channel,auto_push_channel,"+ "status,start_offline_push,catalog_id,administrative_division,catalog_group,create_time,update_time) " + " VALUES (#{enable}, #{name}, #{serverGBId}, #{serverGBDomain}, #{serverIP}, #{serverPort}, #{deviceGBId}, #{deviceIp}, " + - " #{devicePort}, #{username}, #{password}, #{expires}, #{keepTimeout}, #{transport}, #{characterSet}, #{ptz}, #{rtcp}, #{asMessageChannel}, " + + " #{devicePort}, #{username}, #{password}, #{expires}, #{keepTimeout}, #{transport}, #{characterSet}, #{ptz}, #{rtcp}, #{asMessageChannel}, #{autoPushChannel}, " + " #{status}, #{startOfflinePush}, #{catalogId}, #{administrativeDivision}, #{catalogGroup}, #{createTime}, #{updateTime})") int addParentPlatform(ParentPlatform parentPlatform); @@ -42,6 +42,7 @@ "ptz=#{ptz}, " + "rtcp=#{rtcp}, " + "as_message_channel=#{asMessageChannel}, " + + "auto_push_channel=#{autoPushChannel}, " + "status=#{status}, " + "start_offline_push=#{startOfflinePush}, " + "catalog_group=#{catalogGroup}, " + diff --git a/web_src/src/components/dialog/platformEdit.vue b/web_src/src/components/dialog/platformEdit.vue index 0158cf7..f3f4255 100755 --- a/web_src/src/components/dialog/platformEdit.vue +++ b/web_src/src/components/dialog/platformEdit.vue @@ -91,9 +91,10 @@ <el-form-item label="鍏朵粬閫夐」"> <el-checkbox label="鍚敤" v-model="platform.enable" @change="checkExpires"></el-checkbox> <!-- <el-checkbox label="浜戝彴鎺у埗" v-model="platform.ptz"></el-checkbox>--> - <el-checkbox label="鎷夎捣绂荤嚎鎺ㄦ祦" v-model="platform.startOfflinePush"></el-checkbox> + <el-checkbox label="鎷夎捣鎺ㄦ祦" v-model="platform.startOfflinePush"></el-checkbox> <el-checkbox label="RTCP淇濇椿" v-model="platform.rtcp" @change="rtcpCheckBoxChange"></el-checkbox> - <el-checkbox label="浣滀负娑堟伅閫氶亾" v-model="platform.asMessageChannel" ></el-checkbox> + <el-checkbox label="娑堟伅閫氶亾" v-model="platform.asMessageChannel" ></el-checkbox> + <el-checkbox label="鎺ㄩ�侀�氶亾" v-model="platform.autoPushChannel" ></el-checkbox> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit">{{ @@ -141,6 +142,7 @@ ptz: true, rtcp: false, asMessageChannel: false, + autoPushChannel: false, name: null, serverGBId: null, serverGBDomain: null, @@ -208,6 +210,7 @@ this.platform.ptz = platform.ptz; this.platform.rtcp = platform.rtcp; this.platform.asMessageChannel = platform.asMessageChannel; + this.platform.autoPushChannel = platform.autoPushChannel; this.platform.name = platform.name; this.platform.serverGBId = platform.serverGBId; this.platform.serverGBDomain = platform.serverGBDomain; @@ -284,6 +287,7 @@ ptz: true, rtcp: false, asMessageChannel: false, + autoPushChannel: false, name: null, serverGBId: null, administrativeDivision: null, -- Gitblit v1.8.0