From f10b458fc919fbcadc4936bf3a7886088e20ac71 Mon Sep 17 00:00:00 2001 From: 648540858 <456panlinlin> Date: 星期五, 08 四月 2022 14:44:49 +0800 Subject: [PATCH] 优化订阅信息的发送与取消订阅 --- src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java | 75 ++++++++++++ src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java | 12 - src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 29 +++- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java | 11 + src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java | 14 + src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java | 8 src/main/java/com/genersoft/iot/vmp/gb28181/task/ISubscribeTask.java | 5 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java | 2 /dev/null | 38 ------ web_src/src/components/dialog/deviceEdit.vue | 11 + src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java | 77 ++++++++++++ src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java | 16 ++ src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java | 14 + src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java | 6 15 files changed, 242 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java index bbe0e81..0c57bde 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.conf; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; @@ -21,6 +22,7 @@ private ThreadPoolTaskScheduler threadPoolTaskScheduler; private Map<String, ScheduledFuture<?>> futureMap = new ConcurrentHashMap<>(); + private Map<String, Runnable> runnableMap = new ConcurrentHashMap<>(); @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler() { @@ -34,12 +36,12 @@ * @param cycleForCatalog 闂撮殧 * @return */ - public String startCron(String key, Runnable task, int cycleForCatalog) { + public void startCron(String key, Runnable task, int cycleForCatalog) { stop(key); // scheduleWithFixedDelay 蹇呴』绛夊緟涓婁竴涓换鍔$粨鏉熸墠寮�濮嬭鏃秔eriod锛� cycleForCatalog琛ㄧず鎵ц鐨勯棿闅� ScheduledFuture future = threadPoolTaskScheduler.scheduleWithFixedDelay(task, cycleForCatalog * 1000L); futureMap.put(key, future); - return "startCron"; + runnableMap.put(key, task); } /** @@ -49,18 +51,22 @@ * @param delay 寤舵椂 /姣 * @return */ - public String startDelay(String key, Runnable task, int delay) { + public void startDelay(String key, Runnable task, int delay) { stop(key); Date starTime = new Date(System.currentTimeMillis() + delay); // scheduleWithFixedDelay 蹇呴』绛夊緟涓婁竴涓换鍔$粨鏉熸墠寮�濮嬭鏃秔eriod锛� cycleForCatalog琛ㄧず鎵ц鐨勯棿闅� ScheduledFuture future = threadPoolTaskScheduler.schedule(task, starTime); futureMap.put(key, future); - return "startCron"; } public void stop(String key) { if (futureMap.get(key) != null && !futureMap.get(key).isCancelled()) { futureMap.get(key).cancel(true); + Runnable runnable = runnableMap.get(key); + if (runnable instanceof ISubscribeTask) { + ISubscribeTask subscribeTask = (ISubscribeTask) runnable; + subscribeTask.stop(); + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java b/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java index 2c2ea6d..4a89796 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java @@ -14,7 +14,7 @@ /** - * 绯荤粺鍚姩鏃舵帶鍒惰澶囩绾� + * 绯荤粺鍚姩鏃舵帶鍒惰澶� */ @Component @Order(value=4) @@ -41,10 +41,14 @@ for (String deviceId : onlineForAll) { storager.online(deviceId); Device device = redisCatchStorage.getDevice(deviceId); - if (device != null && device.getSubscribeCycleForCatalog() > 0) { - // 鏌ヨ鍦ㄧ嚎璁惧閭d簺寮�鍚簡璁㈤槄锛屼负璁惧寮�鍚畾鏃剁殑鐩綍璁㈤槄 - deviceService.addCatalogSubscribe(device); - deviceService.addMobilePositionSubscribe(device); + if (device != null ) { + if (device.getSubscribeCycleForCatalog() > 0) { + // 鏌ヨ鍦ㄧ嚎璁惧閭d簺寮�鍚簡璁㈤槄锛屼负璁惧寮�鍚畾鏃剁殑鐩綍璁㈤槄 + deviceService.addCatalogSubscribe(device); + } + if (device.getSubscribeCycleForMobilePosition() > 0) { + deviceService.addMobilePositionSubscribe(device); + } } } // 閲嶇疆cseq璁℃暟 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/ISubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/ISubscribeTask.java new file mode 100644 index 0000000..4c6a18a --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/ISubscribeTask.java @@ -0,0 +1,5 @@ +package com.genersoft.iot.vmp.gb28181.task; + +public interface ISubscribeTask extends Runnable{ + void stop(); +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java new file mode 100644 index 0000000..51356d5 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java @@ -0,0 +1,75 @@ +package com.genersoft.iot.vmp.gb28181.task.impl; + +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sip.Dialog; +import javax.sip.DialogState; +import javax.sip.ResponseEvent; + +/** + * 鐩綍璁㈤槄浠诲姟 + */ +public class CatalogSubscribeTask implements ISubscribeTask { + private final Logger logger = LoggerFactory.getLogger(CatalogSubscribeTask.class); + private Device device; + private final ISIPCommander sipCommander; + private Dialog dialog; + + public CatalogSubscribeTask(Device device, ISIPCommander sipCommander) { + this.device = device; + this.sipCommander = sipCommander; + } + + @Override + public void run() { + sipCommander.catalogSubscribe(device, dialog, eventResult -> { + if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) { + dialog = eventResult.dialog; + } + ResponseEvent event = (ResponseEvent) eventResult.event; + if (event.getResponse().getRawContent() != null) { + // 鎴愬姛 + logger.info("[鐩綍璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + }else { + // 鎴愬姛 + logger.info("[鐩綍璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + } + },eventResult -> { + dialog = null; + // 澶辫触 + logger.warn("[鐩綍璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); + }); + } + + @Override + public void stop() { + /** + * dialog 鐨勫悇涓姸鎬� + * EARLY-> Early state鐘舵��-鍒濆璇锋眰鍙戦�佷互鍚庯紝鏀跺埌浜嗕竴涓复鏃跺搷搴旀秷鎭� + * CONFIRMED-> Confirmed Dialog鐘舵��-宸茬‘璁� + * COMPLETED-> Completed Dialog鐘舵��-宸插畬鎴� + * TERMINATED-> Terminated Dialog鐘舵��-缁堟 + */ + logger.info("鍙栨秷鐩綍璁㈤槄鏃禿ialog鐘舵�佷负{}", DialogState.CONFIRMED); + if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) { + device.setSubscribeCycleForCatalog(0); + sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { + ResponseEvent event = (ResponseEvent) eventResult.event; + if (event.getResponse().getRawContent() != null) { + // 鎴愬姛 + logger.info("[鍙栨秷鐩綍璁㈤槄璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + }else { + // 鎴愬姛 + logger.info("[鍙栨秷鐩綍璁㈤槄璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + } + },eventResult -> { + // 澶辫触 + logger.warn("[鍙栨秷鐩綍璁㈤槄璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); + }); + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/GPSSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java similarity index 83% rename from src/main/java/com/genersoft/iot/vmp/gb28181/task/GPSSubscribeTask.java rename to src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java index a2716e3..fcac3e9 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/task/GPSSubscribeTask.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeHandlerTask.java @@ -1,10 +1,10 @@ -package com.genersoft.iot.vmp.gb28181.task; +package com.genersoft.iot.vmp.gb28181.task.impl; -import com.alibaba.fastjson.JSON; import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -13,7 +13,10 @@ import java.text.SimpleDateFormat; import java.util.List; -public class GPSSubscribeTask implements Runnable{ +/** + * 鍚戝凡缁忚闃�(绉诲姩浣嶇疆)鐨勪笂绾у彂閫丮obilePosition娑堟伅 + */ +public class MobilePositionSubscribeHandlerTask implements ISubscribeTask { private IRedisCatchStorage redisCatchStorage; private IVideoManagerStorage storager; @@ -25,7 +28,7 @@ private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - public GPSSubscribeTask(IRedisCatchStorage redisCatchStorage, ISIPCommanderForPlatform sipCommanderForPlatform, IVideoManagerStorage storager, String platformId, String sn, String key, SubscribeHolder subscribeInfo) { + public MobilePositionSubscribeHandlerTask(IRedisCatchStorage redisCatchStorage, ISIPCommanderForPlatform sipCommanderForPlatform, IVideoManagerStorage storager, String platformId, String sn, String key, SubscribeHolder subscribeInfo) { this.redisCatchStorage = redisCatchStorage; this.storager = storager; this.platformId = platformId; @@ -66,4 +69,9 @@ } } } + + @Override + public void stop() { + + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java new file mode 100644 index 0000000..f67f6d2 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java @@ -0,0 +1,77 @@ +package com.genersoft.iot.vmp.gb28181.task.impl; + +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import org.dom4j.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sip.Dialog; +import javax.sip.DialogState; +import javax.sip.ResponseEvent; + +/** + * 绉诲姩浣嶇疆璁㈤槄鐨勫畾鏃舵洿鏂� + */ +public class MobilePositionSubscribeTask implements ISubscribeTask { + private final Logger logger = LoggerFactory.getLogger(MobilePositionSubscribeTask.class); + private Device device; + private ISIPCommander sipCommander; + private Dialog dialog; + + public MobilePositionSubscribeTask(Device device, ISIPCommander sipCommander) { + this.device = device; + this.sipCommander = sipCommander; + } + + @Override + public void run() { + sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { + if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) { + dialog = eventResult.dialog; + } + ResponseEvent event = (ResponseEvent) eventResult.event; + if (event.getResponse().getRawContent() != null) { + // 鎴愬姛 + logger.info("[绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + }else { + // 鎴愬姛 + logger.info("[绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + } + },eventResult -> { + dialog = null; + // 澶辫触 + logger.warn("[绉诲姩浣嶇疆璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); + }); + + } + + @Override + public void stop() { + /** + * dialog 鐨勫悇涓姸鎬� + * EARLY-> Early state鐘舵��-鍒濆璇锋眰鍙戦�佷互鍚庯紝鏀跺埌浜嗕竴涓复鏃跺搷搴旀秷鎭� + * CONFIRMED-> Confirmed Dialog鐘舵��-宸茬‘璁� + * COMPLETED-> Completed Dialog鐘舵��-宸插畬鎴� + * TERMINATED-> Terminated Dialog鐘舵��-缁堟 + */ + logger.info("鍙栨秷绉诲姩璁㈤槄鏃禿ialog鐘舵�佷负{}", dialog.getState()); + if (dialog != null && dialog.getState().equals(DialogState.CONFIRMED)) { + device.setSubscribeCycleForMobilePosition(0); + sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { + ResponseEvent event = (ResponseEvent) eventResult.event; + if (event.getResponse().getRawContent() != null) { + // 鎴愬姛 + logger.info("[鍙栨秷绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + }else { + // 鎴愬姛 + logger.info("[鍙栨秷绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + } + },eventResult -> { + // 澶辫触 + logger.warn("[鍙栨秷绉诲姩浣嶇疆璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); + }); + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java index 6b8a6ae..1de03bd 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java @@ -8,6 +8,8 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.bean.SSRCInfo; +import javax.sip.Dialog; + /** * @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔� * @author: swwheihei @@ -304,7 +306,7 @@ * @param device 瑙嗛璁惧 * @return true = 鍛戒护鍙戦�佹垚鍔� */ - boolean mobilePositionSubscribe(Device device, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent); + boolean mobilePositionSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent , SipSubscribe.Event errorEvent); /** * 璁㈤槄銆佸彇娑堣闃呮姤璀︿俊鎭� @@ -324,7 +326,7 @@ * @param device 瑙嗛璁惧 * @return true = 鍛戒护鍙戦�佹垚鍔� */ - boolean catalogSubscribe(Device device, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent); + boolean catalogSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent); /** * 鎷夋鎺у埗鍛戒护 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 4baa349..123d0e7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -36,6 +36,8 @@ import javax.sip.*; import javax.sip.address.SipURI; import javax.sip.header.CallIdHeader; +import javax.sip.header.ContentTypeHeader; +import javax.sip.header.ExpiresHeader; import javax.sip.header.ViaHeader; import javax.sip.message.Request; import java.lang.reflect.Field; @@ -55,6 +57,9 @@ @Autowired private SipConfig sipConfig; + + @Autowired + private SipFactory sipFactory; @Autowired @Qualifier(value="tcpSipProvider") @@ -1453,7 +1458,7 @@ * @param device 瑙嗛璁惧 * @return true = 鍛戒护鍙戦�佹垚鍔� */ - public boolean mobilePositionSubscribe(Device device, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) { + public boolean mobilePositionSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) { try { StringBuffer subscribePostitionXml = new StringBuffer(200); String charset = device.getCharset(); @@ -1467,12 +1472,20 @@ } subscribePostitionXml.append("</Query>\r\n"); - String tm = Long.toString(System.currentTimeMillis()); - - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - - Request request = headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), "z9hG4bK-viaPos-" + tm, "fromTagPos" + tm, null, device.getSubscribeCycleForMobilePosition(), "presence" ,callIdHeader); //Position;id=" + tm.substring(tm.length() - 4)); + Request request; + if (dialog != null) { + logger.info("鍙戦�佺Щ鍔ㄤ綅缃闃呮秷鎭椂 dialog鐨勭姸鎬佷负锛� {}", dialog.getState()); + request = dialog.createRequest(Request.SUBSCRIBE); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); + request.setContent(subscribePostitionXml.toString(), contentTypeHeader); + ExpiresHeader expireHeader = sipFactory.createHeaderFactory().createExpiresHeader(device.getSubscribeCycleForMobilePosition()); + request.addHeader(expireHeader); + }else { + String tm = Long.toString(System.currentTimeMillis()); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + request = headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), "z9hG4bK-viaPos-" + tm, "fromTagPos" + tm, null, device.getSubscribeCycleForMobilePosition(), "presence" ,callIdHeader); //Position;id=" + tm.substring(tm.length() - 4)); + } transmitRequest(device, request, errorEvent, okEvent); return true; @@ -1542,7 +1555,7 @@ } @Override - public boolean catalogSubscribe(Device device, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { + public boolean catalogSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { try { StringBuffer cmdXml = new StringBuffer(200); String charset = device.getCharset(); 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 e8554f7..1336705 100644 --- 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 @@ -7,7 +7,7 @@ import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; -import com.genersoft.iot.vmp.gb28181.task.GPSSubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeHandlerTask; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; @@ -147,7 +147,7 @@ } String sn = XmlUtil.getText(rootElement, "SN"); String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetting.getServerId() + "_MobilePosition_" + platformId; - logger.info("鎺ユ敹鍒皗}鐨凪obilePosition璁㈤槄", platformId); + logger.info("[notify-MobilePosition]: {}", platformId); StringBuilder resultXml = new StringBuilder(200); resultXml.append("<?xml version=\"1.0\" ?>\r\n") .append("<Response>\r\n") @@ -162,7 +162,7 @@ dynamicTask.stop(key); } String interval = XmlUtil.getText(rootElement, "Interval"); // GPS涓婃姤鏃堕棿闂撮殧 - dynamicTask.startCron(key, new GPSSubscribeTask(redisCatchStorage, sipCommanderForPlatform, storager, platformId, sn, key, subscribeHolder), Integer.parseInt(interval)); + dynamicTask.startCron(key, new MobilePositionSubscribeHandlerTask(redisCatchStorage, sipCommanderForPlatform, storager, platformId, sn, key, subscribeHolder), Integer.parseInt(interval) -1 ); subscribeHolder.putMobilePositionSubscribe(platformId, subscribeInfo); }else if (subscribeInfo.getExpires() == 0) { dynamicTask.stop(key); @@ -200,7 +200,7 @@ } String sn = XmlUtil.getText(rootElement, "SN"); String key = VideoManagerConstants.SIP_SUBSCRIBE_PREFIX + userSetting.getServerId() + "_Catalog_" + platformId; - logger.info("鎺ユ敹鍒皗}鐨凜atalog璁㈤槄", platformId); + logger.info("[notify-Catalog]: {}", platformId); StringBuilder resultXml = new StringBuilder(200); resultXml.append("<?xml version=\"1.0\" ?>\r\n") .append("<Response>\r\n") diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java index 1b5081b..c81aabb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java @@ -81,7 +81,7 @@ } requestURI.setPort(event.getRemotePort()); reqAck.setRequestURI(requestURI); - logger.info("鍚� " + event.getRemoteIpAddress() + ":" + event.getRemotePort() + "鍥炲ack"); + logger.info("[鍥炲ack] {}-> {}:{} ",requestURI, event.getRemoteIpAddress(), event.getRemotePort()); dialog.sendAck(reqAck); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java index 57afd93..de9f176 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java @@ -82,9 +82,14 @@ } public int createRTPServer(MediaServerItem mediaServerItem, String streamId) { - - Map<String, Object> param = new HashMap<>(); int result = -1; + // 鏌ヨ姝tp server 鏄惁宸茬粡瀛樺湪 + JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId); + if (rtpInfo.getInteger("code ") == 0 && rtpInfo.getBoolean("exist")) { + result = rtpInfo.getInteger("local_port"); + return result; + } + Map<String, Object> param = new HashMap<>(); // 鎺ㄦ祦绔彛璁剧疆0鍒欎娇鐢ㄩ殢鏈虹鍙� param.put("enable_tcp", 1); param.put("stream_id", streamId); @@ -301,7 +306,7 @@ result= true; logger.info("鍋滄RTP鎺ㄦ祦鎴愬姛"); } else { - logger.error("RTP鎺ㄦ祦澶辫触: {}, 鍙傛暟锛歿}",jsonObject.getString("msg"),JSONObject.toJSON(param)); + logger.error("鍋滄RTP鎺ㄦ祦澶辫触: {}, 鍙傛暟锛歿}",jsonObject.getString("msg"),JSONObject.toJSON(param)); } return result; } diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java deleted file mode 100644 index 68419bf..0000000 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/CatalogSubscribeTask.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.service.bean; - -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; -import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.sip.ResponseEvent; - -/** - * 鐩綍璁㈤槄浠诲姟 - */ -public class CatalogSubscribeTask implements Runnable{ - private final Logger logger = LoggerFactory.getLogger(CatalogSubscribeTask.class); - private Device device; - private ISIPCommander sipCommander; - - public CatalogSubscribeTask(Device device, ISIPCommander sipCommander) { - this.device = device; - this.sipCommander = sipCommander; - } - - @Override - public void run() { - sipCommander.catalogSubscribe(device, eventResult -> { - ResponseEvent event = (ResponseEvent) eventResult.event; - if (event.getResponse().getRawContent() != null) { - // 鎴愬姛 - logger.info("[鐩綍璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); - }else { - // 鎴愬姛 - logger.info("[鐩綍璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); - } - },eventResult -> { - // 澶辫触 - logger.warn("[鐩綍璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); - }); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/MobilePositionSubscribeTask.java b/src/main/java/com/genersoft/iot/vmp/service/bean/MobilePositionSubscribeTask.java deleted file mode 100644 index df4bc6c..0000000 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/MobilePositionSubscribeTask.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.genersoft.iot.vmp.service.bean; - -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; -import org.dom4j.Element; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.sip.ResponseEvent; - -public class MobilePositionSubscribeTask implements Runnable{ - private final Logger logger = LoggerFactory.getLogger(MobilePositionSubscribeTask.class); - private Device device; - private ISIPCommander sipCommander; - - public MobilePositionSubscribeTask(Device device, ISIPCommander sipCommander) { - this.device = device; - this.sipCommander = sipCommander; - } - - @Override - public void run() { - sipCommander.mobilePositionSubscribe(device, eventResult -> { - ResponseEvent event = (ResponseEvent) eventResult.event; - Element rootElement = null; - if (event.getResponse().getRawContent() != null) { - // 鎴愬姛 - logger.info("[绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); - }else { - // 鎴愬姛 - logger.info("[绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); - } - },eventResult -> { - // 澶辫触 - logger.warn("[绉诲姩浣嶇疆璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); - }); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java index 384bf7f..e9f7968 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java @@ -4,8 +4,8 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; -import com.genersoft.iot.vmp.service.bean.CatalogSubscribeTask; -import com.genersoft.iot.vmp.service.bean.MobilePositionSubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; +import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +42,7 @@ int subscribeCycleForCatalog = device.getSubscribeCycleForCatalog(); // 璁剧疆鏈�灏忓�间负30 subscribeCycleForCatalog = Math.max(subscribeCycleForCatalog, 30); - dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, subscribeCycleForCatalog - 5); + dynamicTask.startCron(device.getDeviceId() + "catalog", catalogSubscribeTask, subscribeCycleForCatalog); return true; } @@ -53,8 +53,6 @@ } logger.info("绉婚櫎鐩綍璁㈤槄: {}", device.getDeviceId()); dynamicTask.stop(device.getDeviceId() + "catalog"); - device.setSubscribeCycleForCatalog(0); - sipCommander.catalogSubscribe(device, null, null); return true; } @@ -75,7 +73,7 @@ int subscribeCycleForCatalog = device.getSubscribeCycleForCatalog(); // 璁剧疆鏈�灏忓�间负30 subscribeCycleForCatalog = Math.max(subscribeCycleForCatalog, 30); - dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, subscribeCycleForCatalog - 5); + dynamicTask.startCron(device.getDeviceId() + "mobile_position" , mobilePositionSubscribeTask, subscribeCycleForCatalog -1 ); return true; } @@ -86,8 +84,6 @@ } logger.info("绉婚櫎绉诲姩浣嶇疆璁㈤槄: {}", device.getDeviceId()); dynamicTask.stop(device.getDeviceId() + "mobile_position"); - device.setSubscribeCycleForCatalog(0); - sipCommander.mobilePositionSubscribe(device, null, null); return true; } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java index 365903c..c360843 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; +import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.github.pagehelper.util.StringUtil; @@ -47,6 +48,9 @@ @Autowired private DeferredResultHolder resultHolder; + + @Autowired + private IDeviceService deviceService; /** * 鏌ヨ鍘嗗彶杞ㄨ抗 @@ -163,7 +167,7 @@ device.setMobilePositionSubmissionInterval(Integer.parseInt(interval)); storager.updateDevice(device); String result = msg; - if (cmder.mobilePositionSubscribe(device, null, null)) { + if (deviceService.removeMobilePositionSubscribe(device)) { result += "锛屾垚鍔�"; } else { result += "锛屽け璐�"; diff --git a/web_src/src/components/dialog/deviceEdit.vue b/web_src/src/components/dialog/deviceEdit.vue index 1150d21..1b1aba0 100644 --- a/web_src/src/components/dialog/deviceEdit.vue +++ b/web_src/src/components/dialog/deviceEdit.vue @@ -10,7 +10,7 @@ @close="close()" > <div id="shared" style="margin-top: 1rem;margin-right: 100px;"> - <el-form ref="form" :rules="rules" :model="form" label-width="240px" > + <el-form ref="form" :rules="rules" :model="form" label-width="200px" > <el-form-item label="璁惧缂栧彿" > <el-input v-model="form.deviceId" disabled></el-input> </el-form-item> @@ -36,13 +36,13 @@ <el-option key="UTF-8" label="UTF-8" value="utf-8"></el-option> </el-select> </el-form-item> - <el-form-item label="鐩綍璁㈤槄鍛ㄦ湡(0涓哄仠鐢ㄨ闃�)" prop="subscribeCycleForCatalog" > + <el-form-item label="鐩綍璁㈤槄" title="0涓哄彇娑堣闃�" prop="subscribeCycleForCatalog" > <el-input v-model="form.subscribeCycleForCatalog" clearable ></el-input> </el-form-item> - <el-form-item label="绉诲姩浣嶇疆璁㈤槄鍛ㄦ湡(0涓哄仠鐢ㄨ闃�)" prop="subscribeCycleForCatalog" > + <el-form-item label="绉诲姩浣嶇疆璁㈤槄" title="0涓哄彇娑堣闃�" prop="subscribeCycleForCatalog" > <el-input v-model="form.subscribeCycleForMobilePosition" clearable ></el-input> </el-form-item> - <el-form-item label="绉诲姩浣嶇疆鎶ラ�侀棿闅�" prop="subscribeCycleForCatalog" > + <el-form-item v-if="form.subscribeCycleForMobilePosition > 0" label="绉诲姩浣嶇疆鎶ラ�侀棿闅�" prop="subscribeCycleForCatalog" > <el-input v-model="form.mobilePositionSubmissionInterval" clearable ></el-input> </el-form-item> <el-form-item> @@ -98,6 +98,9 @@ onSubmit: function () { console.log("onSubmit"); console.log(this.form); + this.form.subscribeCycleForCatalog = this.form.subscribeCycleForCatalog||0 + this.form.subscribeCycleForMobilePosition = this.form.subscribeCycleForMobilePosition||0 + this.form.mobilePositionSubmissionInterval = this.form.mobilePositionSubmissionInterval||0 this.$axios({ method: 'post', url:`/api/device/query/device/update/`, -- Gitblit v1.8.0