From 70c20364af15fce16992fce499efc623823ce221 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 22 九月 2022 14:10:26 +0800
Subject: [PATCH] 修复流注销时移除流认证信息
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java | 196 +++++++++++++++++++-----------------------------
1 files changed, 79 insertions(+), 117 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 0e6d4b8..a15940d 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
@@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
+import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
@@ -45,7 +46,7 @@
private final Logger logger = LoggerFactory.getLogger(SIPCommanderFroPlatform.class);
@Autowired
- private SIPRequestHeaderPlarformProvider headerProviderPlarformProvider;
+ private SIPRequestHeaderPlarformProvider headerProviderPlatformProvider;
@Autowired
private IRedisCatchStorage redisCatchStorage;
@@ -72,6 +73,9 @@
@Autowired
private SipFactory sipFactory;
+ @Autowired
+ private SubscribeHolder subscribeHolder;
+
@Override
public boolean register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) {
return register(parentPlatform, null, null, errorEvent, okEvent, false, true);
@@ -96,7 +100,7 @@
callIdHeader = udpSipProvider.getNewCallId();
}
- request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform,
+ request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform,
redisCatchStorage.getCSEQ(), SipUtils.getNewFromTag(),
SipUtils.getNewViaTag(), callIdHeader, isRegister);
// 灏� callid 鍐欏叆缂撳瓨锛� 绛夋敞鍐屾垚鍔熷彲浠ユ洿鏂扮姸鎬�
@@ -118,7 +122,7 @@
}else {
CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform, SipUtils.getNewFromTag(), null, callId, www, callIdHeader, isRegister);
+ request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, SipUtils.getNewFromTag(), null, callId, www, callIdHeader, isRegister);
}
transmitRequest(parentPlatform, request, null, okEvent);
@@ -152,7 +156,7 @@
CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- Request request = headerProviderPlarformProvider.createMessageRequest(
+ Request request = headerProviderPlatformProvider.createMessageRequest(
parentPlatform,
keepaliveXml.toString(),
SipUtils.getNewFromTag(),
@@ -218,7 +222,7 @@
CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
+ Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
transmitRequest(parentPlatform, request);
} catch (SipException | ParseException | InvalidArgumentException e) {
@@ -312,7 +316,7 @@
CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, SipUtils.getNewViaTag(), callIdHeader);
+ 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);
@@ -352,7 +356,7 @@
CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
+ Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
transmitRequest(parentPlatform, request);
} catch (SipException | ParseException | InvalidArgumentException e) {
@@ -390,7 +394,7 @@
CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
+ Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
transmitRequest(parentPlatform, request);
} catch (SipException | ParseException | InvalidArgumentException e) {
@@ -425,11 +429,7 @@
deviceStatusXml.append("<Altitude>" + gpsMsgInfo.getAltitude() + "</Altitude>\r\n");
deviceStatusXml.append("</Notify>\r\n");
- CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
- : udpSipProvider.getNewCallId();
- callIdHeader.setCallId(subscribeInfo.getCallId());
-
- sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> {
+ sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> {
logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg);
}, null);
@@ -451,8 +451,8 @@
if (parentPlatform == null) {
return false;
}
- logger.info("[鍙戦�� 鎶ヨ璁㈤槄] {}/{}->{},{}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(),
- deviceAlarm.getLongitude(), deviceAlarm.getLatitude());
+ logger.info("[鍙戦�佹姤璀﹂�氱煡] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(),
+ deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSONObject.toJSON(deviceAlarm));
try {
String characterSet = parentPlatform.getCharacterSet();
StringBuffer deviceStatusXml = new StringBuffer(600);
@@ -475,7 +475,7 @@
CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader);
+ Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader);
transmitRequest(parentPlatform, request);
} catch (SipException | ParseException e) {
@@ -527,18 +527,15 @@
return true;
}
- private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent,
+ private ClientTransaction sendNotify(ParentPlatform parentPlatform, String catalogXmlContent,
SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent )
throws NoSuchFieldException, IllegalAccessException, SipException, ParseException, InvalidArgumentException {
MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory();
String characterSet = parentPlatform.getCharacterSet();
// 璁剧疆缂栫爜锛� 闃叉涓枃涔辩爜
messageFactory.setDefaultContentEncodingCharset(characterSet);
- Dialog dialog = subscribeInfo.getDialog();
- if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) {
- return;
- }
- SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY);
+
+ SIPRequest notifyRequest = headerProviderPlatformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, subscribeInfo);
notifyRequest.getCSeqHeader().setSeqNumber(redisCatchStorage.getCSEQ());
@@ -558,26 +555,32 @@
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.getCallId(), errorEvent);
+ sipSubscribe.addErrorSubscribe(subscribeInfo.getRequest().getCallIdHeader().getCallId(), errorEvent);
}
// 娣诲姞璁㈤槄
if (okEvent != null) {
- sipSubscribe.addOkSubscribe(subscribeInfo.getCallId(), okEvent);
+ sipSubscribe.addOkSubscribe(subscribeInfo.getRequest().getCallIdHeader().getCallId(), okEvent);
}
- if (transaction == null) {
- logger.error("骞冲彴{}鐨凾ransport閿欒锛歿}",parentPlatform.getServerGBId(), parentPlatform.getTransport());
- return;
- }
- dialog.sendRequest(transaction);
-
+ transaction.sendRequest();
+ return transaction;
}
private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) {
@@ -753,7 +756,7 @@
// callid
CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
+ Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
transmitRequest(parentPlatform, request);
} catch (SipException | ParseException | InvalidArgumentException e) {
@@ -772,36 +775,8 @@
return false;
}
- byte[] dialogByteArray = sendRtpItem.getDialog();
- if (dialogByteArray == null) {
- return false;
- }
try{
- SIPDialog dialog = (SIPDialog) SerializeUtils.deSerialize(dialogByteArray);
- SipStack sipStack;
- if ("TCP".equals(platform.getTransport())) {
- sipStack = tcpSipProvider.getSipStack();
- } else {
- sipStack = udpSipProvider.getSipStack();
- }
- SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog);
- if (dialog != sipDialog) {
- dialog = sipDialog;
- }
- if ("TCP".equals(platform.getTransport())) {
- dialog.setSipProvider(tcpSipProvider);
- } else {
- 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<>());
-
- SIPRequest messageRequest = (SIPRequest)dialog.createRequest(Request.MESSAGE);
String characterSet = platform.getCharacterSet();
StringBuffer mediaStatusXml = new StringBuffer(200);
mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
@@ -811,6 +786,10 @@
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();
@@ -822,17 +801,15 @@
}else {
clientTransaction = udpSipProvider.getNewClientTransaction(messageRequest);
}
- dialog.sendRequest(clientTransaction);
+ clientTransaction.sendRequest();
} catch (SipException e) {
e.printStackTrace();
return false;
} catch (ParseException e) {
e.printStackTrace();
return false;
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
+ } catch (InvalidArgumentException e) {
+ throw new RuntimeException(e);
}
return true;
@@ -846,61 +823,46 @@
}
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());
+ streamByeCmd(platform, sendRtpItem);
+ }
+ }
+
+ @Override
+ public void streamByeCmd(ParentPlatform platform, SendRtpItem sendRtpItem) {
+ if (sendRtpItem == null ) {
+ logger.info("[鍚戜笂绾у彂閫丅YE]锛� sendRtpItem 涓篘ULL");
+ return;
+ }
+ if (platform == null) {
+ logger.info("[鍚戜笂绾у彂閫丅YE]锛� platform 涓篘ULL");
+ return;
+ }
+ logger.info("[鍚戜笂绾у彂閫丅YE]锛� {}/{}", platform.getServerGBId(), sendRtpItem.getChannelId());
+ String mediaServerId = sendRtpItem.getMediaServerId();
+ MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
+ if (mediaServerItem != null) {
+ 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");
}
- byte[] dialogByteArray = sendRtpItem.getDialog();
- if (dialogByteArray != null) {
- SIPDialog dialog = (SIPDialog) SerializeUtils.deSerialize(dialogByteArray);
- SipStack sipStack;
- if ("TCP".equals(platform.getTransport())) {
- sipStack = tcpSipProvider.getSipStack();
- } else {
- sipStack = udpSipProvider.getSipStack();
- }
- SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog);
- if (dialog != sipDialog) {
- dialog = sipDialog;
- }
- try {
- if ("TCP".equals(platform.getTransport())) {
- dialog.setSipProvider(tcpSipProvider);
- } else {
- 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<>());
-
- Request byeRequest = dialog.createRequest(Request.BYE);
-
- SipURI byeURI = (SipURI) byeRequest.getRequestURI();
- byeURI.setHost(platform.getServerIP());
- byeURI.setPort(platform.getServerPort());
- ClientTransaction clientTransaction;
- if ("TCP".equals(platform.getTransport())) {
- clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest);
- } else {
- 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();
- }
-
+ 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);
}
}
}
--
Gitblit v1.8.0