From 2e98b20bea4463e4465e3c19059d0744a09aec06 Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Tue, 27 Jun 2023 14:34:41 +0800
Subject: [PATCH] gb28181版本升级-补充

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java |  117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 117 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
new file mode 100644
index 0000000..5a4ceb2
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
@@ -0,0 +1,117 @@
+package com.genersoft.iot.vmp.gb28181.transmit.event.response.impl;
+
+import com.genersoft.iot.vmp.conf.SipConfig;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
+import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
+import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
+import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
+import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract;
+import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
+import com.genersoft.iot.vmp.service.IDeviceService;
+import com.genersoft.iot.vmp.utils.GitUtil;
+import gov.nist.javax.sip.ResponseEventExt;
+import gov.nist.javax.sip.SipProviderImpl;
+import gov.nist.javax.sip.message.SIPResponse;
+import gov.nist.javax.sip.stack.SIPClientTransaction;
+import gov.nist.javax.sip.stack.SIPDialog;
+import gov.nist.javax.sip.stack.SIPTransaction;
+import gov.nist.javax.sip.stack.SIPTransactionImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import javax.sdp.SdpFactory;
+import javax.sdp.SdpParseException;
+import javax.sdp.SessionDescription;
+import javax.sip.*;
+import javax.sip.address.Address;
+import javax.sip.address.SipURI;
+import javax.sip.header.CSeqHeader;
+import javax.sip.header.UserAgentHeader;
+import javax.sip.message.Request;
+import javax.sip.message.Response;
+import java.text.ParseException;
+
+
+/**
+ * @description: 处理INVITE响应
+ * @author: panlinlin
+ * @date: 2021年11月5日 16:40
+ */
+@Component
+public class InviteResponseProcessor extends SIPResponseProcessorAbstract {
+
+	private final static Logger logger = LoggerFactory.getLogger(InviteResponseProcessor.class);
+	private final String method = "INVITE";
+
+	@Autowired
+	private SIPProcessorObserver sipProcessorObserver;
+
+
+	@Autowired
+	private SipFactory sipFactory;
+
+	@Autowired
+	private SIPSender sipSender;
+
+	@Autowired
+	private SIPRequestHeaderProvider headerProvider;
+
+
+	@Override
+	public void afterPropertiesSet() throws Exception {
+		// 添加消息处理的订阅
+		sipProcessorObserver.addResponseProcessor(method, this);
+	}
+
+
+
+	/**
+	 * 处理invite响应
+	 * 
+	 * @param evt 响应消息
+	 * @throws ParseException
+	 */
+	@Override
+	public void process(ResponseEvent evt ){
+		try {
+
+			SIPResponse response = (SIPResponse)evt.getResponse();
+			int statusCode = response.getStatusCode();
+			// trying不会回复
+			if (statusCode == Response.TRYING) {
+			}
+			// 成功响应
+			// 下发ack
+			if (statusCode == Response.OK) {
+				ResponseEventExt event = (ResponseEventExt)evt;
+
+				String contentString = new String(response.getRawContent());
+				// jainSip不支持y=字段, 移除以解析。
+				int ssrcIndex = contentString.indexOf("y=");
+				// 检查是否有y字段
+				SessionDescription sdp;
+				if (ssrcIndex >= 0) {
+					//ssrc规定长度为10字节,不取余下长度以避免后续还有“f=”字段
+					String substring = contentString.substring(0, contentString.indexOf("y="));
+					sdp = SdpFactory.getInstance().createSessionDescription(substring);
+				} else {
+					sdp = SdpFactory.getInstance().createSessionDescription(contentString);
+				}
+				SipURI requestUri = sipFactory.createAddressFactory().createSipURI(sdp.getOrigin().getUsername(), event.getRemoteIpAddress() + ":" + event.getRemotePort());
+				Request reqAck = headerProvider.createAckRequest(requestUri, response);
+
+				logger.info("[回复ack] {}-> {}:{} ", sdp.getOrigin().getUsername(), event.getRemoteIpAddress(), event.getRemotePort());
+				sipSender.transmitRequest(reqAck);
+			}
+		} catch (InvalidArgumentException | ParseException | SipException | SdpParseException e) {
+			logger.info("[点播回复ACK],异常:", e );
+		}
+	}
+
+}

--
Gitblit v1.9.3