From bea63f67e75ea6c38d946c2ee463260fcf815f87 Mon Sep 17 00:00:00 2001
From: Fang <costa11@qq.com>
Date: 星期一, 07 三月 2022 14:21:29 +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 |  146 ++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 134 insertions(+), 12 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 2165262..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
@@ -1,14 +1,20 @@
 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
 
-import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
-import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
-import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
-import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo;
+import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 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;
@@ -17,12 +23,17 @@
 import org.springframework.context.annotation.Lazy;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
+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;
 
@@ -39,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")) {
@@ -495,5 +512,110 @@
         catalogXml.append("</Notify>\r\n");
         return catalogXml.toString();
     }
+    @Override
+    public boolean recordInfo(DeviceChannel deviceChannel, ParentPlatform parentPlatform, String fromTag, RecordInfo recordInfo) {
+        if ( parentPlatform ==null) {
+            return false;
+        }
+        try {
+            StringBuffer recordXml = new StringBuffer(600);
+            recordXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n");
+            recordXml.append("<Response>\r\n");
+            recordXml.append("<CmdType>RecordInfo</CmdType>\r\n");
+            recordXml.append("<SN>" +recordInfo.getSn() + "</SN>\r\n");
+            recordXml.append("<DeviceID>" + recordInfo.getDeviceId() + "</DeviceID>\r\n");
+            recordXml.append("<SumNum>" + recordInfo.getSumNum() + "</SumNum>\r\n");
+            recordXml.append("<RecordList Num=\"" + recordInfo.getRecordList().size()+"\">\r\n");
+            for (RecordItem recordItem : recordInfo.getRecordList()) {
+                recordXml.append("<Item>\r\n");
+                if (deviceChannel != null) {
+                    recordXml.append("<DeviceID>" + recordItem.getDeviceId() + "</DeviceID>\r\n");
+                    recordXml.append("<Name>" + recordItem.getName() + "</Name>\r\n");
+                    recordXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(recordItem.getStartTime()) + "</StartTime>\r\n");
+                    recordXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(recordItem.getEndTime()) + "</EndTime>\r\n");
+                    recordXml.append("<Secrecy>" + recordItem.getSecrecy() + "</Secrecy>\r\n");
+                    recordXml.append("<Type>" + recordItem.getType() + "</Type>\r\n");
+                    if (!StringUtils.isEmpty(recordItem.getFileSize())) {
+                        recordXml.append("<FileSize>" + recordItem.getFileSize() + "</FileSize>\r\n");
+                    }
+                    if (!StringUtils.isEmpty(recordItem.getFilePath())) {
+                        recordXml.append("<FilePath>" + recordItem.getFilePath() + "</FilePath>\r\n");
+                    }
+                }
+                recordXml.append("</Item>\r\n");
+            }
 
+            recordXml.append("</RecordList>\r\n");
+            recordXml.append("</Response>\r\n");
+
+            // callid
+            CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
+                    : udpSipProvider.getNewCallId();
+            Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, callIdHeader);
+            transmitRequest(parentPlatform, request);
+
+        } catch (SipException | ParseException | InvalidArgumentException e) {
+            e.printStackTrace();
+            return false;
+        }
+        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