From 764d04b497356ba6bcbb75fd42b51eca750f7223 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 29 五月 2024 15:02:51 +0800
Subject: [PATCH] 调整上级观看消息的发送

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java |  153 ++++++++++++++++++++-------------------------------
 1 files changed, 60 insertions(+), 93 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
old mode 100644
new mode 100755
index 57945e7..f3f7431
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
@@ -1,13 +1,11 @@
 package com.genersoft.iot.vmp.gb28181.transmit.event.request;
 
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
+import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
-import gov.nist.javax.sip.SipProviderImpl;
-import gov.nist.javax.sip.SipStackImpl;
+import com.google.common.primitives.Bytes;
 import gov.nist.javax.sip.message.SIPRequest;
 import gov.nist.javax.sip.message.SIPResponse;
-import gov.nist.javax.sip.stack.SIPServerTransaction;
-import org.apache.commons.lang3.ArrayUtils;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
 import org.dom4j.Element;
@@ -15,19 +13,17 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 
 import javax.sip.*;
 import javax.sip.address.Address;
-import javax.sip.address.AddressFactory;
 import javax.sip.address.SipURI;
-import javax.sip.header.*;
+import javax.sip.header.ContentTypeHeader;
+import javax.sip.header.ExpiresHeader;
+import javax.sip.header.HeaderFactory;
 import javax.sip.message.MessageFactory;
 import javax.sip.message.Request;
 import javax.sip.message.Response;
 import java.io.ByteArrayInputStream;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -43,66 +39,13 @@
 	private final static Logger logger = LoggerFactory.getLogger(SIPRequestProcessorParent.class);
 
 	@Autowired
