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