From b79a49fa76116fbc2be1de7465d933209b0c99ee Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 23 九月 2022 22:45:23 +0800 Subject: [PATCH] dialog去除以及异常情况处理优化 --- src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/CatalogSubscribeTask.java | 72 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java | 47 src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java | 20 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java | 43 src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java | 21 src/main/java/com/genersoft/iot/vmp/gb28181/bean/CmdSendFailEvent.java | 27 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java | 99 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java | 57 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java | 36 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java | 102 src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java | 71 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java | 11 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java | 35 src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java | 31 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/PresetQueryResponseMessageHandler.java | 45 src/main/java/com/genersoft/iot/vmp/gb28181/event/device/RequestTimeoutEventImpl.java | 1 src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java | 118 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 364 ++- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java | 143 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java | 14 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java | 22 src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceNotFoundEvent.java | 10 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java | 4 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java | 14 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java | 6 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java | 56 src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java | 58 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java | 38 src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java | 43 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java | 23 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java | 66 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java | 40 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java | 5 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 2919 +++++++++++++---------------- src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java | 23 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java | 17 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java | 110 src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java | 7 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java | 9 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java | 29 src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java | 43 src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java | 13 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java | 13 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java | 148 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java | 14 src/main/java/com/genersoft/iot/vmp/conf/exception/SsrcTransactionNotFoundException.java | 51 src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java | 4 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 49 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java | 616 ++--- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java | 46 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java | 46 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java | 23 53 files changed, 2,991 insertions(+), 2,937 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java index 03498fd..35ff08e 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java @@ -2,6 +2,9 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.utils.DateUtil; +import com.genersoft.iot.vmp.vmanager.gb28181.device.DeviceQuery; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.util.ObjectUtils; @@ -14,6 +17,8 @@ @Configuration("mediaConfig") public class MediaConfig{ + + private final static Logger logger = LoggerFactory.getLogger(MediaConfig.class); // 淇敼蹇呴』閰嶇疆锛屼笉鍐嶆敮鎸佽嚜鍔ㄨ幏鍙� @Value("${media.id}") @@ -174,7 +179,7 @@ try { hostAddress = InetAddress.getByName(sdpIp).getHostAddress(); } catch (UnknownHostException e) { - throw new RuntimeException(e); + logger.error("[鑾峰彇SDP IP]: 鍩熷悕瑙f瀽澶辫触"); } return hostAddress; } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/exception/SsrcTransactionNotFoundException.java b/src/main/java/com/genersoft/iot/vmp/conf/exception/SsrcTransactionNotFoundException.java new file mode 100644 index 0000000..4038cd1 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/conf/exception/SsrcTransactionNotFoundException.java @@ -0,0 +1,51 @@ +package com.genersoft.iot.vmp.conf.exception; + +import com.sun.javafx.binding.StringFormatter; + +/** + * @author lin + */ +public class SsrcTransactionNotFoundException extends Exception{ + private String deviceId; + private String channelId; + private String callId; + private String stream; + + + + public SsrcTransactionNotFoundException(String deviceId, String channelId, String callId, String stream) { + this.deviceId = deviceId; + this.channelId = channelId; + this.callId = callId; + this.stream = stream; + } + + public String getDeviceId() { + return deviceId; + } + + public String getChannelId() { + return channelId; + } + + public String getCallId() { + return callId; + } + + public String getStream() { + return stream; + } + + @Override + public String getMessage() { + StringBuffer msg = new StringBuffer(); + msg.append(StringFormatter.format("缂撳瓨浜嬪姟淇℃伅鏈壘鍒帮紝device锛�%s channel: %s ", deviceId, channelId)); + if (callId != null) { + msg.append("callId: " + callId); + } + if (stream != null) { + msg.append("stream: " + stream); + } + return msg.toString(); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java index cd8b5d7..6cd1924 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java @@ -41,7 +41,7 @@ @Bean("sipStack") @DependsOn({"sipFactory"}) - SipStack createSipStack() throws PeerUnavailableException { + SipStackImpl createSipStack() throws PeerUnavailableException { sipStack = ( SipStackImpl )sipFactory.createSipStack(DefaultProperties.getProperties(sipConfig.getMonitorIp(), false)); return sipStack; } @@ -56,7 +56,6 @@ tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint); tcpSipProvider.setDialogErrorsAutomaticallyHandled(); tcpSipProvider.addSipListener(sipProcessorObserver); -// tcpSipProvider.setAutomaticDialogSupportEnabled(false); logger.info("[Sip Server] TCP 鍚姩鎴愬姛 {}:{}", sipConfig.getMonitorIp(), sipConfig.getPort()); } catch (TransportNotSupportedException e) { e.printStackTrace(); @@ -80,7 +79,6 @@ udpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "UDP"); udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint); udpSipProvider.addSipListener(sipProcessorObserver); -// udpSipProvider.setAutomaticDialogSupportEnabled(false); } catch (TransportNotSupportedException e) { e.printStackTrace(); } catch (InvalidArgumentException e) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CmdSendFailEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CmdSendFailEvent.java new file mode 100644 index 0000000..0cd4086 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CmdSendFailEvent.java @@ -0,0 +1,27 @@ +package com.genersoft.iot.vmp.gb28181.bean; + +import javax.sip.Dialog; +import java.util.EventObject; + +public class CmdSendFailEvent extends EventObject { + + private String callId; + + /** + * Constructs a prototypical Event. + * + * @param dialog + * @throws IllegalArgumentException if source is null. + */ + public CmdSendFailEvent(Dialog dialog) { + super(dialog); + } + + public String getCallId() { + return callId; + } + + public void setCallId(String callId) { + this.callId = callId; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceNotFoundEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceNotFoundEvent.java index 4e55011..c782c3c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceNotFoundEvent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceNotFoundEvent.java @@ -4,6 +4,9 @@ import java.util.EventObject; public class DeviceNotFoundEvent extends EventObject { + + private String callId; + /** * Constructs a prototypical Event. * @@ -14,8 +17,11 @@ super(dialog); } + public String getCallId() { + return callId; + } - public Dialog getDialog() { - return (Dialog)super.getSource(); + public void setCallId(String callId) { + this.callId = callId; } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java index c68be12..c04a695 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.gb28181.bean; import gov.nist.javax.sip.message.SIPRequest; +import gov.nist.javax.sip.message.SIPResponse; public class SipTransactionInfo { @@ -9,11 +10,11 @@ private String toTag; private String viaBranch; - public SipTransactionInfo(SIPRequest request) { - this.callId = request.getCallIdHeader().getCallId(); - this.fromTag = request.getFromTag(); - this.toTag = request.getToTag(); - this.viaBranch = request.getTopmostViaHeader().getBranch(); + public SipTransactionInfo(SIPResponse response) { + this.callId = response.getCallIdHeader().getCallId(); + this.fromTag = response.getFromTag(); + this.toTag = response.getToTag(); + this.viaBranch = response.getTopmostViaHeader().getBranch(); } public SipTransactionInfo() { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java index 87d2635..d27ce26 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java @@ -8,10 +8,11 @@ private String channelId; private String callId; private String stream; - private byte[] transaction; - private byte[] dialog; private String mediaServerId; private String ssrc; + + private SipTransactionInfo sipTransactionInfo; + private VideoStreamSessionManager.SessionType type; public String getDeviceId() { @@ -46,22 +47,6 @@ this.stream = stream; } - public byte[] getTransaction() { - return transaction; - } - - public void setTransaction(byte[] transaction) { - this.transaction = transaction; - } - - public byte[] getDialog() { - return dialog; - } - - public void setDialog(byte[] dialog) { - this.dialog = dialog; - } - public String getMediaServerId() { return mediaServerId; } @@ -85,4 +70,12 @@ public void setType(VideoStreamSessionManager.SessionType type) { this.type = type; } + + public SipTransactionInfo getSipTransactionInfo() { + return sipTransactionInfo; + } + + public void setSipTransactionInfo(SipTransactionInfo sipTransactionInfo) { + this.sipTransactionInfo = sipTransactionInfo; + } } 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 2c80c62..e971c7a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java @@ -1,15 +1,10 @@ package com.genersoft.iot.vmp.gb28181.bean; -import com.genersoft.iot.vmp.utils.SerializeUtils; import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.message.SIPResponse; -import javax.sip.ClientTransaction; -import javax.sip.Dialog; -import javax.sip.RequestEvent; import javax.sip.ServerTransaction; import javax.sip.header.*; -import javax.sip.message.Request; public class SubscribeInfo { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java index 69529b0..e5b995e 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java @@ -10,6 +10,7 @@ import javax.sip.*; import javax.sip.header.CallIdHeader; import javax.sip.message.Response; +import java.text.ParseException; import java.time.Instant; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -56,8 +57,7 @@ logger.debug("errorSubscribes.size:{}",errorSubscribes.size()); } - public interface Event { - void response(EventResult eventResult); + public interface Event { void response(EventResult eventResult) ; } /** @@ -81,18 +81,13 @@ public EventResultType type; public String msg; public String callId; - public Dialog dialog; public EventObject event; - - public EventResult() { - } public EventResult(EventObject event) { this.event = event; if (event instanceof ResponseEvent) { ResponseEvent responseEvent = (ResponseEvent)event; Response response = responseEvent.getResponse(); - this.dialog = responseEvent.getDialog(); this.type = EventResultType.response; if (response != null) { this.msg = response.getReasonPhrase(); @@ -127,12 +122,10 @@ this.statusCode = -1024; this.callId = dialogTerminatedEvent.getDialog().getCallId().getCallId(); }else if (event instanceof DeviceNotFoundEvent) { - DeviceNotFoundEvent deviceNotFoundEvent = (DeviceNotFoundEvent)event; this.type = EventResultType.deviceNotFoundEvent; this.msg = "璁惧鏈壘鍒�"; this.statusCode = -1024; - this.dialog = deviceNotFoundEvent.getDialog(); - this.callId = this.dialog != null ?deviceNotFoundEvent.getDialog().getCallId().getCallId() : null; + this.callId = ((DeviceNotFoundEvent) event).getCallId(); } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/device/RequestTimeoutEventImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/device/RequestTimeoutEventImpl.java index 9382c2f..bffa4cb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/device/RequestTimeoutEventImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/device/RequestTimeoutEventImpl.java @@ -36,6 +36,7 @@ } deviceService.offline(device.getDeviceId()); } + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java index 7cd08a5..be73ebd 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java @@ -18,6 +18,9 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.util.*; /** @@ -96,7 +99,12 @@ } if (deviceChannelList.size() > 0) { logger.info("[Catalog浜嬩欢: {}]骞冲彴锛歿}锛屽奖鍝嶉�氶亾{}涓�", event.getType(), event.getPlatformId(), deviceChannelList.size()); - sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), parentPlatform, deviceChannelList, subscribe, null); + try { + sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), parentPlatform, deviceChannelList, subscribe, null); + } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException | + IllegalAccessException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 Catalog閫氱煡: {}", e.getMessage()); + } } }else if (parentPlatformMap.keySet().size() > 0) { for (String gbId : parentPlatformMap.keySet()) { @@ -112,7 +120,12 @@ DeviceChannel deviceChannel = new DeviceChannel(); deviceChannel.setChannelId(gbId); deviceChannelList.add(deviceChannel); - sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), platform, deviceChannelList, subscribeInfo, null); + try { + sipCommanderFroPlatform.sendNotifyForCatalogOther(event.getType(), platform, deviceChannelList, subscribeInfo, null); + } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException | + IllegalAccessException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 Catalog閫氱煡: {}", e.getMessage()); + } } } } @@ -137,7 +150,12 @@ } if (deviceChannelList.size() > 0) { logger.info("[Catalog浜嬩欢: {}]骞冲彴锛歿}锛屽奖鍝嶉�氶亾{}涓�", event.getType(), event.getPlatformId(), deviceChannelList.size()); - sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), parentPlatform, deviceChannelList, subscribe, null); + try { + sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), parentPlatform, deviceChannelList, subscribe, null); + } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException | + IllegalAccessException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 Catalog閫氱煡: {}", e.getMessage()); + } } }else if (parentPlatformMap.keySet().size() > 0) { for (String gbId : parentPlatformMap.keySet()) { @@ -157,7 +175,12 @@ DeviceChannel deviceChannelByStream = gbStreamService.getDeviceChannelListByStreamWithStatus(gbStream, gbStream.getCatalogId(), platform); deviceChannelList.add(deviceChannelByStream); } - sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), platform, deviceChannelList, subscribeInfo, null); + try { + sipCommanderFroPlatform.sendNotifyForCatalogAddOrUpdate(event.getType(), platform, deviceChannelList, subscribeInfo, null); + } catch (InvalidArgumentException | ParseException | NoSuchFieldException | + SipException | IllegalAccessException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 Catalog閫氱煡: {}", e.getMessage()); + } } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java index b4d254a..6e7b3dc 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java @@ -8,9 +8,13 @@ import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.gb28181.bean.SipMsgInfo; +import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.utils.SerializeUtils; import com.genersoft.iot.vmp.utils.redis.RedisUtil; +import gov.nist.javax.sip.message.SIPRequest; +import gov.nist.javax.sip.message.SIPResponse; import gov.nist.javax.sip.stack.SIPDialog; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -42,15 +46,14 @@ * @param callId 涓�娆¤姹傜殑CallID * @param stream 娴佸悕绉� * @param mediaServerId 鎵�浣跨敤鐨勬祦濯掍綋ID - * @param transaction 浜嬪姟 + * @param response 鍥炲 */ - public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, ClientTransaction transaction, SessionType type){ + public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, SIPResponse response, SessionType type){ SsrcTransaction ssrcTransaction = new SsrcTransaction(); ssrcTransaction.setDeviceId(deviceId); ssrcTransaction.setChannelId(channelId); ssrcTransaction.setStream(stream); - byte[] transactionByteArray = SerializeUtils.serialize(transaction); - ssrcTransaction.setTransaction(transactionByteArray); + ssrcTransaction.setSipTransactionInfo(new SipTransactionInfo(response)); ssrcTransaction.setCallId(callId); ssrcTransaction.setSsrc(ssrc); ssrcTransaction.setMediaServerId(mediaServerId); @@ -60,53 +63,6 @@ + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction); RedisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction); - } - - public void put(String deviceId, String channelId, String callId, Dialog dialog){ - SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callId, null); - if (ssrcTransaction != null) { - byte[] dialogByteArray = SerializeUtils.serialize(dialog); - ssrcTransaction.setDialog(dialogByteArray); - } - RedisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() - + "_" + deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" - + ssrcTransaction.getStream(), ssrcTransaction); - } - - - public ClientTransaction getTransaction(String deviceId, String channelId, String stream, String callId){ - SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callId, stream); - if (ssrcTransaction == null) { - return null; - } - byte[] transactionByteArray = ssrcTransaction.getTransaction(); - ClientTransaction clientTransaction = (ClientTransaction)SerializeUtils.deSerialize(transactionByteArray); - return clientTransaction; - } - - public SIPDialog getDialogByStream(String deviceId, String channelId, String stream){ - SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream); - if (ssrcTransaction == null) { - return null; - } - byte[] dialogByteArray = ssrcTransaction.getDialog(); - if (dialogByteArray == null) { - return null; - } - SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray); - return dialog; - } - - public SIPDialog getDialogByCallId(String deviceId, String channelId, String callId){ - SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callId, null); - if (ssrcTransaction == null) { - return null; - } - byte[] dialogByteArray = ssrcTransaction.getDialog(); - if (dialogByteArray == null) { - return null; - } - return (SIPDialog)SerializeUtils.deSerialize(dialogByteArray); } public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){ 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 index bfa900a..39dff93 100644 --- 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 @@ -10,9 +10,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import javax.sip.Dialog; -import javax.sip.DialogState; -import javax.sip.ResponseEvent; +import javax.sip.*; import javax.sip.header.ToHeader; import java.text.ParseException; import java.util.Timer; @@ -44,23 +42,29 @@ if (dynamicTask.get(taskKey) != null) { dynamicTask.stop(taskKey); } - SIPRequest sipRequest = sipCommander.catalogSubscribe(device, request, eventResult -> { - ResponseEvent event = (ResponseEvent) eventResult.event; - // 鎴愬姛 - logger.info("[鐩綍璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); - ToHeader toHeader = (ToHeader)event.getResponse().getHeader(ToHeader.NAME); - try { - this.request.getToHeader().setTag(toHeader.getTag()); - } catch (ParseException e) { - logger.info("[鐩綍璁㈤槄]鎴愬姛锛� 浣嗕负request璁剧疆ToTag澶辫触"); + SIPRequest sipRequest = null; + try { + sipRequest = sipCommander.catalogSubscribe(device, request, eventResult -> { + ResponseEvent event = (ResponseEvent) eventResult.event; + // 鎴愬姛 + logger.info("[鐩綍璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + ToHeader toHeader = (ToHeader)event.getResponse().getHeader(ToHeader.NAME); + try { + this.request.getToHeader().setTag(toHeader.getTag()); + } catch (ParseException e) { + logger.info("[鐩綍璁㈤槄]鎴愬姛锛� 浣嗕负request璁剧疆ToTag澶辫触"); + this.request = null; + } + },eventResult -> { this.request = null; - } - },eventResult -> { - this.request = null; - // 澶辫触 - logger.warn("[鐩綍璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); - dynamicTask.startDelay(taskKey, CatalogSubscribeTask.this, 2000); - }); + // 澶辫触 + logger.warn("[鐩綍璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); + dynamicTask.startDelay(taskKey, CatalogSubscribeTask.this, 2000); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鐩綍璁㈤槄: {}", e.getMessage()); + + } if (sipRequest != null) { this.request = sipRequest; } @@ -80,18 +84,22 @@ dynamicTask.stop(taskKey); } device.setSubscribeCycleForCatalog(0); - sipCommander.catalogSubscribe(device, request, 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); - }); + try { + sipCommander.catalogSubscribe(device, request, 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); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍙栨秷鐩綍璁㈤槄璁㈤槄: {}", e.getMessage()); + } } } 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 index 5dbdbe6..0abd3ca 100644 --- 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 @@ -11,9 +11,7 @@ import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; -import javax.sip.Dialog; -import javax.sip.DialogState; -import javax.sip.ResponseEvent; +import javax.sip.*; import javax.sip.header.ToHeader; import java.text.ParseException; import java.util.Timer; @@ -43,23 +41,28 @@ if (dynamicTask.get(taskKey) != null) { dynamicTask.stop(taskKey); } - SIPRequest sipRequest = sipCommander.mobilePositionSubscribe(device, request, eventResult -> { - // 鎴愬姛 - logger.info("[绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); - ResponseEvent event = (ResponseEvent) eventResult.event; - ToHeader toHeader = (ToHeader)event.getResponse().getHeader(ToHeader.NAME); - try { - this.request.getToHeader().setTag(toHeader.getTag()); - } catch (ParseException e) { - logger.info("[绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� 涓簉equest璁剧疆ToTag澶辫触"); + SIPRequest sipRequest = null; + try { + sipRequest = sipCommander.mobilePositionSubscribe(device, request, eventResult -> { + // 鎴愬姛 + logger.info("[绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� {}", device.getDeviceId()); + ResponseEvent event = (ResponseEvent) eventResult.event; + ToHeader toHeader = (ToHeader)event.getResponse().getHeader(ToHeader.NAME); + try { + this.request.getToHeader().setTag(toHeader.getTag()); + } catch (ParseException e) { + logger.info("[绉诲姩浣嶇疆璁㈤槄]鎴愬姛锛� 涓簉equest璁剧疆ToTag澶辫触"); + this.request = null; + } + },eventResult -> { this.request = null; - } - },eventResult -> { - this.request = null; - // 澶辫触 - logger.warn("[绉诲姩浣嶇疆璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); - dynamicTask.startDelay(taskKey, MobilePositionSubscribeTask.this, 2000); - }); + // 澶辫触 + logger.warn("[绉诲姩浣嶇疆璁㈤槄]澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 {}-{} ", device.getDeviceId(), eventResult.msg); + dynamicTask.startDelay(taskKey, MobilePositionSubscribeTask.this, 2000); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 绉诲姩浣嶇疆璁㈤槄: {}", e.getMessage()); + } if (sipRequest != null) { this.request = sipRequest; } @@ -79,18 +82,22 @@ dynamicTask.stop(taskKey); } device.setSubscribeCycleForMobilePosition(0); - sipCommander.mobilePositionSubscribe(device, request, 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); - }); + try { + sipCommander.mobilePositionSubscribe(device, request, 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); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍙栨秷绉诲姩浣嶇疆璁㈤槄: {}", e.getMessage()); + } } } 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 c7f6385..2410e6d 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 @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.cmd; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; @@ -9,6 +10,11 @@ import gov.nist.javax.sip.message.SIPRequest; import javax.sip.Dialog; +import javax.sip.InvalidArgumentException; +import javax.sip.PeerUnavailableException; +import javax.sip.SipException; +import javax.sip.message.Request; +import java.text.ParseException; /** * @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔� @@ -25,7 +31,7 @@ * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ */ - boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown); + void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown) throws InvalidArgumentException, ParseException, SipException; /** * 浜戝彴鏂瑰悜鏀炬帶鍒� @@ -36,7 +42,7 @@ * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ * @param moveSpeed 闀滃ご绉诲姩閫熷害 */ - boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed); + void ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed) throws InvalidArgumentException, ParseException, SipException; /** * 浜戝彴缂╂斁鎺у埗锛屼娇鐢ㄩ厤缃枃浠朵腑鐨勯粯璁ら暅澶寸缉鏀鹃�熷害 @@ -45,7 +51,7 @@ * @param channelId 棰勮閫氶亾 * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ */ - boolean ptzZoomCmd(Device device,String channelId,int inOut); + void ptzZoomCmd(Device device,String channelId,int inOut) throws InvalidArgumentException, ParseException, SipException; /** * 浜戝彴缂╂斁鎺у埗 @@ -54,7 +60,7 @@ * @param channelId 棰勮閫氶亾 * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ */ - boolean ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed); + void ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed) throws InvalidArgumentException, ParseException, SipException; /** * 浜戝彴鎺у埗锛屾敮鎸佹柟鍚戜笌缂╂斁鎺у埗 @@ -67,7 +73,7 @@ * @param moveSpeed 闀滃ご绉诲姩閫熷害 * @param zoomSpeed 闀滃ご缂╂斁閫熷害 */ - boolean ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed); + void ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) throws InvalidArgumentException, SipException, ParseException; /** * 鍓嶇鎺у埗锛屽寘鎷琍TZ鎸囦护銆丗I鎸囦护銆侀缃綅鎸囦护銆佸贰鑸寚浠ゃ�佹壂鎻忔寚浠ゅ拰杈呭姪寮�鍏虫寚浠� @@ -79,7 +85,7 @@ * @param parameter2 鏁版嵁2 * @param combineCode2 缁勫悎鐮�2 */ - boolean frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2); + void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException; /** * 鍓嶇鎺у埗鎸囦护锛堢敤浜庤浆鍙戜笂绾ф寚浠わ級 @@ -87,14 +93,14 @@ * @param channelId 棰勮閫氶亾 * @param cmdString 鍓嶇鎺у埗鎸囦护涓� */ - boolean fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent); + void fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; /** * 璇锋眰棰勮瑙嗛娴� * @param device 瑙嗛璁惧 * @param channelId 棰勮閫氶亾 */ - void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent); + void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 璇锋眰鍥炴斁瑙嗛娴� @@ -104,7 +110,7 @@ * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss */ - void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInf, Device device, String channelId, String startTime, String endTime,InviteStreamCallback inviteStreamCallback, InviteStreamCallback event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent); + void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInf, Device device, String channelId, String startTime, String endTime,InviteStreamCallback inviteStreamCallback, InviteStreamCallback event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 璇锋眰鍘嗗彶濯掍綋涓嬭浇 @@ -117,33 +123,33 @@ */ void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, - SipSubscribe.Event errorEvent); + SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 瑙嗛娴佸仠姝� */ - void streamByeCmd(String deviceId, String channelId, String stream, String callId, SipSubscribe.Event okEvent); - void streamByeCmd(String deviceId, String channelId, String stream, String callId); + void streamByeCmd(Device device, String channelId, String stream, String callId, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException, SsrcTransactionNotFoundException; + void streamByeCmd(Device device, String channelId, String stream, String callId) throws InvalidArgumentException, ParseException, SipException, SsrcTransactionNotFoundException; /** * 鍥炴斁鏆傚仠 */ - void playPauseCmd(Device device, StreamInfo streamInfo); + void playPauseCmd(Device device, StreamInfo streamInfo) throws InvalidArgumentException, ParseException, SipException; /** * 鍥炴斁鎭㈠ */ - void playResumeCmd(Device device, StreamInfo streamInfo); + void playResumeCmd(Device device, StreamInfo streamInfo) throws InvalidArgumentException, ParseException, SipException; /** * 鍥炴斁鎷栧姩鎾斁 */ - void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime); + void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) throws InvalidArgumentException, ParseException, SipException; /** * 鍥炴斁鍊嶉�熸挱鏀� */ - void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed); + void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) throws InvalidArgumentException, ParseException, SipException; /** * 鍥炴斁鎺у埗 @@ -151,23 +157,24 @@ * @param streamInfo * @param content */ - void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent); + void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, InvalidArgumentException, ParseException; - /** + + /** * 璇煶骞挎挱 * * @param device 瑙嗛璁惧 * @param channelId 棰勮閫氶亾 */ - boolean audioBroadcastCmd(Device device,String channelId); + void audioBroadcastCmd(Device device,String channelId); /** * 璇煶骞挎挱 * * @param device 瑙嗛璁惧 */ - void audioBroadcastCmd(Device device, SipSubscribe.Event okEvent); - boolean audioBroadcastCmd(Device device); + void audioBroadcastCmd(Device device, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException; + void audioBroadcastCmd(Device device) throws InvalidArgumentException, SipException, ParseException; /** * 闊宠棰戝綍鍍忔帶鍒� @@ -176,21 +183,21 @@ * @param channelId 棰勮閫氶亾 * @param recordCmdStr 褰曞儚鍛戒护锛歊ecord / StopRecord */ - boolean recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent); + void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 杩滅▼鍚姩鎺у埗鍛戒护 * * @param device 瑙嗛璁惧 */ - boolean teleBootCmd(Device device); + void teleBootCmd(Device device) throws InvalidArgumentException, SipException, ParseException; /** * 鎶ヨ甯冮槻/鎾ら槻鍛戒护 * * @param device 瑙嗛璁惧 */ - boolean guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent); + void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 鎶ヨ澶嶄綅鍛戒护 @@ -199,7 +206,7 @@ * @param alarmMethod 鎶ヨ鏂瑰紡锛堝彲閫夛級 * @param alarmType 鎶ヨ绫诲瀷锛堝彲閫夛級 */ - boolean alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent); + void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 寮哄埗鍏抽敭甯у懡浠�,璁惧鏀跺埌姝ゅ懡浠ゅ簲绔嬪埢鍙戦�佷竴涓狪DR甯� @@ -207,7 +214,7 @@ * @param device 瑙嗛璁惧 * @param channelId 棰勮閫氶亾 */ - boolean iFrameCmd(Device device, String channelId); + void iFrameCmd(Device device, String channelId) throws InvalidArgumentException, SipException, ParseException; /** * 鐪嬪畧浣嶆帶鍒跺懡浠� @@ -217,14 +224,14 @@ * @param resetTime 鑷姩褰掍綅鏃堕棿闂撮殧锛屽紑鍚湅瀹堜綅鏃朵娇鐢紝鍗曚綅:绉�(s) * @param presetIndex 璋冪敤棰勭疆浣嶇紪鍙凤紝寮�鍚湅瀹堜綅鏃朵娇鐢紝鍙栧�艰寖鍥�0~255 */ - boolean homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent); + void homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 璁惧閰嶇疆鍛戒护 * * @param device 瑙嗛璁惧 */ - boolean deviceConfigCmd(Device device); + void deviceConfigCmd(Device device); /** * 璁惧閰嶇疆鍛戒护锛歜asicParam @@ -236,14 +243,14 @@ * @param heartBeatInterval 蹇冭烦闂撮殧鏃堕棿锛堝彲閫夛級 * @param heartBeatCount 蹇冭烦瓒呮椂娆℃暟锛堝彲閫夛級 */ - boolean deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent); + void deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 鏌ヨ璁惧鐘舵�� * * @param device 瑙嗛璁惧 */ - boolean deviceStatusQuery(Device device, SipSubscribe.Event errorEvent); + void deviceStatusQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 鏌ヨ璁惧淇℃伅 @@ -251,14 +258,14 @@ * @param device 瑙嗛璁惧 * @return */ - boolean deviceInfoQuery(Device device); + void deviceInfoQuery(Device device) throws InvalidArgumentException, SipException, ParseException; /** * 鏌ヨ鐩綍鍒楄〃 * * @param device 瑙嗛璁惧 */ - boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent); + void catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) throws SipException, InvalidArgumentException, ParseException; /** * 鏌ヨ褰曞儚淇℃伅 @@ -268,7 +275,7 @@ * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss * @param sn */ - boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent); + void recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 鏌ヨ鎶ヨ淇℃伅 @@ -282,8 +289,8 @@ * @param endTime 鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級 * @return true = 鍛戒护鍙戦�佹垚鍔� */ - boolean alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod, - String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent); + void alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod, + String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 鏌ヨ璁惧閰嶇疆 @@ -292,21 +299,21 @@ * @param channelId 閫氶亾缂栫爜锛堝彲閫夛級 * @param configType 閰嶇疆绫诲瀷锛� */ - boolean deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent); + void deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 鏌ヨ璁惧棰勭疆浣嶇疆 * * @param device 瑙嗛璁惧 */ - boolean presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent); + void presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 鏌ヨ绉诲姩璁惧浣嶇疆鏁版嵁 * * @param device 瑙嗛璁惧 */ - boolean mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent); + void mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 璁㈤槄銆佸彇娑堣闃呯Щ鍔ㄤ綅缃� @@ -314,7 +321,7 @@ * @param device 瑙嗛璁惧 * @return true = 鍛戒护鍙戦�佹垚鍔� */ - SIPRequest mobilePositionSubscribe(Device device, SIPRequest request, SipSubscribe.Event okEvent , SipSubscribe.Event errorEvent); + SIPRequest mobilePositionSubscribe(Device device, SIPRequest request, SipSubscribe.Event okEvent , SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 璁㈤槄銆佸彇娑堣闃呮姤璀︿俊鎭� @@ -327,14 +334,14 @@ * @param endTime 鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級 * @return true = 鍛戒护鍙戦�佹垚鍔� */ - boolean alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime); + void alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime) throws InvalidArgumentException, SipException, ParseException; /** * 璁㈤槄銆佸彇娑堣闃呯洰褰曚俊鎭� * @param device 瑙嗛璁惧 * @return true = 鍛戒护鍙戦�佹垚鍔� */ - SIPRequest catalogSubscribe(Device device, SIPRequest request, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent); + SIPRequest catalogSubscribe(Device device, SIPRequest request, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; /** * 鎷夋鎺у埗鍛戒护 @@ -343,7 +350,7 @@ * @param channelId 閫氶亾id * @param cmdString 鍓嶇鎺у埗鎸囦护涓� */ - boolean dragZoomCmd(Device device, String channelId, String cmdString); + void dragZoomCmd(Device device, String channelId, String cmdString) throws InvalidArgumentException, SipException, ParseException; /** @@ -352,5 +359,11 @@ * @param deviceAlarm 鎶ヨ淇℃伅淇℃伅 * @return */ - boolean sendAlarmMessage(Device device, DeviceAlarm deviceAlarm); + void sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) throws InvalidArgumentException, SipException, ParseException; + + void transmitRequest(String transport, Request request) throws SipException, ParseException ; + + void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent) throws SipException, ParseException; + + void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException, ParseException; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java index ab229bd..13a36d7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java @@ -4,7 +4,10 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; import javax.sip.header.WWWAuthenticateHeader; +import java.text.ParseException; import java.util.List; public interface ISIPCommanderForPlatform { @@ -14,15 +17,15 @@ * @param parentPlatform * @return */ - boolean register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent); - boolean register(ParentPlatform parentPlatform, String callId, WWWAuthenticateHeader www, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister); + void register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException; + void register(ParentPlatform parentPlatform, String callId, WWWAuthenticateHeader www, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister) throws SipException, InvalidArgumentException, ParseException; /** * 鍚戜笂绾у钩鍙版敞閿� * @param parentPlatform * @return */ - boolean unregister(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent); + void unregister(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException; /** @@ -30,7 +33,7 @@ * @param parentPlatform * @return callId(浣滀负鎺ュ彈鍥炲鐨勫垽瀹�) */ - String keepalive(ParentPlatform parentPlatform,SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent); + String keepalive(ParentPlatform parentPlatform,SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException, InvalidArgumentException, ParseException; /** @@ -42,8 +45,8 @@ * @param size * @return */ - boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size); - boolean catalogQuery(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag); + void catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size) throws SipException, InvalidArgumentException, ParseException; + void catalogQuery(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag) throws InvalidArgumentException, ParseException, SipException; /** * 鍚戜笂绾у洖澶岲eviceInfo鏌ヨ淇℃伅 @@ -52,7 +55,7 @@ * @param fromTag * @return */ - boolean deviceInfoResponse(ParentPlatform parentPlatform, String sn, String fromTag); + void deviceInfoResponse(ParentPlatform parentPlatform, String sn, String fromTag) throws SipException, InvalidArgumentException, ParseException; /** * 鍚戜笂绾у洖澶岲eviceStatus鏌ヨ淇℃伅 @@ -61,7 +64,7 @@ * @param fromTag * @return */ - boolean deviceStatusResponse(ParentPlatform parentPlatform, String sn, String fromTag); + void deviceStatusResponse(ParentPlatform parentPlatform, String sn, String fromTag) throws SipException, InvalidArgumentException, ParseException; /** * 鍚戜笂绾у洖澶嶇Щ鍔ㄤ綅缃闃呮秷鎭� @@ -70,7 +73,7 @@ * @param subscribeInfo 璁㈤槄鐩稿叧鐨勪俊鎭� * @return */ - boolean sendNotifyMobilePosition(ParentPlatform parentPlatform, GPSMsgInfo gpsMsgInfo, SubscribeInfo subscribeInfo); + void sendNotifyMobilePosition(ParentPlatform parentPlatform, GPSMsgInfo gpsMsgInfo, SubscribeInfo subscribeInfo) throws InvalidArgumentException, ParseException, NoSuchFieldException, SipException, IllegalAccessException; /** * 鍚戜笂绾у洖澶嶆姤璀︽秷鎭� @@ -78,21 +81,21 @@ * @param deviceAlarm 鎶ヨ淇℃伅淇℃伅 * @return */ - boolean sendAlarmMessage(ParentPlatform parentPlatform, DeviceAlarm deviceAlarm); + void sendAlarmMessage(ParentPlatform parentPlatform, DeviceAlarm deviceAlarm) throws SipException, InvalidArgumentException, ParseException; /** * 鍥炲catalog浜嬩欢-澧炲姞/鏇存柊 * @param parentPlatform * @param deviceChannels */ - boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, SubscribeInfo subscribeInfo, Integer index); + void sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, SubscribeInfo subscribeInfo, Integer index) throws InvalidArgumentException, ParseException, NoSuchFieldException, SipException, IllegalAccessException; /** * 鍥炲catalog浜嬩欢-鍒犻櫎 * @param parentPlatform * @param deviceChannels */ - boolean sendNotifyForCatalogOther(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, SubscribeInfo subscribeInfo, Integer index); + void sendNotifyForCatalogOther(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, SubscribeInfo subscribeInfo, Integer index) throws InvalidArgumentException, ParseException, NoSuchFieldException, SipException, IllegalAccessException; /** * 鍥炲recordInfo @@ -101,7 +104,7 @@ * @param fromTag fromTag * @param recordInfo 褰曞儚淇℃伅 */ - boolean recordInfo(DeviceChannel deviceChannel, ParentPlatform parentPlatform, String fromTag, RecordInfo recordInfo); + void recordInfo(DeviceChannel deviceChannel, ParentPlatform parentPlatform, String fromTag, RecordInfo recordInfo) throws SipException, InvalidArgumentException, ParseException; /** * 褰曞儚鎾斁鎺ㄩ�佸畬鎴愭椂鍙戦�丮ediaStatus娑堟伅 @@ -109,13 +112,13 @@ * @param sendRtpItem * @return */ - boolean sendMediaStatusNotify(ParentPlatform platform, SendRtpItem sendRtpItem); + void sendMediaStatusNotify(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException; /** * 鍚戝彂璧风偣鎾殑涓婄骇鍥炲bye * @param platform 骞冲彴淇℃伅 * @param callId callId */ - void streamByeCmd(ParentPlatform platform, String callId); - void streamByeCmd(ParentPlatform platform, SendRtpItem sendRtpItem); + void streamByeCmd(ParentPlatform platform, String callId) throws SipException, InvalidArgumentException, ParseException; + void streamByeCmd(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java index 34c5cbe..1374ddf 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java @@ -10,6 +10,9 @@ import javax.sip.message.Request; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.gb28181.bean.SipMsgInfo; +import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; +import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -17,6 +20,7 @@ import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; import gov.nist.javax.sip.message.SIPRequest; +import gov.nist.javax.sip.message.SIPResponse; import gov.nist.javax.sip.stack.SIPDialog; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -168,34 +172,37 @@ return request; } - public Request createByteRequest(Device device, String channelId, String viaTag, String fromTag, String toTag, String callId) throws ParseException, InvalidArgumentException, PeerUnavailableException { + public Request createByteRequest(Device device, String channelId, SipTransactionInfo transactionInfo) throws ParseException, InvalidArgumentException, PeerUnavailableException { Request request = null; //璇锋眰琛� SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); // via ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag()); viaHeaders.add(viaHeader); //from SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain()); Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); //蹇呴』瑕佹湁鏍囪锛屽惁鍒欐棤娉曞垱寤轰細璇濓紝鏃犳硶鍥炲簲ack + FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag()); //to SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,device.getHostAddress()); Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,toTag); + ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag()); //Forwards MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); //ceq CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE); - CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(callId); + CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(transactionInfo.getCallId()); request = sipFactory.createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); + request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + + request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); return request; } @@ -251,47 +258,72 @@ return request; } - public Request createInfoRequest(Device device, StreamInfo streamInfo, String content) + public SIPRequest createInfoRequest(Device device, String channelId, String content, SipTransactionInfo transactionInfo) throws SipException, ParseException, InvalidArgumentException { - if (streamInfo == null) { + if (device == null || transactionInfo == null) { return null; } - Request request = null; - SIPDialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream()); - if (dialog == null) { - return null; + SIPRequest request = null; + //璇锋眰琛� + SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); + // via + ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag()); + viaHeaders.add(viaHeader); + //from + SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain()); + Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); + FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag()); + //to + SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,device.getHostAddress()); + Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); + ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag()); + + //Forwards + MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); + + //ceq + CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INFO); + CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(transactionInfo.getCallId()); + request = (SIPRequest)sipFactory.createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); + + request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); + + Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); + request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + + request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); + + if (content != null) { + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", + "MANSRTSP"); + request.setContent(content, contentTypeHeader); } + return request; + } - SipStack sipStack = udpSipProvider.getSipStack(); - SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog); - if (dialog != sipDialog) { - dialog = sipDialog; - }else { - dialog.setSipProvider(udpSipProvider); - } - streamSession.put(streamInfo.getDeviceID(), streamInfo.getChannelId(), dialog.getCallId().getCallId(), dialog); - Request infoRequest = dialog.createRequest(Request.INFO); - SipURI sipURI = (SipURI) infoRequest.getRequestURI(); - sipURI.setHost(device.getIp()); - sipURI.setPort(device.getPort()); - sipURI.setUser(streamInfo.getChannelId()); + public Request createAckRequest(SipURI sipURI, SIPResponse sipResponse) throws ParseException, InvalidArgumentException, PeerUnavailableException { - ViaHeader viaHeader = (ViaHeader) infoRequest.getHeader(ViaHeader.NAME); - viaHeader.setRPort(); - // 澧炲姞Contact header - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory() - .createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort())); - infoRequest.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - infoRequest.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); + // via + ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); + ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), sipResponse.getTopmostViaHeader().getTransport(), SipUtils.getNewViaTag()); + viaHeaders.add(viaHeader); - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", - "MANSRTSP"); - infoRequest.setContent(content, contentTypeHeader); + //Forwards + MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); - CSeqHeader cSeqHeader = (CSeqHeader)infoRequest.getHeader(CSeqHeader.NAME); - cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ()); - // ceq - infoRequest.addHeader(cSeqHeader); - return infoRequest; + //ceq + CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(sipResponse.getCSeqHeader().getSeqNumber(), Request.ACK); + + Request request = sipFactory.createMessageFactory().createRequest(sipURI, Request.ACK, sipResponse.getCallIdHeader(), cSeqHeader, sipResponse.getFromHeader(), sipResponse.getToHeader(), viaHeaders, maxForwards); + + request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); + + Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); + request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); + + request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); + + return request; } } 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 d08201f..14c0116 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 @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; @@ -22,17 +23,20 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GitUtil; +import gov.nist.javax.sip.SIPConstants; import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; -import gov.nist.javax.sip.message.MessageFactoryImpl; import gov.nist.javax.sip.message.SIPRequest; +import gov.nist.javax.sip.message.SIPResponse; import gov.nist.javax.sip.stack.SIPClientTransaction; +import gov.nist.javax.sip.stack.SIPClientTransactionImpl; import gov.nist.javax.sip.stack.SIPDialog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.DependsOn; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; @@ -41,1791 +45,1444 @@ import javax.sip.address.SipURI; import javax.sip.header.*; import javax.sip.message.Request; +import javax.sip.message.Response; import java.lang.reflect.Field; import java.text.ParseException; import java.util.HashSet; -/** - * @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔� +/** + * @description:璁惧鑳藉姏鎺ュ彛锛岀敤浜庡畾涔夎澶囩殑鎺у埗銆佹煡璇㈣兘鍔� * @author: swwheihei - * @date: 2020骞�5鏈�3鏃� 涓嬪崍9:22:48 + * @date: 2020骞�5鏈�3鏃� 涓嬪崍9:22:48 */ @Component @DependsOn("sipLayer") public class SIPCommander implements ISIPCommander { - private final Logger logger = LoggerFactory.getLogger(SIPCommander.class); + private final Logger logger = LoggerFactory.getLogger(SIPCommander.class); - @Autowired - private SipConfig sipConfig; + @Autowired + private SipConfig sipConfig; - @Autowired - private SipFactory sipFactory; + @Autowired + private SipFactory sipFactory; - @Autowired - private GitUtil gitUtil; + @Autowired + private GitUtil gitUtil; - @Autowired - @Qualifier(value="tcpSipProvider") - private SipProviderImpl tcpSipProvider; + @Autowired + @Qualifier(value = "tcpSipProvider") + private SipProviderImpl tcpSipProvider; - @Autowired - @Qualifier(value="udpSipProvider") - private SipProviderImpl udpSipProvider; + @Autowired + @Qualifier(value = "udpSipProvider") + private SipProviderImpl udpSipProvider; - @Autowired - private SIPRequestHeaderProvider headerProvider; - - @Autowired - private VideoStreamSessionManager streamSession; + @Autowired + private SIPRequestHeaderProvider headerProvider; - @Autowired - private IVideoManagerStorage storager; + @Autowired + private VideoStreamSessionManager streamSession; - @Autowired - private IRedisCatchStorage redisCatchStorage; + @Autowired + private UserSetting userSetting; - @Autowired - private UserSetting userSetting; + @Autowired + private ZlmHttpHookSubscribe subscribe; - @Autowired - private ZlmHttpHookSubscribe subscribe; + @Autowired + private SipSubscribe sipSubscribe; - @Autowired - private SipSubscribe sipSubscribe; - - @Autowired - private IMediaServerService mediaServerService; - - @Autowired - private DynamicTask dynamicTask; + @Autowired + private IMediaServerService mediaServerService; - /** - * 浜戝彴鏂瑰悜鏀炬帶鍒讹紝浣跨敤閰嶇疆鏂囦欢涓殑榛樿闀滃ご绉诲姩閫熷害 - * - * @param device 鎺у埗璁惧 - * @param channelId 棰勮閫氶亾 - * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ - * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ - */ - @Override - public boolean ptzdirectCmd(Device device, String channelId, int leftRight, int upDown) { - return ptzCmd(device, channelId, leftRight, upDown, 0, sipConfig.getPtzSpeed(), 0); - } + /** + * 浜戝彴鏂瑰悜鏀炬帶鍒讹紝浣跨敤閰嶇疆鏂囦欢涓殑榛樿闀滃ご绉诲姩閫熷害 + * + * @param device 鎺у埗璁惧 + * @param channelId 棰勮閫氶亾 + * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ + * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ + */ + @Override + public void ptzdirectCmd(Device device, String channelId, int leftRight, int upDown) throws InvalidArgumentException, ParseException, SipException { + ptzCmd(device, channelId, leftRight, upDown, 0, sipConfig.getPtzSpeed(), 0); + } - /** - * 浜戝彴鏂瑰悜鏀炬帶鍒� - * - * @param device 鎺у埗璁惧 - * @param channelId 棰勮閫氶亾 - * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ - * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ - * @param moveSpeed 闀滃ご绉诲姩閫熷害 - */ - @Override - public boolean ptzdirectCmd(Device device, String channelId, int leftRight, int upDown, int moveSpeed) { - return ptzCmd(device, channelId, leftRight, upDown, 0, moveSpeed, 0); - } + /** + * 浜戝彴鏂瑰悜鏀炬帶鍒� + * + * @param device 鎺у埗璁惧 + * @param channelId 棰勮閫氶亾 + * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ + * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ + * @param moveSpeed 闀滃ご绉诲姩閫熷害 + */ + @Override + public void ptzdirectCmd(Device device, String channelId, int leftRight, int upDown, int moveSpeed) throws InvalidArgumentException, ParseException, SipException { + ptzCmd(device, channelId, leftRight, upDown, 0, moveSpeed, 0); + } - /** - * 浜戝彴缂╂斁鎺у埗锛屼娇鐢ㄩ厤缃枃浠朵腑鐨勯粯璁ら暅澶寸缉鏀鹃�熷害 - * - * @param device 鎺у埗璁惧 - * @param channelId 棰勮閫氶亾 - * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ - */ - @Override - public boolean ptzZoomCmd(Device device, String channelId, int inOut) { - return ptzCmd(device, channelId, 0, 0, inOut, 0, sipConfig.getPtzSpeed()); - } + /** + * 浜戝彴缂╂斁鎺у埗锛屼娇鐢ㄩ厤缃枃浠朵腑鐨勯粯璁ら暅澶寸缉鏀鹃�熷害 + * + * @param device 鎺у埗璁惧 + * @param channelId 棰勮閫氶亾 + * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ + */ + @Override + public void ptzZoomCmd(Device device, String channelId, int inOut) throws InvalidArgumentException, ParseException, SipException { + ptzCmd(device, channelId, 0, 0, inOut, 0, sipConfig.getPtzSpeed()); + } - /** - * 浜戝彴缂╂斁鎺у埗 - * - * @param device 鎺у埗璁惧 - * @param channelId 棰勮閫氶亾 - * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ - * @param zoomSpeed 闀滃ご缂╂斁閫熷害 - */ - @Override - public boolean ptzZoomCmd(Device device, String channelId, int inOut, int zoomSpeed) { - return ptzCmd(device, channelId, 0, 0, inOut, 0, zoomSpeed); - } - - /** - * 浜戝彴鎸囦护鐮佽绠� - * - * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ - * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ - * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ - * @param moveSpeed 闀滃ご绉诲姩閫熷害 榛樿 0XFF (0-255) - * @param zoomSpeed 闀滃ご缂╂斁閫熷害 榛樿 0X1 (0-255) - */ - public static String cmdString(int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) { - int cmdCode = 0; - if (leftRight == 2) { - cmdCode|=0x01; // 鍙崇Щ - } else if(leftRight == 1) { - cmdCode|=0x02; // 宸︾Щ - } - if (upDown == 2) { - cmdCode|=0x04; // 涓嬬Щ - } else if(upDown == 1) { - cmdCode|=0x08; // 涓婄Щ - } - if (inOut == 2) { - cmdCode |= 0x10; // 鏀惧ぇ - } else if(inOut == 1) { - cmdCode |= 0x20; // 缂╁皬 - } - StringBuilder builder = new StringBuilder("A50F01"); - String strTmp; - strTmp = String.format("%02X", cmdCode); - builder.append(strTmp, 0, 2); - strTmp = String.format("%02X", moveSpeed); - builder.append(strTmp, 0, 2); - builder.append(strTmp, 0, 2); - strTmp = String.format("%X", zoomSpeed); - builder.append(strTmp, 0, 1).append("0"); - //璁$畻鏍¢獙鐮� - int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + moveSpeed + moveSpeed + (zoomSpeed /*<< 4*/ & 0XF0)) % 0X100; - strTmp = String.format("%02X", checkCode); - builder.append(strTmp, 0, 2); - return builder.toString(); -} + /** + * 浜戝彴缂╂斁鎺у埗 + * + * @param device 鎺у埗璁惧 + * @param channelId 棰勮閫氶亾 + * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ + * @param zoomSpeed 闀滃ご缂╂斁閫熷害 + */ + @Override + public void ptzZoomCmd(Device device, String channelId, int inOut, int zoomSpeed) throws InvalidArgumentException, ParseException, SipException { + ptzCmd(device, channelId, 0, 0, inOut, 0, zoomSpeed); + } - /** - * 浜戝彴鎸囦护鐮佽绠� - * - * @param cmdCode 鎸囦护鐮� - * @param parameter1 鏁版嵁1 - * @param parameter2 鏁版嵁2 - * @param combineCode2 缁勫悎鐮�2 - */ + /** + * 浜戝彴鎸囦护鐮佽绠� + * + * @param cmdCode 鎸囦护鐮� + * @param parameter1 鏁版嵁1 + * @param parameter2 鏁版嵁2 + * @param combineCode2 缁勫悎鐮�2 + */ public static String frontEndCmdString(int cmdCode, int parameter1, int parameter2, int combineCode2) { - StringBuilder builder = new StringBuilder("A50F01"); - String strTmp; - strTmp = String.format("%02X", cmdCode); - builder.append(strTmp, 0, 2); - strTmp = String.format("%02X", parameter1); - builder.append(strTmp, 0, 2); - strTmp = String.format("%02X", parameter2); - builder.append(strTmp, 0, 2); - strTmp = String.format("%X", combineCode2); - builder.append(strTmp, 0, 1).append("0"); - //璁$畻鏍¢獙鐮� - int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + parameter1 + parameter2 + (combineCode2 & 0XF0)) % 0X100; - strTmp = String.format("%02X", checkCode); - builder.append(strTmp, 0, 2); - return builder.toString(); - } + StringBuilder builder = new StringBuilder("A50F01"); + String strTmp; + strTmp = String.format("%02X", cmdCode); + builder.append(strTmp, 0, 2); + strTmp = String.format("%02X", parameter1); + builder.append(strTmp, 0, 2); + strTmp = String.format("%02X", parameter2); + builder.append(strTmp, 0, 2); + strTmp = String.format("%X", combineCode2); + builder.append(strTmp, 0, 1).append("0"); + //璁$畻鏍¢獙鐮� + int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + parameter1 + parameter2 + (combineCode2 & 0XF0)) % 0X100; + strTmp = String.format("%02X", checkCode); + builder.append(strTmp, 0, 2); + return builder.toString(); + } - /** - * 浜戝彴鎺у埗锛屾敮鎸佹柟鍚戜笌缂╂斁鎺у埗 - * - * @param device 鎺у埗璁惧 - * @param channelId 棰勮閫氶亾 - * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ - * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ - * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ - * @param moveSpeed 闀滃ご绉诲姩閫熷害 - * @param zoomSpeed 闀滃ご缂╂斁閫熷害 - */ - @Override - public boolean ptzCmd(Device device, String channelId, int leftRight, int upDown, int inOut, int moveSpeed, - int zoomSpeed) { - try { - String cmdStr= cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed); - StringBuffer ptzXml = new StringBuffer(200); - String charset = device.getCharset(); - ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - ptzXml.append("<Control>\r\n"); - ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>\r\n"); - ptzXml.append("<Info>\r\n"); - ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); - ptzXml.append("</Info>\r\n"); - ptzXml.append("</Control>\r\n"); + /** + * 浜戝彴鎺у埗锛屾敮鎸佹柟鍚戜笌缂╂斁鎺у埗 + * + * @param device 鎺у埗璁惧 + * @param channelId 棰勮閫氶亾 + * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ + * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ + * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ + * @param moveSpeed 闀滃ご绉诲姩閫熷害 + * @param zoomSpeed 闀滃ご缂╂斁閫熷害 + */ + @Override + public void ptzCmd(Device device, String channelId, int leftRight, int upDown, int inOut, int moveSpeed, + int zoomSpeed) throws InvalidArgumentException, SipException, ParseException { + String cmdStr = SipUtils.cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed); + StringBuffer ptzXml = new StringBuffer(200); + String charset = device.getCharset(); + ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + ptzXml.append("<Control>\r\n"); + ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + ptzXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>\r\n"); + ptzXml.append("<Info>\r\n"); + ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); + ptzXml.append("</Info>\r\n"); + ptzXml.append("</Control>\r\n"); - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - - transmitRequest(device, request); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - return false; - } + Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - /** - * 鍓嶇鎺у埗锛屽寘鎷琍TZ鎸囦护銆丗I鎸囦护銆侀缃綅鎸囦护銆佸贰鑸寚浠ゃ�佹壂鎻忔寚浠ゅ拰杈呭姪寮�鍏虫寚浠� - * - * @param device 鎺у埗璁惧 - * @param channelId 棰勮閫氶亾 - * @param cmdCode 鎸囦护鐮� - * @param parameter1 鏁版嵁1 - * @param parameter2 鏁版嵁2 - * @param combineCode2 缁勫悎鐮�2 - */ - @Override - public boolean frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) { - try { - String cmdStr= frontEndCmdString(cmdCode, parameter1, parameter2, combineCode2); - logger.debug("鎺у埗瀛楃涓诧細" + cmdStr); - StringBuffer ptzXml = new StringBuffer(200); - String charset = device.getCharset(); - ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - ptzXml.append("<Control>\r\n"); - ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>\r\n"); - ptzXml.append("<Info>\r\n"); - ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); - ptzXml.append("</Info>\r\n"); - ptzXml.append("</Control>\r\n"); - + transmitRequest(device.getTransport(), request); + } - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + /** + * 鍓嶇鎺у埗锛屽寘鎷琍TZ鎸囦护銆丗I鎸囦护銆侀缃綅鎸囦护銆佸贰鑸寚浠ゃ�佹壂鎻忔寚浠ゅ拰杈呭姪寮�鍏虫寚浠� + * + * @param device 鎺у埗璁惧 + * @param channelId 棰勮閫氶亾 + * @param cmdCode 鎸囦护鐮� + * @param parameter1 鏁版嵁1 + * @param parameter2 鏁版嵁2 + * @param combineCode2 缁勫悎鐮�2 + */ + @Override + public void frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2) throws SipException, InvalidArgumentException, ParseException { - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - return false; - } + String cmdStr = frontEndCmdString(cmdCode, parameter1, parameter2, combineCode2); + StringBuffer ptzXml = new StringBuffer(200); + String charset = device.getCharset(); + ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + ptzXml.append("<Control>\r\n"); + ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + ptzXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + ptzXml.append("<PTZCmd>" + cmdStr + "</PTZCmd>\r\n"); + ptzXml.append("<Info>\r\n"); + ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); + ptzXml.append("</Info>\r\n"); + ptzXml.append("</Control>\r\n"); - /** - * 鍓嶇鎺у埗鎸囦护锛堢敤浜庤浆鍙戜笂绾ф寚浠わ級 - * @param device 鎺у埗璁惧 - * @param channelId 棰勮閫氶亾 - * @param cmdString 鍓嶇鎺у埗鎸囦护涓� - */ - @Override - public boolean fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) { - try { - StringBuffer ptzXml = new StringBuffer(200); - String charset = device.getCharset(); - ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - ptzXml.append("<Control>\r\n"); - ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - ptzXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - ptzXml.append("<PTZCmd>" + cmdString + "</PTZCmd>\r\n"); - ptzXml.append("<Info>\r\n"); - ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); - ptzXml.append("</Info>\r\n"); - ptzXml.append("</Control>\r\n"); - - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent, okEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - return false; - } - - /** - * 璇锋眰棰勮瑙嗛娴� - * @param device 瑙嗛璁惧 - * @param channelId 棰勮閫氶亾 - * @param event hook璁㈤槄 - * @param errorEvent sip閿欒璁㈤槄 - */ - @Override - public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, - ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { - String stream = ssrcInfo.getStream(); - try { - if (device == null) { - return; - } -// String streamMode = device.getStreamMode().toUpperCase(); + SIPRequest request = (SIPRequest) headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request); - logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId()); - subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ - if (event != null) { - event.response(mediaServerItemInUse, json); - subscribe.removeSubscribe(hookSubscribe); - } - }); - // - StringBuffer content = new StringBuffer(200); - content.append("v=0\r\n"); - content.append("o="+ channelId+" 0 0 IN IP4 "+ mediaServerItem.getSdpIp() +"\r\n"); - content.append("s=Play\r\n"); - content.append("c=IN IP4 "+ mediaServerItem.getSdpIp() +"\r\n"); - content.append("t=0 0\r\n"); + } - if (userSetting.isSeniorSdp()) { - if("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); - }else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); - }else if("UDP".equalsIgnoreCase(device.getStreamMode())) { - content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 126 125 99 34 98 97\r\n"); - } - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=fmtp:126 profile-level-id=42e01e\r\n"); - content.append("a=rtpmap:126 H264/90000\r\n"); - content.append("a=rtpmap:125 H264S/90000\r\n"); - content.append("a=fmtp:125 profile-level-id=42e01e\r\n"); - content.append("a=rtpmap:99 H265/90000\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - if("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())){ // tcp琚姩妯″紡 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - }else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp涓诲姩妯″紡 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } - }else { - if("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n"); - }else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n"); - }else if("UDP".equalsIgnoreCase(device.getStreamMode())) { - content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 97 98 99\r\n"); - } - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - content.append("a=rtpmap:99 H265/90000\r\n"); - if ("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp琚姩妯″紡 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - } else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp涓诲姩妯″紡 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } - } + /** + * 鍓嶇鎺у埗鎸囦护锛堢敤浜庤浆鍙戜笂绾ф寚浠わ級 + * + * @param device 鎺у埗璁惧 + * @param channelId 棰勮閫氶亾 + * @param cmdString 鍓嶇鎺у埗鎸囦护涓� + */ + @Override + public void fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException { - content.append("y="+ssrcInfo.getSsrc()+"\r\n");//ssrc - // f瀛楁:f= v/缂栫爜鏍煎紡/鍒嗚鲸鐜�/甯х巼/鐮佺巼绫诲瀷/鐮佺巼澶у皬a/缂栫爜鏍煎紡/鐮佺巼澶у皬/閲囨牱鐜� + StringBuffer ptzXml = new StringBuffer(200); + String charset = device.getCharset(); + ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + ptzXml.append("<Control>\r\n"); + ptzXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + ptzXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + ptzXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + ptzXml.append("<PTZCmd>" + cmdString + "</PTZCmd>\r\n"); + ptzXml.append("<Info>\r\n"); + ptzXml.append("<ControlPriority>5</ControlPriority>\r\n"); + ptzXml.append("</Info>\r\n"); + ptzXml.append("</Control>\r\n"); + + + CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent, okEvent); + + } + + /** + * 璇锋眰棰勮瑙嗛娴� + * + * @param device 瑙嗛璁惧 + * @param channelId 棰勮閫氶亾 + * @param event hook璁㈤槄 + * @param errorEvent sip閿欒璁㈤槄 + */ + @Override + public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, + ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { + String stream = ssrcInfo.getStream(); + + if (device == null) { + return; + } + + logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId()); + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { + if (event != null) { + event.response(mediaServerItemInUse, json); + subscribe.removeSubscribe(hookSubscribe); + } + }); + // + StringBuffer content = new StringBuffer(200); + content.append("v=0\r\n"); + content.append("o=" + channelId + " 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); + content.append("s=Play\r\n"); + content.append("c=IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); + content.append("t=0 0\r\n"); + + if (userSetting.isSeniorSdp()) { + if ("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + } else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + } else if ("UDP".equalsIgnoreCase(device.getStreamMode())) { + content.append("m=video " + ssrcInfo.getPort() + " RTP/AVP 96 126 125 99 34 98 97\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=fmtp:126 profile-level-id=42e01e\r\n"); + content.append("a=rtpmap:126 H264/90000\r\n"); + content.append("a=rtpmap:125 H264S/90000\r\n"); + content.append("a=fmtp:125 profile-level-id=42e01e\r\n"); + content.append("a=rtpmap:99 H265/90000\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + if ("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp琚姩妯″紡 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + } else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + } else { + if ("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 97 98 99\r\n"); + } else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 97 98 99\r\n"); + } else if ("UDP".equalsIgnoreCase(device.getStreamMode())) { + content.append("m=video " + ssrcInfo.getPort() + " RTP/AVP 96 97 98 99\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + content.append("a=rtpmap:99 H265/90000\r\n"); + if ("TCP-PASSIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp琚姩妯″紡 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + } else if ("TCP-ACTIVE".equalsIgnoreCase(device.getStreamMode())) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + } + + content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc + // f瀛楁:f= v/缂栫爜鏍煎紡/鍒嗚鲸鐜�/甯х巼/鐮佺巼绫诲瀷/鐮佺巼澶у皬a/缂栫爜鏍煎紡/鐮佺巼澶у皬/閲囨牱鐜� // content.append("f=v/2/5/25/1/4000a/1/8/1" + "\r\n"); // 鏈彂鐜版敮鎸佹鐗规�х殑璁惧 - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(), callIdHeader); + Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(), callIdHeader); + transmitRequest(device.getTransport(), request, (e -> { + streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); + errorEvent.response(e); + }), e -> { + // 杩欓噷涓轰緥閬垮厤涓�涓�氶亾鐨勭偣鎾彧鏈変竴涓猚allID杩欎釜鍙傛暟浣跨敤涓�涓浐瀹氬�� + ResponseEvent responseEvent = (ResponseEvent) e.event; + SIPResponse response = (SIPResponse) responseEvent.getResponse(); + streamSession.put(device.getDeviceId(), channelId, "play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.play); + okEvent.response(e); + }); + } - transmitRequest(device, request, (e -> { - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); - mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); - errorEvent.response(e); - }), e ->{ - // 杩欓噷涓轰緥閬垮厤涓�涓�氶亾鐨勭偣鎾彧鏈変竴涓猚allID杩欎釜鍙傛暟浣跨敤涓�涓浐瀹氬�� - streamSession.put(device.getDeviceId(), channelId ,"play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), ((ResponseEvent)e.event).getClientTransaction(), VideoStreamSessionManager.SessionType.play); - Dialog sipDialog = null; - if (e.dialog == null) { - SIPClientTransaction clientTransaction = (SIPClientTransaction)((ResponseEvent)e.event).getClientTransaction(); - sipDialog = new SIPDialog(clientTransaction, clientTransaction.getLastResponse()); - }else { - sipDialog = e.dialog; - } - streamSession.put(device.getDeviceId(), channelId ,"play", sipDialog); - okEvent.response(e); - }); + /** + * 璇锋眰鍥炴斁瑙嗛娴� + * + * @param device 瑙嗛璁惧 + * @param channelId 棰勮閫氶亾 + * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss + * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss + */ + @Override + public void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, + String startTime, String endTime, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, + SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - - } catch ( SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } - - /** - * 璇锋眰鍥炴斁瑙嗛娴� - * - * @param device 瑙嗛璁惧 - * @param channelId 棰勮閫氶亾 - * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss - * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss - */ - @Override - public void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, - String startTime, String endTime, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, - SipSubscribe.Event okEvent,SipSubscribe.Event errorEvent) { - try { - logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); + logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); - StringBuffer content = new StringBuffer(200); - content.append("v=0\r\n"); - content.append("o="+channelId+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); - content.append("s=Playback\r\n"); - content.append("u="+channelId+":0\r\n"); - content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); - content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" " - +DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n"); + StringBuffer content = new StringBuffer(200); + content.append("v=0\r\n"); + content.append("o=" + channelId + " 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); + content.append("s=Playback\r\n"); + content.append("u=" + channelId + ":0\r\n"); + content.append("c=IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); + content.append("t=" + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime) + " " + + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) + "\r\n"); - String streamMode = device.getStreamMode(); + String streamMode = device.getStreamMode(); - if (userSetting.isSeniorSdp()) { - if("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); - }else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); - }else if("UDP".equalsIgnoreCase(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 126 125 99 34 98 97\r\n"); - } - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=fmtp:126 profile-level-id=42e01e\r\n"); - content.append("a=rtpmap:126 H264/90000\r\n"); - content.append("a=rtpmap:125 H264S/90000\r\n"); - content.append("a=fmtp:125 profile-level-id=42e01e\r\n"); - content.append("a=rtpmap:99 H265/90000\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - if("TCP-PASSIVE".equalsIgnoreCase(streamMode)){ // tcp琚姩妯″紡 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - }else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { // tcp涓诲姩妯″紡 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } - }else { - if("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n"); - }else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n"); - }else if("UDP".equalsIgnoreCase(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 97 98 99\r\n"); - } - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:99 H265/90000\r\n"); - if("TCP-PASSIVE".equalsIgnoreCase(streamMode)){ // tcp琚姩妯″紡 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - }else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { // tcp涓诲姩妯″紡 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } - } + if (userSetting.isSeniorSdp()) { + if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + } else if ("UDP".equalsIgnoreCase(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " RTP/AVP 96 126 125 99 34 98 97\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=fmtp:126 profile-level-id=42e01e\r\n"); + content.append("a=rtpmap:126 H264/90000\r\n"); + content.append("a=rtpmap:125 H264S/90000\r\n"); + content.append("a=fmtp:125 profile-level-id=42e01e\r\n"); + content.append("a=rtpmap:99 H265/90000\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { // tcp琚姩妯″紡 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + } else { + if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 97 98 99\r\n"); + } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 97 98 99\r\n"); + } else if ("UDP".equalsIgnoreCase(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " RTP/AVP 96 97 98 99\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:99 H265/90000\r\n"); + if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { // tcp琚姩妯″紡 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + } - content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc + content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); - // 娣诲姞璁㈤槄 - subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ - if (hookEvent != null) { - InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()); - hookEvent.call(inviteStreamInfo); - } - subscribe.removeSubscribe(hookSubscribe); - }); - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader, ssrcInfo.getSsrc()); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); + // 娣诲姞璁㈤槄 + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { + if (hookEvent != null) { + InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()); + hookEvent.call(inviteStreamInfo); + } + subscribe.removeSubscribe(hookSubscribe); + }); + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader, ssrcInfo.getSsrc()); - transmitRequest(device, request, errorEvent, event -> { - ResponseEvent responseEvent = (ResponseEvent) event.event; - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), responseEvent.getClientTransaction(), VideoStreamSessionManager.SessionType.playback); - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), event.dialog); - okEvent.response(event); - }); - if (inviteStreamCallback != null) { - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); - } - } catch ( SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } + transmitRequest(device.getTransport(), request, errorEvent, event -> { + ResponseEvent responseEvent = (ResponseEvent) event.event; + SIPResponse response = (SIPResponse) responseEvent.getResponse(); + streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.playback); + okEvent.response(event); + }); + if (inviteStreamCallback != null) { + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); + } + } - /** - * 璇锋眰鍘嗗彶濯掍綋涓嬭浇 - * - * @param device 瑙嗛璁惧 - * @param channelId 棰勮閫氶亾 - * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss - * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss - * @param downloadSpeed 涓嬭浇鍊嶉�熷弬鏁� - */ - @Override - public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, - String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, - SipSubscribe.Event errorEvent) { - try { - logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); + /** + * 璇锋眰鍘嗗彶濯掍綋涓嬭浇 + * + * @param device 瑙嗛璁惧 + * @param channelId 棰勮閫氶亾 + * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss + * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss + * @param downloadSpeed 涓嬭浇鍊嶉�熷弬鏁� + */ + @Override + public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, + String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, + SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - StringBuffer content = new StringBuffer(200); - content.append("v=0\r\n"); - content.append("o="+channelId+" 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); - content.append("s=Download\r\n"); - content.append("u="+channelId+":0\r\n"); - content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); - content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" " - +DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n"); + logger.info("{} 鍒嗛厤鐨刏LM涓�: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); - String streamMode = device.getStreamMode().toUpperCase(); + StringBuffer content = new StringBuffer(200); + content.append("v=0\r\n"); + content.append("o=" + channelId + " 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); + content.append("s=Download\r\n"); + content.append("u=" + channelId + ":0\r\n"); + content.append("c=IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); + content.append("t=" + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime) + " " + + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) + "\r\n"); - if (userSetting.isSeniorSdp()) { - if("TCP-PASSIVE".equals(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); - }else if ("TCP-ACTIVE".equals(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); - }else if("UDP".equals(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 126 125 99 34 98 97\r\n"); - } - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=fmtp:126 profile-level-id=42e01e\r\n"); - content.append("a=rtpmap:126 H264/90000\r\n"); - content.append("a=rtpmap:125 H264S/90000\r\n"); - content.append("a=fmtp:125 profile-level-id=42e01e\r\n"); - content.append("a=rtpmap:99 MP4V-ES/90000\r\n"); - content.append("a=fmtp:99 profile-level-id=3\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } - }else { - if("TCP-PASSIVE".equals(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n"); - }else if ("TCP-ACTIVE".equals(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" TCP/RTP/AVP 96 97 98 99\r\n"); - }else if("UDP".equals(streamMode)) { - content.append("m=video "+ ssrcInfo.getPort() +" RTP/AVP 96 97 98 99\r\n"); - } - content.append("a=recvonly\r\n"); - content.append("a=rtpmap:96 PS/90000\r\n"); - content.append("a=rtpmap:97 MPEG4/90000\r\n"); - content.append("a=rtpmap:98 H264/90000\r\n"); - content.append("a=rtpmap:99 H265/90000\r\n"); - if("TCP-PASSIVE".equals(streamMode)){ // tcp琚姩妯″紡 - content.append("a=setup:passive\r\n"); - content.append("a=connection:new\r\n"); - }else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡 - content.append("a=setup:active\r\n"); - content.append("a=connection:new\r\n"); - } - } - content.append("a=downloadspeed:" + downloadSpeed + "\r\n"); + String streamMode = device.getStreamMode().toUpperCase(); - content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc + if (userSetting.isSeniorSdp()) { + if ("TCP-PASSIVE".equals(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + } else if ("TCP-ACTIVE".equals(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 126 125 99 34 98 97\r\n"); + } else if ("UDP".equals(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " RTP/AVP 96 126 125 99 34 98 97\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=fmtp:126 profile-level-id=42e01e\r\n"); + content.append("a=rtpmap:126 H264/90000\r\n"); + content.append("a=rtpmap:125 H264S/90000\r\n"); + content.append("a=fmtp:125 profile-level-id=42e01e\r\n"); + content.append("a=rtpmap:99 MP4V-ES/90000\r\n"); + content.append("a=fmtp:99 profile-level-id=3\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + if ("TCP-PASSIVE".equals(streamMode)) { // tcp琚姩妯″紡 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + } else { + if ("TCP-PASSIVE".equals(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 97 98 99\r\n"); + } else if ("TCP-ACTIVE".equals(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " TCP/RTP/AVP 96 97 98 99\r\n"); + } else if ("UDP".equals(streamMode)) { + content.append("m=video " + ssrcInfo.getPort() + " RTP/AVP 96 97 98 99\r\n"); + } + content.append("a=recvonly\r\n"); + content.append("a=rtpmap:96 PS/90000\r\n"); + content.append("a=rtpmap:97 MPEG4/90000\r\n"); + content.append("a=rtpmap:98 H264/90000\r\n"); + content.append("a=rtpmap:99 H265/90000\r\n"); + if ("TCP-PASSIVE".equals(streamMode)) { // tcp琚姩妯″紡 + content.append("a=setup:passive\r\n"); + content.append("a=connection:new\r\n"); + } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp涓诲姩妯″紡 + content.append("a=setup:active\r\n"); + content.append("a=connection:new\r\n"); + } + } + content.append("a=downloadspeed:" + downloadSpeed + "\r\n"); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId()); - // 娣诲姞璁㈤槄 - subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{ - hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); - subscribe.removeSubscribe(hookSubscribe); - hookSubscribe.getContent().put("regist", false); - hookSubscribe.getContent().put("schema", "rtsp"); - // 娣诲姞娴佹敞閿�鐨勮闃咃紝娉ㄩ攢浜嗗悗鍚戣澶囧彂閫乥ye - subscribe.addSubscribe(hookSubscribe, - (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd)->{ - ClientTransaction transaction = streamSession.getTransaction(device.getDeviceId(), channelId, ssrcInfo.getStream(), callIdHeader.getCallId()); - if (transaction != null) { - logger.info("[褰曞儚]涓嬭浇缁撴潫锛� 鍙戦�丅YE"); - streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), callIdHeader.getCallId()); - } - }); - }); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader, ssrcInfo.getSsrc()); - if (inviteStreamCallback != null) { - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); - } - transmitRequest(device, request, errorEvent, okEvent->{ - ResponseEvent responseEvent = (ResponseEvent) okEvent.event; - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), responseEvent.getClientTransaction(), VideoStreamSessionManager.SessionType.download); - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), okEvent.dialog); - }); + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId()); + // 娣诲姞璁㈤槄 + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { + hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); + subscribe.removeSubscribe(hookSubscribe); + hookSubscribe.getContent().put("regist", false); + hookSubscribe.getContent().put("schema", "rtsp"); + // 娣诲姞娴佹敞閿�鐨勮闃咃紝娉ㄩ攢浜嗗悗鍚戣澶囧彂閫乥ye + subscribe.addSubscribe(hookSubscribe, + (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> { + logger.info("[褰曞儚]涓嬭浇缁撴潫锛� 鍙戦�丅YE"); + try { + streamByeCmd(device, channelId, ssrcInfo.getStream(), callIdHeader.getCallId()); + } catch (InvalidArgumentException | ParseException | SipException | + SsrcTransactionNotFoundException e) { + logger.error("[褰曞儚]涓嬭浇缁撴潫锛� 鍙戦�丅YE澶辫触 {}", e.getMessage()); + } + }); + }); + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader, ssrcInfo.getSsrc()); + if (inviteStreamCallback != null) { + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); + } + transmitRequest(device.getTransport(), request, errorEvent, okEvent -> { + ResponseEvent responseEvent = (ResponseEvent) okEvent.event; + SIPResponse response = (SIPResponse) responseEvent.getResponse(); + streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download); + }); + } - } catch ( SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } + /** + * 瑙嗛娴佸仠姝�, 涓嶄娇鐢ㄥ洖璋� + */ + @Override + public void streamByeCmd(Device device, String channelId, String stream, String callId) throws InvalidArgumentException, ParseException, SipException, SsrcTransactionNotFoundException { + streamByeCmd(device, channelId, stream, callId, null); + } - /** - * 瑙嗛娴佸仠姝�, 涓嶄娇鐢ㄥ洖璋� - */ - @Override - public void streamByeCmd(String deviceId, String channelId, String stream, String callId) { - streamByeCmd(deviceId, channelId, stream, callId, null); - } + /** + * 瑙嗛娴佸仠姝� + */ + @Override + public void streamByeCmd(Device device, String channelId, String stream, String callId, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException, SsrcTransactionNotFoundException { + SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, callId, stream); + if (ssrcTransaction == null) { + throw new SsrcTransactionNotFoundException(device.getDeviceId(), channelId, callId, stream); + } - /** - * 瑙嗛娴佸仠姝� - */ - @Override - public void streamByeCmd(String deviceId, String channelId, String stream, String callId, SipSubscribe.Event okEvent) { - try { - SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(deviceId, channelId, callId, stream); - ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId, stream, callId); + mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc()); + mediaServerService.closeRTPServer(ssrcTransaction.getMediaServerId(), ssrcTransaction.getStream()); + streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); - if (transaction == null ) { - logger.warn("[ {} -> {}]鍋滄瑙嗛娴佺殑鏃跺�欏彂鐜颁簨鍔″凡涓㈠け", deviceId, channelId); - SipSubscribe.EventResult<Object> eventResult = new SipSubscribe.EventResult<>(); - if (okEvent != null) { - okEvent.response(eventResult); - } - return; - } - SIPDialog dialog; - if (callId != null) { - dialog = streamSession.getDialogByCallId(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), callId); - }else { - if (stream == null && ssrcTransaction == null && ssrcTransaction.getStream() == null) { - return; - } - dialog = streamSession.getDialogByStream(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); - } - mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc()); - mediaServerService.closeRTPServer(ssrcTransaction.getMediaServerId(), ssrcTransaction.getStream()); - streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); + Request byteRequest = headerProvider.createByteRequest(device, channelId, ssrcTransaction.getSipTransactionInfo()); + transmitRequest(device.getTransport(), byteRequest, null, okEvent); + } - if (dialog == null) { - logger.warn("[ {} -> {}]鍋滄瑙嗛娴佺殑鏃跺�欏彂鐜板璇濆凡涓㈠け", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); - return; - } - SipStack sipStack = udpSipProvider.getSipStack(); - SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog); - if (dialog != sipDialog) { - dialog = sipDialog; - }else { - dialog.setSipProvider(udpSipProvider); - try { - Field sipStackField = SIPDialog.class.getDeclaredField("sipStack"); - sipStackField.setAccessible(true); - sipStackField.set(dialog, sipStack); - Field eventListenersField = SIPDialog.class.getDeclaredField("eventListeners"); - eventListenersField.setAccessible(true); - eventListenersField.set(dialog, new HashSet<>()); - } catch (NoSuchFieldException | IllegalAccessException e) { - e.printStackTrace(); - } - } + /** + * 璇煶骞挎挱 + * + * @param device 瑙嗛璁惧 + * @param channelId 棰勮閫氶亾 + */ + @Override + public void audioBroadcastCmd(Device device, String channelId) { + } - Request byeRequest = dialog.createRequest(Request.BYE); - SipURI byeURI = (SipURI) byeRequest.getRequestURI(); - SIPRequest request = (SIPRequest)transaction.getRequest(); - byeURI.setHost(request.getRemoteAddress().getHostAddress()); - byeURI.setPort(request.getRemotePort()); - byeURI.setUser(channelId); - ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME); - String protocol = viaHeader.getTransport().toUpperCase(); - viaHeader.setRPort(); - // 澧炲姞Contact header - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); - byeRequest.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - UserAgentHeader userAgentHeader = SipUtils.createUserAgentHeader(sipFactory, gitUtil); - byeRequest.addHeader(userAgentHeader); - ClientTransaction clientTransaction = null; - if("TCP".equals(protocol)) { - clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); - } else if("UDP".equals(protocol)) { - clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); - } + /** + * 璇煶骞挎挱 + * + * @param device 瑙嗛璁惧 + */ + @Override + public void audioBroadcastCmd(Device device) throws InvalidArgumentException, SipException, ParseException { - CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME); - if (okEvent != null) { - sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent); - } - CSeqHeader cSeqHeader = (CSeqHeader)byeRequest.getHeader(CSeqHeader.NAME); - cSeqHeader.setSeqNumber(redisCatchStorage.getCSEQ()); - dialog.sendRequest(clientTransaction); + StringBuffer broadcastXml = new StringBuffer(200); + String charset = device.getCharset(); + broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + broadcastXml.append("<Notify>\r\n"); + broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n"); + broadcastXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + broadcastXml.append("<SourceID>" + sipConfig.getId() + "</SourceID>\r\n"); + broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); + broadcastXml.append("</Notify>\r\n"); - } catch (SipException | ParseException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - throw new RuntimeException(e); - } - } + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - /** - * 璇煶骞挎挱 - * - * @param device 瑙嗛璁惧 - * @param channelId 棰勮閫氶亾 - */ - @Override - public boolean audioBroadcastCmd(Device device, String channelId) { - // 鏀逛负鏂扮殑瀹炵幇 - return false; - } + Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request); - /** - * 璇煶骞挎挱 - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean audioBroadcastCmd(Device device) { - try { - StringBuffer broadcastXml = new StringBuffer(200); - String charset = device.getCharset(); - broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - broadcastXml.append("<Notify>\r\n"); - broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n"); - broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - broadcastXml.append("<SourceID>" + sipConfig.getId() + "</SourceID>\r\n"); - broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); - broadcastXml.append("</Notify>\r\n"); + } - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - - Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - return false; - } - @Override - public void audioBroadcastCmd(Device device, SipSubscribe.Event errorEvent) { - try { - StringBuffer broadcastXml = new StringBuffer(200); - String charset = device.getCharset(); - broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - broadcastXml.append("<Notify>\r\n"); - broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n"); - broadcastXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - broadcastXml.append("<SourceID>" + sipConfig.getId() + "</SourceID>\r\n"); - broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); - broadcastXml.append("</Notify>\r\n"); + @Override + public void audioBroadcastCmd(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - - Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } - - - /** - * 闊宠棰戝綍鍍忔帶鍒� - * - * @param device 瑙嗛璁惧 - * @param channelId 棰勮閫氶亾 - * @param recordCmdStr 褰曞儚鍛戒护锛歊ecord / StopRecord - */ - @Override - public boolean recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Control>\r\n"); - cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (ObjectUtils.isEmpty(channelId)) { - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - } else { - cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - } - cmdXml.append("<RecordCmd>" + recordCmdStr + "</RecordCmd>\r\n"); - cmdXml.append("</Control>\r\n"); + StringBuffer broadcastXml = new StringBuffer(200); + String charset = device.getCharset(); + broadcastXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + broadcastXml.append("<Notify>\r\n"); + broadcastXml.append("<CmdType>Broadcast</CmdType>\r\n"); + broadcastXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + broadcastXml.append("<SourceID>" + sipConfig.getId() + "</SourceID>\r\n"); + broadcastXml.append("<TargetID>" + device.getDeviceId() + "</TargetID>\r\n"); + broadcastXml.append("</Notify>\r\n"); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); - /** - * 杩滅▼鍚姩鎺у埗鍛戒护 - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean teleBootCmd(Device device) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Control>\r\n"); - cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - cmdXml.append("<TeleBoot>Boot</TeleBoot>\r\n"); - cmdXml.append("</Control>\r\n"); + } - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } - - /** - * 鎶ヨ甯冮槻/鎾ら槻鍛戒护 - * - * @param device 瑙嗛璁惧 - * @param guardCmdStr "SetGuard"/"ResetGuard" - */ - @Override - public boolean guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Control>\r\n"); - cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - cmdXml.append("<GuardCmd>" + guardCmdStr + "</GuardCmd>\r\n"); - cmdXml.append("</Control>\r\n"); + /** + * 闊宠棰戝綍鍍忔帶鍒� + * + * @param device 瑙嗛璁惧 + * @param channelId 棰勮閫氶亾 + * @param recordCmdStr 褰曞儚鍛戒护锛歊ecord / StopRecord + */ + @Override + public void recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Control>\r\n"); + cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + if (ObjectUtils.isEmpty(channelId)) { + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + } else { + cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + } + cmdXml.append("<RecordCmd>" + recordCmdStr + "</RecordCmd>\r\n"); + cmdXml.append("</Control>\r\n"); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); + } - /** - * 鎶ヨ澶嶄綅鍛戒护 - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Control>\r\n"); - cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - cmdXml.append("<AlarmCmd>ResetAlarm</AlarmCmd>\r\n"); - if (!ObjectUtils.isEmpty(alarmMethod) || !ObjectUtils.isEmpty(alarmType)) { - cmdXml.append("<Info>\r\n"); - } - if (!ObjectUtils.isEmpty(alarmMethod)) { - cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); - } - if (!ObjectUtils.isEmpty(alarmType)) { - cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); - } - if (!ObjectUtils.isEmpty(alarmMethod) || !ObjectUtils.isEmpty(alarmType)) { - cmdXml.append("</Info>\r\n"); - } - cmdXml.append("</Control>\r\n"); + /** + * 杩滅▼鍚姩鎺у埗鍛戒护 + * + * @param device 瑙嗛璁惧 + */ + @Override + public void teleBootCmd(Device device) throws InvalidArgumentException, SipException, ParseException { - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Control>\r\n"); + cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + cmdXml.append("<TeleBoot>Boot</TeleBoot>\r\n"); + cmdXml.append("</Control>\r\n"); - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - /** - * 寮哄埗鍏抽敭甯у懡浠�,璁惧鏀跺埌姝ゅ懡浠ゅ簲绔嬪埢鍙戦�佷竴涓狪DR甯� - * - * @param device 瑙嗛璁惧 - * @param channelId 棰勮閫氶亾 - */ - @Override - public boolean iFrameCmd(Device device, String channelId) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Control>\r\n"); - cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (ObjectUtils.isEmpty(channelId)) { - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - } else { - cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - } - cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n"); - cmdXml.append("</Control>\r\n"); + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request); + } - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + /** + * 鎶ヨ甯冮槻/鎾ら槻鍛戒护 + * + * @param device 瑙嗛璁惧 + * @param guardCmdStr "SetGuard"/"ResetGuard" + */ + @Override + public void guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Control>\r\n"); + cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + cmdXml.append("<GuardCmd>" + guardCmdStr + "</GuardCmd>\r\n"); + cmdXml.append("</Control>\r\n"); - /** - * 鐪嬪畧浣嶆帶鍒跺懡浠� - * - * @param device 瑙嗛璁惧 - * @param enabled 鐪嬪畧浣嶄娇鑳斤細1 = 寮�鍚紝0 = 鍏抽棴 - * @param resetTime 鑷姩褰掍綅鏃堕棿闂撮殧锛屽紑鍚湅瀹堜綅鏃朵娇鐢紝鍗曚綅:绉�(s) - * @param presetIndex 璋冪敤棰勭疆浣嶇紪鍙凤紝寮�鍚湅瀹堜綅鏃朵娇鐢紝鍙栧�艰寖鍥�0~255 - */ - @Override - public boolean homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Control>\r\n"); - cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (ObjectUtils.isEmpty(channelId)) { - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - } else { - cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - } - cmdXml.append("<HomePosition>\r\n"); - if (NumericUtil.isInteger(enabled) && (!enabled.equals("0"))) { - cmdXml.append("<Enabled>1</Enabled>\r\n"); - if (NumericUtil.isInteger(resetTime)) { - cmdXml.append("<ResetTime>" + resetTime + "</ResetTime>\r\n"); - } else { - cmdXml.append("<ResetTime>0</ResetTime>\r\n"); - } - if (NumericUtil.isInteger(presetIndex)) { - cmdXml.append("<PresetIndex>" + presetIndex + "</PresetIndex>\r\n"); - } else { - cmdXml.append("<PresetIndex>0</PresetIndex>\r\n"); - } - } else { - cmdXml.append("<Enabled>0</Enabled>\r\n"); - } - cmdXml.append("</HomePosition>\r\n"); - cmdXml.append("</Control>\r\n"); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); + } + + /** + * 鎶ヨ澶嶄綅鍛戒护 + * + * @param device 瑙嗛璁惧 + */ + @Override + public void alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { + + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Control>\r\n"); + cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + cmdXml.append("<AlarmCmd>ResetAlarm</AlarmCmd>\r\n"); + if (!ObjectUtils.isEmpty(alarmMethod) || !ObjectUtils.isEmpty(alarmType)) { + cmdXml.append("<Info>\r\n"); + } + if (!ObjectUtils.isEmpty(alarmMethod)) { + cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); + } + if (!ObjectUtils.isEmpty(alarmType)) { + cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); + } + if (!ObjectUtils.isEmpty(alarmMethod) || !ObjectUtils.isEmpty(alarmType)) { + cmdXml.append("</Info>\r\n"); + } + cmdXml.append("</Control>\r\n"); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); + } + + /** + * 寮哄埗鍏抽敭甯у懡浠�,璁惧鏀跺埌姝ゅ懡浠ゅ簲绔嬪埢鍙戦�佷竴涓狪DR甯� + * + * @param device 瑙嗛璁惧 + * @param channelId 棰勮閫氶亾 + */ + @Override + public void iFrameCmd(Device device, String channelId) throws InvalidArgumentException, SipException, ParseException { + + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Control>\r\n"); + cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + if (ObjectUtils.isEmpty(channelId)) { + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + } else { + cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + } + cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n"); + cmdXml.append("</Control>\r\n"); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request); + } + + /** + * 鐪嬪畧浣嶆帶鍒跺懡浠� + * + * @param device 瑙嗛璁惧 + * @param enabled 鐪嬪畧浣嶄娇鑳斤細1 = 寮�鍚紝0 = 鍏抽棴 + * @param resetTime 鑷姩褰掍綅鏃堕棿闂撮殧锛屽紑鍚湅瀹堜綅鏃朵娇鐢紝鍗曚綅:绉�(s) + * @param presetIndex 璋冪敤棰勭疆浣嶇紪鍙凤紝寮�鍚湅瀹堜綅鏃朵娇鐢紝鍙栧�艰寖鍥�0~255 + */ + @Override + public void homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { + + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Control>\r\n"); + cmdXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + if (ObjectUtils.isEmpty(channelId)) { + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + } else { + cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + } + cmdXml.append("<HomePosition>\r\n"); + if (NumericUtil.isInteger(enabled) && (!enabled.equals("0"))) { + cmdXml.append("<Enabled>1</Enabled>\r\n"); + if (NumericUtil.isInteger(resetTime)) { + cmdXml.append("<ResetTime>" + resetTime + "</ResetTime>\r\n"); + } else { + cmdXml.append("<ResetTime>0</ResetTime>\r\n"); + } + if (NumericUtil.isInteger(presetIndex)) { + cmdXml.append("<PresetIndex>" + presetIndex + "</PresetIndex>\r\n"); + } else { + cmdXml.append("<PresetIndex>0</PresetIndex>\r\n"); + } + } else { + cmdXml.append("<Enabled>0</Enabled>\r\n"); + } + cmdXml.append("</HomePosition>\r\n"); + cmdXml.append("</Control>\r\n"); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); + } + + /** + * 璁惧閰嶇疆鍛戒护 + * + * @param device 瑙嗛璁惧 + */ + @Override + public void deviceConfigCmd(Device device) { + // TODO Auto-generated method stub + } + + /** + * 璁惧閰嶇疆鍛戒护锛歜asicParam + * + * @param device 瑙嗛璁惧 + * @param channelId 閫氶亾缂栫爜锛堝彲閫夛級 + * @param name 璁惧/閫氶亾鍚嶇О锛堝彲閫夛級 + * @param expiration 娉ㄥ唽杩囨湡鏃堕棿锛堝彲閫夛級 + * @param heartBeatInterval 蹇冭烦闂撮殧鏃堕棿锛堝彲閫夛級 + * @param heartBeatCount 蹇冭烦瓒呮椂娆℃暟锛堝彲閫夛級 + */ + @Override + public void deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, + String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { + + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Control>\r\n"); + cmdXml.append("<CmdType>DeviceConfig</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + if (ObjectUtils.isEmpty(channelId)) { + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + } else { + cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + } + cmdXml.append("<BasicParam>\r\n"); + if (!ObjectUtils.isEmpty(name)) { + cmdXml.append("<Name>" + name + "</Name>\r\n"); + } + if (NumericUtil.isInteger(expiration)) { + if (Integer.valueOf(expiration) > 0) { + cmdXml.append("<Expiration>" + expiration + "</Expiration>\r\n"); + } + } + if (NumericUtil.isInteger(heartBeatInterval)) { + if (Integer.valueOf(heartBeatInterval) > 0) { + cmdXml.append("<HeartBeatInterval>" + heartBeatInterval + "</HeartBeatInterval>\r\n"); + } + } + if (NumericUtil.isInteger(heartBeatCount)) { + if (Integer.valueOf(heartBeatCount) > 0) { + cmdXml.append("<HeartBeatCount>" + heartBeatCount + "</HeartBeatCount>\r\n"); + } + } + cmdXml.append("</BasicParam>\r\n"); + cmdXml.append("</Control>\r\n"); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); + } + + /** + * 鏌ヨ璁惧鐘舵�� + * + * @param device 瑙嗛璁惧 + */ + @Override + public void deviceStatusQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { + + String charset = device.getCharset(); + StringBuffer catalogXml = new StringBuffer(200); + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + catalogXml.append("<Query>\r\n"); + catalogXml.append("<CmdType>DeviceStatus</CmdType>\r\n"); + catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + catalogXml.append("</Query>\r\n"); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + + transmitRequest(device.getTransport(), request, errorEvent); + } + + /** + * 鏌ヨ璁惧淇℃伅 + * + * @param device 瑙嗛璁惧 + */ + @Override + public void deviceInfoQuery(Device device) throws InvalidArgumentException, SipException, ParseException { + + StringBuffer catalogXml = new StringBuffer(200); + String charset = device.getCharset(); + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + catalogXml.append("<Query>\r\n"); + catalogXml.append("<CmdType>DeviceInfo</CmdType>\r\n"); + catalogXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + catalogXml.append("</Query>\r\n"); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + + transmitRequest(device.getTransport(), request); + + } + + /** + * 鏌ヨ鐩綍鍒楄〃 + * + * @param device 瑙嗛璁惧 + */ + @Override + public void catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) throws SipException, InvalidArgumentException, ParseException { + + StringBuffer catalogXml = new StringBuffer(200); + String charset = device.getCharset(); + catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + catalogXml.append("<Query>\r\n"); + catalogXml.append(" <CmdType>Catalog</CmdType>\r\n"); + catalogXml.append(" <SN>" + sn + "</SN>\r\n"); + catalogXml.append(" <DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + catalogXml.append("</Query>\r\n"); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - /** - * 璁惧閰嶇疆鍛戒护 - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean deviceConfigCmd(Device device) { - // TODO Auto-generated method stub - return false; - } + transmitRequest(device.getTransport(), request, errorEvent); + } - /** - * 璁惧閰嶇疆鍛戒护锛歜asicParam - * - * @param device 瑙嗛璁惧 - * @param channelId 閫氶亾缂栫爜锛堝彲閫夛級 - * @param name 璁惧/閫氶亾鍚嶇О锛堝彲閫夛級 - * @param expiration 娉ㄥ唽杩囨湡鏃堕棿锛堝彲閫夛級 - * @param heartBeatInterval 蹇冭烦闂撮殧鏃堕棿锛堝彲閫夛級 - * @param heartBeatCount 蹇冭烦瓒呮椂娆℃暟锛堝彲閫夛級 - */ - @Override - public boolean deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, - String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Control>\r\n"); - cmdXml.append("<CmdType>DeviceConfig</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (ObjectUtils.isEmpty(channelId)) { - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - } else { - cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - } - cmdXml.append("<BasicParam>\r\n"); - if (!ObjectUtils.isEmpty(name)) { - cmdXml.append("<Name>" + name + "</Name>\r\n"); - } - if (NumericUtil.isInteger(expiration)) { - if (Integer.valueOf(expiration) > 0) { - cmdXml.append("<Expiration>" + expiration + "</Expiration>\r\n"); - } - } - if (NumericUtil.isInteger(heartBeatInterval)) { - if (Integer.valueOf(heartBeatInterval) > 0) { - cmdXml.append("<HeartBeatInterval>" + heartBeatInterval + "</HeartBeatInterval>\r\n"); - } - } - if (NumericUtil.isInteger(heartBeatCount)) { - if (Integer.valueOf(heartBeatCount) > 0) { - cmdXml.append("<HeartBeatCount>" + heartBeatCount + "</HeartBeatCount>\r\n"); - } - } - cmdXml.append("</BasicParam>\r\n"); - cmdXml.append("</Control>\r\n"); + /** + * 鏌ヨ褰曞儚淇℃伅 + * + * @param device 瑙嗛璁惧 + * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss + * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss + */ + @Override + public void recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { + if (secrecy == null) { + secrecy = 0; + } + if (type == null) { + type = "all"; + } - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + StringBuffer recordInfoXml = new StringBuffer(200); + String charset = device.getCharset(); + recordInfoXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + recordInfoXml.append("<Query>\r\n"); + recordInfoXml.append("<CmdType>RecordInfo</CmdType>\r\n"); + recordInfoXml.append("<SN>" + sn + "</SN>\r\n"); + recordInfoXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + if (startTime != null) { + recordInfoXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(startTime) + "</StartTime>\r\n"); + } + if (endTime != null) { + recordInfoXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(endTime) + "</EndTime>\r\n"); + } + if (secrecy != null) { + recordInfoXml.append("<Secrecy> " + secrecy + " </Secrecy>\r\n"); + } + if (type != null) { + // 澶у崕NVR瑕佹眰蹇呴』澧炲姞涓�涓�间负all鐨勬枃鏈厓绱犺妭鐐筎ype + recordInfoXml.append("<Type>" + type + "</Type>\r\n"); + } + recordInfoXml.append("</Query>\r\n"); - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - /** - * 鏌ヨ璁惧鐘舵�� - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean deviceStatusQuery(Device device, SipSubscribe.Event errorEvent) { - try { - String charset = device.getCharset(); - StringBuffer catalogXml = new StringBuffer(200); - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - catalogXml.append("<Query>\r\n"); - catalogXml.append("<CmdType>DeviceStatus</CmdType>\r\n"); - catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - catalogXml.append("</Query>\r\n"); + Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), + SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + transmitRequest(device.getTransport(), request, errorEvent, okEvent); + } - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + /** + * 鏌ヨ鎶ヨ淇℃伅 + * + * @param device 瑙嗛璁惧 + * @param startPriority 鎶ヨ璧峰绾у埆锛堝彲閫夛級 + * @param endPriority 鎶ヨ缁堟绾у埆锛堝彲閫夛級 + * @param alarmMethod 鎶ヨ鏂瑰紡鏉′欢锛堝彲閫夛級 + * @param alarmType 鎶ヨ绫诲瀷 + * @param startTime 鎶ヨ鍙戠敓璧峰鏃堕棿锛堝彲閫夛級 + * @param endTime 鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級 + * @return true = 鍛戒护鍙戦�佹垚鍔� + */ + @Override + public void alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod, String alarmType, + String startTime, String endTime, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - transmitRequest(device, request, errorEvent); - return true; - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Query>\r\n"); + cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + if (!ObjectUtils.isEmpty(startPriority)) { + cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n"); + } + if (!ObjectUtils.isEmpty(endPriority)) { + cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n"); + } + if (!ObjectUtils.isEmpty(alarmMethod)) { + cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); + } + if (!ObjectUtils.isEmpty(alarmType)) { + cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); + } + if (!ObjectUtils.isEmpty(startTime)) { + cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n"); + } + if (!ObjectUtils.isEmpty(endTime)) { + cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n"); + } + cmdXml.append("</Query>\r\n"); - /** - * 鏌ヨ璁惧淇℃伅 - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean deviceInfoQuery(Device device) { - try { - StringBuffer catalogXml = new StringBuffer(200); - String charset = device.getCharset(); - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - catalogXml.append("<Query>\r\n"); - catalogXml.append("<CmdType>DeviceInfo</CmdType>\r\n"); - catalogXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - catalogXml.append("</Query>\r\n"); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); + } - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + /** + * 鏌ヨ璁惧閰嶇疆 + * + * @param device 瑙嗛璁惧 + * @param channelId 閫氶亾缂栫爜锛堝彲閫夛級 + * @param configType 閰嶇疆绫诲瀷锛� + */ + @Override + public void deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - transmitRequest(device, request); - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Query>\r\n"); + cmdXml.append("<CmdType>ConfigDownload</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + if (ObjectUtils.isEmpty(channelId)) { + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + } else { + cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + } + cmdXml.append("<ConfigType>" + configType + "</ConfigType>\r\n"); + cmdXml.append("</Query>\r\n"); - /** - * 鏌ヨ鐩綍鍒楄〃 - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent) { - try { - StringBuffer catalogXml = new StringBuffer(200); - String charset = device.getCharset(); - catalogXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - catalogXml.append("<Query>\r\n"); - catalogXml.append(" <CmdType>Catalog</CmdType>\r\n"); - catalogXml.append(" <SN>" + sn + "</SN>\r\n"); - catalogXml.append(" <DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - catalogXml.append("</Query>\r\n"); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); + } - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + /** + * 鏌ヨ璁惧棰勭疆浣嶇疆 + * + * @param device 瑙嗛璁惧 + */ + @Override + public void presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - transmitRequest(device, request, errorEvent); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Query>\r\n"); + cmdXml.append("<CmdType>PresetQuery</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + if (ObjectUtils.isEmpty(channelId)) { + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + } else { + cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + } + cmdXml.append("</Query>\r\n"); - /** - * 鏌ヨ褰曞儚淇℃伅 - * - * @param device 瑙嗛璁惧 - * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss - * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss - */ - @Override - public boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { - if (secrecy == null) { - secrecy = 0; - } - if (type == null) { - type = "all"; - } - try { - StringBuffer recordInfoXml = new StringBuffer(200); - String charset = device.getCharset(); - recordInfoXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - recordInfoXml.append("<Query>\r\n"); - recordInfoXml.append("<CmdType>RecordInfo</CmdType>\r\n"); - recordInfoXml.append("<SN>" + sn + "</SN>\r\n"); - recordInfoXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - if (startTime != null) { - recordInfoXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(startTime) + "</StartTime>\r\n"); - } - if (endTime != null) { - recordInfoXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(endTime) + "</EndTime>\r\n"); - } - if (secrecy != null) { - recordInfoXml.append("<Secrecy> "+ secrecy + " </Secrecy>\r\n"); - } - if (type != null) { - // 澶у崕NVR瑕佹眰蹇呴』澧炲姞涓�涓�间负all鐨勬枃鏈厓绱犺妭鐐筎ype - recordInfoXml.append("<Type>" + type+"</Type>\r\n"); - } - recordInfoXml.append("</Query>\r\n"); - - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), - SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent); + } - transmitRequest(device, request, errorEvent, okEvent); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } + /** + * 鏌ヨ绉诲姩璁惧浣嶇疆鏁版嵁 + * + * @param device 瑙嗛璁惧 + */ + @Override + public void mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - /** - * 鏌ヨ鎶ヨ淇℃伅 - * - * @param device 瑙嗛璁惧 - * @param startPriority 鎶ヨ璧峰绾у埆锛堝彲閫夛級 - * @param endPriority 鎶ヨ缁堟绾у埆锛堝彲閫夛級 - * @param alarmMethod 鎶ヨ鏂瑰紡鏉′欢锛堝彲閫夛級 - * @param alarmType 鎶ヨ绫诲瀷 - * @param startTime 鎶ヨ鍙戠敓璧峰鏃堕棿锛堝彲閫夛級 - * @param endTime 鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級 - * @return true = 鍛戒护鍙戦�佹垚鍔� - */ - @Override - public boolean alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod, String alarmType, - String startTime, String endTime, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Query>\r\n"); - cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - if (!ObjectUtils.isEmpty(startPriority)) { - cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n"); - } - if (!ObjectUtils.isEmpty(endPriority)) { - cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n"); - } - if (!ObjectUtils.isEmpty(alarmMethod)) { - cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); - } - if (!ObjectUtils.isEmpty(alarmType)) { - cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); - } - if (!ObjectUtils.isEmpty(startTime)) { - cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n"); - } - if (!ObjectUtils.isEmpty(endTime)) { - cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n"); - } - cmdXml.append("</Query>\r\n"); - - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + StringBuffer mobilePostitionXml = new StringBuffer(200); + String charset = device.getCharset(); + mobilePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + mobilePostitionXml.append("<Query>\r\n"); + mobilePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n"); + mobilePostitionXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + mobilePostitionXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + mobilePostitionXml.append("<Interval>60</Interval>\r\n"); + mobilePostitionXml.append("</Query>\r\n"); - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - /** - * 鏌ヨ璁惧閰嶇疆 - * - * @param device 瑙嗛璁惧 - * @param channelId 閫氶亾缂栫爜锛堝彲閫夛級 - * @param configType 閰嶇疆绫诲瀷锛� - */ - @Override - public boolean deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Query>\r\n"); - cmdXml.append("<CmdType>ConfigDownload</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (ObjectUtils.isEmpty(channelId)) { - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - } else { - cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - } - cmdXml.append("<ConfigType>" + configType + "</ConfigType>\r\n"); - cmdXml.append("</Query>\r\n"); - - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + transmitRequest(device.getTransport(), request, errorEvent); - /** - * 鏌ヨ璁惧棰勭疆浣嶇疆 - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Query>\r\n"); - cmdXml.append("<CmdType>PresetQuery</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - if (ObjectUtils.isEmpty(channelId)) { - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - } else { - cmdXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - } - cmdXml.append("</Query>\r\n"); - - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + } - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request, errorEvent); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - } + /** + * 璁㈤槄銆佸彇娑堣闃呯Щ鍔ㄤ綅缃� + * + * @param device 瑙嗛璁惧 + * @return true = 鍛戒护鍙戦�佹垚鍔� + */ + @Override + public SIPRequest mobilePositionSubscribe(Device device, SIPRequest requestOld, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - /** - * 鏌ヨ绉诲姩璁惧浣嶇疆鏁版嵁 - * - * @param device 瑙嗛璁惧 - */ - @Override - public boolean mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent) { - try { - StringBuffer mobilePostitionXml = new StringBuffer(200); - String charset = device.getCharset(); - mobilePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - mobilePostitionXml.append("<Query>\r\n"); - mobilePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n"); - mobilePostitionXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - mobilePostitionXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - mobilePostitionXml.append("<Interval>60</Interval>\r\n"); - mobilePostitionXml.append("</Query>\r\n"); - - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + StringBuffer subscribePostitionXml = new StringBuffer(200); + String charset = device.getCharset(); + subscribePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + subscribePostitionXml.append("<Query>\r\n"); + subscribePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n"); + subscribePostitionXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + subscribePostitionXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + if (device.getSubscribeCycleForMobilePosition() > 0) { + subscribePostitionXml.append("<Interval>" + device.getMobilePositionSubmissionInterval() + "</Interval>\r\n"); + } + subscribePostitionXml.append("</Query>\r\n"); - Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + CallIdHeader callIdHeader; - transmitRequest(device, request, errorEvent); - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } + if (requestOld != null) { + callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId()); + } else { + callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + } + SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), requestOld, device.getSubscribeCycleForMobilePosition(), "presence", callIdHeader); //Position;id=" + tm.substring(tm.length() - 4)); - /** - * 璁㈤槄銆佸彇娑堣闃呯Щ鍔ㄤ綅缃� - * - * @param device 瑙嗛璁惧 - * @return true = 鍛戒护鍙戦�佹垚鍔� - */ - @Override - public SIPRequest mobilePositionSubscribe(Device device, SIPRequest requestOld, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent) { - try { - StringBuffer subscribePostitionXml = new StringBuffer(200); - String charset = device.getCharset(); - subscribePostitionXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - subscribePostitionXml.append("<Query>\r\n"); - subscribePostitionXml.append("<CmdType>MobilePosition</CmdType>\r\n"); - subscribePostitionXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - subscribePostitionXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - if (device.getSubscribeCycleForMobilePosition() > 0) { - subscribePostitionXml.append("<Interval>" + device.getMobilePositionSubmissionInterval() + "</Interval>\r\n"); - } - subscribePostitionXml.append("</Query>\r\n"); + transmitRequest(device.getTransport(), request, errorEvent, okEvent); + return request; + } - CallIdHeader callIdHeader; + /** + * 璁㈤槄銆佸彇娑堣闃呮姤璀︿俊鎭� + * + * @param device 瑙嗛璁惧 + * @param expires 璁㈤槄杩囨湡鏃堕棿锛�0 = 鍙栨秷璁㈤槄锛� + * @param startPriority 鎶ヨ璧峰绾у埆锛堝彲閫夛級 + * @param endPriority 鎶ヨ缁堟绾у埆锛堝彲閫夛級 + * @param alarmMethod 鎶ヨ鏂瑰紡鏉′欢锛堝彲閫夛級 + * @param alarmType 鎶ヨ绫诲瀷 + * @param startTime 鎶ヨ鍙戠敓璧峰鏃堕棿锛堝彲閫夛級 + * @param endTime 鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級 + * @return true = 鍛戒护鍙戦�佹垚鍔� + */ + @Override + public void alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime) throws InvalidArgumentException, SipException, ParseException { - if (requestOld != null) { - callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId()); - }else { - callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - } - SIPRequest request = (SIPRequest)headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), requestOld, device.getSubscribeCycleForMobilePosition(), "presence" ,callIdHeader); //Position;id=" + tm.substring(tm.length() - 4)); + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Query>\r\n"); + cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + if (!ObjectUtils.isEmpty(startPriority)) { + cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n"); + } + if (!ObjectUtils.isEmpty(endPriority)) { + cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n"); + } + if (!ObjectUtils.isEmpty(alarmMethod)) { + cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); + } + if (!ObjectUtils.isEmpty(alarmType)) { + cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); + } + if (!ObjectUtils.isEmpty(startTime)) { + cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n"); + } + if (!ObjectUtils.isEmpty(endTime)) { + cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n"); + } + cmdXml.append("</Query>\r\n"); - transmitRequest(device, request, errorEvent, okEvent); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - return request; + Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence", callIdHeader); + transmitRequest(device.getTransport(), request); - } catch ( NumberFormatException | ParseException | InvalidArgumentException | SipException e) { - e.printStackTrace(); - return null; - } - } + } - /** - * 璁㈤槄銆佸彇娑堣闃呮姤璀︿俊鎭� - * - * @param device 瑙嗛璁惧 - * @param expires 璁㈤槄杩囨湡鏃堕棿锛�0 = 鍙栨秷璁㈤槄锛� - * @param startPriority 鎶ヨ璧峰绾у埆锛堝彲閫夛級 - * @param endPriority 鎶ヨ缁堟绾у埆锛堝彲閫夛級 - * @param alarmMethod 鎶ヨ鏂瑰紡鏉′欢锛堝彲閫夛級 - * @param alarmType 鎶ヨ绫诲瀷 - * @param startTime 鎶ヨ鍙戠敓璧峰鏃堕棿锛堝彲閫夛級 - * @param endTime 鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級 - * @return true = 鍛戒护鍙戦�佹垚鍔� - */ - @Override - public boolean alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Query>\r\n"); - cmdXml.append("<CmdType>Alarm</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - if (!ObjectUtils.isEmpty(startPriority)) { - cmdXml.append("<StartAlarmPriority>" + startPriority + "</StartAlarmPriority>\r\n"); - } - if (!ObjectUtils.isEmpty(endPriority)) { - cmdXml.append("<EndAlarmPriority>" + endPriority + "</EndAlarmPriority>\r\n"); - } - if (!ObjectUtils.isEmpty(alarmMethod)) { - cmdXml.append("<AlarmMethod>" + alarmMethod + "</AlarmMethod>\r\n"); - } - if (!ObjectUtils.isEmpty(alarmType)) { - cmdXml.append("<AlarmType>" + alarmType + "</AlarmType>\r\n"); - } - if (!ObjectUtils.isEmpty(startTime)) { - cmdXml.append("<StartAlarmTime>" + startTime + "</StartAlarmTime>\r\n"); - } - if (!ObjectUtils.isEmpty(endTime)) { - cmdXml.append("<EndAlarmTime>" + endTime + "</EndAlarmTime>\r\n"); - } - cmdXml.append("</Query>\r\n"); + @Override + public SIPRequest catalogSubscribe(Device device, SIPRequest requestOld, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + StringBuffer cmdXml = new StringBuffer(200); + String charset = device.getCharset(); + cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + cmdXml.append("<Query>\r\n"); + cmdXml.append("<CmdType>Catalog</CmdType>\r\n"); + cmdXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + cmdXml.append("</Query>\r\n"); - Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence" , callIdHeader); - transmitRequest(device, request); + CallIdHeader callIdHeader; - return true; + if (requestOld != null) { + callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId()); + } else { + callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + } - } catch ( NumberFormatException | ParseException | InvalidArgumentException | SipException e) { - e.printStackTrace(); - return false; - } - } + // 鏈夋晥鏃堕棿榛樿涓�60绉掍互涓� + SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, cmdXml.toString(), requestOld, device.getSubscribeCycleForCatalog(), "Catalog", + callIdHeader); + transmitRequest(device.getTransport(), request, errorEvent, okEvent); + return request; + } - @Override - public SIPRequest catalogSubscribe(Device device, SIPRequest requestOld, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { - try { - StringBuffer cmdXml = new StringBuffer(200); - String charset = device.getCharset(); - cmdXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - cmdXml.append("<Query>\r\n"); - cmdXml.append("<CmdType>Catalog</CmdType>\r\n"); - cmdXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - cmdXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - cmdXml.append("</Query>\r\n"); + @Override + public void dragZoomCmd(Device device, String channelId, String cmdString) throws InvalidArgumentException, SipException, ParseException { - CallIdHeader callIdHeader ; + StringBuffer dragXml = new StringBuffer(200); + String charset = device.getCharset(); + dragXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); + dragXml.append("<Control>\r\n"); + dragXml.append("<CmdType>DeviceControl</CmdType>\r\n"); + dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + if (ObjectUtils.isEmpty(channelId)) { + dragXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); + } else { + dragXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); + } + dragXml.append(cmdString); + dragXml.append("</Control>\r\n"); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + logger.debug("鎷夋淇′护锛� " + request.toString()); + transmitRequest(device.getTransport(), request); + } - if (requestOld != null) { - callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId()); - }else { - callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - } - // 鏈夋晥鏃堕棿榛樿涓�60绉掍互涓� - SIPRequest request = (SIPRequest)headerProvider.createSubscribeRequest(device, cmdXml.toString(), requestOld, device.getSubscribeCycleForCatalog(), "Catalog" , - callIdHeader); - transmitRequest(device, request, errorEvent, okEvent); - return request; + @Override + public void transmitRequest(String transport, Request request) throws SipException, ParseException { + transmitRequest(transport, request, null, null); + } - } catch ( NumberFormatException | ParseException | InvalidArgumentException | SipException e) { - e.printStackTrace(); - return null; - } - } + @Override + public void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent) throws SipException, ParseException { + transmitRequest(transport, request, errorEvent, null); + } - @Override - public boolean dragZoomCmd(Device device, String channelId, String cmdString) { - try { - StringBuffer dragXml = new StringBuffer(200); - String charset = device.getCharset(); - dragXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); - dragXml.append("<Control>\r\n"); - dragXml.append("<CmdType>DeviceControl</CmdType>\r\n"); - dragXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); - if (ObjectUtils.isEmpty(channelId)) { - dragXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); - } else { - dragXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); - } - dragXml.append(cmdString); - dragXml.append("</Control>\r\n"); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - logger.debug("鎷夋淇′护锛� " + request.toString()); - transmitRequest(device, request); - return true; - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - return false; - } + @Override + public void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException { + if (request.getHeader(UserAgentHeader.NAME) == null) { + try { + request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); + } catch (ParseException e) { + logger.error("娣诲姞UserAgentHeader澶辫触", e); + } + } - private ClientTransaction transmitRequest(Device device, Request request) throws SipException { - return transmitRequest(device, request, null, null); - } + CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME); + // 娣诲姞閿欒璁㈤槄 + if (errorEvent != null) { + sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> { + errorEvent.response(eventResult); + sipSubscribe.removeErrorSubscribe(eventResult.callId); + sipSubscribe.removeOkSubscribe(eventResult.callId); + })); + } + // 娣诲姞璁㈤槄 + if (okEvent != null) { + sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> { + okEvent.response(eventResult); + sipSubscribe.removeOkSubscribe(eventResult.callId); + sipSubscribe.removeErrorSubscribe(eventResult.callId); + }); + } + if ("TCP".equals(transport)) { + tcpSipProvider.sendRequest(request); + } else if ("UDP".equals(transport)) { + udpSipProvider.sendRequest(request); + } - private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent) throws SipException { - return transmitRequest(device, request, errorEvent, null); - } + } - private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException { - ClientTransaction clientTransaction = null; - if("TCP".equals(device.getTransport())) { - clientTransaction = tcpSipProvider.getNewClientTransaction(request); - } else if("UDP".equals(device.getTransport())) { - clientTransaction = udpSipProvider.getNewClientTransaction(request); - } - if (request.getHeader(UserAgentHeader.NAME) == null) { - try { - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); - } catch (ParseException e) { - logger.error("娣诲姞UserAgentHeader澶辫触", e); - } - } - CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); - // 娣诲姞閿欒璁㈤槄 - if (errorEvent != null) { - sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> { - errorEvent.response(eventResult); - sipSubscribe.removeErrorSubscribe(eventResult.callId); - sipSubscribe.removeOkSubscribe(eventResult.callId); - })); - } - // 娣诲姞璁㈤槄 - if (okEvent != null) { - sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult ->{ - okEvent.response(eventResult); - sipSubscribe.removeOkSubscribe(eventResult.callId); - sipSubscribe.removeErrorSubscribe(eventResult.callId); - }); - } - clientTransaction.sendRequest(); - return clientTransaction; - } + /** + * 鍥炴斁鏆傚仠 + */ + @Override + public void playPauseCmd(Device device, StreamInfo streamInfo) throws InvalidArgumentException, ParseException, SipException { + StringBuffer content = new StringBuffer(200); + content.append("PAUSE RTSP/1.0\r\n"); + content.append("CSeq: " + getInfoCseq() + "\r\n"); + content.append("PauseTime: now\r\n"); - /** - * 鍥炴斁鏆傚仠 - */ - @Override - public void playPauseCmd(Device device, StreamInfo streamInfo) { - try { - StringBuffer content = new StringBuffer(200); - content.append("PAUSE RTSP/1.0\r\n"); - content.append("CSeq: " + getInfoCseq() + "\r\n"); - content.append("PauseTime: now\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); - if (request == null) { - return; - } - logger.info(request.toString()); - ClientTransaction clientTransaction = null; - if ("TCP".equals(device.getTransport())) { - clientTransaction = tcpSipProvider.getNewClientTransaction(request); - } else if ("UDP".equals(device.getTransport())) { - clientTransaction = udpSipProvider.getNewClientTransaction(request); - } - if (clientTransaction != null) { - clientTransaction.sendRequest(); - } + playbackControlCmd(device, streamInfo, content.toString(), null, null); + } - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } - /** - * 鍥炴斁鎭㈠ - */ - @Override - public void playResumeCmd(Device device, StreamInfo streamInfo) { - try { - StringBuffer content = new StringBuffer(200); - content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + getInfoCseq() + "\r\n"); - content.append("Range: npt=now-\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); - if (request == null) { - return; - } - logger.info(request.toString()); - ClientTransaction clientTransaction = null; - if ("TCP".equals(device.getTransport())) { - clientTransaction = tcpSipProvider.getNewClientTransaction(request); - } else if ("UDP".equals(device.getTransport())) { - clientTransaction = udpSipProvider.getNewClientTransaction(request); - } + /** + * 鍥炴斁鎭㈠ + */ + @Override + public void playResumeCmd(Device device, StreamInfo streamInfo) throws InvalidArgumentException, ParseException, SipException { + StringBuffer content = new StringBuffer(200); + content.append("PLAY RTSP/1.0\r\n"); + content.append("CSeq: " + getInfoCseq() + "\r\n"); + content.append("Range: npt=now-\r\n"); - clientTransaction.sendRequest(); + playbackControlCmd(device, streamInfo, content.toString(), null, null); + } - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } + /** + * 鍥炴斁鎷栧姩鎾斁 + */ + @Override + public void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) throws InvalidArgumentException, ParseException, SipException { + StringBuffer content = new StringBuffer(200); + content.append("PLAY RTSP/1.0\r\n"); + content.append("CSeq: " + getInfoCseq() + "\r\n"); + content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n"); - /** - * 鍥炴斁鎷栧姩鎾斁 - */ - @Override - public void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime) { - try { - StringBuffer content = new StringBuffer(200); - content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + getInfoCseq() + "\r\n"); - content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n"); + playbackControlCmd(device, streamInfo, content.toString(), null, null); + } - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); - if (request == null) { - return; - } - logger.info(request.toString()); - ClientTransaction clientTransaction = null; - if ("TCP".equals(device.getTransport())) { - clientTransaction = tcpSipProvider.getNewClientTransaction(request); - } else if ("UDP".equals(device.getTransport())) { - clientTransaction = udpSipProvider.getNewClientTransaction(request); - } + /** + * 鍥炴斁鍊嶉�熸挱鏀� + */ + @Override + public void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) throws InvalidArgumentException, ParseException, SipException { + StringBuffer content = new StringBuffer(200); + content.append("PLAY RTSP/1.0\r\n"); + content.append("CSeq: " + getInfoCseq() + "\r\n"); + content.append("Scale: " + String.format("%.6f", speed) + "\r\n"); - clientTransaction.sendRequest(); + playbackControlCmd(device, streamInfo, content.toString(), null, null); + } - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } + private int getInfoCseq() { + return (int) ((Math.random() * 9 + 1) * Math.pow(10, 8)); + } - /** - * 鍥炴斁鍊嶉�熸挱鏀� - */ - @Override - public void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed) { - try { + @Override + public void playbackControlCmd(Device device, StreamInfo streamInfo, String content, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, InvalidArgumentException, ParseException { - StringBuffer content = new StringBuffer(200); - content.append("PLAY RTSP/1.0\r\n"); - content.append("CSeq: " + getInfoCseq() + "\r\n"); - content.append("Scale: " + String.format("%.6f",speed) + "\r\n"); - Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString()); - if (request == null) { - return; - } - logger.info(request.toString()); - ClientTransaction clientTransaction = null; - if ("TCP".equals(device.getTransport())) { - clientTransaction = tcpSipProvider.getNewClientTransaction(request); - } else if ("UDP".equals(device.getTransport())) { - clientTransaction = udpSipProvider.getNewClientTransaction(request); - } + SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(device.getDeviceId(), streamInfo.getChannelId(), null, streamInfo.getStream()); + if (ssrcTransaction == null) { + logger.info("[鍥炴斁鎺у埗]鏈壘鍒拌棰戞祦淇℃伅锛岃澶囷細{}, 娴両D: {}", device.getDeviceId(), streamInfo.getStream()); + return; + } - clientTransaction.sendRequest(); + SIPRequest request = headerProvider.createInfoRequest(device, streamInfo.getChannelId(), content.toString(), ssrcTransaction.getSipTransactionInfo()); + if (request == null) { + logger.info("[鍥炴斁鎺у埗]鏋勫缓Request淇℃伅澶辫触锛岃澶囷細{}, 娴両D: {}", device.getDeviceId(), streamInfo.getStream()); + return; + } - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } + transmitRequest(device.getTransport(), request, errorEvent, okEvent); + } - private int getInfoCseq() { - return (int) ((Math.random() * 9 + 1) * Math.pow(10, 8)); - } - - @Override - public void playbackControlCmd(Device device, StreamInfo streamInfo, String content,SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) { - try { - Request request = headerProvider.createInfoRequest(device, streamInfo, content); - if (request == null) { - return; - } - ClientTransaction clientTransaction = null; - if ("TCP".equals(device.getTransport())) { - clientTransaction = tcpSipProvider.getNewClientTransaction(request); - } else if ("UDP".equals(device.getTransport())) { - clientTransaction = udpSipProvider.getNewClientTransaction(request); - } - CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME); - if(errorEvent != null) { - sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> { - errorEvent.response(eventResult); - sipSubscribe.removeErrorSubscribe(eventResult.callId); - sipSubscribe.removeOkSubscribe(eventResult.callId); - })); - } - - if(okEvent != null) { - sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> { - okEvent.response(eventResult); - sipSubscribe.removeOkSubscribe(eventResult.callId); - sipSubscribe.removeErrorSubscribe(eventResult.callId); - }); - } - clientTransaction.sendRequest(); - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - } - } + @Override + public void sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) throws InvalidArgumentException, SipException, ParseException { + if (device == null) { + return; + } + logger.info("[鍙戦�� 鎶ヨ閫氱煡] {}/{}->{},{}", device.getDeviceId(), deviceAlarm.getChannelId(), + deviceAlarm.getLongitude(), deviceAlarm.getLatitude()); - @Override - public boolean sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) { - if (device == null) { - return false; - } - logger.info("[鍙戦�� 鎶ヨ閫氱煡] {}/{}->{},{}", device.getDeviceId(), deviceAlarm.getChannelId(), - deviceAlarm.getLongitude(), deviceAlarm.getLatitude()); - try { - String characterSet = device.getCharset(); - StringBuffer deviceStatusXml = new StringBuffer(600); - deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); - deviceStatusXml.append("<Notify>\r\n"); - deviceStatusXml.append("<CmdType>Alarm</CmdType>\r\n"); - deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - deviceStatusXml.append("<DeviceID>" + deviceAlarm.getChannelId() + "</DeviceID>\r\n"); - deviceStatusXml.append("<AlarmPriority>" + deviceAlarm.getAlarmPriority() + "</AlarmPriority>\r\n"); - deviceStatusXml.append("<AlarmMethod>" + deviceAlarm.getAlarmMethod() + "</AlarmMethod>\r\n"); - deviceStatusXml.append("<AlarmTime>" + deviceAlarm.getAlarmTime() + "</AlarmTime>\r\n"); - deviceStatusXml.append("<AlarmDescription>" + deviceAlarm.getAlarmDescription() + "</AlarmDescription>\r\n"); - deviceStatusXml.append("<Longitude>" + deviceAlarm.getLongitude() + "</Longitude>\r\n"); - deviceStatusXml.append("<Latitude>" + deviceAlarm.getLatitude() + "</Latitude>\r\n"); - deviceStatusXml.append("<info>\r\n"); - deviceStatusXml.append("<AlarmType>" + deviceAlarm.getAlarmType() + "</AlarmType>\r\n"); - deviceStatusXml.append("</info>\r\n"); - deviceStatusXml.append("</Notify>\r\n"); + String characterSet = device.getCharset(); + StringBuffer deviceStatusXml = new StringBuffer(600); + deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + deviceStatusXml.append("<Notify>\r\n"); + deviceStatusXml.append("<CmdType>Alarm</CmdType>\r\n"); + deviceStatusXml.append("<SN>" + (int) ((Math.random() * 9 + 1) * 100000) + "</SN>\r\n"); + deviceStatusXml.append("<DeviceID>" + deviceAlarm.getChannelId() + "</DeviceID>\r\n"); + deviceStatusXml.append("<AlarmPriority>" + deviceAlarm.getAlarmPriority() + "</AlarmPriority>\r\n"); + deviceStatusXml.append("<AlarmMethod>" + deviceAlarm.getAlarmMethod() + "</AlarmMethod>\r\n"); + deviceStatusXml.append("<AlarmTime>" + deviceAlarm.getAlarmTime() + "</AlarmTime>\r\n"); + deviceStatusXml.append("<AlarmDescription>" + deviceAlarm.getAlarmDescription() + "</AlarmDescription>\r\n"); + deviceStatusXml.append("<Longitude>" + deviceAlarm.getLongitude() + "</Longitude>\r\n"); + deviceStatusXml.append("<Latitude>" + deviceAlarm.getLatitude() + "</Latitude>\r\n"); + deviceStatusXml.append("<info>\r\n"); + deviceStatusXml.append("<AlarmType>" + deviceAlarm.getAlarmType() + "</AlarmType>\r\n"); + deviceStatusXml.append("</info>\r\n"); + deviceStatusXml.append("</Notify>\r\n"); - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); - transmitRequest(device, request); + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); + transmitRequest(device.getTransport(), request); - } catch (SipException | ParseException e) { - e.printStackTrace(); - return false; - } catch (InvalidArgumentException e) { - throw new RuntimeException(e); - } - return true; - } + } } 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 a15940d..bfc1ea9 100644 --- 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 @@ -13,12 +13,13 @@ import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.utils.GitUtil; import com.genersoft.iot.vmp.utils.SerializeUtils; +import gov.nist.javax.sip.SIPConstants; import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; import gov.nist.javax.sip.message.MessageFactoryImpl; import gov.nist.javax.sip.message.SIPRequest; -import gov.nist.javax.sip.stack.SIPDialog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -26,17 +27,15 @@ import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.Lazy; import org.springframework.lang.Nullable; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import javax.sip.*; -import javax.sip.address.SipURI; import javax.sip.header.*; import javax.sip.message.Request; -import java.lang.reflect.Field; import java.text.ParseException; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; @Component @@ -77,19 +76,18 @@ private SubscribeHolder subscribeHolder; @Override - public boolean register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) { - return register(parentPlatform, null, null, errorEvent, okEvent, false, true); + public void register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException { + register(parentPlatform, null, null, errorEvent, okEvent, false, true); } @Override - public boolean unregister(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) { - return register(parentPlatform, null, null, errorEvent, okEvent, false, false); + public void unregister(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException { + register(parentPlatform, null, null, errorEvent, okEvent, false, false); } @Override - public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable WWWAuthenticateHeader www, - SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister) { - try { + public void register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable WWWAuthenticateHeader www, + SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister) throws SipException, InvalidArgumentException, ParseException { Request request; if (!registerAgain ) { CallIdHeader callIdHeader = null; @@ -126,23 +124,10 @@ } transmitRequest(parentPlatform, request, null, okEvent); - return true; - } catch (ParseException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (PeerUnavailableException e) { - e.printStackTrace(); - } catch (SipException e) { - e.printStackTrace(); - } - return false; } @Override - public String keepalive(ParentPlatform parentPlatform,SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) { - String callId = null; - try { + public String keepalive(ParentPlatform parentPlatform,SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException, InvalidArgumentException, ParseException { String characterSet = parentPlatform.getCharacterSet(); StringBuffer keepaliveXml = new StringBuffer(200); keepaliveXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); @@ -163,11 +148,7 @@ SipUtils.getNewViaTag(), callIdHeader); transmitRequest(parentPlatform, request, errorEvent, okEvent); - callId = callIdHeader.getCallId(); - } catch (ParseException | InvalidArgumentException | SipException e) { - e.printStackTrace(); - } - return callId; + return callIdHeader.getCallId(); } private void transmitRequest(ParentPlatform parentPlatform, Request request) throws SipException { @@ -206,39 +187,32 @@ * @return */ @Override - public boolean catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size) { + public void catalogQuery(DeviceChannel channel, ParentPlatform parentPlatform, String sn, String fromTag, int size) throws SipException, InvalidArgumentException, ParseException { if ( parentPlatform ==null) { - return false; + return ; } - try { - List<DeviceChannel> channels = new ArrayList<>(); - if (channel != null) { - channels.add(channel); - } - String catalogXml = getCatalogXml(channels, sn, parentPlatform, size); - - // callid - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - - Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); - transmitRequest(parentPlatform, request); - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; + List<DeviceChannel> channels = new ArrayList<>(); + if (channel != null) { + channels.add(channel); } - return true; + String catalogXml = getCatalogXml(channels, sn, parentPlatform, size); + + // callid + CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); + transmitRequest(parentPlatform, request); + } @Override - public boolean catalogQuery(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag) { + public void catalogQuery(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag) throws InvalidArgumentException, ParseException, SipException { if ( parentPlatform ==null) { - return false; + return ; } sendCatalogResponse(channels, parentPlatform, sn, fromTag, 0); - return true; } private String getCatalogXml(List<DeviceChannel> channels, String sn, ParentPlatform parentPlatform, int size) { String characterSet = parentPlatform.getCharacterSet(); @@ -300,30 +274,30 @@ return catalogXml.toString(); } - private void sendCatalogResponse(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag, int index) { + private void sendCatalogResponse(List<DeviceChannel> channels, ParentPlatform parentPlatform, String sn, String fromTag, int index) throws SipException, InvalidArgumentException, ParseException { if (index >= channels.size()) { return; } - try { - List<DeviceChannel> deviceChannels; - if (index + parentPlatform.getCatalogGroup() < channels.size()) { - deviceChannels = channels.subList(index, index + parentPlatform.getCatalogGroup()); - }else { - deviceChannels = channels.subList(index, channels.size()); - } - String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size()); - // callid - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - - Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, SipUtils.getNewViaTag(), callIdHeader); - transmitRequest(parentPlatform, request, null, eventResult -> { - int indexNext = index + parentPlatform.getCatalogGroup(); - sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext); - }); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); + List<DeviceChannel> deviceChannels; + if (index + parentPlatform.getCatalogGroup() < channels.size()) { + deviceChannels = channels.subList(index, index + parentPlatform.getCatalogGroup()); + }else { + deviceChannels = channels.subList(index, channels.size()); } + String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size()); + // callid + CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, SipUtils.getNewViaTag(), callIdHeader); + transmitRequest(parentPlatform, request, null, eventResult -> { + int indexNext = index + parentPlatform.getCatalogGroup(); + try { + sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鐩綍鏌ヨ鍥炲: {}", e.getMessage()); + } + }); } /** @@ -334,36 +308,29 @@ * @return */ @Override - public boolean deviceInfoResponse(ParentPlatform parentPlatform, String sn, String fromTag) { + public void deviceInfoResponse(ParentPlatform parentPlatform, String sn, String fromTag) throws SipException, InvalidArgumentException, ParseException { if (parentPlatform == null) { - return false; + return; } - try { - String characterSet = parentPlatform.getCharacterSet(); - StringBuffer deviceInfoXml = new StringBuffer(600); - deviceInfoXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); - deviceInfoXml.append("<Response>\r\n"); - deviceInfoXml.append("<CmdType>DeviceInfo</CmdType>\r\n"); - deviceInfoXml.append("<SN>" +sn + "</SN>\r\n"); - deviceInfoXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n"); - deviceInfoXml.append("<DeviceName>" + parentPlatform.getName() + "</DeviceName>\r\n"); - deviceInfoXml.append("<Manufacturer>wvp</Manufacturer>\r\n"); - deviceInfoXml.append("<Model>wvp-28181-2.0</Model>\r\n"); - deviceInfoXml.append("<Firmware>2.0.202107</Firmware>\r\n"); - deviceInfoXml.append("<Result>OK</Result>\r\n"); - deviceInfoXml.append("</Response>\r\n"); + String characterSet = parentPlatform.getCharacterSet(); + StringBuffer deviceInfoXml = new StringBuffer(600); + deviceInfoXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + deviceInfoXml.append("<Response>\r\n"); + deviceInfoXml.append("<CmdType>DeviceInfo</CmdType>\r\n"); + deviceInfoXml.append("<SN>" +sn + "</SN>\r\n"); + deviceInfoXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n"); + deviceInfoXml.append("<DeviceName>" + parentPlatform.getName() + "</DeviceName>\r\n"); + deviceInfoXml.append("<Manufacturer>wvp</Manufacturer>\r\n"); + deviceInfoXml.append("<Model>wvp-28181-2.0</Model>\r\n"); + deviceInfoXml.append("<Firmware>2.0.202107</Firmware>\r\n"); + deviceInfoXml.append("<Result>OK</Result>\r\n"); + deviceInfoXml.append("</Response>\r\n"); - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); - transmitRequest(parentPlatform, request); - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; + Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); + transmitRequest(parentPlatform, request); } /** @@ -374,129 +341,103 @@ * @return */ @Override - public boolean deviceStatusResponse(ParentPlatform parentPlatform, String sn, String fromTag) { + public void deviceStatusResponse(ParentPlatform parentPlatform, String sn, String fromTag) throws SipException, InvalidArgumentException, ParseException { if (parentPlatform == null) { - return false; + return ; } - try { - String characterSet = parentPlatform.getCharacterSet(); - StringBuffer deviceStatusXml = new StringBuffer(600); - deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); - deviceStatusXml.append("<Response>\r\n"); - deviceStatusXml.append("<CmdType>DeviceStatus</CmdType>\r\n"); - deviceStatusXml.append("<SN>" +sn + "</SN>\r\n"); - deviceStatusXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n"); - deviceStatusXml.append("<Result>OK</Result>\r\n"); - deviceStatusXml.append("<Online>ONLINE</Online>\r\n"); - deviceStatusXml.append("<Status>OK</Status>\r\n"); - deviceStatusXml.append("</Response>\r\n"); + String characterSet = parentPlatform.getCharacterSet(); + StringBuffer deviceStatusXml = new StringBuffer(600); + deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + deviceStatusXml.append("<Response>\r\n"); + deviceStatusXml.append("<CmdType>DeviceStatus</CmdType>\r\n"); + deviceStatusXml.append("<SN>" +sn + "</SN>\r\n"); + deviceStatusXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n"); + deviceStatusXml.append("<Result>OK</Result>\r\n"); + deviceStatusXml.append("<Online>ONLINE</Online>\r\n"); + deviceStatusXml.append("<Status>OK</Status>\r\n"); + deviceStatusXml.append("</Response>\r\n"); - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); - transmitRequest(parentPlatform, request); + Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); + transmitRequest(parentPlatform, request); - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; } @Override - public boolean sendNotifyMobilePosition(ParentPlatform parentPlatform, GPSMsgInfo gpsMsgInfo, SubscribeInfo subscribeInfo) { + public void sendNotifyMobilePosition(ParentPlatform parentPlatform, GPSMsgInfo gpsMsgInfo, SubscribeInfo subscribeInfo) throws InvalidArgumentException, ParseException, NoSuchFieldException, SipException, IllegalAccessException { if (parentPlatform == null) { - return false; + return; } if (logger.isDebugEnabled()) { logger.debug("[鍙戦�� 绉诲姩浣嶇疆璁㈤槄] {}/{}->{},{}", parentPlatform.getServerGBId(), gpsMsgInfo.getId(), gpsMsgInfo.getLng(), gpsMsgInfo.getLat()); } - try { - String characterSet = parentPlatform.getCharacterSet(); - StringBuffer deviceStatusXml = new StringBuffer(600); - deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); - deviceStatusXml.append("<Notify>\r\n"); - deviceStatusXml.append("<CmdType>MobilePosition</CmdType>\r\n"); - deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - deviceStatusXml.append("<DeviceID>" + gpsMsgInfo.getId() + "</DeviceID>\r\n"); - deviceStatusXml.append("<Time>" + gpsMsgInfo.getTime() + "</Time>\r\n"); - deviceStatusXml.append("<Longitude>" + gpsMsgInfo.getLng() + "</Longitude>\r\n"); - deviceStatusXml.append("<Latitude>" + gpsMsgInfo.getLat() + "</Latitude>\r\n"); - deviceStatusXml.append("<Speed>" + gpsMsgInfo.getSpeed() + "</Speed>\r\n"); - deviceStatusXml.append("<Direction>" + gpsMsgInfo.getDirection() + "</Direction>\r\n"); - deviceStatusXml.append("<Altitude>" + gpsMsgInfo.getAltitude() + "</Altitude>\r\n"); - deviceStatusXml.append("</Notify>\r\n"); + String characterSet = parentPlatform.getCharacterSet(); + StringBuffer deviceStatusXml = new StringBuffer(600); + deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + deviceStatusXml.append("<Notify>\r\n"); + deviceStatusXml.append("<CmdType>MobilePosition</CmdType>\r\n"); + deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); + deviceStatusXml.append("<DeviceID>" + gpsMsgInfo.getId() + "</DeviceID>\r\n"); + deviceStatusXml.append("<Time>" + gpsMsgInfo.getTime() + "</Time>\r\n"); + deviceStatusXml.append("<Longitude>" + gpsMsgInfo.getLng() + "</Longitude>\r\n"); + deviceStatusXml.append("<Latitude>" + gpsMsgInfo.getLat() + "</Latitude>\r\n"); + deviceStatusXml.append("<Speed>" + gpsMsgInfo.getSpeed() + "</Speed>\r\n"); + deviceStatusXml.append("<Direction>" + gpsMsgInfo.getDirection() + "</Direction>\r\n"); + deviceStatusXml.append("<Altitude>" + gpsMsgInfo.getAltitude() + "</Altitude>\r\n"); + deviceStatusXml.append("</Notify>\r\n"); - sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> { - logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg); - }, null); + sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> { + logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg); + }, null); - } catch (SipException | ParseException e) { - e.printStackTrace(); - return false; - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } - return true; } @Override - public boolean sendAlarmMessage(ParentPlatform parentPlatform, DeviceAlarm deviceAlarm) { + public void sendAlarmMessage(ParentPlatform parentPlatform, DeviceAlarm deviceAlarm) throws SipException, InvalidArgumentException, ParseException { if (parentPlatform == null) { - return false; + return; } logger.info("[鍙戦�佹姤璀﹂�氱煡] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSONObject.toJSON(deviceAlarm)); - try { - String characterSet = parentPlatform.getCharacterSet(); - StringBuffer deviceStatusXml = new StringBuffer(600); - deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); - deviceStatusXml.append("<Notify>\r\n"); - deviceStatusXml.append("<CmdType>Alarm</CmdType>\r\n"); - deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - deviceStatusXml.append("<DeviceID>" + deviceAlarm.getChannelId() + "</DeviceID>\r\n"); - deviceStatusXml.append("<AlarmPriority>" + deviceAlarm.getAlarmPriority() + "</AlarmPriority>\r\n"); - deviceStatusXml.append("<AlarmMethod>" + deviceAlarm.getAlarmMethod() + "</AlarmMethod>\r\n"); - deviceStatusXml.append("<AlarmTime>" + deviceAlarm.getAlarmTime() + "</AlarmTime>\r\n"); - deviceStatusXml.append("<AlarmDescription>" + deviceAlarm.getAlarmDescription() + "</AlarmDescription>\r\n"); - deviceStatusXml.append("<Longitude>" + deviceAlarm.getLongitude() + "</Longitude>\r\n"); - deviceStatusXml.append("<Latitude>" + deviceAlarm.getLatitude() + "</Latitude>\r\n"); - deviceStatusXml.append("<info>\r\n"); - deviceStatusXml.append("<AlarmType>" + deviceAlarm.getAlarmType() + "</AlarmType>\r\n"); - deviceStatusXml.append("</info>\r\n"); - deviceStatusXml.append("</Notify>\r\n"); + String characterSet = parentPlatform.getCharacterSet(); + StringBuffer deviceStatusXml = new StringBuffer(600); + deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + deviceStatusXml.append("<Notify>\r\n"); + deviceStatusXml.append("<CmdType>Alarm</CmdType>\r\n"); + deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); + deviceStatusXml.append("<DeviceID>" + deviceAlarm.getChannelId() + "</DeviceID>\r\n"); + deviceStatusXml.append("<AlarmPriority>" + deviceAlarm.getAlarmPriority() + "</AlarmPriority>\r\n"); + deviceStatusXml.append("<AlarmMethod>" + deviceAlarm.getAlarmMethod() + "</AlarmMethod>\r\n"); + deviceStatusXml.append("<AlarmTime>" + deviceAlarm.getAlarmTime() + "</AlarmTime>\r\n"); + deviceStatusXml.append("<AlarmDescription>" + deviceAlarm.getAlarmDescription() + "</AlarmDescription>\r\n"); + deviceStatusXml.append("<Longitude>" + deviceAlarm.getLongitude() + "</Longitude>\r\n"); + deviceStatusXml.append("<Latitude>" + deviceAlarm.getLatitude() + "</Latitude>\r\n"); + deviceStatusXml.append("<info>\r\n"); + deviceStatusXml.append("<AlarmType>" + deviceAlarm.getAlarmType() + "</AlarmType>\r\n"); + deviceStatusXml.append("</info>\r\n"); + deviceStatusXml.append("</Notify>\r\n"); - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); + CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); - Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader); - transmitRequest(parentPlatform, request); + Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader); + transmitRequest(parentPlatform, request); - } catch (SipException | ParseException e) { - e.printStackTrace(); - return false; - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } - return true; } @Override - public boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, SubscribeInfo subscribeInfo, Integer index) { + public void sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, SubscribeInfo subscribeInfo, Integer index) throws InvalidArgumentException, ParseException, NoSuchFieldException, SipException, IllegalAccessException { if (parentPlatform == null || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) { - return false; + return; } if (index == null) { index = 0; } if (index >= deviceChannels.size()) { - return true; + return; } List<DeviceChannel> channels; if (index + parentPlatform.getCatalogGroup() < deviceChannels.size()) { @@ -504,32 +445,25 @@ }else { channels = deviceChannels.subList(index, deviceChannels.size()); } - try { - Integer finalIndex = index; - String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channels, - deviceChannels.size(), type, subscribeInfo); - sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> { - logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg); - }, (eventResult -> { + Integer finalIndex = index; + String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channels, + deviceChannels.size(), type, subscribeInfo); + sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> { + logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg); + }, (eventResult -> { + try { sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + parentPlatform.getCatalogGroup()); - })); - } catch (SipException | ParseException e) { - e.printStackTrace(); - return false; - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } - return true; + } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException | + IllegalAccessException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 NOTIFY閫氱煡: {}", e.getMessage()); + } + })); } - private ClientTransaction sendNotify(ParentPlatform parentPlatform, String catalogXmlContent, + private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent, SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent ) - throws NoSuchFieldException, IllegalAccessException, SipException, ParseException, InvalidArgumentException { + throws SipException, ParseException, InvalidArgumentException { MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); String characterSet = parentPlatform.getCharacterSet(); // 璁剧疆缂栫爜锛� 闃叉涓枃涔辩爜 @@ -537,50 +471,7 @@ SIPRequest notifyRequest = headerProviderPlatformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, subscribeInfo); - notifyRequest.getCSeqHeader().setSeqNumber(redisCatchStorage.getCSEQ()); - - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); - notifyRequest.setContent(catalogXmlContent, contentTypeHeader); - - SubscriptionStateHeader subscriptionState = sipFactory.createHeaderFactory() - .createSubscriptionStateHeader(SubscriptionStateHeader.ACTIVE); - notifyRequest.addHeader(subscriptionState); - - EventHeader event = sipFactory.createHeaderFactory().createEventHeader(subscribeInfo.getEventType()); - if (subscribeInfo.getEventId() != null) { - event.setEventId(subscribeInfo.getEventId()); - } - notifyRequest.addHeader(event); - SipURI sipURI = (SipURI) notifyRequest.getRequestURI(); - sipURI.setHost(parentPlatform.getServerIP()); - sipURI.setPort(parentPlatform.getServerPort()); - -// ClientTransaction transaction = subscribeInfo.getClientTransaction(); -// if (transaction == null || transaction.getState().equals(TransactionState.COMPLETED)) { -// if ("TCP".equals(parentPlatform.getTransport())) { -// transaction = tcpSipProvider.getNewClientTransaction(notifyRequest); -// } else if ("UDP".equals(parentPlatform.getTransport())) { -// transaction = udpSipProvider.getNewClientTransaction(notifyRequest); -// } -// } - - ClientTransaction transaction = null; - if ("TCP".equals(parentPlatform.getTransport())) { - transaction = tcpSipProvider.getNewClientTransaction(notifyRequest); - } else if ("UDP".equals(parentPlatform.getTransport())) { - transaction = udpSipProvider.getNewClientTransaction(notifyRequest); - } - - // 娣诲姞閿欒璁㈤槄 - if (errorEvent != null) { - sipSubscribe.addErrorSubscribe(subscribeInfo.getRequest().getCallIdHeader().getCallId(), errorEvent); - } - // 娣诲姞璁㈤槄 - if (okEvent != null) { - sipSubscribe.addOkSubscribe(subscribeInfo.getRequest().getCallIdHeader().getCallId(), okEvent); - } - transaction.sendRequest(); - return transaction; + transmitRequest(parentPlatform, notifyRequest); } private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) { @@ -639,20 +530,21 @@ } @Override - public boolean sendNotifyForCatalogOther(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, - SubscribeInfo subscribeInfo, Integer index) { + public void sendNotifyForCatalogOther(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, + SubscribeInfo subscribeInfo, Integer index) throws InvalidArgumentException, ParseException, NoSuchFieldException, SipException, IllegalAccessException { if (parentPlatform == null || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) { - return false; + logger.warn("[缂哄皯蹇呰鍙傛暟]"); + return; } if (index == null) { index = 0; } if (index >= deviceChannels.size()) { - return true; + return; } List<DeviceChannel> channels; if (index + parentPlatform.getCatalogGroup() < deviceChannels.size()) { @@ -660,28 +552,19 @@ }else { channels = deviceChannels.subList(index, deviceChannels.size()); } - try { - Integer finalIndex = index; - String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, channels, type); - sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> { - logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg); - }, (eventResult -> { + Integer finalIndex = index; + String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, channels, type); + sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> { + logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg); + }, eventResult -> { + try { sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + parentPlatform.getCatalogGroup()); - })); - } catch (SipException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } - - return true; + } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException | + IllegalAccessException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 NOTIFY閫氱煡: {}", e.getMessage()); + } + }); } private String getCatalogXmlContentForCatalogOther(ParentPlatform parentPlatform, List<DeviceChannel> channels, String type) { @@ -711,113 +594,81 @@ return catalogXml.toString(); } @Override - public boolean recordInfo(DeviceChannel deviceChannel, ParentPlatform parentPlatform, String fromTag, RecordInfo recordInfo) { + public void recordInfo(DeviceChannel deviceChannel, ParentPlatform parentPlatform, String fromTag, RecordInfo recordInfo) throws SipException, InvalidArgumentException, ParseException { if ( parentPlatform ==null) { - return false; + return ; } - try { - String characterSet = parentPlatform.getCharacterSet(); - StringBuffer recordXml = new StringBuffer(600); - recordXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); - recordXml.append("<Response>\r\n"); - recordXml.append("<CmdType>RecordInfo</CmdType>\r\n"); - recordXml.append("<SN>" +recordInfo.getSn() + "</SN>\r\n"); - recordXml.append("<DeviceID>" + recordInfo.getDeviceId() + "</DeviceID>\r\n"); - recordXml.append("<SumNum>" + recordInfo.getSumNum() + "</SumNum>\r\n"); - if (recordInfo.getRecordList() == null ) { - recordXml.append("<RecordList Num=\"0\">\r\n"); - }else { - recordXml.append("<RecordList Num=\"" + recordInfo.getRecordList().size()+"\">\r\n"); - if (recordInfo.getRecordList().size() > 0) { - for (RecordItem recordItem : recordInfo.getRecordList()) { - recordXml.append("<Item>\r\n"); - if (deviceChannel != null) { - recordXml.append("<DeviceID>" + recordItem.getDeviceId() + "</DeviceID>\r\n"); - recordXml.append("<Name>" + recordItem.getName() + "</Name>\r\n"); - recordXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(recordItem.getStartTime()) + "</StartTime>\r\n"); - recordXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(recordItem.getEndTime()) + "</EndTime>\r\n"); - recordXml.append("<Secrecy>" + recordItem.getSecrecy() + "</Secrecy>\r\n"); - recordXml.append("<Type>" + recordItem.getType() + "</Type>\r\n"); - if (!ObjectUtils.isEmpty(recordItem.getFileSize())) { - recordXml.append("<FileSize>" + recordItem.getFileSize() + "</FileSize>\r\n"); - } - if (!ObjectUtils.isEmpty(recordItem.getFilePath())) { - recordXml.append("<FilePath>" + recordItem.getFilePath() + "</FilePath>\r\n"); - } + String characterSet = parentPlatform.getCharacterSet(); + StringBuffer recordXml = new StringBuffer(600); + recordXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + recordXml.append("<Response>\r\n"); + recordXml.append("<CmdType>RecordInfo</CmdType>\r\n"); + recordXml.append("<SN>" +recordInfo.getSn() + "</SN>\r\n"); + recordXml.append("<DeviceID>" + recordInfo.getDeviceId() + "</DeviceID>\r\n"); + recordXml.append("<SumNum>" + recordInfo.getSumNum() + "</SumNum>\r\n"); + if (recordInfo.getRecordList() == null ) { + recordXml.append("<RecordList Num=\"0\">\r\n"); + }else { + recordXml.append("<RecordList Num=\"" + recordInfo.getRecordList().size()+"\">\r\n"); + if (recordInfo.getRecordList().size() > 0) { + for (RecordItem recordItem : recordInfo.getRecordList()) { + recordXml.append("<Item>\r\n"); + if (deviceChannel != null) { + recordXml.append("<DeviceID>" + recordItem.getDeviceId() + "</DeviceID>\r\n"); + recordXml.append("<Name>" + recordItem.getName() + "</Name>\r\n"); + recordXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(recordItem.getStartTime()) + "</StartTime>\r\n"); + recordXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(recordItem.getEndTime()) + "</EndTime>\r\n"); + recordXml.append("<Secrecy>" + recordItem.getSecrecy() + "</Secrecy>\r\n"); + recordXml.append("<Type>" + recordItem.getType() + "</Type>\r\n"); + if (!ObjectUtils.isEmpty(recordItem.getFileSize())) { + recordXml.append("<FileSize>" + recordItem.getFileSize() + "</FileSize>\r\n"); } - recordXml.append("</Item>\r\n"); + if (!ObjectUtils.isEmpty(recordItem.getFilePath())) { + recordXml.append("<FilePath>" + recordItem.getFilePath() + "</FilePath>\r\n"); + } } + recordXml.append("</Item>\r\n"); } } - - recordXml.append("</RecordList>\r\n"); - recordXml.append("</Response>\r\n"); - - // callid - CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() - : udpSipProvider.getNewCallId(); - Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); - transmitRequest(parentPlatform, request); - - } catch (SipException | ParseException | InvalidArgumentException e) { - e.printStackTrace(); - return false; - } - return true; - } - - @Override - public boolean sendMediaStatusNotify(ParentPlatform platform, SendRtpItem sendRtpItem) { - if (sendRtpItem == null) { - return false; - } - if (platform == null) { - return false; } - try{ + recordXml.append("</RecordList>\r\n"); + recordXml.append("</Response>\r\n"); - String characterSet = platform.getCharacterSet(); - StringBuffer mediaStatusXml = new StringBuffer(200); - mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); - mediaStatusXml.append("<Notify>\r\n"); - mediaStatusXml.append("<CmdType>MediaStatus</CmdType>\r\n"); - mediaStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); - mediaStatusXml.append("<DeviceID>" + sendRtpItem.getChannelId() + "</DeviceID>\r\n"); - mediaStatusXml.append("<NotifyType>121</NotifyType>\r\n"); - mediaStatusXml.append("</Notify>\r\n"); - - SIPRequest messageRequest = (SIPRequest)headerProviderPlatformProvider.createMessageRequest(platform, mediaStatusXml.toString(), - sendRtpItem); - - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); - messageRequest.setContent(mediaStatusXml.toString(), contentTypeHeader); - SipURI sipURI = (SipURI) messageRequest.getRequestURI(); - sipURI.setHost(platform.getServerIP()); - sipURI.setPort(platform.getServerPort()); - ClientTransaction clientTransaction; - if ("TCP".equals(platform.getTransport())) { - clientTransaction = tcpSipProvider.getNewClientTransaction(messageRequest); - }else { - clientTransaction = udpSipProvider.getNewClientTransaction(messageRequest); - } - clientTransaction.sendRequest(); - } catch (SipException e) { - e.printStackTrace(); - return false; - } catch (ParseException e) { - e.printStackTrace(); - return false; - } catch (InvalidArgumentException e) { - throw new RuntimeException(e); - } - return true; - + // callid + CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); + transmitRequest(parentPlatform, request); } @Override - public void streamByeCmd(ParentPlatform platform, String callId) { + public void sendMediaStatusNotify(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException { + if (sendRtpItem == null || platform == null) { + return; + } + + + String characterSet = platform.getCharacterSet(); + StringBuffer mediaStatusXml = new StringBuffer(200); + mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + mediaStatusXml.append("<Notify>\r\n"); + mediaStatusXml.append("<CmdType>MediaStatus</CmdType>\r\n"); + mediaStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); + mediaStatusXml.append("<DeviceID>" + sendRtpItem.getChannelId() + "</DeviceID>\r\n"); + mediaStatusXml.append("<NotifyType>121</NotifyType>\r\n"); + mediaStatusXml.append("</Notify>\r\n"); + + SIPRequest messageRequest = (SIPRequest)headerProviderPlatformProvider.createMessageRequest(platform, mediaStatusXml.toString(), + sendRtpItem); + + transmitRequest(platform, messageRequest); + + } + + @Override + public void streamByeCmd(ParentPlatform platform, String callId) throws SipException, InvalidArgumentException, ParseException { if (platform == null) { return; } @@ -828,7 +679,7 @@ } @Override - public void streamByeCmd(ParentPlatform platform, SendRtpItem sendRtpItem) { + public void streamByeCmd(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException { if (sendRtpItem == null ) { logger.info("[鍚戜笂绾у彂閫丅YE]锛� sendRtpItem 涓篘ULL"); return; @@ -844,25 +695,10 @@ mediaServerService.releaseSsrc(mediaServerItem.getId(), sendRtpItem.getSsrc()); zlmrtpServerFactory.closeRTPServer(mediaServerItem, sendRtpItem.getStreamId()); } - try { - - SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(platform, sendRtpItem); - if (byeRequest == null) { - logger.warn("[鍚戜笂绾у彂閫乥ye]锛氭棤娉曞垱寤� byeRequest"); - } - ClientTransaction clientTransaction; - if ("TCP".equals(platform.getTransport())) { - clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); - } else { - clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); - } - clientTransaction.sendRequest(); - } catch (SipException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - throw new RuntimeException(e); + SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(platform, sendRtpItem); + if (byeRequest == null) { + logger.warn("[鍚戜笂绾у彂閫乥ye]锛氭棤娉曞垱寤� byeRequest"); } + transmitRequest(platform,byeRequest); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java index c12d0df..8c6ab99 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java @@ -7,6 +7,7 @@ import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.message.SIPResponse; import gov.nist.javax.sip.stack.SIPServerTransaction; +import gov.nist.javax.sip.stack.SIPServerTransactionImpl; import org.apache.commons.lang3.ArrayUtils; import org.dom4j.Document; import org.dom4j.DocumentException; @@ -57,7 +58,7 @@ */ public ServerTransaction getServerTransaction(RequestEvent evt) { Request request = evt.getRequest(); - ServerTransaction serverTransaction = evt.getServerTransaction(); + SIPServerTransactionImpl serverTransaction = (SIPServerTransactionImpl)evt.getServerTransaction(); // 鍒ゆ柇TCP杩樻槸UDP boolean isTcp = false; ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); @@ -65,28 +66,28 @@ if (transport.equalsIgnoreCase("TCP")) { isTcp = true; } - + if (serverTransaction != null && serverTransaction.getOriginalRequest() == null) { + serverTransaction.setOriginalRequest((SIPRequest) evt.getRequest()); + } if (serverTransaction == null) { try { if (isTcp) { SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack(); - serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); + serverTransaction = (SIPServerTransactionImpl) stack.findTransaction((SIPRequest)request, true); if (serverTransaction == null) { - serverTransaction = tcpSipProvider.getNewServerTransaction(request); + serverTransaction = (SIPServerTransactionImpl)tcpSipProvider.getNewServerTransaction(request); } } else { SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack(); - serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true); + serverTransaction = (SIPServerTransactionImpl) stack.findTransaction((SIPRequest)request, true); if (serverTransaction == null) { - serverTransaction = udpSipProvider.getNewServerTransaction(request); + serverTransaction = (SIPServerTransactionImpl)udpSipProvider.getNewServerTransaction(request); } } } catch (TransactionAlreadyExistsException e) { logger.error(e.getMessage()); } catch (TransactionUnavailableException e) { logger.error(e.getMessage()); - }finally { - } } return serverTransaction; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java index 33cc6e6..8acf621 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java @@ -23,12 +23,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; +import javax.sip.SipException; import javax.sip.address.SipURI; import javax.sip.header.CallIdHeader; import javax.sip.header.FromHeader; import javax.sip.header.HeaderAddress; import javax.sip.header.ToHeader; +import java.text.ParseException; import java.util.*; /** @@ -95,8 +98,8 @@ SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, channelId, null, callIdHeader.getCallId()); String is_Udp = sendRtpItem.isTcp() ? "0" : "1"; MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId()); - logger.info("鏀跺埌ACK锛宺tp/{}寮�濮嬪悜涓婄骇鎺ㄦ祦, 鐩爣 {}:{}锛孲SRC={}", sendRtpItem.getStreamId(), sendRtpItem.getIp(), sendRtpItem.getPort(), sendRtpItem.getSsrc()); - Map<String, Object> param = new HashMap<>(); + logger.info("鏀跺埌ACK锛宺tp/{}寮�濮嬪悜涓婄骇鎺ㄦ祦, 鐩爣={}:{}锛孲SRC={}", sendRtpItem.getStreamId(), sendRtpItem.getIp(), sendRtpItem.getPort(), sendRtpItem.getSsrc()); + Map<String, Object> param = new HashMap<>(12); param.put("vhost","__defaultVhost__"); param.put("app",sendRtpItem.getApp()); param.put("stream",sendRtpItem.getStreamId()); @@ -139,7 +142,11 @@ // TODO 鍙兘鏄闊冲璁� }else { // 鍚戜笂绾у钩鍙� - commanderForPlatform.streamByeCmd(parentPlatform, callIdHeader.getCallId()); + try { + commanderForPlatform.streamByeCmd(parentPlatform, callIdHeader.getCallId()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage()); + } } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java index 4211417..8bf4931 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.InviteStreamType; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; @@ -12,12 +13,11 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; +import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; -import com.genersoft.iot.vmp.utils.SerializeUtils; -import gov.nist.javax.sip.stack.SIPDialog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; @@ -51,6 +51,9 @@ private IRedisCatchStorage redisCatchStorage; @Autowired + private IDeviceService deviceService; + + @Autowired private IVideoManagerStorage storager; @Autowired @@ -77,9 +80,13 @@ */ @Override public void process(RequestEvent evt) { + try { responseAck(getServerTransaction(evt), Response.OK); - CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍥炲BYE淇℃伅澶辫触]锛寋}", e.getMessage()); + } + CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, channelId, null, callIdHeader.getCallId()); @@ -99,7 +106,17 @@ if (totalReaderCount <= 0) { logger.info("[鏀跺埌bye] {} 鏃犲叾瀹冭鐪嬭�咃紝閫氱煡璁惧鍋滄鎺ㄦ祦", streamId); if (sendRtpItem.getPlayType().equals(InviteStreamType.PLAY)) { - cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId, streamId, null); + Device device = deviceService.queryDevice(sendRtpItem.getDeviceId()); + if (device == null) { + logger.info("[鏀跺埌bye] {} 閫氱煡璁惧鍋滄鎺ㄦ祦鏃舵湭鎵惧埌璁惧淇℃伅", streamId); + } + try { + logger.warn("[鍋滄鐐规挱] {}/{}", sendRtpItem.getDeviceId(), channelId); + cmder.streamByeCmd(device, channelId, streamId, null); + } catch (InvalidArgumentException | ParseException | SipException | + SsrcTransactionNotFoundException e) { + logger.error("[鏀跺埌bye] {} 鏃犲叾瀹冭鐪嬭�咃紝閫氱煡璁惧鍋滄鎺ㄦ祦锛� 鍙戦�丅YE澶辫触 {}",streamId, e.getMessage()); + } } if (sendRtpItem.getPlayType().equals(InviteStreamType.PUSH)) { MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(0, @@ -120,8 +137,7 @@ } SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null); if (ssrcTransactionForPlay != null){ - SIPDialog dialogForPlay = (SIPDialog) SerializeUtils.deSerialize(ssrcTransactionForPlay.getDialog()); - if (dialogForPlay.getCallId().getCallId().equals(callIdHeader.getCallId())){ + if (ssrcTransactionForPlay.getCallId().equals(callIdHeader.getCallId())){ // 閲婃斁ssrc MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransactionForPlay.getMediaServerId()); if (mediaServerItem != null) { @@ -140,12 +156,6 @@ streamSession.remove(device.getDeviceId(), channelId, ssrcTransactionForPlayBack.getStream()); } } - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java index ff3c78f..09436ed 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java @@ -341,7 +341,11 @@ logger.info("Ack 绛夊緟瓒呮椂"); mediaServerService.releaseSsrc(mediaServerItemInUSe.getId(), ssrc); // 鍥炲bye - cmderFroPlatform.streamByeCmd(platform, callIdHeader.getCallId()); + try { + cmderFroPlatform.streamByeCmd(platform, callIdHeader.getCallId()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage()); + } }, 60 * 1000); responseSdpAck(serverTransaction, content.toString(), platform); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java index 0b6ced0..b5f16ac 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/info/InfoRequestProcessor.java @@ -93,7 +93,9 @@ responseAck(serverTransaction, Response.NOT_FOUND, "device "+ deviceId +" not found"); logger.warn("[璁惧鏈壘鍒� ]锛� {}", deviceId); if (sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()) != null){ - SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new DeviceNotFoundEvent(evt.getDialog())); + DeviceNotFoundEvent deviceNotFoundEvent = new DeviceNotFoundEvent(evt.getDialog()); + deviceNotFoundEvent.setCallId(callIdHeader.getCallId()); + SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(deviceNotFoundEvent); sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()).response(eventResult); }; }else { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java index bd4ca65..f74c250 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java @@ -89,8 +89,6 @@ ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId); try { if (device != null && parentPlatform != null) { - - logger.warn("[閲嶅]骞冲彴涓庤澶囩紪鍙烽噸澶嶏細{}", deviceId); SIPRequest request = (SIPRequest) evt.getRequest(); String hostAddress = request.getRemoteAddress().getHostAddress(); int remotePort = request.getRemotePort(); @@ -105,7 +103,9 @@ responseAck(serverTransaction, Response.NOT_FOUND, "device "+ deviceId +" not found"); logger.warn("[璁惧鏈壘鍒� ]锛� {}", deviceId); if (sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()) != null){ - SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new DeviceNotFoundEvent(evt.getDialog())); + DeviceNotFoundEvent deviceNotFoundEvent = new DeviceNotFoundEvent(evt.getDialog()); + deviceNotFoundEvent.setCallId(callIdHeader.getCallId()); + SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(deviceNotFoundEvent); sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()).response(eventResult); }; }else { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java index 094e656..855ad3b 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java @@ -16,6 +16,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -48,6 +50,10 @@ @Autowired private SIPCommanderFroPlatform cmderFroPlatform; + @Qualifier("taskExecutor") + @Autowired + private ThreadPoolTaskExecutor taskExecutor; + @Override public void afterPropertiesSet() throws Exception { controlMessageHandler.addHandler(cmdType, this); @@ -71,34 +77,30 @@ if (parentPlatform.getServerGBId().equals(targetGBId)) { // 杩滅▼鍚姩鏈钩鍙帮細闇�瑕佸湪閲嶆柊鍚姩绋嬪簭鍚庡厛瀵筍ipStack瑙g粦 logger.info("鎵ц杩滅▼鍚姩鏈钩鍙板懡浠�"); - cmderFroPlatform.unregister(parentPlatform, null, null); - - Thread restartThread = new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(3000); - SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider"); - SipStackImpl stack = (SipStackImpl)up.getSipStack(); - stack.stop(); - Iterator listener = stack.getListeningPoints(); - while (listener.hasNext()) { - stack.deleteListeningPoint((ListeningPoint) listener.next()); - } - Iterator providers = stack.getSipProviders(); - while (providers.hasNext()) { - stack.deleteSipProvider((SipProvider) providers.next()); - } - VManageBootstrap.restart(); - } catch (InterruptedException ignored) { - } catch (ObjectInUseException e) { - e.printStackTrace(); + try { + cmderFroPlatform.unregister(parentPlatform, null, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 娉ㄩ攢: {}", e.getMessage()); + } + taskExecutor.execute(()->{ + try { + Thread.sleep(3000); + SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider"); + SipStackImpl stack = (SipStackImpl)up.getSipStack(); + stack.stop(); + Iterator listener = stack.getListeningPoints(); + while (listener.hasNext()) { + stack.deleteListeningPoint((ListeningPoint) listener.next()); } + Iterator providers = stack.getSipProviders(); + while (providers.hasNext()) { + stack.deleteSipProvider((SipProvider) providers.next()); + } + VManageBootstrap.restart(); + } catch (InterruptedException | ObjectInUseException e) { + logger.error("[浠诲姟鎵ц澶辫触] 鏈嶅姟閲嶅惎: {}", e.getMessage()); } }); - - restartThread.setDaemon(false); - restartThread.start(); } else { // 杩滅▼鍚姩鎸囧畾璁惧 } @@ -111,37 +113,29 @@ try { responseAck(serverTransaction, Response.NOT_FOUND); return; - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 閿欒淇℃伅: {}", e.getMessage()); } } - cmder.fronEndCmd(deviceForPlatform, channelId, cmdString, eventResult -> { - // 澶辫触鐨勫洖澶� - try { - responseAck(serverTransaction, eventResult.statusCode, eventResult.msg); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - }, eventResult -> { - // 鎴愬姛鐨勫洖澶� - try { - responseAck(serverTransaction, eventResult.statusCode); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - }); + try { + cmder.fronEndCmd(deviceForPlatform, channelId, cmdString, eventResult -> { + // 澶辫触鐨勫洖澶� + try { + responseAck(serverTransaction, eventResult.statusCode, eventResult.msg); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 浜戝彴/鍓嶇鍥炲: {}", e.getMessage()); + } + }, eventResult -> { + // 鎴愬姛鐨勫洖澶� + try { + responseAck(serverTransaction, eventResult.statusCode); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 浜戝彴/鍓嶇鍥炲: {}", e.getMessage()); + } + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 浜戝彴/鍓嶇: {}", e.getMessage()); + } } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java index 332fc67..98d42d6 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; @@ -89,7 +90,12 @@ // 鍏堜粠浼氳瘽鍐呮煡鎵� SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, callIdHeader.getCallId(), null); if (ssrcTransaction != null) { // 鍏煎娴峰悍 濯掍綋閫氱煡 娑堟伅from瀛楁涓嶆槸璁惧ID鐨勯棶棰� - cmder.streamByeCmd(device.getDeviceId(), ssrcTransaction.getChannelId(), null, callIdHeader.getCallId()); + + try { + cmder.streamByeCmd(device, ssrcTransaction.getChannelId(), null, callIdHeader.getCallId()); + } catch (InvalidArgumentException | ParseException | SsrcTransactionNotFoundException | SipException e) { + logger.error("[褰曞儚娴乚鎺ㄩ�佸畬姣曪紝鏀跺埌鍏虫祦閫氱煡锛� 鍙戦�丅YE澶辫触 {}", e.getMessage()); + } // 濡傛灉绾ц仈鎾斁锛岄渶瑕佺粰涓婄骇鍙戦�佹閫氱煡 TODO 澶氫釜涓婄骇鍚屾椂瑙傜湅涓�涓笅绾� 鍙兘瀛樺湪鍋滈敊鐨勯棶棰橈紝闇�瑕佸皢鐐规挱CallId杩涜涓婁笅绾х粦瀹� SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, ssrcTransaction.getChannelId(), null, null); @@ -99,7 +105,11 @@ logger.warn("[绾ц仈娑堟伅鍙戦�乚锛氬彂閫丮ediaStatus鍙戠幇涓婄骇骞冲彴{}涓嶅瓨鍦�", sendRtpItem.getPlatformId()); return; } - sipCommanderFroPlatform.sendMediaStatusNotify(parentPlatform, sendRtpItem); + try { + sipCommanderFroPlatform.sendMediaStatusNotify(parentPlatform, sendRtpItem); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 褰曞儚鎾斁瀹屾瘯: {}", e.getMessage()); + } } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java index 27d9200..3567939 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceInfoQueryMessageHandler.java @@ -49,14 +49,14 @@ try { // 鍥炲200 OK responseAck(getServerTransaction(evt), Response.OK); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 DeviceInfo鏌ヨ鍥炲: {}", e.getMessage()); } String sn = rootElement.element("SN").getText(); - cmderFroPlatform.deviceInfoResponse(parentPlatform, sn, fromHeader.getTag()); + try { + cmderFroPlatform.deviceInfoResponse(parentPlatform, sn, fromHeader.getTag()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 DeviceInfo鏌ヨ鍥炲: {}", e.getMessage()); + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java index 05d2714..bb6ff78 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java @@ -62,14 +62,14 @@ // 鍥炲200 OK try { responseAck(getServerTransaction(evt), Response.OK); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 DeviceStatus鏌ヨ鍥炲200OK: {}", e.getMessage()); } String sn = rootElement.element("SN").getText(); - cmderFroPlatform.deviceStatusResponse(parentPlatform, sn, fromHeader.getTag()); + try { + cmderFroPlatform.deviceStatusResponse(parentPlatform, sn, fromHeader.getTag()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 DeviceStatus鏌ヨ鍥炲: {}", e.getMessage()); + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java index 49e04e9..8c1365a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java @@ -103,53 +103,45 @@ DeviceChannel deviceChannel = storager.queryChannelInParentPlatform(parentPlatform.getServerGBId(), channelId); // 鎺ユ敹褰曞儚鏁版嵁 recordEndEventListener.addEndEventHandler(deviceChannel.getDeviceId(), channelId, (recordInfo)->{ - cmderFroPlatform.recordInfo(deviceChannel, parentPlatform, fromHeader.getTag(), recordInfo); + try { + cmderFroPlatform.recordInfo(deviceChannel, parentPlatform, fromHeader.getTag(), recordInfo); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍥炲褰曞儚鏁版嵁: {}", e.getMessage()); + } }); - commander.recordInfoQuery(device, channelId, DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(startTime), - DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, (eventResult -> { - // 鍥炲200 OK - try { - responseAck(serverTransaction, Response.OK); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - }),(eventResult -> { - // 鏌ヨ澶辫触 - try { - responseAck(serverTransaction, eventResult.statusCode, eventResult.msg); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - })); + try { + commander.recordInfoQuery(device, channelId, DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(startTime), + DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, (eventResult -> { + // 鍥炲200 OK + try { + responseAck(serverTransaction, Response.OK); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚鏌ヨ鍥炲: {}", e.getMessage()); + } + }),(eventResult -> { + // 鏌ヨ澶辫触 + try { + responseAck(serverTransaction, eventResult.statusCode, eventResult.msg); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚鏌ヨ鍥炲: {}", e.getMessage()); + } + })); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚鏌ヨ: {}", e.getMessage()); + } }else if (channelSources.get(1).getCount() > 0) { // 鐩存挱娴� // TODO try { responseAck(serverTransaction, Response.NOT_IMPLEMENTED); // 鍥炲鏈疄鐜� - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚鏌ヨ: {}", e.getMessage()); } }else { // 閿欒鐨勮姹� try { responseAck(serverTransaction, Response.BAD_REQUEST); - } catch (SipException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚鏌ヨ: {}", e.getMessage()); } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java index 3cff19d..94fed56 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java @@ -87,89 +87,73 @@ public void handForDevice(RequestEvent evt, Device device, Element element) { taskQueue.offer(new HandlerCatchData(evt, device, element)); // 鍥炲200 OK + ServerTransaction serverTransaction = getServerTransaction(evt); try { - ServerTransaction serverTransaction = getServerTransaction(evt); responseAck(serverTransaction, Response.OK); - if (!taskQueueHandlerRun) { - taskQueueHandlerRun = true; - taskExecutor.execute(()-> { - while (!taskQueue.isEmpty()) { - HandlerCatchData take = taskQueue.poll(); - try { - Element rootElement = getRootElement(take.getEvt(), take.getDevice().getCharset()); - if (rootElement == null) { - logger.warn("[ 鏀跺埌閫氶亾 ] content cannot be null, {}", evt.getRequest()); - continue; - } - Element deviceListElement = rootElement.element("DeviceList"); - Element sumNumElement = rootElement.element("SumNum"); - Element snElement = rootElement.element("SN"); - if (snElement == null || sumNumElement == null || deviceListElement == null) { - responseAck(serverTransaction, Response.BAD_REQUEST, "xml error"); - continue; - } - int sumNum = Integer.parseInt(sumNumElement.getText()); - - if (sumNum == 0) { - logger.info("[鏀跺埌閫氶亾]璁惧:{}鐨�: 0涓�", take.getDevice().getDeviceId()); - // 鏁版嵁宸茬粡瀹屾暣鎺ユ敹 - storager.cleanChannelsForDevice(take.getDevice().getDeviceId()); - catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); - }else { - Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); - if (deviceListIterator != null) { - List<DeviceChannel> channelList = new ArrayList<>(); - // 閬嶅巻DeviceList - while (deviceListIterator.hasNext()) { - Element itemDevice = deviceListIterator.next(); - Element channelDeviceElement = itemDevice.element("DeviceID"); - if (channelDeviceElement == null) { - continue; - } - DeviceChannel deviceChannel = XmlUtil.channelContentHander(itemDevice, device, null); - deviceChannel.setDeviceId(take.getDevice().getDeviceId()); - - channelList.add(deviceChannel); - } - int sn = Integer.parseInt(snElement.getText()); - catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList); - logger.info("[鏀跺埌閫氶亾]璁惧: {} -> {}涓紝{}/{}", take.getDevice().getDeviceId(), channelList.size(), catalogDataCatch.get(take.getDevice().getDeviceId()) == null ? 0 :catalogDataCatch.get(take.getDevice().getDeviceId()).size(), sumNum); - if (catalogDataCatch.get(take.getDevice().getDeviceId()).size() == sumNum) { - // 鏁版嵁宸茬粡瀹屾暣鎺ユ敹锛� 姝ゆ椂鍙兘瀛樺湪鏌愪釜璁惧绂荤嚎鍙樹笂绾跨殑鎯呭喌锛屼絾鏄�冭檻鍒版�ц兘锛屾澶勪笉鍋氬鐞嗭紝 - // 鐩墠鏀寔璁惧閫氶亾涓婄嚎閫氱煡鏃跺拰璁惧涓婄嚎鏃跺悜涓婄骇閫氱煡 - boolean resetChannelsResult = storager.resetChannels(take.getDevice().getDeviceId(), catalogDataCatch.get(take.getDevice().getDeviceId())); - if (!resetChannelsResult) { - String errorMsg = "鎺ユ敹鎴愬姛锛屽啓鍏ュけ璐ワ紝鍏�" + sumNum + "鏉★紝宸叉帴鏀�" + catalogDataCatch.get(take.getDevice().getDeviceId()).size() + "鏉�"; - catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), errorMsg); - }else { - catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); - } - } - } - - } - } catch (DocumentException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } catch (SipException e) { - e.printStackTrace(); - } finally { - taskQueueHandlerRun = false; - } + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鐩綍鏌ヨ鍥炲: {}", e.getMessage()); + } + if (!taskQueueHandlerRun) { + taskQueueHandlerRun = true; + taskExecutor.execute(() -> { + while (!taskQueue.isEmpty()) { + HandlerCatchData take = taskQueue.poll(); + Element rootElement = null; + try { + rootElement = getRootElement(take.getEvt(), take.getDevice().getCharset()); + } catch (DocumentException e) { + logger.error("[xml瑙f瀽] 澶辫触锛� ", e); + continue; } - }); - } - } catch (SipException e) { - throw new RuntimeException(e); - } catch (InvalidArgumentException e) { - throw new RuntimeException(e); - } catch (ParseException e) { - throw new RuntimeException(e); - } finally { - taskQueueHandlerRun = false; + if (rootElement == null) { + logger.warn("[ 鏀跺埌閫氶亾 ] content cannot be null, {}", evt.getRequest()); + continue; + } + Element deviceListElement = rootElement.element("DeviceList"); + Element sumNumElement = rootElement.element("SumNum"); + Element snElement = rootElement.element("SN"); + int sumNum = Integer.parseInt(sumNumElement.getText()); + + if (sumNum == 0) { + logger.info("[鏀跺埌閫氶亾]璁惧:{}鐨�: 0涓�", take.getDevice().getDeviceId()); + // 鏁版嵁宸茬粡瀹屾暣鎺ユ敹 + storager.cleanChannelsForDevice(take.getDevice().getDeviceId()); + catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); + } else { + Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); + if (deviceListIterator != null) { + List<DeviceChannel> channelList = new ArrayList<>(); + // 閬嶅巻DeviceList + while (deviceListIterator.hasNext()) { + Element itemDevice = deviceListIterator.next(); + Element channelDeviceElement = itemDevice.element("DeviceID"); + if (channelDeviceElement == null) { + continue; + } + DeviceChannel deviceChannel = XmlUtil.channelContentHander(itemDevice, device, null); + deviceChannel.setDeviceId(take.getDevice().getDeviceId()); + + channelList.add(deviceChannel); + } + int sn = Integer.parseInt(snElement.getText()); + catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList); + logger.info("[鏀跺埌閫氶亾]璁惧: {} -> {}涓紝{}/{}", take.getDevice().getDeviceId(), channelList.size(), catalogDataCatch.get(take.getDevice().getDeviceId()) == null ? 0 : catalogDataCatch.get(take.getDevice().getDeviceId()).size(), sumNum); + if (catalogDataCatch.get(take.getDevice().getDeviceId()).size() == sumNum) { + // 鏁版嵁宸茬粡瀹屾暣鎺ユ敹锛� 姝ゆ椂鍙兘瀛樺湪鏌愪釜璁惧绂荤嚎鍙樹笂绾跨殑鎯呭喌锛屼絾鏄�冭檻鍒版�ц兘锛屾澶勪笉鍋氬鐞嗭紝 + // 鐩墠鏀寔璁惧閫氶亾涓婄嚎閫氱煡鏃跺拰璁惧涓婄嚎鏃跺悜涓婄骇閫氱煡 + boolean resetChannelsResult = storager.resetChannels(take.getDevice().getDeviceId(), catalogDataCatch.get(take.getDevice().getDeviceId())); + if (!resetChannelsResult) { + String errorMsg = "鎺ユ敹鎴愬姛锛屽啓鍏ュけ璐ワ紝鍏�" + sumNum + "鏉★紝宸叉帴鏀�" + catalogDataCatch.get(take.getDevice().getDeviceId()).size() + "鏉�"; + catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), errorMsg); + } else { + catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); + } + } + } + + } + } + }); } } @@ -182,7 +166,7 @@ public SyncStatus getChannelSyncProgress(String deviceId) { if (catalogDataCatch.get(deviceId) == null) { return null; - }else { + } else { return catalogDataCatch.getSyncStatus(deviceId); } } @@ -190,7 +174,7 @@ public boolean isSyncRunning(String deviceId) { if (catalogDataCatch.get(deviceId) == null) { return false; - }else { + } else { return catalogDataCatch.isSyncRunning(deviceId); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/PresetQueryResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/PresetQueryResponseMessageHandler.java index 1febeae..366c7ad 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/PresetQueryResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/PresetQueryResponseMessageHandler.java @@ -50,12 +50,12 @@ @Override public void handForDevice(RequestEvent evt, Device device, Element element) { - Element rootElement = null; + + ServerTransaction serverTransaction = getServerTransaction(evt); + try { + Element rootElement = getRootElement(evt, device.getCharset()); - ServerTransaction serverTransaction = getServerTransaction(evt); - - rootElement = getRootElement(evt, device.getCharset()); if (rootElement == null) { logger.warn("[ 璁惧棰勭疆浣嶆煡璇㈠簲绛� ] content cannot be null, {}", evt.getRequest()); responseAck(serverTransaction, Response.BAD_REQUEST); @@ -66,32 +66,29 @@ //璇ュ瓧娈靛彲鑳戒负閫氶亾鎴栧垯璁惧鐨刬d String deviceId = getText(rootElement, "DeviceID"); String key = DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + deviceId; - if (snElement == null || presetListNumElement == null) { + if (snElement == null || presetListNumElement == null) { responseAck(serverTransaction, Response.BAD_REQUEST, "xml error"); return; } int sumNum = Integer.parseInt(presetListNumElement.attributeValue("Num")); List<PresetQuerySipReq> presetQuerySipReqList = new ArrayList<>(); if (sumNum > 0) { - for (Iterator<Element> presetIterator = presetListNumElement.elementIterator();presetIterator.hasNext();){ + for (Iterator<Element> presetIterator = presetListNumElement.elementIterator(); presetIterator.hasNext(); ) { Element itemListElement = presetIterator.next(); PresetQuerySipReq presetQuerySipReq = new PresetQuerySipReq(); - for (Iterator<Element> itemListIterator = itemListElement.elementIterator();itemListIterator.hasNext();){ - // 閬嶅巻item - Element itemOne = itemListIterator.next(); - String name = itemOne.getName(); - String textTrim = itemOne.getTextTrim(); - if("PresetID".equalsIgnoreCase(name)){ - presetQuerySipReq.setPresetId(textTrim); - }else { - presetQuerySipReq.setPresetName(textTrim); - } + for (Iterator<Element> itemListIterator = itemListElement.elementIterator(); itemListIterator.hasNext(); ) { + // 閬嶅巻item + Element itemOne = itemListIterator.next(); + String name = itemOne.getName(); + String textTrim = itemOne.getTextTrim(); + if ("PresetID".equalsIgnoreCase(name)) { + presetQuerySipReq.setPresetId(textTrim); + } else { + presetQuerySipReq.setPresetName(textTrim); + } } presetQuerySipReqList.add(presetQuerySipReq); - - } - } RequestMessage requestMessage = new RequestMessage(); requestMessage.setKey(key); @@ -99,13 +96,9 @@ deferredResultHolder.invokeAllResult(requestMessage); responseAck(serverTransaction, Response.OK); } catch (DocumentException e) { - e.printStackTrace(); - } catch (InvalidArgumentException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } catch (SipException e) { - e.printStackTrace(); + logger.error("[瑙f瀽xml]澶辫触: ", e); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 璁惧棰勭疆浣嶆煡璇㈠簲绛斿鐞�: {}", e.getMessage()); } } 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 9b09029..3cca115 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 @@ -1,18 +1,27 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.response.impl; import com.genersoft.iot.vmp.conf.SipConfig; +import com.genersoft.iot.vmp.gb28181.bean.Device; +import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider; import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; +import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.utils.GitUtil; import gov.nist.javax.sip.ResponseEventExt; +import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.message.SIPResponse; import gov.nist.javax.sip.stack.SIPClientTransaction; import gov.nist.javax.sip.stack.SIPDialog; +import gov.nist.javax.sip.stack.SIPTransaction; +import gov.nist.javax.sip.stack.SIPTransactionImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import javax.sdp.SdpFactory; @@ -54,6 +63,20 @@ @Autowired private GitUtil gitUtil; + @Autowired + private ISIPCommander commander; + + @Autowired + private IDeviceService deviceService; + + @Autowired + private SIPRequestHeaderProvider headerProvider; + + @Autowired + @Qualifier(value="udpSipProvider") + private SipProviderImpl udpSipProvider; + + @Override public void afterPropertiesSet() throws Exception { // 娣诲姞娑堟伅澶勭悊鐨勮闃� @@ -71,7 +94,8 @@ @Override public void process(ResponseEvent evt ){ try { - Response response = evt.getResponse(); + + SIPResponse response = (SIPResponse)evt.getResponse(); int statusCode = response.getStatusCode(); // trying涓嶄細鍥炲 if (statusCode == Response.TRYING) { @@ -80,10 +104,7 @@ // 涓嬪彂ack if (statusCode == Response.OK) { ResponseEventExt event = (ResponseEventExt)evt; - SIPDialog dialog = new SIPDialog((SIPClientTransaction) event.getClientTransaction(), (SIPResponse) event.getResponse()); - CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); - Request reqAck = dialog.createAck(cseq.getSeqNumber()); - SipURI requestURI = (SipURI) reqAck.getRequestURI(); + String contentString = new String(response.getRawContent()); // jainSip涓嶆敮鎸亂=瀛楁锛� 绉婚櫎浠ヨВ鏋愩�� int ssrcIndex = contentString.indexOf("y="); @@ -96,29 +117,15 @@ } else { sdp = SdpFactory.getInstance().createSessionDescription(contentString); } - requestURI.setUser(sdp.getOrigin().getUsername()); - try { - requestURI.setHost(event.getRemoteIpAddress()); - } catch (ParseException e) { - e.printStackTrace(); - } - requestURI.setPort(event.getRemotePort()); - reqAck.setRequestURI(requestURI); - UserAgentHeader userAgentHeader = SipUtils.createUserAgentHeader(sipFactory, gitUtil); - reqAck.addHeader(userAgentHeader); - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); - reqAck.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); - logger.info("[鍥炲ack] {}-> {}:{} ",requestURI, event.getRemoteIpAddress(), event.getRemotePort()); + SipURI requestUri = sipFactory.createAddressFactory().createSipURI(sdp.getOrigin().getUsername(), event.getRemoteIpAddress() + ":" + event.getRemotePort()); + Request reqAck = headerProvider.createAckRequest(requestUri, response); - dialog.sendAck(reqAck); + logger.info("[鍥炲ack] {}-> {}:{} ", sdp.getOrigin().getUsername(), event.getRemoteIpAddress(), event.getRemotePort()); + commander.transmitRequest(response.getTopmostViaHeader().getTransport(), reqAck, null, null); } - } catch (InvalidArgumentException | SipException e) { - e.printStackTrace(); - } catch (ParseException e) { - throw new RuntimeException(e); - } catch (SdpParseException e) { - throw new RuntimeException(e); + } catch (InvalidArgumentException | ParseException | SipException | SdpParseException e) { + logger.info("[鐐规挱鍥炲ACK]锛屽紓甯革細", e ); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java index a5cddae..d0e1583 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java @@ -15,10 +15,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.sip.InvalidArgumentException; import javax.sip.ResponseEvent; +import javax.sip.SipException; import javax.sip.header.CallIdHeader; import javax.sip.header.WWWAuthenticateHeader; import javax.sip.message.Response; +import java.text.ParseException; /** * @description:Register鍝嶅簲澶勭悊鍣� @@ -87,7 +90,11 @@ if (response.getStatusCode() == Response.UNAUTHORIZED) { WWWAuthenticateHeader www = (WWWAuthenticateHeader)response.getHeader(WWWAuthenticateHeader.NAME); - sipCommanderForPlatform.register(parentPlatform, callId, www, null, null, true, platformRegisterInfo.isRegister()); + try { + sipCommanderForPlatform.register(parentPlatform, callId, www, null, null, true, platformRegisterInfo.isRegister()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍐嶆娉ㄥ唽: {}", e.getMessage()); + } }else if (response.getStatusCode() == Response.OK){ if (platformRegisterInfo.isRegister()) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java index cf64a86..bf2a0ee 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java @@ -70,4 +70,47 @@ return String.valueOf(System.currentTimeMillis()); } + + /** + * 浜戝彴鎸囦护鐮佽绠� + * + * @param leftRight 闀滃ご宸︾Щ鍙崇Щ 0:鍋滄 1:宸︾Щ 2:鍙崇Щ + * @param upDown 闀滃ご涓婄Щ涓嬬Щ 0:鍋滄 1:涓婄Щ 2:涓嬬Щ + * @param inOut 闀滃ご鏀惧ぇ缂╁皬 0:鍋滄 1:缂╁皬 2:鏀惧ぇ + * @param moveSpeed 闀滃ご绉诲姩閫熷害 榛樿 0XFF (0-255) + * @param zoomSpeed 闀滃ご缂╂斁閫熷害 榛樿 0X1 (0-255) + */ + public static String cmdString(int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed) { + int cmdCode = 0; + if (leftRight == 2) { + cmdCode|=0x01; // 鍙崇Щ + } else if(leftRight == 1) { + cmdCode|=0x02; // 宸︾Щ + } + if (upDown == 2) { + cmdCode|=0x04; // 涓嬬Щ + } else if(upDown == 1) { + cmdCode|=0x08; // 涓婄Щ + } + if (inOut == 2) { + cmdCode |= 0x10; // 鏀惧ぇ + } else if(inOut == 1) { + cmdCode |= 0x20; // 缂╁皬 + } + StringBuilder builder = new StringBuilder("A50F01"); + String strTmp; + strTmp = String.format("%02X", cmdCode); + builder.append(strTmp, 0, 2); + strTmp = String.format("%02X", moveSpeed); + builder.append(strTmp, 0, 2); + builder.append(strTmp, 0, 2); + strTmp = String.format("%X", zoomSpeed); + builder.append(strTmp, 0, 1).append("0"); + //璁$畻鏍¢獙鐮� + int checkCode = (0XA5 + 0X0F + 0X01 + cmdCode + moveSpeed + moveSpeed + (zoomSpeed /*<< 4*/ & 0XF0)) % 0X100; + strTmp = String.format("%02X", checkCode); + builder.append(strTmp, 0, 2); + return builder.toString(); + } + } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index cbecf0f..b043cad 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.media.zlm; +import java.text.ParseException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -7,6 +8,7 @@ import com.alibaba.fastjson.JSON; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.EventPublisher; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; @@ -31,6 +33,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import javax.servlet.http.HttpServletRequest; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; /** * @description:閽堝 ZLMediaServer鐨刪ook浜嬩欢鐩戝惉 @@ -57,6 +61,9 @@ @Autowired private IRedisCatchStorage redisCatchStorage; + + @Autowired + private IDeviceService deviceService; @Autowired private IMediaServerService mediaServerService; @@ -515,7 +522,11 @@ String platformId = sendRtpItem.getPlatformId(); ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); - commanderFroPlatform.streamByeCmd(platform, sendRtpItem); + try { + commanderFroPlatform.streamByeCmd(platform, sendRtpItem); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage()); + } } } } @@ -552,21 +563,41 @@ if (sendRtpItems.size() > 0) { for (SendRtpItem sendRtpItem : sendRtpItems) { ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId()); - commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId()); + try { + commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage()); + } redisCatchStorage.deleteSendRTPServer(parentPlatform.getServerGBId(), sendRtpItem.getChannelId(), sendRtpItem.getCallId(), sendRtpItem.getStreamId()); } } } - cmder.streamByeCmd(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId(), - streamInfoForPlayCatch.getStream(), null); + Device device = deviceService.queryDevice(streamInfoForPlayCatch.getDeviceID()); + if (device != null) { + try { + cmder.streamByeCmd(device, streamInfoForPlayCatch.getChannelId(), + streamInfoForPlayCatch.getStream(), null); + } catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) { + logger.error("[鏃犱汉瑙傜湅]鐐规挱锛� 鍙戦�丅YE澶辫触 {}", e.getMessage()); + } + } + redisCatchStorage.stopPlay(streamInfoForPlayCatch); storager.stopPlay(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId()); }else{ StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null); if (streamInfoForPlayBackCatch != null) { - cmder.streamByeCmd(streamInfoForPlayBackCatch.getDeviceID(), - streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null); + Device device = deviceService.queryDevice(streamInfoForPlayCatch.getDeviceID()); + if (device != null) { + try { + cmder.streamByeCmd(device,streamInfoForPlayBackCatch.getChannelId(), + streamInfoForPlayBackCatch.getStream(), null); + } catch (InvalidArgumentException | ParseException | SipException | + SsrcTransactionNotFoundException e) { + logger.error("[鏃犱汉瑙傜湅]鍥炴斁锛� 鍙戦�丅YE澶辫触 {}", e.getMessage()); + } + } redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch.getDeviceID(), streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null); }else { @@ -689,7 +720,11 @@ if (sendRtpItems.size() > 0) { for (SendRtpItem sendRtpItem : sendRtpItems) { ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId()); - commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId()); + try { + commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage()); + } redisCatchStorage.deleteSendRTPServer(parentPlatform.getServerGBId(), sendRtpItem.getChannelId(), sendRtpItem.getCallId(), sendRtpItem.getStreamId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java index b545ccc..d615980 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java @@ -68,7 +68,6 @@ private Map<String, ChannelOnlineEvent> channelOnPublishEvents = new ConcurrentHashMap<>(); public StreamPushItem addPush(MediaItem mediaItem) { - // 鏌ユ壘姝ょ洿鎾祦鏄惁瀛樺湪redis棰勮gbId StreamPushItem transform = streamPushService.transform(mediaItem); StreamPushItem pushInDb = streamPushService.getPush(mediaItem.getApp(), mediaItem.getStream()); transform.setPushIng(mediaItem.isRegist()); @@ -82,15 +81,14 @@ streamPushMapper.update(transform); gbStreamMapper.updateMediaServer(mediaItem.getApp(), mediaItem.getStream(), mediaItem.getMediaServerId()); } - if (transform != null) { - if (getChannelOnlineEventLister(transform.getApp(), transform.getStream()) != null) { - try { - getChannelOnlineEventLister(transform.getApp(), transform.getStream()).run(transform.getApp(), transform.getStream(), transform.getServerId()); - } catch (ParseException e) { - throw new RuntimeException(e); - } - removedChannelOnlineEventLister(transform.getApp(), transform.getStream()); + ChannelOnlineEvent channelOnlineEventLister = getChannelOnlineEventLister(transform.getApp(), transform.getStream()); + if ( channelOnlineEventLister != null) { + try { + channelOnlineEventLister.run(transform.getApp(), transform.getStream(), transform.getServerId());; + } catch (ParseException e) { + logger.error("addPush: ", e); } + removedChannelOnlineEventLister(transform.getApp(), transform.getStream()); } return transform; } @@ -99,11 +97,12 @@ MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); // 鏌ョ湅鎺ㄦ祦鐘舵�� if (zlmrtpServerFactory.isStreamReady(mediaServerItem, app, stream)) { - if (getChannelOnlineEventLister(app, stream) != null) { + ChannelOnlineEvent channelOnlineEventLister = getChannelOnlineEventLister(app, stream); + if (channelOnlineEventLister != null) { try { - getChannelOnlineEventLister(app, stream).run(app, stream, mediaServerId); + channelOnlineEventLister.run(app, stream, mediaServerId); } catch (ParseException e) { - throw new RuntimeException(e); + logger.error("sendStreamEvent: ", e); } removedChannelOnlineEventLister(app, stream); } 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 b1f8f2a..70d824c 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 @@ -26,6 +26,9 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.time.Instant; import java.util.ArrayList; import java.util.Collections; @@ -95,7 +98,11 @@ logger.info("[璁惧涓婄嚎,棣栨娉ㄥ唽]: {}锛屾煡璇㈣澶囦俊鎭互鍙婇�氶亾淇℃伅", device.getDeviceId()); deviceMapper.add(device); redisCatchStorage.updateDevice(device); - commander.deviceInfoQuery(device); + try { + commander.deviceInfoQuery(device); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鏌ヨ璁惧淇℃伅: {}", e.getMessage()); + } sync(device); }else { if(device.getOnline() == 0){ @@ -104,7 +111,11 @@ logger.info("[璁惧涓婄嚎,绂荤嚎鐘舵�佷笅閲嶆柊娉ㄥ唽]: {}锛屾煡璇㈣澶囦俊鎭互鍙婇�氶亾淇℃伅", device.getDeviceId()); deviceMapper.update(device); redisCatchStorage.updateDevice(device); - commander.deviceInfoQuery(device); + try { + commander.deviceInfoQuery(device); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鏌ヨ璁惧淇℃伅: {}", e.getMessage()); + } sync(device); // TODO 濡傛灉璁惧涓嬬殑閫氶亾绾ц仈鍒颁簡鍏朵粬骞冲彴锛岄偅涔堥渶瑕佸彂閫佷簨浠舵垨鑰卬otify缁欎笂绾у钩鍙� }else { @@ -129,6 +140,7 @@ @Override public void offline(String deviceId) { + logger.info("[璁惧绂荤嚎]锛� device锛歿}", deviceId); Device device = deviceMapper.getDeviceByDeviceId(deviceId); if (device == null) { return; @@ -238,15 +250,28 @@ } int sn = (int)((Math.random()*9+1)*100000); catalogResponseMessageHandler.setChannelSyncReady(device, sn); - sipCommander.catalogQuery(device, sn, event -> { - String errorMsg = String.format("鍚屾閫氶亾澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg); + try { + sipCommander.catalogQuery(device, sn, event -> { + String errorMsg = String.format("鍚屾閫氶亾澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg); + catalogResponseMessageHandler.setChannelSyncEnd(device.getDeviceId(), errorMsg); + }); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍚屾閫氶亾], 淇′护鍙戦�佸け璐ワ細{}", e.getMessage() ); + String errorMsg = String.format("鍚屾閫氶亾澶辫触锛屼俊浠ゅ彂閫佸け璐ワ細 %s", e.getMessage()); catalogResponseMessageHandler.setChannelSyncEnd(device.getDeviceId(), errorMsg); - }); + } } @Override public Device queryDevice(String deviceId) { - return deviceMapper.getDeviceByDeviceId(deviceId); + Device device = redisCatchStorage.getDevice(deviceId); + if (device == null) { + device = deviceMapper.getDeviceByDeviceId(deviceId); + if (device != null) { + redisCatchStorage.updateDevice(device); + } + } + return device; } @Override @@ -266,7 +291,11 @@ if (device == null || device.getOnline() == 0) { return; } - sipCommander.deviceStatusQuery(device, null); + try { + sipCommander.deviceStatusQuery(device, null); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 璁惧鐘舵�佹煡璇�: {}", e.getMessage()); + } } 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 3c5644b..fe67ede 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 @@ -20,7 +20,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; import javax.sip.TimeoutEvent; +import java.text.ParseException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -99,9 +102,13 @@ if (parentPlatform.isEnable()) { // 淇濆瓨鏃跺惎鐢ㄥ氨鍙戦�佹敞鍐� // 娉ㄥ唽鎴愬姛鏃剁敱绋嬪簭鐩存帴璋冪敤浜唎nline鏂规硶 - commanderForPlatform.register(parentPlatform, eventResult -> { - logger.info("[鍥芥爣绾ц仈] {},娣诲姞鍚戜笂绾ф敞鍐屽け璐ワ紝璇风‘瀹氫笂绾у钩鍙板彲鐢ㄦ椂閲嶆柊淇濆瓨", parentPlatform.getServerGBId()); - }, null); + try { + commanderForPlatform.register(parentPlatform, eventResult -> { + logger.info("[鍥芥爣绾ц仈] {},娣诲姞鍚戜笂绾ф敞鍐屽け璐ワ紝璇风‘瀹氫笂绾у钩鍙板彲鐢ㄦ椂閲嶆柊淇濆瓨", parentPlatform.getServerGBId()); + }, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈: {}", e.getMessage()); + } } return result > 0; } @@ -130,46 +137,62 @@ // 娣诲姞娉ㄥ唽浠诲姟 dynamicTask.startDelay(registerTaskKey, // 娉ㄥ唽澶辫触锛堟敞鍐屾垚鍔熸椂鐢辩▼搴忕洿鎺ヨ皟鐢ㄤ簡online鏂规硶锛� - ()->commanderForPlatform.register(parentPlatform, eventResult -> offline(parentPlatform),null), + ()-> { + try { + commanderForPlatform.register(parentPlatform, eventResult -> offline(parentPlatform),null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈瀹氭椂娉ㄥ唽: {}", e.getMessage()); + } + }, (parentPlatform.getExpires() - 10) *1000); final String keepaliveTaskKey = KEEPALIVE_KEY_PREFIX + parentPlatform.getServerGBId(); if (!dynamicTask.contains(keepaliveTaskKey)) { // 娣诲姞蹇冭烦浠诲姟 dynamicTask.startCron(keepaliveTaskKey, - ()-> commanderForPlatform.keepalive(parentPlatform, eventResult -> { - // 蹇冭烦澶辫触 - if (eventResult.type == SipSubscribe.EventResultType.timeout) { - // 蹇冭烦瓒呮椂 - ParentPlatformCatch platformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); - // 姝ゆ椂鏄涓夋蹇冭烦瓒呮椂锛� 骞冲彴绂荤嚎 - if (platformCatch.getKeepAliveReply() == 2) { - // 璁剧疆骞冲彴绂荤嚎锛屽苟閲嶆柊娉ㄥ唽 - offline(parentPlatform); - logger.info("[鍥芥爣绾ц仈] {}锛屼笁娆″績璺宠秴鏃跺悗鍐嶆鍙戣捣娉ㄥ唽", parentPlatform.getServerGBId()); - commanderForPlatform.register(parentPlatform, eventResult1 -> { - logger.info("[鍥芥爣绾ц仈] {}锛屼笁娆″績璺宠秴鏃跺悗鍐嶆鍙戣捣娉ㄥ唽浠嶇劧澶辫触锛屽紑濮嬪畾鏃跺彂璧锋敞鍐岋紝闂撮殧涓�1鍒嗛挓", parentPlatform.getServerGBId()); - // 娣诲姞娉ㄥ唽浠诲姟 - dynamicTask.startCron(registerTaskKey, - // 娉ㄥ唽澶辫触锛堟敞鍐屾垚鍔熸椂鐢辩▼搴忕洿鎺ヨ皟鐢ㄤ簡online鏂规硶锛� - ()->logger.info("[鍥芥爣绾ц仈] {},骞冲彴绂荤嚎鍚庢寔缁彂璧锋敞鍐岋紝澶辫触", parentPlatform.getServerGBId()), - 60*1000); - }, null); - } + ()-> { + try { + commanderForPlatform.keepalive(parentPlatform, eventResult -> { + // 蹇冭烦澶辫触 + if (eventResult.type == SipSubscribe.EventResultType.timeout) { + // 蹇冭烦瓒呮椂 + ParentPlatformCatch platformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); + // 姝ゆ椂鏄涓夋蹇冭烦瓒呮椂锛� 骞冲彴绂荤嚎 + if (platformCatch.getKeepAliveReply() == 2) { + // 璁剧疆骞冲彴绂荤嚎锛屽苟閲嶆柊娉ㄥ唽 + offline(parentPlatform); + logger.info("[鍥芥爣绾ц仈] {}锛屼笁娆″績璺宠秴鏃跺悗鍐嶆鍙戣捣娉ㄥ唽", parentPlatform.getServerGBId()); + try { + commanderForPlatform.register(parentPlatform, eventResult1 -> { + logger.info("[鍥芥爣绾ц仈] {}锛屼笁娆″績璺宠秴鏃跺悗鍐嶆鍙戣捣娉ㄥ唽浠嶇劧澶辫触锛屽紑濮嬪畾鏃跺彂璧锋敞鍐岋紝闂撮殧涓�1鍒嗛挓", parentPlatform.getServerGBId()); + // 娣诲姞娉ㄥ唽浠诲姟 + dynamicTask.startCron(registerTaskKey, + // 娉ㄥ唽澶辫触锛堟敞鍐屾垚鍔熸椂鐢辩▼搴忕洿鎺ヨ皟鐢ㄤ簡online鏂规硶锛� + ()->logger.info("[鍥芥爣绾ц仈] {},骞冲彴绂荤嚎鍚庢寔缁彂璧锋敞鍐岋紝澶辫触", parentPlatform.getServerGBId()), + 60*1000); + }, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 娉ㄥ唽: {}", e.getMessage()); + } + } - }else { - logger.warn("[鍥芥爣绾ц仈]鍙戦�佸績璺虫敹鍒伴敊璇紝code锛� {}, msg: {}", eventResult.statusCode, eventResult.msg); - } + }else { + logger.warn("[鍥芥爣绾ц仈]鍙戦�佸績璺虫敹鍒伴敊璇紝code锛� {}, msg: {}", eventResult.statusCode, eventResult.msg); + } - }, eventResult -> { - // 蹇冭烦鎴愬姛 - // 娓呯┖涔嬪墠鐨勫績璺宠秴鏃惰鏁� - ParentPlatformCatch platformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); - if (platformCatch.getKeepAliveReply() > 0) { - platformCatch.setKeepAliveReply(0); - redisCatchStorage.updatePlatformCatchInfo(platformCatch); + }, eventResult -> { + // 蹇冭烦鎴愬姛 + // 娓呯┖涔嬪墠鐨勫績璺宠秴鏃惰鏁� + ParentPlatformCatch platformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); + if (platformCatch.getKeepAliveReply() > 0) { + platformCatch.setKeepAliveReply(0); + redisCatchStorage.updatePlatformCatchInfo(platformCatch); + } + }); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�佸績璺�: {}", e.getMessage()); } - }), + }, (parentPlatform.getKeepTimeout() - 10)*1000); } } @@ -225,14 +248,18 @@ @Override public void login(ParentPlatform parentPlatform) { final String registerTaskKey = REGISTER_KEY_PREFIX + parentPlatform.getServerGBId(); - commanderForPlatform.register(parentPlatform, eventResult1 -> { - logger.info("[鍥芥爣绾ц仈] {}锛屽紑濮嬪畾鏃跺彂璧锋敞鍐岋紝闂撮殧涓�1鍒嗛挓", parentPlatform.getServerGBId()); - // 娣诲姞娉ㄥ唽浠诲姟 - dynamicTask.startCron(registerTaskKey, - // 娉ㄥ唽澶辫触锛堟敞鍐屾垚鍔熸椂鐢辩▼搴忕洿鎺ヨ皟鐢ㄤ簡online鏂规硶锛� - ()->logger.info("[鍥芥爣绾ц仈] {},骞冲彴绂荤嚎鍚庢寔缁彂璧锋敞鍐岋紝澶辫触", parentPlatform.getServerGBId()), - 60*1000); - }, null); + try { + commanderForPlatform.register(parentPlatform, eventResult1 -> { + logger.info("[鍥芥爣绾ц仈] {}锛屽紑濮嬪畾鏃跺彂璧锋敞鍐岋紝闂撮殧涓�1鍒嗛挓", parentPlatform.getServerGBId()); + // 娣诲姞娉ㄥ唽浠诲姟 + dynamicTask.startCron(registerTaskKey, + // 娉ㄥ唽澶辫触锛堟敞鍐屾垚鍔熸椂鐢辩▼搴忕洿鎺ヨ皟鐢ㄤ簡online鏂规硶锛� + ()->logger.info("[鍥芥爣绾ц仈] {},骞冲彴绂荤嚎鍚庢寔缁彂璧锋敞鍐岋紝澶辫触", parentPlatform.getServerGBId()), + 60*1000); + }, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈娉ㄥ唽: {}", e.getMessage()); + } } @Override @@ -259,7 +286,12 @@ continue; } // 鍙戦�丟PS娑堟伅 - commanderForPlatform.sendNotifyMobilePosition(platform, gpsMsgInfo, subscribe); + try { + commanderForPlatform.sendNotifyMobilePosition(platform, gpsMsgInfo, subscribe); + } catch (InvalidArgumentException | ParseException | NoSuchFieldException | SipException | + IllegalAccessException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 绉诲姩浣嶇疆閫氱煡: {}", e.getMessage()); + } } } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java index 6662738..7908c03 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java @@ -2,11 +2,17 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.ParseException; import java.util.*; +import javax.sip.InvalidArgumentException; import javax.sip.ResponseEvent; +import javax.sip.SipException; import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; +import com.genersoft.iot.vmp.gb28181.bean.*; +import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,13 +28,6 @@ import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.UserSetting; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo; -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; -import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; -import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; @@ -91,6 +90,10 @@ @Autowired private VideoStreamSessionManager streamSession; + + + @Autowired + private IDeviceService deviceService; @Autowired private UserSetting userSetting; @@ -258,14 +261,14 @@ System.out.println("璁剧疆瓒呮椂浠诲姟锛� " + timeOutTaskKey); dynamicTask.startDelay( timeOutTaskKey,()->{ - SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); - if (dialog != null) { - logger.info("[鐐规挱瓒呮椂] 鏀舵祦瓒呮椂 deviceId: {}, channelId: {}锛岀鍙o細{}, SSRC: {}", device.getDeviceId(), channelId, finalSsrcInfo.getPort(), finalSsrcInfo.getSsrc()); - timeoutCallback.run(1, "鏀舵祦瓒呮椂"); - // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧� - cmder.streamByeCmd(device.getDeviceId(), channelId, finalSsrcInfo.getStream(), null); - }else { - logger.info("[鐐规挱瓒呮椂] 娑堟伅鏈搷搴� deviceId: {}, channelId: {}锛岀鍙o細{}, SSRC: {}", device.getDeviceId(), channelId, finalSsrcInfo.getPort(), finalSsrcInfo.getSsrc()); + logger.info("[鐐规挱瓒呮椂] 鏀舵祦瓒呮椂 deviceId: {}, channelId: {}锛岀鍙o細{}, SSRC: {}", device.getDeviceId(), channelId, finalSsrcInfo.getPort(), finalSsrcInfo.getSsrc()); + timeoutCallback.run(1, "鏀舵祦瓒呮椂"); + // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧� + try { + cmder.streamByeCmd(device, channelId, finalSsrcInfo.getStream(), null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鐐规挱瓒呮椂]锛� 鍙戦�丅YE澶辫触 {}", e.getMessage()); + } catch (SsrcTransactionNotFoundException e) { timeoutCallback.run(0, "鐐规挱瓒呮椂"); mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream()); @@ -279,73 +282,87 @@ logger.info("[鐐规挱绔彛鍒嗛厤寮傚父]锛宒eviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo); return; } - cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { - logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); - System.out.println("鍋滄瓒呮椂浠诲姟锛� " + timeOutTaskKey); - dynamicTask.stop(timeOutTaskKey); - // hook鍝嶅簲 - onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid); - hookEvent.response(mediaServerItemInuse, response); - logger.info("[鐐规挱鎴愬姛] deviceId: {}, channelId: {}", device.getDeviceId(), channelId); + try { + cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { + logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); + System.out.println("鍋滄瓒呮椂浠诲姟锛� " + timeOutTaskKey); + dynamicTask.stop(timeOutTaskKey); + // hook鍝嶅簲 + onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid); + hookEvent.response(mediaServerItemInuse, response); + logger.info("[鐐规挱鎴愬姛] deviceId: {}, channelId: {}", device.getDeviceId(), channelId); - }, (event) -> { - ResponseEvent responseEvent = (ResponseEvent)event.event; - String contentString = new String(responseEvent.getResponse().getRawContent()); - // 鑾峰彇ssrc - int ssrcIndex = contentString.indexOf("y="); - // 妫�鏌ユ槸鍚︽湁y瀛楁 - if (ssrcIndex >= 0) { - //ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈� TODO 鍚庣画瀵逛笉瑙勮寖鐨勯潪10浣峴src鍏煎 - String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12); - // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞� - if (ssrc.equals(ssrcInResponse)) { - return; - } - logger.info("[鐐规挱娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse ); - if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) { - logger.info("[鐐规挱娑堟伅] SSRC淇 {}->{}", ssrc, ssrcInResponse); - - if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) { - // ssrc 涓嶅彲鐢� - // 閲婃斁ssrc - mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); - streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); - event.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�"; - event.statusCode = 400; - errorEvent.response(event); + }, (event) -> { + ResponseEvent responseEvent = (ResponseEvent)event.event; + String contentString = new String(responseEvent.getResponse().getRawContent()); + // 鑾峰彇ssrc + int ssrcIndex = contentString.indexOf("y="); + // 妫�鏌ユ槸鍚︽湁y瀛楁 + if (ssrcIndex >= 0) { + //ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈� TODO 鍚庣画瀵逛笉瑙勮寖鐨勯潪10浣峴src鍏煎 + String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12); + // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞� + if (ssrc.equals(ssrcInResponse)) { return; } + logger.info("[鐐规挱娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse ); + if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) { + logger.info("[鐐规挱娑堟伅] SSRC淇 {}->{}", ssrc, ssrcInResponse); - // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚� - if (!mediaServerItem.isRtpEnable()) { - // 娣诲姞璁㈤槄 - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId()); - subscribe.removeSubscribe(hookSubscribe); - hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase()); - subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{ - logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString()); - dynamicTask.stop(timeOutTaskKey); - // hook鍝嶅簲 - onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid); - hookEvent.response(mediaServerItemInUse, response); - }); + if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) { + // ssrc 涓嶅彲鐢� + // 閲婃斁ssrc + mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); + streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); + event.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�"; + event.statusCode = 400; + errorEvent.response(event); + return; + } + + // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚� + if (!mediaServerItem.isRtpEnable()) { + // 娣诲姞璁㈤槄 + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId()); + subscribe.removeSubscribe(hookSubscribe); + hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase()); + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{ + logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString()); + dynamicTask.stop(timeOutTaskKey); + // hook鍝嶅簲 + onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid); + hookEvent.response(mediaServerItemInUse, response); + }); + } + // 鍏抽棴rtp server + mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream()); + // 閲嶆柊寮�鍚痵src server + mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort()); + } - // 鍏抽棴rtp server - mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream()); - // 閲嶆柊寮�鍚痵src server - mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort()); - } - } - }, (event) -> { + }, (event) -> { + dynamicTask.stop(timeOutTaskKey); + mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream()); + // 閲婃斁ssrc + mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); + + streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); + errorEvent.response(event); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + + logger.error("[鍛戒护鍙戦�佸け璐 鐐规挱娑堟伅: {}", e.getMessage()); dynamicTask.stop(timeOutTaskKey); mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream()); // 閲婃斁ssrc mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); - errorEvent.response(event); - }); + SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null)); + eventResult.msg = "鍛戒护鍙戦�佸け璐�"; + errorEvent.response(eventResult); + } } @Override @@ -436,17 +453,18 @@ playBackResult.setCode(ErrorCode.ERROR100.getCode()); playBackResult.setMsg("鍥炴斁瓒呮椂"); playBackResult.setData(requestMessage); - SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream()); - // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧� - if (dialog != null) { + + try { + cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[褰曞儚娴乚鍥炴斁瓒呮椂 鍙戦�丅YE澶辫触 {}", e.getMessage()); + } catch (SsrcTransactionNotFoundException e) { // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧� - cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); - }else { mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); } - cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); + // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰 playBackCallback.call(playBackResult); result.setResult(WVPResult.fail(ErrorCode.ERROR100.getCode(), "鍥炴斁瓒呮椂")); @@ -486,59 +504,67 @@ playBackCallback.call(playBackResult); }; - cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack, - hookEvent, eventResult -> { - if (eventResult.type == SipSubscribe.EventResultType.response) { - ResponseEvent responseEvent = (ResponseEvent)eventResult.event; - String contentString = new String(responseEvent.getResponse().getRawContent()); - // 鑾峰彇ssrc - int ssrcIndex = contentString.indexOf("y="); - // 妫�鏌ユ槸鍚︽湁y瀛楁 - if (ssrcIndex >= 0) { - //ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈� TODO 鍚庣画瀵逛笉瑙勮寖鐨勯潪10浣峴src鍏煎 - String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12); - // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞� - if (ssrcInfo.getSsrc().equals(ssrcInResponse)) { - return; - } - logger.info("[鍥炴斁娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse ); - if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) { - logger.info("[鍥炴斁娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse); - - if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) { - // ssrc 涓嶅彲鐢� - // 閲婃斁ssrc - mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); - eventResult.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�"; - eventResult.statusCode = 400; - errorEvent.response(eventResult); + try { + cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack, + hookEvent, eventResult -> { + if (eventResult.type == SipSubscribe.EventResultType.response) { + ResponseEvent responseEvent = (ResponseEvent)eventResult.event; + String contentString = new String(responseEvent.getResponse().getRawContent()); + // 鑾峰彇ssrc + int ssrcIndex = contentString.indexOf("y="); + // 妫�鏌ユ槸鍚︽湁y瀛楁 + if (ssrcIndex >= 0) { + //ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈� TODO 鍚庣画瀵逛笉瑙勮寖鐨勯潪10浣峴src鍏煎 + String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12); + // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞� + if (ssrcInfo.getSsrc().equals(ssrcInResponse)) { return; } + logger.info("[鍥炴斁娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse ); + if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) { + logger.info("[鍥炴斁娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse); - // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚� - if (!mediaServerItem.isRtpEnable()) { - // 娣诲姞璁㈤槄 - HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); - subscribe.removeSubscribe(hookSubscribe); - hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase()); - subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{ - logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString()); - dynamicTask.stop(playBackTimeOutTaskKey); - // hook鍝嶅簲 - onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid); - hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream())); - }); + if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) { + // ssrc 涓嶅彲鐢� + // 閲婃斁ssrc + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); + streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); + eventResult.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�"; + eventResult.statusCode = 400; + errorEvent.response(eventResult); + return; + } + + // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚� + if (!mediaServerItem.isRtpEnable()) { + // 娣诲姞璁㈤槄 + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); + subscribe.removeSubscribe(hookSubscribe); + hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase()); + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{ + logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString()); + dynamicTask.stop(playBackTimeOutTaskKey); + // hook鍝嶅簲 + onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid); + hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream())); + }); + } + // 鍏抽棴rtp server + mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); + // 閲嶆柊寮�鍚痵src server + mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort()); } - // 鍏抽棴rtp server - mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); - // 閲嶆柊寮�鍚痵src server - mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort()); } } - } - }, errorEvent); + }, errorEvent); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥炴斁: {}", e.getMessage()); + + SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null)); + eventResult.msg = "鍛戒护鍙戦�佸け璐�"; + errorEvent.response(eventResult); + } return result; } @@ -584,46 +610,57 @@ downloadResult.setCode(ErrorCode.ERROR100.getCode()); downloadResult.setMsg("褰曞儚涓嬭浇璇锋眰瓒呮椂"); hookCallBack.call(downloadResult); - SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream()); + // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧� - if (dialog != null) { - // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧� - cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); - }else { + try { + cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[褰曞儚娴乚褰曞儚涓嬭浇璇锋眰瓒呮椂锛� 鍙戦�丅YE澶辫触 {}", e.getMessage()); + } catch (SsrcTransactionNotFoundException e) { mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); } - cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰 hookCallBack.call(downloadResult); }, userSetting.getPlayTimeout()); - cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack, - inviteStreamInfo -> { - logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + inviteStreamInfo.getResponse().toJSONString()); - dynamicTask.stop(downLoadTimeOutTaskKey); - StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); - streamInfo.setStartTime(startTime); - streamInfo.setEndTime(endTime); - redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId()); - wvpResult.setCode(ErrorCode.SUCCESS.getCode()); - wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); - wvpResult.setData(streamInfo); - downloadResult.setCode(ErrorCode.SUCCESS.getCode()); - downloadResult.setMsg(ErrorCode.SUCCESS.getMsg()); - downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); - downloadResult.setResponse(inviteStreamInfo.getResponse()); - hookCallBack.call(downloadResult); - }, event -> { - dynamicTask.stop(downLoadTimeOutTaskKey); - downloadResult.setCode(ErrorCode.ERROR100.getCode()); - downloadResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); - wvpResult.setCode(ErrorCode.ERROR100.getCode()); - wvpResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); - downloadResult.setEvent(event); - hookCallBack.call(downloadResult); - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); - }); + + SipSubscribe.Event errorEvent = event -> { + dynamicTask.stop(downLoadTimeOutTaskKey); + downloadResult.setCode(ErrorCode.ERROR100.getCode()); + downloadResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); + wvpResult.setCode(ErrorCode.ERROR100.getCode()); + wvpResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); + downloadResult.setEvent(event); + hookCallBack.call(downloadResult); + streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); + }; + + try { + cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack, + inviteStreamInfo -> { + logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + inviteStreamInfo.getResponse().toJSONString()); + dynamicTask.stop(downLoadTimeOutTaskKey); + StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); + streamInfo.setStartTime(startTime); + streamInfo.setEndTime(endTime); + redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId()); + wvpResult.setCode(ErrorCode.SUCCESS.getCode()); + wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); + wvpResult.setData(streamInfo); + downloadResult.setCode(ErrorCode.SUCCESS.getCode()); + downloadResult.setMsg(ErrorCode.SUCCESS.getMsg()); + downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); + downloadResult.setResponse(inviteStreamInfo.getResponse()); + hookCallBack.call(downloadResult); + }, errorEvent); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚涓嬭浇: {}", e.getMessage()); + + SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null)); + eventResult.msg = "鍛戒护鍙戦�佸け璐�"; + errorEvent.response(eventResult); + } return result; } @@ -702,7 +739,11 @@ for (SendRtpItem sendRtpItem : sendRtpItems) { if (sendRtpItem.getMediaServerId().equals(mediaServerId)) { ParentPlatform platform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId()); - sipCommanderFroPlatform.streamByeCmd(platform, sendRtpItem.getCallId()); + try { + sipCommanderFroPlatform.streamByeCmd(platform, sendRtpItem.getCallId()); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage()); + } } } } @@ -711,8 +752,17 @@ if (allSsrc.size() > 0) { for (SsrcTransaction ssrcTransaction : allSsrc) { if(ssrcTransaction.getMediaServerId().equals(mediaServerId)) { - cmder.streamByeCmd(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), - ssrcTransaction.getStream(), null); + Device device = deviceService.queryDevice(ssrcTransaction.getDeviceId()); + if (device == null) { + continue; + } + try { + cmder.streamByeCmd(device, ssrcTransaction.getChannelId(), + ssrcTransaction.getStream(), null); + } catch (InvalidArgumentException | ParseException | SipException | + SsrcTransactionNotFoundException e) { + logger.error("[zlm绂荤嚎]涓烘鍦ㄤ娇鐢ㄦzlm鐨勮澶囷紝 鍙戦�丅YE澶辫触 {}", e.getMessage()); + } } } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java index 84f5ef7..589e2be 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java +++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java @@ -16,6 +16,9 @@ import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; @@ -76,16 +79,28 @@ List<ParentPlatform> parentPlatforms = storage.queryEnableParentPlatformList(true); if (parentPlatforms.size() > 0) { for (ParentPlatform parentPlatform : parentPlatforms) { - commanderForPlatform.sendAlarmMessage(parentPlatform, deviceAlarm); + try { + commanderForPlatform.sendAlarmMessage(parentPlatform, deviceAlarm); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�佹姤璀�: {}", e.getMessage()); + } } } }else { Device device = storage.queryVideoDevice(gbId); ParentPlatform platform = storage.queryParentPlatByServerGBId(gbId); if (device != null && platform == null) { - commander.sendAlarmMessage(device, deviceAlarm); + try { + commander.sendAlarmMessage(device, deviceAlarm); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍙戦�佹姤璀�: {}", e.getMessage()); + } }else if (device == null && platform != null){ - commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + try { + commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍙戦�佹姤璀�: {}", e.getMessage()); + } }else { logger.warn("鏃犳硶纭畾" + gbId + "鏄钩鍙拌繕鏄澶�"); } 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 e5d928a..f399f30 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 @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.vmanager.gb28181.MobilePosition; +import java.text.ParseException; import java.util.List; import java.util.UUID; @@ -30,6 +31,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult; + +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; /** * 浣嶇疆淇℃伅绠$悊 @@ -105,13 +109,18 @@ Device device = storager.queryVideoDevice(deviceId); String uuid = UUID.randomUUID().toString(); String key = DeferredResultHolder.CALLBACK_CMD_MOBILEPOSITION + deviceId; - cmder.mobilePostitionQuery(device, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("鑾峰彇绉诲姩浣嶇疆淇℃伅澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); + try { + cmder.mobilePostitionQuery(device, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鑾峰彇绉诲姩浣嶇疆淇℃伅澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鑾峰彇绉诲姩浣嶇疆淇℃伅: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } DeferredResult<MobilePosition> result = new DeferredResult<MobilePosition>(5*1000L); result.onTimeout(()->{ logger.warn(String.format("鑾峰彇绉诲姩浣嶇疆淇℃伅瓒呮椂")); diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java index c8bd3f4..e030b17 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java @@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; +import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener; import com.genersoft.iot.vmp.service.IDeviceAlarmService; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.DateUtil; @@ -16,6 +17,8 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -23,6 +26,9 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; @@ -32,6 +38,8 @@ @RestController @RequestMapping("/api/alarm") public class AlarmController { + + private final static Logger logger = LoggerFactory.getLogger(AlarmController.class); @Autowired private IDeviceAlarmService deviceAlarmService; @@ -108,9 +116,19 @@ deviceAlarm.setLatitude(39.33333); if (device != null && platform == null) { - commander.sendAlarmMessage(device, deviceAlarm); + + try { + commander.sendAlarmMessage(device, deviceAlarm); + } catch (InvalidArgumentException | SipException | ParseException e) { + + } }else if (device == null && platform != null){ - commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + try { + commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } }else { throw new ControllerException(ErrorCode.ERROR100.getCode(),"鏃犳硶纭畾" + deviceId + "鏄钩鍙拌繕鏄澶�"); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java index d0eb81d..e39b303 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java @@ -8,12 +8,14 @@ package com.genersoft.iot.vmp.vmanager.gb28181.device; import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.gb28181.bean.Device; 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.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -26,6 +28,9 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.util.UUID; @Tag(name = "鍥芥爣璁惧閰嶇疆") @@ -75,14 +80,19 @@ Device device = storager.queryVideoDevice(deviceId); String uuid = UUID.randomUUID().toString(); String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONFIG + deviceId + channelId; - cmder.deviceBasicConfigCmd(device, channelId, name, expiration, heartBeatInterval, heartBeatCount, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("璁惧閰嶇疆鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<String> result = new DeferredResult<String>(3 * 1000L); + try { + cmder.deviceBasicConfigCmd(device, channelId, name, expiration, heartBeatInterval, heartBeatCount, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("璁惧閰嶇疆鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 璁惧閰嶇疆: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } + DeferredResult<String> result = new DeferredResult<String>(3 * 1000L); result.onTimeout(() -> { logger.warn(String.format("璁惧閰嶇疆鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�")); // 閲婃斁rtpserver @@ -121,14 +131,19 @@ String key = DeferredResultHolder.CALLBACK_CMD_CONFIGDOWNLOAD + (ObjectUtils.isEmpty(channelId) ? deviceId : channelId); String uuid = UUID.randomUUID().toString(); Device device = storager.queryVideoDevice(deviceId); - cmder.deviceConfigQuery(device, channelId, configType, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("鑾峰彇璁惧閰嶇疆澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<String> result = new DeferredResult<String > (3 * 1000L); + try { + cmder.deviceConfigQuery(device, channelId, configType, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鑾峰彇璁惧閰嶇疆澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鑾峰彇璁惧閰嶇疆: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } + DeferredResult<String> result = new DeferredResult<String > (3 * 1000L); result.onTimeout(()->{ logger.warn(String.format("鑾峰彇璁惧閰嶇疆瓒呮椂")); // 閲婃斁rtpserver diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java index fe363a6..1b866b9 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java @@ -29,6 +29,9 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.util.UUID; @Tag(name = "鍥芥爣璁惧鎺у埗") @@ -61,10 +64,12 @@ logger.debug("璁惧杩滅▼鍚姩API璋冪敤"); } Device device = storager.queryVideoDevice(deviceId); - if (!cmder.teleBootCmd(device)) { - logger.warn("璁惧杩滅▼鍚姩API璋冪敤澶辫触锛�"); - throw new ControllerException(ErrorCode.ERROR100); - } + try { + cmder.teleBootCmd(device); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 杩滅▼鍚姩: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } } /** @@ -101,13 +106,18 @@ return result; } resultHolder.put(key, uuid, result); - cmder.recordCmd(device, channelId, recordCmdStr, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("寮�濮�/鍋滄褰曞儚鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); - resultHolder.invokeAllResult(msg); - }); + try { + cmder.recordCmd(device, channelId, recordCmdStr, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("寮�濮�/鍋滄褰曞儚鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); + resultHolder.invokeAllResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 寮�濮�/鍋滄褰曞儚: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } return result; } @@ -123,21 +133,26 @@ @Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true) @Parameter(name = "guardCmdStr", description = "鍛戒护锛� 鍙�夊�硷細SetGuard锛堝竷闃诧級锛孯esetGuard锛堟挙闃诧級", required = true) @GetMapping("/guard/{deviceId}/{guardCmdStr}") - public DeferredResult<ResponseEntity<String>> guardApi(@PathVariable String deviceId, String channelId, @PathVariable String guardCmdStr) { + public DeferredResult<String> guardApi(@PathVariable String deviceId, String channelId, @PathVariable String guardCmdStr) { if (logger.isDebugEnabled()) { logger.debug("甯冮槻/鎾ら槻API璋冪敤"); } Device device = storager.queryVideoDevice(deviceId); String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + channelId; String uuid =UUID.randomUUID().toString(); - cmder.guardCmd(device, guardCmdStr, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("甯冮槻/鎾ら槻鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); + try { + cmder.guardCmd(device, guardCmdStr, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("甯冮槻/鎾ら槻鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 甯冮槻/鎾ら槻鎿嶄綔: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦��: " + e.getMessage()); + } + DeferredResult<String> result = new DeferredResult<>(3 * 1000L); resultHolder.put(key, uuid, result); result.onTimeout(() -> { logger.warn(String.format("甯冮槻/鎾ら槻鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�")); @@ -174,14 +189,19 @@ Device device = storager.queryVideoDevice(deviceId); String uuid = UUID.randomUUID().toString(); String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + deviceId + channelId; - cmder.alarmCmd(device, alarmMethod, alarmType, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("鎶ヨ澶嶄綅鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); + try { + cmder.alarmCmd(device, alarmMethod, alarmType, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鎶ヨ澶嶄綅鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鎶ヨ澶嶄綅: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); result.onTimeout(() -> { logger.warn(String.format("鎶ヨ澶嶄綅鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�")); // 閲婃斁rtpserver @@ -205,23 +225,23 @@ @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿") @GetMapping("/i_frame/{deviceId}") - public ResponseEntity<String> iFrame(@PathVariable String deviceId, + public JSONObject iFrame(@PathVariable String deviceId, @RequestParam(required = false) String channelId) { if (logger.isDebugEnabled()) { logger.debug("寮哄埗鍏抽敭甯PI璋冪敤"); } Device device = storager.queryVideoDevice(deviceId); - boolean sucsess = cmder.iFrameCmd(device, channelId); - if (sucsess) { - JSONObject json = new JSONObject(); - json.put("DeviceID", deviceId); - json.put("ChannelID", channelId); - json.put("Result", "OK"); - return new ResponseEntity<>(json.toJSONString(), HttpStatus.OK); - } else { - logger.warn("寮哄埗鍏抽敭甯PI璋冪敤澶辫触锛�"); - return new ResponseEntity<String>("寮哄埗鍏抽敭甯PI璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR); + try { + cmder.iFrameCmd(device, channelId); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 寮哄埗鍏抽敭甯�: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); } + JSONObject json = new JSONObject(); + json.put("DeviceID", deviceId); + json.put("ChannelID", channelId); + json.put("Result", "OK"); + return json; } /** @@ -240,7 +260,7 @@ @Parameter(name = "presetIndex", description = "璋冪敤棰勭疆浣嶇紪鍙�") @Parameter(name = "resetTime", description = "鑷姩褰掍綅鏃堕棿闂撮殧") @GetMapping("/home_position/{deviceId}/{enabled}") - public DeferredResult<ResponseEntity<String>> homePositionApi(@PathVariable String deviceId, + public DeferredResult<String> homePositionApi(@PathVariable String deviceId, @PathVariable String enabled, @RequestParam(required = false) String resetTime, @RequestParam(required = false) String presetIndex, @@ -251,14 +271,19 @@ String key = DeferredResultHolder.CALLBACK_CMD_DEVICECONTROL + (ObjectUtils.isEmpty(channelId) ? deviceId : channelId); String uuid = UUID.randomUUID().toString(); Device device = storager.queryVideoDevice(deviceId); - cmder.homePositionCmd(device, channelId, enabled, resetTime, presetIndex, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("鐪嬪畧浣嶆帶鍒舵搷浣滃け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L); + try { + cmder.homePositionCmd(device, channelId, enabled, resetTime, presetIndex, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鐪嬪畧浣嶆帶鍒舵搷浣滃け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鐪嬪畧浣嶆帶鍒�: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } + DeferredResult<String> result = new DeferredResult<>(3 * 1000L); result.onTimeout(() -> { logger.warn(String.format("鐪嬪畧浣嶆帶鍒舵搷浣滆秴鏃�, 璁惧鏈繑鍥炲簲绛旀寚浠�")); // 閲婃斁rtpserver @@ -297,14 +322,14 @@ @Parameter(name = "lengthx", description = "鎷夋闀垮害鍍忕礌鍊�", required = true) @Parameter(name = "lengthy", description = "lengthy", required = true) @GetMapping("drag_zoom/zoom_in") - public ResponseEntity<String> dragZoomIn(@RequestParam String deviceId, + public void dragZoomIn(@RequestParam String deviceId, @RequestParam(required = false) String channelId, @RequestParam int length, @RequestParam int width, @RequestParam int midpointx, @RequestParam int midpointy, @RequestParam int lengthx, - @RequestParam int lengthy){ + @RequestParam int lengthy) throws RuntimeException { if (logger.isDebugEnabled()) { logger.debug(String.format("璁惧鎷夋鏀惧ぇ API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s 锛宭ength锛�%d 锛寃idth锛�%d 锛宮idpointx锛�%d 锛宮idpointy锛�%d 锛宭engthx锛�%d 锛宭engthy锛�%d",deviceId, channelId, length, width, midpointx, midpointy,lengthx, lengthy)); } @@ -318,8 +343,12 @@ cmdXml.append("<LengthX>" + lengthx+ "</LengthX>\r\n"); cmdXml.append("<LengthY>" + lengthy+ "</LengthY>\r\n"); cmdXml.append("</DragZoomIn>\r\n"); - cmder.dragZoomCmd(device, channelId, cmdXml.toString()); - return new ResponseEntity<String>("success", HttpStatus.OK); + try { + cmder.dragZoomCmd(device, channelId, cmdXml.toString()); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鎷夋鏀惧ぇ: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } } /** @@ -344,7 +373,7 @@ @Parameter(name = "lengthx", description = "鎷夋闀垮害鍍忕礌鍊�", required = true) @Parameter(name = "lengthy", description = "鎷夋瀹藉害鍍忕礌鍊�", required = true) @GetMapping("/drag_zoom/zoom_out") - public ResponseEntity<String> dragZoomOut(@RequestParam String deviceId, + public void dragZoomOut(@RequestParam String deviceId, @RequestParam(required = false) String channelId, @RequestParam int length, @RequestParam int width, @@ -366,7 +395,11 @@ cmdXml.append("<LengthX>" + lengthx+ "</LengthX>\r\n"); cmdXml.append("<LengthY>" + lengthy+ "</LengthY>\r\n"); cmdXml.append("</DragZoomOut>\r\n"); - cmder.dragZoomCmd(device, channelId, cmdXml.toString()); - return new ResponseEntity<String>("success",HttpStatus.OK); + try { + cmder.dragZoomCmd(device, channelId, cmdXml.toString()); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鎷夋缂╁皬: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index eb79fc7..37fb98e 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -39,8 +39,11 @@ import javax.servlet.http.HttpServletResponse; import javax.sip.DialogState; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; import java.io.*; import java.nio.file.Files; +import java.text.ParseException; import java.util.*; @Tag(name = "鍥芥爣璁惧鏌ヨ", description = "鍥芥爣璁惧鏌ヨ") @@ -315,13 +318,18 @@ result.setResult(new ResponseEntity(String.format("璁惧%s涓嶅瓨鍦�", deviceId),HttpStatus.OK)); return result; } - cmder.deviceStatusQuery(device, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("鑾峰彇璁惧鐘舵�佸け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); + try { + cmder.deviceStatusQuery(device, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鑾峰彇璁惧鐘舵�佸け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鑾峰彇璁惧鐘舵��: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } result.onTimeout(()->{ logger.warn(String.format("鑾峰彇璁惧鐘舵�佽秴鏃�")); // 閲婃斁rtpserver @@ -368,14 +376,19 @@ Device device = storager.queryVideoDevice(deviceId); String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId; String uuid = UUID.randomUUID().toString(); - cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("璁惧鎶ヨ鏌ヨ澶辫触锛岄敊璇爜锛� %s, %s",event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); + try { + cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("璁惧鎶ヨ鏌ヨ澶辫触锛岄敊璇爜锛� %s, %s",event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 璁惧鎶ヨ鏌ヨ: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); result.onTimeout(()->{ logger.warn(String.format("璁惧鎶ヨ鏌ヨ瓒呮椂")); // 閲婃斁rtpserver 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 fa1de00..a1cb871 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 @@ -29,6 +29,9 @@ import org.springframework.web.bind.annotation.*; import com.genersoft.iot.vmp.conf.SipConfig; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.util.List; /** @@ -212,20 +215,37 @@ // 淇濆瓨鏃跺惎鐢ㄥ氨鍙戦�佹敞鍐� if (parentPlatform.isEnable()) { if (parentPlatformOld != null && parentPlatformOld.isStatus()) { - commanderForPlatform.unregister(parentPlatformOld, null, null); + try { + commanderForPlatform.unregister(parentPlatformOld, null, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 娉ㄩ攢: {}", e.getMessage()); + } try { Thread.sleep(500); } catch (InterruptedException e) { - e.printStackTrace(); + logger.error("[绾跨▼浼戠湢澶辫触] : {}", e.getMessage()); } // 鍙淇濆瓨灏卞彂閫佹敞鍐� - commanderForPlatform.register(parentPlatform, null, null); + try { + commanderForPlatform.register(parentPlatform, null, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 娉ㄥ唽: {}", e.getMessage()); + } + } else { // 鍙淇濆瓨灏卞彂閫佹敞鍐� - commanderForPlatform.register(parentPlatform, null, null); + try { + commanderForPlatform.register(parentPlatform, null, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 娉ㄥ唽: {}", e.getMessage()); + } } } else if (parentPlatformOld != null && parentPlatformOld.isEnable() && !parentPlatform.isEnable()) { // 鍏抽棴鍚敤鏃舵敞閿� - commanderForPlatform.unregister(parentPlatformOld, null, null); + try { + commanderForPlatform.unregister(parentPlatformOld, null, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 娉ㄩ攢: {}", e.getMessage()); + } // 鍋滄璁㈤槄鐩稿叧鐨勫畾鏃朵换鍔� subscribeHolder.removeAllSubscribe(parentPlatform.getServerGBId()); } @@ -258,17 +278,21 @@ throw new ControllerException(ErrorCode.ERROR100.getCode(), "骞冲彴涓嶅瓨鍦�"); } // 鍙戦�佺绾挎秷鎭�,鏃犺鏄惁鎴愬姛閮藉垹闄ょ紦瀛� - commanderForPlatform.unregister(parentPlatform, (event -> { - // 娓呯┖redis缂撳瓨 - redisCatchStorage.delPlatformCatchInfo(parentPlatform.getServerGBId()); - redisCatchStorage.delPlatformKeepalive(parentPlatform.getServerGBId()); - redisCatchStorage.delPlatformRegister(parentPlatform.getServerGBId()); - }), (event -> { - // 娓呯┖redis缂撳瓨 - redisCatchStorage.delPlatformCatchInfo(parentPlatform.getServerGBId()); - redisCatchStorage.delPlatformKeepalive(parentPlatform.getServerGBId()); - redisCatchStorage.delPlatformRegister(parentPlatform.getServerGBId()); - })); + try { + commanderForPlatform.unregister(parentPlatform, (event -> { + // 娓呯┖redis缂撳瓨 + redisCatchStorage.delPlatformCatchInfo(parentPlatform.getServerGBId()); + redisCatchStorage.delPlatformKeepalive(parentPlatform.getServerGBId()); + redisCatchStorage.delPlatformRegister(parentPlatform.getServerGBId()); + }), (event -> { + // 娓呯┖redis缂撳瓨 + redisCatchStorage.delPlatformCatchInfo(parentPlatform.getServerGBId()); + redisCatchStorage.delPlatformKeepalive(parentPlatform.getServerGBId()); + redisCatchStorage.delPlatformRegister(parentPlatform.getServerGBId()); + })); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 娉ㄩ攢: {}", e.getMessage()); + } boolean deleteResult = storager.deleteParentPlatform(parentPlatform); storager.delCatalogByPlatformId(parentPlatform.getServerGBId()); diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java index 5d9bb2b..b965254 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSONArray; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.bean.Device; @@ -36,6 +37,9 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.springframework.web.context.request.async.DeferredResult; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.util.List; import java.util.UUID; @@ -102,12 +106,23 @@ throw new ControllerException(ErrorCode.ERROR400); } + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧[" + deviceId + "]涓嶅瓨鍦�"); + } + StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId); if (streamInfo == null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "鐐规挱鏈壘鍒�"); } - cmder.streamByeCmd(deviceId, channelId, streamInfo.getStream(), null, null); + try { + logger.warn("[鍋滄鐐规挱] {}/{}", device.getDeviceId(), channelId); + cmder.streamByeCmd(device, channelId, streamInfo.getStream(), null, null); + } catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍋滄鐐规挱锛� 鍙戦�丅YE: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } redisCatchStorage.stopPlay(streamInfo); storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); @@ -221,18 +236,23 @@ resultHolder.invokeResult(msg); return result; } - cmder.audioBroadcastCmd(device, (event) -> { - RequestMessage msg = new RequestMessage(); - msg.setKey(key); - msg.setId(uuid); - JSONObject json = new JSONObject(); - json.put("DeviceID", deviceId); - json.put("CmdType", "Broadcast"); - json.put("Result", "Failed"); - json.put("Description", String.format("璇煶骞挎挱鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); - msg.setData(json); - resultHolder.invokeResult(msg); - }); + try { + cmder.audioBroadcastCmd(device, (event) -> { + RequestMessage msg = new RequestMessage(); + msg.setKey(key); + msg.setId(uuid); + JSONObject json = new JSONObject(); + json.put("DeviceID", deviceId); + json.put("CmdType", "Broadcast"); + json.put("Result", "Failed"); + json.put("Description", String.format("璇煶骞挎挱鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg)); + msg.setData(json); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 璇煶骞挎挱: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } result.onTimeout(() -> { logger.warn("璇煶骞挎挱鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�"); diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java index 33c02ad..20860bf 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java @@ -2,6 +2,7 @@ import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -21,11 +22,14 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.springframework.web.context.request.async.DeferredResult; + +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; /** * @author lin @@ -92,7 +96,15 @@ if (ObjectUtils.isEmpty(deviceId) || ObjectUtils.isEmpty(channelId) || ObjectUtils.isEmpty(stream)) { throw new ControllerException(ErrorCode.ERROR400); } - cmder.streamByeCmd(deviceId, channelId, stream, null); + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + throw new ControllerException(ErrorCode.ERROR400.getCode(), "璁惧锛�" + deviceId + " 鏈壘鍒�"); + } + try { + cmder.streamByeCmd(device, channelId, stream, null); + } catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍙戦�乥ye澶辫触锛� " + e.getMessage()); + } } @@ -107,7 +119,11 @@ throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId涓嶅瓨鍦�"); } Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); - cmder.playPauseCmd(device, streamInfo); + try { + cmder.playPauseCmd(device, streamInfo); + } catch (InvalidArgumentException | ParseException | SipException e) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); + } } @@ -122,7 +138,11 @@ throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId涓嶅瓨鍦�"); } Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); - cmder.playResumeCmd(device, streamInfo); + try { + cmder.playResumeCmd(device, streamInfo); + } catch (InvalidArgumentException | ParseException | SipException e) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); + } } @@ -138,7 +158,11 @@ throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId涓嶅瓨鍦�"); } Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); - cmder.playSeekCmd(device, streamInfo, seekTime); + try { + cmder.playSeekCmd(device, streamInfo, seekTime); + } catch (InvalidArgumentException | ParseException | SipException e) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); + } } @Operation(summary = "鍥炴斁鍊嶉�熸挱鏀�") @@ -157,6 +181,10 @@ throw new ControllerException(ErrorCode.ERROR100.getCode(), "涓嶆敮鎸佺殑speed锛�0.25 0.5 1銆�2銆�4锛�"); } Device device = storager.queryVideoDevice(streamInfo.getDeviceID()); - cmder.playSpeedCmd(device, streamInfo, speed); + try { + cmder.playSpeedCmd(device, streamInfo, speed); + } catch (InvalidArgumentException | ParseException | SipException e) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java index 6903e4d..171f57c 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/ptz/PtzController.java @@ -1,6 +1,8 @@ package com.genersoft.iot.vmp.vmanager.gb28181.ptz; +import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -18,6 +20,9 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.util.UUID; @Tag(name = "浜戝彴鎺у埗") @@ -98,7 +103,12 @@ default: break; } - cmder.frontEndCmd(device, channelId, cmdCode, horizonSpeed, verticalSpeed, zoomSpeed); + try { + cmder.frontEndCmd(device, channelId, cmdCode, horizonSpeed, verticalSpeed, zoomSpeed); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 浜戝彴鎺у埗: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } } @@ -117,7 +127,12 @@ } Device device = storager.queryVideoDevice(deviceId); - cmder.frontEndCmd(device, channelId, cmdCode, parameter1, parameter2, combindCode2); + try { + cmder.frontEndCmd(device, channelId, cmdCode, parameter1, parameter2, combindCode2); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鍓嶇鎺у埗: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } } @@ -146,13 +161,18 @@ return result; } resultHolder.put(key, uuid, result); - cmder.presetQuery(device, channelId, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("鑾峰彇璁惧棰勭疆浣嶅け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); + try { + cmder.presetQuery(device, channelId, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鑾峰彇璁惧棰勭疆浣嶅け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鑾峰彇璁惧棰勭疆浣�: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } return result; } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java index 755b37b..b09467a 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java @@ -3,7 +3,9 @@ import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; +import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IPlayService; import com.genersoft.iot.vmp.utils.DateUtil; @@ -31,6 +33,9 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; import java.time.LocalDate; import java.util.UUID; @@ -53,6 +58,12 @@ @Autowired private IPlayService playService; + + @Autowired + private IDeviceService deviceService; + + + @Operation(summary = "褰曞儚鏌ヨ") @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @@ -81,13 +92,18 @@ RequestMessage msg = new RequestMessage(); msg.setId(uuid); msg.setKey(key); - cmder.recordInfoQuery(device, channelId, startTime, endTime, sn, null, null, null, (eventResult -> { - WVPResult<RecordInfo> wvpResult = new WVPResult<>(); - wvpResult.setCode(ErrorCode.ERROR100.getCode()); - wvpResult.setMsg("鏌ヨ褰曞儚澶辫触, status: " + eventResult.statusCode + ", message: " + eventResult.msg); - msg.setData(wvpResult); - resultHolder.invokeResult(msg); - })); + try { + cmder.recordInfoQuery(device, channelId, startTime, endTime, sn, null, null, null, (eventResult -> { + WVPResult<RecordInfo> wvpResult = new WVPResult<>(); + wvpResult.setCode(ErrorCode.ERROR100.getCode()); + wvpResult.setMsg("鏌ヨ褰曞儚澶辫触, status: " + eventResult.statusCode + ", message: " + eventResult.msg); + msg.setData(wvpResult); + resultHolder.invokeResult(msg); + })); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鏌ヨ褰曞儚: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ resultHolder.put(key, uuid, result); @@ -131,14 +147,24 @@ @GetMapping("/download/stop/{deviceId}/{channelId}/{stream}") public void playStop(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) { - cmder.streamByeCmd(deviceId, channelId, stream, null); - if (logger.isDebugEnabled()) { logger.debug(String.format("璁惧鍘嗗彶濯掍綋涓嬭浇鍋滄 API璋冪敤锛宒eviceId/channelId锛�%s_%s", deviceId, channelId)); } if (deviceId == null || channelId == null) { - throw new ControllerException(ErrorCode.ERROR100); + throw new ControllerException(ErrorCode.ERROR400); + } + + Device device = deviceService.queryDevice(deviceId); + if (device == null) { + throw new ControllerException(ErrorCode.ERROR400.getCode(), "璁惧锛�" + deviceId + "鏈壘鍒�"); + } + + try { + cmder.streamByeCmd(device, channelId, stream, null); + } catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) { + logger.error("[鍋滄鍘嗗彶濯掍綋涓嬭浇]鍋滄鍘嗗彶濯掍綋涓嬭浇锛屽彂閫丅YE澶辫触 {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); } } diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java index 9bbe1d7..c817385 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java @@ -1,13 +1,19 @@ package com.genersoft.iot.vmp.web.gb28181; import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; + +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; /** * API鍏煎锛氳澶囨帶鍒� @@ -35,7 +41,7 @@ * @return */ @RequestMapping(value = "/ptz") - private JSONObject list(String serial,String command, + private void list(String serial,String command, @RequestParam(required = false)Integer channel, @RequestParam(required = false)String code, @RequestParam(required = false)Integer speed){ @@ -48,9 +54,7 @@ if (speed == null) {speed = 0;} Device device = storager.queryVideoDevice(serial); if (device == null) { - JSONObject result = new JSONObject(); - result.put("error","device[ " + serial + " ]鏈壘鍒�"); - return result; + throw new ControllerException(ErrorCode.ERROR100.getCode(), "device[ " + serial + " ]鏈壘鍒�"); } int cmdCode = 0; switch (command){ @@ -91,7 +95,11 @@ break; } // 榛樿鍊� 50 - cmder.frontEndCmd(device, code, cmdCode, speed, speed, speed); - return null; + try { + cmder.frontEndCmd(device, code, cmdCode, speed, speed, speed); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 浜戝彴鎺у埗: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java index 9b72200..07c93fb 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java +++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java @@ -3,10 +3,12 @@ import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; +import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.service.IPlayService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; @@ -16,6 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; + +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.text.ParseException; /** * API鍏煎锛氬疄鏃剁洿鎾� @@ -39,6 +45,9 @@ @Autowired private IRedisCatchStorage redisCatchStorage; + + @Autowired + private IDeviceService deviceService; @Autowired private IPlayService playService; @@ -177,7 +186,19 @@ result.put("error","鏈壘鍒版祦淇℃伅"); return result; } - cmder.streamByeCmd(serial, code, streamInfo.getStream(), null); + Device device = deviceService.queryDevice(serial); + if (device == null) { + JSONObject result = new JSONObject(); + result.put("error","鏈壘鍒拌澶�"); + return result; + } + try { + cmder.streamByeCmd(device, code, streamInfo.getStream(), null); + } catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) { + JSONObject result = new JSONObject(); + result.put("error","鍙戦�丅YE澶辫触锛�" + e.getMessage()); + return result; + } redisCatchStorage.stopPlay(streamInfo); storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); return null; -- Gitblit v1.8.0