From d7a1b94f905c5f28c9c8f2d48c3f9e28ebcf9cc4 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 24 九月 2022 21:04:58 +0800
Subject: [PATCH] Merge branch 'wvp-28181-2.0'

---
 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 332d72c..cc13d05 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;
@@ -47,7 +48,7 @@
     private final Logger logger = LoggerFactory.getLogger(SIPCommanderFroPlatform.class);
 
     @Autowired
-    private SIPRequestHeaderPlarformProvider headerProviderPlarformProvider;
+    private SIPRequestHeaderPlarformProvider headerProviderPlatformProvider;
 
     @Autowired
     private IRedisCatchStorage redisCatchStorage;
@@ -74,6 +75,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);
@@ -98,7 +102,7 @@
                     callIdHeader = udpSipProvider.getNewCallId();
                 }
 
-                request = headerProviderPlarformProvider.createRegisterRequest(parentPlatform,
+                request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform,
                         redisCatchStorage.getCSEQ(), SipUtils.getNewFromTag(),
                         SipUtils.getNewViaTag(), callIdHeader, isRegister);
                 // 灏� callid 鍐欏叆缂撳瓨锛� 绛夋敞鍐屾垚鍔熷彲浠ユ洿鏂扮姸鎬�
@@ -120,7 +124,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);
@@ -154,7 +158,7 @@
             CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()
                     : udpSipProvider.getNewCallId();
 
-            Request request = headerProviderPlarformProvider.createMessageRequest(
+            Request request = headerProviderPlatformProvider.createMessageRequest(
                     parentPlatform,
                     keepaliveXml.toString(),
                     SipUtils.getNewFromTag(),
@@ -220,7 +224,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) {
@@ -314,7 +318,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);
@@ -354,7 +358,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) {
@@ -392,7 +396,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) {
@@ -427,11 +431,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);
 
@@ -453,8 +453,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);
@@ -477,7 +477,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) {
@@ -529,18 +529,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());
         
@@ -560,26 +557,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) {
@@ -755,7 +758,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) {
@@ -774,36 +777,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");
@@ -813,6 +788,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();
@@ -824,17 +803,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;
 
@@ -848,61 +825,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