From 710600db6f3bd6f72a83ef75cca30953fd0f375f Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期三, 21 九月 2022 18:18:37 +0800 Subject: [PATCH] 优化sip消息,去除自动dialog创建 --- 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