From c1d7f867c2ffcb1364334a5e013eb8f208819ef5 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 10 三月 2022 20:53:56 +0800
Subject: [PATCH] 优化目录订阅以及国标级联目录订阅回复

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java |  143 ++++++++++++++++++++++++++++++++---------------
 1 files changed, 98 insertions(+), 45 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 67cb734..a379f39 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
@@ -27,9 +27,7 @@
 
 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.header.*;
 import javax.sip.message.Request;
 import java.lang.reflect.Field;
 import java.text.ParseException;
@@ -68,6 +66,9 @@
     @Qualifier(value="udpSipProvider")
     private SipProviderImpl udpSipProvider;
 
+    @Autowired
+    private SipFactory sipFactory;
+
     @Override
     public boolean register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) {
         return register(parentPlatform, null, null, errorEvent, okEvent, false);
@@ -88,7 +89,7 @@
     public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable WWWAuthenticateHeader www,
                             SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain) {
         try {
-            Request request = null;
+            Request request;
             String tm = Long.toString(System.currentTimeMillis());
             if (!registerAgain ) {
                 //		//callid
@@ -364,16 +365,18 @@
                     : udpSipProvider.getNewCallId();
             callIdHeader.setCallId(subscribeInfo.getCallId());
 
-            String tm = Long.toString(System.currentTimeMillis());
+//
+            sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> {
+                logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg);
+            }, null);
 
-            Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform,
-                    deviceStatusXml.toString(),callIdHeader,
-                    "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""),  subscribeInfo);
-            transmitRequest(parentPlatform, request);
-
-        } catch (SipException | ParseException | InvalidArgumentException e) {
+        } catch (SipException | ParseException  e) {
             e.printStackTrace();
             return false;
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
         }
         return true;
     }
@@ -386,36 +389,88 @@
         if (index == null) {
             index = 0;
         }
-
+        if (index >= deviceChannels.size()) {
+            return true;
+        }
         try {
-            if (index > deviceChannels.size() - 1) {
-                return true;
-            }
-            Request request = getCatalogNotifyRequestForCatalogAddOrUpdate(parentPlatform, deviceChannels.get(index), deviceChannels.size(), type, subscribeInfo);
-            index += 1;
             Integer finalIndex = index;
-            transmitRequest(parentPlatform, request, null, (eventResult -> {
-                sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex);
+            String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, deviceChannels.get(index ), deviceChannels.size(), type, subscribeInfo);
+            sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> {
+                logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg);
+            }, (eventResult -> {
+                sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + 1);
             }));
-        } catch (SipException | ParseException | InvalidArgumentException e) {
+        } catch (SipException | ParseException e) {
             e.printStackTrace();
             return false;
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
         }
         return true;
     }
 
-    private Request getCatalogNotifyRequestForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int size, String type,
-                                            SubscribeInfo subscribeInfo) throws ParseException, InvalidArgumentException,
-            PeerUnavailableException {
-        String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channel, size, type, subscribeInfo);
+    private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent,
+                                   SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent,  SipSubscribe.Event okEvent )
+            throws NoSuchFieldException, IllegalAccessException, SipException, ParseException {
+        Dialog dialog  = subscribeInfo.getDialog();
+        Request notifyRequest = dialog.createRequest(Request.NOTIFY);
 
-        CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
-                : udpSipProvider.getNewCallId();
-        callIdHeader.setCallId(subscribeInfo.getCallId());
-        Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXmlContent,
-                callIdHeader, "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), subscribeInfo);
-        return request;
+        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();
+        SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest();
+        sipURI.setHost(request.getRemoteAddress().getHostName());
+        sipURI.setPort(request.getRemotePort());
+        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);
+        }
+        // 娣诲姞璁㈤槄
+        if (okEvent != null) {
+            sipSubscribe.addOkSubscribe(subscribeInfo.getCallId(), okEvent);
+        }
+        if (transaction == null) {
+            logger.error("骞冲彴{}鐨凾ransport閿欒锛歿}",parentPlatform.getServerGBId(), parentPlatform.getTransport());
+            return;
+        }
+        dialog.sendRequest(transaction);
+
     }
+
+//    private Request getCatalogNotifyRequestForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int size, String type,
+//                                            SubscribeInfo subscribeInfo) throws ParseException, InvalidArgumentException,
+//            PeerUnavailableException, NoSuchFieldException, IllegalAccessException {
+//        String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channel, size, type, subscribeInfo);
+//
+//        CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+//                : udpSipProvider.getNewCallId();
+//        callIdHeader.setCallId(subscribeInfo.getCallId());
+//        String tm = Long.toString(System.currentTimeMillis());
+//
+//        Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXmlContent,
+//                callIdHeader, "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""),"FromRegister" + tm, subscribeInfo);
+//        return request;
+//    }
 
     private  String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int sumNum, String type, SubscribeInfo subscribeInfo) {
         StringBuffer catalogXml = new StringBuffer(600);
@@ -465,34 +520,31 @@
         if (index == null) {
             index = 0;
         }
-
-        if (index > deviceChannels.size() - 1) {
+        if (index >= deviceChannels.size()) {
             return true;
         }
         try {
-            String catalogXml = getCatalogXmlContentForCatalogOther(deviceChannels.get(index), type, parentPlatform);
-            CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
-                        : udpSipProvider.getNewCallId();
-                Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXml,
-                        callIdHeader,
-                        "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), subscribeInfo);
-                index += 1;
             Integer finalIndex = index;
-            transmitRequest(parentPlatform, request, null, eventResult -> {
-                sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex);
-            });
+            String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, deviceChannels.get(index), type);
+            sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> {
+                logger.error("鍙戦�丯OTIFY閫氱煡娑堟伅澶辫触銆傞敊璇細{} {}", eventResult.statusCode, eventResult.msg);
+            }, (eventResult -> {
+                sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + 1);
+            }));
         } catch (SipException e) {
             e.printStackTrace();
-        } catch (InvalidArgumentException e) {
-            e.printStackTrace();
         } catch (ParseException e) {
+            e.printStackTrace();
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
             e.printStackTrace();
         }
 
         return true;
     }
 
-    private String getCatalogXmlContentForCatalogOther(DeviceChannel channel, String type, ParentPlatform parentPlatform) {
+    private String getCatalogXmlContentForCatalogOther(ParentPlatform parentPlatform, DeviceChannel channel, String type) {
         if (parentPlatform.getServerGBId().equals(channel.getParentId())) {
             channel.setParentId(parentPlatform.getDeviceGBId());
         }
@@ -594,6 +646,7 @@
                         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());

--
Gitblit v1.8.0