From 4abbf4df07f02c0c94baa2787fdcf4a14dcb3463 Mon Sep 17 00:00:00 2001
From: sc.dm <822878110@qq.com>
Date: 星期四, 10 三月 2022 17:42:02 +0800
Subject: [PATCH] Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java | 92 ++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 84 insertions(+), 8 deletions(-)
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 1bf0601..67cb734 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
@@ -5,8 +5,16 @@
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderPlarformProvider;
import com.genersoft.iot.vmp.gb28181.utils.DateUtil;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
+import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+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.SerializeUtils;
+import gov.nist.javax.sip.SipProviderImpl;
+import gov.nist.javax.sip.SipStackImpl;
+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;
@@ -18,10 +26,14 @@
import org.springframework.util.StringUtils;
import javax.sip.*;
+import javax.sip.address.SipURI;
import javax.sip.header.CallIdHeader;
+import javax.sip.header.ViaHeader;
import javax.sip.header.WWWAuthenticateHeader;
import javax.sip.message.Request;
+import java.lang.reflect.Field;
import java.text.ParseException;
+import java.util.HashSet;
import java.util.List;
import java.util.UUID;
@@ -38,41 +50,47 @@
private IRedisCatchStorage redisCatchStorage;
@Autowired
+ private IMediaServerService mediaServerService;
+
+ @Autowired
private SipSubscribe sipSubscribe;
+
+ @Autowired
+ private ZLMRTPServerFactory zlmrtpServerFactory;
@Lazy
@Autowired
@Qualifier(value="tcpSipProvider")
- private SipProvider tcpSipProvider;
+ private SipProviderImpl tcpSipProvider;
@Lazy
@Autowired
@Qualifier(value="udpSipProvider")
- private SipProvider udpSipProvider;
+ private SipProviderImpl udpSipProvider;
@Override
public boolean register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) {
- return register(parentPlatform, null, null, errorEvent, okEvent);
+ return register(parentPlatform, null, null, errorEvent, okEvent, false);
}
@Override
public boolean unregister(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) {
- parentPlatform.setExpires("0");
ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId());
if (parentPlatformCatch != null) {
parentPlatformCatch.setParentPlatform(parentPlatform);
redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
}
-
- return register(parentPlatform, null, null, errorEvent, okEvent);
+ parentPlatform.setExpires("0");
+ return register(parentPlatform, null, null, errorEvent, okEvent, false);
}
@Override
- public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable WWWAuthenticateHeader www, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) {
+ public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable WWWAuthenticateHeader www,
+ SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain) {
try {
Request request = null;
String tm = Long.toString(System.currentTimeMillis());
- if (www == null ) {
+ if (!registerAgain ) {
// //callid
CallIdHeader callIdHeader = null;
if(parentPlatform.getTransport().equals("TCP")) {
@@ -542,4 +560,62 @@
}
return true;
}
+
+ @Override
+ public void streamByeCmd(ParentPlatform platform, String callId) {
+ if (platform == null) {
+ return;
+ }
+ SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platform.getServerGBId(), null, null, callId);
+ if (sendRtpItem != null) {
+ String mediaServerId = sendRtpItem.getMediaServerId();
+ MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
+ if (mediaServerItem != null) {
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), sendRtpItem.getSsrc());
+ zlmrtpServerFactory.closeRTPServer(mediaServerItem, sendRtpItem.getStreamId());
+ }
+ byte[] dialogByteArray = sendRtpItem.getDialog();
+ if (dialogByteArray != null) {
+ SIPDialog dialog = (SIPDialog) SerializeUtils.deSerialize(dialogByteArray);
+ SipStack sipStack = udpSipProvider.getSipStack();
+ SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog);
+ if (dialog != sipDialog) {
+ dialog = sipDialog;
+ } else {
+ try {
+ dialog.setSipProvider(udpSipProvider);
+ 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<>());
+
+ byte[] transactionByteArray = sendRtpItem.getTransaction();
+ ClientTransaction clientTransaction = (ClientTransaction) SerializeUtils.deSerialize(transactionByteArray);
+ Request byeRequest = dialog.createRequest(Request.BYE);
+ SipURI byeURI = (SipURI) byeRequest.getRequestURI();
+ SIPRequest request = (SIPRequest) clientTransaction.getRequest();
+ byeURI.setHost(request.getRemoteAddress().getHostName());
+ byeURI.setPort(request.getRemotePort());
+ if ("TCP".equals(platform.getTransport())) {
+ clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest);
+ } else if ("UDP".equals(platform.getTransport())) {
+ clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest);
+ }
+ dialog.sendRequest(clientTransaction);
+ } catch (SipException e) {
+ e.printStackTrace();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ } catch (NoSuchFieldException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+
+ }
+ }
+ }
+ }
}
--
Gitblit v1.8.0