-	@Qualifier(value="tcpSipProvider")
-	private SipProviderImpl tcpSipProvider;
-
-	@Autowired
-	@Qualifier(value="udpSipProvider")
-	private SipProviderImpl udpSipProvider;
-
-	/**
-	 * 鏍规嵁 RequestEvent 鑾峰彇 ServerTransaction
-	 * @param evt
-	 * @return
-	 */
-	public ServerTransaction getServerTransaction(RequestEvent evt) {
-		Request request = evt.getRequest();
-		ServerTransaction serverTransaction = evt.getServerTransaction();
-		// 鍒ゆ柇TCP杩樻槸UDP
-		ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
-		String transport = reqViaHeader.getTransport();
-		boolean isTcp = "TCP".equals(transport);
-
-		if (serverTransaction == null) {
-			try {
-				if (isTcp) {
-					SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack();
-					serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true);
-					if (serverTransaction == null) {
-						serverTransaction = tcpSipProvider.getNewServerTransaction(request);
-					}
-				} else {
-					SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack();
-					serverTransaction = (SIPServerTransaction) stack.findTransaction((SIPRequest)request, true);
-					if (serverTransaction == null) {
-						serverTransaction = udpSipProvider.getNewServerTransaction(request);
-					}
-				}
-			} catch (TransactionAlreadyExistsException e) {
-				logger.error(e.getMessage());
-			} catch (TransactionUnavailableException e) {
-				logger.error(e.getMessage());
-			}finally {
-
-			}
-		}
-		return serverTransaction;
-	}
-	
-	public AddressFactory getAddressFactory() {
-		try {
-			return SipFactory.getInstance().createAddressFactory();
-		} catch (PeerUnavailableException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
+	private SIPSender sipSender;
 
 	public HeaderFactory getHeaderFactory() {
 		try {
 			return SipFactory.getInstance().createHeaderFactory();
 		} catch (PeerUnavailableException e) {
-			e.printStackTrace();
+			logger.error("鏈鐞嗙殑寮傚父 ", e);
 		}
 		return null;
 	}
@@ -111,7 +54,7 @@
 		try {
 			return SipFactory.getInstance().createMessageFactory();
 		} catch (PeerUnavailableException e) {
-			e.printStackTrace();
+			logger.error("鏈鐞嗙殑寮傚父 ", e);
 		}
 		return null;
 	}
@@ -130,25 +73,27 @@
 	 * 400
 	 * 404
 	 */
-	public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode) throws SipException, InvalidArgumentException, ParseException {
-		return responseAck(serverTransaction, statusCode, null);
+	public SIPResponse responseAck(SIPRequest sipRequest, int statusCode) throws SipException, InvalidArgumentException, ParseException {
+		return responseAck(sipRequest, statusCode, null);
 	}
 
-	public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException {
-		return responseAck(serverTransaction, statusCode, msg, null);
+	public SIPResponse responseAck(SIPRequest sipRequest, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException {
+		return responseAck(sipRequest, statusCode, msg, null);
 	}
 
-	public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException {
-		ToHeader toHeader = (ToHeader) serverTransaction.getRequest().getHeader(ToHeader.NAME);
-		if (toHeader.getTag() == null) {
-			toHeader.setTag(SipUtils.getNewTag());
+
+	public SIPResponse responseAck(SIPRequest sipRequest, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException {
+		if (sipRequest.getToHeader().getTag() == null) {
+			sipRequest.getToHeader().setTag(SipUtils.getNewTag());
 		}
-		SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, serverTransaction.getRequest());
+		SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, sipRequest);
+		response.setStatusCode(statusCode);
 		if (msg != null) {
 			response.setReasonPhrase(msg);
 		}
+
 		if (responseAckExtraParam != null) {
-			if (responseAckExtraParam.sipURI != null && serverTransaction.getRequest().getMethod().equals(Request.INVITE)) {
+			if (responseAckExtraParam.sipURI != null && sipRequest.getMethod().equals(Request.INVITE)) {
 				logger.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort());
 				Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(
 						SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(),  responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort()
@@ -159,7 +104,7 @@
 				response.setContent(responseAckExtraParam.content, responseAckExtraParam.contentTypeHeader);
 			}
 
-			if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) {
+			if (sipRequest.getMethod().equals(Request.SUBSCRIBE)) {
 				if (responseAckExtraParam.expires == -1) {
 					logger.error("[鍙傛暟涓嶅叏] 2xx鐨凷UBSCRIBE鍥炲锛屽繀椤昏缃瓻xpires header");
 				}else {
@@ -168,28 +113,28 @@
 				}
 			}
 		}else {
-			if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) {
+			if (sipRequest.getMethod().equals(Request.SUBSCRIBE)) {
 				logger.error("[鍙傛暟涓嶅叏] 2xx鐨凷UBSCRIBE鍥炲锛屽繀椤昏缃瓻xpires header");
 			}
 		}
-		serverTransaction.sendResponse(response);
-		if (statusCode >= 200 && !"NOTIFY".equalsIgnoreCase(serverTransaction.getRequest().getMethod())) {
-			if (serverTransaction.getDialog() != null) {
-				serverTransaction.getDialog().delete();
-			}
-		}
+
+		// 鍙戦�乺esponse
+		sipSender.transmitRequest(sipRequest.getLocalAddress().getHostAddress(), response);
+
 		return response;
 	}
+
+
 
 	/**
 	 * 鍥炲甯dp鐨�200
 	 */
-	public SIPResponse responseSdpAck(ServerTransaction serverTransaction, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException {
+	public SIPResponse responseSdpAck(SIPRequest request, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException {
 
 		ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
 
 		// 鍏煎鍥芥爣涓殑浣跨敤缂栫爜@鍩熷悕浣滀负RequestURI鐨勬儏鍐�
-		SipURI sipURI = (SipURI)serverTransaction.getRequest().getRequestURI();
+		SipURI sipURI = (SipURI)request.getRequestURI();
 		if (sipURI.getPort() == -1) {
 			sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(),  platform.getServerIP()+":"+platform.getServerPort());
 		}
@@ -198,16 +143,19 @@
 		responseAckExtraParam.content = sdp;
 		responseAckExtraParam.sipURI = sipURI;
 
-		return responseAck(serverTransaction, Response.OK, null, responseAckExtraParam);
+		SIPResponse sipResponse = responseAck(request, Response.OK, null, responseAckExtraParam);
+
+
+		return sipResponse;
 	}
 
 	/**
 	 * 鍥炲甯ml鐨�200
 	 */
-	public SIPResponse responseXmlAck(ServerTransaction serverTransaction, String xml, ParentPlatform platform, Integer expires) throws SipException, InvalidArgumentException, ParseException {
+	public SIPResponse responseXmlAck(SIPRequest request, String xml, ParentPlatform platform, Integer expires) throws SipException, InvalidArgumentException, ParseException {
 		ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
 
-		SipURI sipURI = (SipURI)serverTransaction.getRequest().getRequestURI();
+		SipURI sipURI = (SipURI)request.getRequestURI();
 		if (sipURI.getPort() == -1) {
 			sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(),  platform.getServerIP()+":"+platform.getServerPort());
 		}
@@ -216,13 +164,14 @@
 		responseAckExtraParam.content = xml;
 		responseAckExtraParam.sipURI = sipURI;
 		responseAckExtraParam.expires = expires;
-		return responseAck(serverTransaction, Response.OK, null, responseAckExtraParam);
+		return responseAck(request, Response.OK, null, responseAckExtraParam);
 	}
 
 	public Element getRootElement(RequestEvent evt) throws DocumentException {
 		return getRootElement(evt, "gb2312");
 	}
 	public Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
+
 		if (charset == null) {
 			charset = "gb2312";
 		}
@@ -231,7 +180,8 @@
 		reader.setEncoding(charset);
 		// 瀵规捣搴峰嚭鐜扮殑鏈浆涔夊瓧绗﹀仛澶勭悊銆�
 		String[] destStrArray = new String[]{"&lt;","&gt;","&amp;","&apos;","&quot;"};
-		char despChar = '&'; // 鎴栬鍙墿灞曞吋瀹瑰叾浠栧瓧绗�
+		// 鎴栬鍙墿灞曞吋瀹瑰叾浠栧瓧绗�
+		char despChar = '&';
 		byte destBye = (byte) despChar;
 		List<Byte> result = new ArrayList<>();
 		byte[] rawContent = request.getRawContent();
@@ -254,11 +204,28 @@
 				result.add(rawContent[i]);
 			}
 		}
-		Byte[] bytes = new Byte[0];
-		byte[] bytesResult = ArrayUtils.toPrimitive(result.toArray(bytes));
+		byte[] bytesResult = Bytes.toArray(result);
 
-		Document xml = reader.read(new ByteArrayInputStream(bytesResult));
+		Document xml;
+		try {
+			xml = reader.read(new ByteArrayInputStream(bytesResult));
+		}catch (DocumentException e) {
+			logger.warn("[xml瑙f瀽寮傚父]锛� 鍘熸枃濡備笅锛� \r\n{}", new String(bytesResult));
+			logger.warn("[xml瑙f瀽寮傚父]锛� 鍘熸枃濡備笅锛� 灏濊瘯鍏煎鎬у鐞�");
+			String[] xmlLineArray = new String(bytesResult).split("\\r?\\n");
+
+			// 鍏煎娴峰悍鐨刟ddress瀛楁甯︽湁<鐮存崲xml缁撴瀯瀵艰嚧鏃犳硶瑙f瀽xml鐨勯棶棰�
+			StringBuilder stringBuilder = new StringBuilder();
+			for (String s : xmlLineArray) {
+				if (s.startsWith("<Address")) {
+					continue;
+				}
+				stringBuilder.append(s);
+			}
+			xml = reader.read(new ByteArrayInputStream(stringBuilder.toString().getBytes()));
+		}
 		return xml.getRootElement();
 	}
 
+
 }

--
Gitblit v1.8.0