From b7857027d51eca627a3f092415aa2e0d3b51313c Mon Sep 17 00:00:00 2001
From: lawrencehj <1934378145@qq.com>
Date: 星期二, 09 三月 2021 20:02:56 +0800
Subject: [PATCH] 去除冗余代码和死代码
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java | 258 ++++++++++++++++++++++++++++++++++++---------------
1 files changed, 181 insertions(+), 77 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
index 4dea5d4..ac19d6f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -1,32 +1,44 @@
package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
+import javax.sdp.*;
import javax.sip.InvalidArgumentException;
import javax.sip.RequestEvent;
import javax.sip.SipException;
+import javax.sip.SipFactory;
+import javax.sip.address.Address;
import javax.sip.address.SipURI;
import javax.sip.header.ContentTypeHeader;
import javax.sip.header.FromHeader;
+import javax.sip.header.HeaderFactory;
import javax.sip.header.SubjectHeader;
import javax.sip.message.Request;
import javax.sip.message.Response;
+import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.conf.MediaServerConfig;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
-import com.genersoft.iot.vmp.gb28181.sdp.Codec;
-import com.genersoft.iot.vmp.gb28181.sdp.MediaDescription;
-import com.genersoft.iot.vmp.gb28181.sdp.SdpParser;
-import com.genersoft.iot.vmp.gb28181.sdp.SessionDescription;
+import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
+import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult;
+import com.genersoft.iot.vmp.vmanager.service.IPlayService;
+import gov.nist.javax.sdp.fields.SDPFormat;
import gov.nist.javax.sip.address.AddressImpl;
import gov.nist.javax.sip.address.SipUri;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
+import java.util.UUID;
+import java.util.Vector;
/**
* @Description:澶勭悊INVITE璇锋眰
@@ -40,6 +52,22 @@
private SIPCommanderFroPlatform cmderFroPlatform;
private IVideoManagerStorager storager;
+
+ private IRedisCatchStorage redisCatchStorage;
+
+ private SIPCommander cmder;
+
+ private IPlayService playService;
+
+ private ZLMRTPServerFactory zlmrtpServerFactory;
+
+ public ZLMRTPServerFactory getZlmrtpServerFactory() {
+ return zlmrtpServerFactory;
+ }
+
+ public void setZlmrtpServerFactory(ZLMRTPServerFactory zlmrtpServerFactory) {
+ this.zlmrtpServerFactory = zlmrtpServerFactory;
+ }
/**
* 澶勭悊invite璇锋眰
@@ -76,131 +104,183 @@
platformId = uri.getUser();
if (platformId == null || channelId == null) {
- response400Ack(evt); // 鍙傛暟涓嶅叏锛� 鍙�400锛岃姹傞敊璇�
+ logger.info("鏃犳硶浠嶧romHeader鐨凙ddress涓幏鍙栧埌骞冲彴id锛岃繑鍥�404");
+ responseAck(evt, Response.BAD_REQUEST); // 鍙傛暟涓嶅叏锛� 鍙�400锛岃姹傞敊璇�
return;
}
// 鏌ヨ骞冲彴涓嬫槸鍚︽湁璇ラ�氶亾
DeviceChannel channel = storager.queryChannelInParentPlatform(platformId, channelId);
if (channel == null) {
- response404Ack(evt); // 閫氶亾涓嶅瓨鍦紝鍙�404锛岃祫婧愪笉瀛樺湪
+ logger.info("閫氶亾涓嶅瓨鍦紝杩斿洖404");
+ responseAck(evt, Response.NOT_FOUND); // 閫氶亾涓嶅瓨鍦紝鍙�404锛岃祫婧愪笉瀛樺湪
return;
}else {
- response100Ack(evt); // 閫氶亾瀛樺湪锛屽彂100锛宼rying
+ responseAck(evt, Response.TRYING); // 閫氶亾瀛樺湪锛屽彂100锛宼rying
}
- // 瑙f瀽sdp娑堟伅
- SessionDescription sdp = new SdpParser().parse(request.getRawContent());
+ // 瑙f瀽sdp娑堟伅, 浣跨敤jainsip 鑷甫鐨剆dp瑙f瀽鏂瑰紡
+ String contentString = new String(request.getRawContent());
+
+ // jainSip涓嶆敮鎸亂=瀛楁锛� 绉婚櫎绉婚櫎浠ヨВ鏋愩��
+ int ssrcIndex = contentString.indexOf("y=");
+ String ssrc = contentString.substring(ssrcIndex + 2, contentString.length())
+ .replace("\r\n", "").replace("\n", "");
+
+ String substring = contentString.substring(0, contentString.indexOf("y="));
+ SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
+
// 鑾峰彇鏀寔鐨勬牸寮�
- List<MediaDescription> mediaDescriptions = sdp.getMediaDescriptions();
+ Vector mediaDescriptions = sdp.getMediaDescriptions(true);
// 鏌ョ湅鏄惁鏀寔PS 璐熻浇96
String ip = null;
int port = -1;
- for (MediaDescription mediaDescription : mediaDescriptions) {
+ boolean recvonly = false;
+ boolean mediaTransmissionTCP = false;
+ Boolean tcpActive = null;
+ for (int i = 0; i < mediaDescriptions.size(); i++) {
+ MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i);
+ Media media = mediaDescription.getMedia();
- List<Codec> codecs = mediaDescription.getCodecs();
- for (Codec codec : codecs) {
- if("96".equals(codec.getPayloadType()) || "PS".equals(codec.getName()) || "ps".equals(codec.getName())) {
- ip = mediaDescription.getIpAddress().getHostName();
- port = mediaDescription.getPort();
- break;
+ Vector mediaFormats = media.getMediaFormats(false);
+ if (mediaFormats.contains("96")) {
+ port = media.getMediaPort();
+ String mediaType = media.getMediaType();
+ String protocol = media.getProtocol();
+
+ // 鍖哄垎TCP鍙戞祦杩樻槸udp锛� 褰撳墠榛樿udp
+ if ("TCP/RTP/AVP".equals(protocol)) {
+ String setup = mediaDescription.getAttribute("setup");
+ if (setup != null) {
+ mediaTransmissionTCP = true;
+ if ("active".equals(setup)) {
+ tcpActive = true;
+ }else if ("passive".equals(setup)) {
+ tcpActive = false;
+ }
+ }
}
+ break;
}
}
- if (ip == null || port == -1) { // TODO 娌℃湁鍚堥�傜殑瑙嗛娴佹牸寮忥紝 鍙厤缃槸鍚︿娇鐢ㄧ涓�涓猰edia淇℃伅
- if (mediaDescriptions.size() > 0) {
- ip = mediaDescriptions.get(0).getIpAddress().getHostName();
- port = mediaDescriptions.get(0).getPort();
- }
+ if (port == -1) {
+ logger.info("涓嶆敮鎸佺殑濯掍綋鏍煎紡锛岃繑鍥�415");
+ // 鍥炲涓嶆敮鎸佺殑鏍煎紡
+ responseAck(evt, Response.UNSUPPORTED_MEDIA_TYPE); // 涓嶆敮鎸佺殑鏍煎紡锛屽彂415
+ return;
}
+ String username = sdp.getOrigin().getUsername();
+ String addressStr = sdp.getOrigin().getAddress();
+ String sessionName = sdp.getSessionName().getValue();
+ logger.info("[涓婄骇鐐规挱]鐢ㄦ埛锛歿}锛� 鍦板潃锛歿}:{}锛� ssrc锛歿}", username, addressStr, port, ssrc);
- if (ip == null || port == -1) {
- response488Ack(evt);
+ Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, channelId);
+ if (device == null) {
+ logger.warn("鐐规挱骞冲彴{}鐨勯�氶亾{}鏃舵湭鎵惧埌璁惧淇℃伅", platformId, channel);
+ responseAck(evt, Response.SERVER_INTERNAL_ERROR);
+ return;
+ }
+ SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(ip, port, platformId, ssrc, channelId,
+ mediaTransmissionTCP);
+ if (tcpActive != null) {
+ sendRtpItem.setTcpActive(tcpActive);
+ }
+ if (sendRtpItem == null) {
+ logger.warn("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
+ responseAck(evt, Response.BUSY_HERE);
return;
}
-
- String ssrc = sdp.getSsrc();
+ // 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
+ redisCatchStorage.updateSendRTPSever(sendRtpItem);
// 閫氱煡涓嬬骇鎺ㄦ祦锛�
- // 鏌ユ壘鍚堥�傜殑绔彛鎺ㄦ祦锛�
- // 鍙戦�� 200ok
- // 鏀跺埌ack鍚庤皟鐢ㄦ帹娴佹帴鍙�
+ PlayResult playResult = playService.play(device.getDeviceId(), channelId, (responseJSON)->{
+ // 鏀跺埌鎺ㄦ祦锛� 鍥炲200OK, 绛夊緟ack
+ sendRtpItem.setStatus(1);
+ redisCatchStorage.updateSendRTPSever(sendRtpItem);
+ // TODO 娣诲姞瀵箃cp鐨勬敮鎸�
+ MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
+ StringBuffer content = new StringBuffer(200);
+ content.append("v=0\r\n");
+ content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+ content.append("s=Play\r\n");
+ content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+ content.append("t=0 0\r\n");
+ content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n");
+ content.append("a=sendonly\r\n");
+ content.append("a=rtpmap:96 PS/90000\r\n");
+ content.append("y="+ ssrc + "\r\n");
+ content.append("f=\r\n");
+ try {
+ responseAck(evt, content.toString());
+ } catch (SipException e) {
+ e.printStackTrace();
+ } catch (InvalidArgumentException e) {
+ e.printStackTrace();
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ },(event -> {
+ // 鏈煡閿欒銆傜洿鎺ヨ浆鍙戣澶囩偣鎾殑閿欒
+ Response response = null;
+ try {
+ response = getMessageFactory().createResponse(event.getResponse().getStatusCode(), evt.getRequest());
+ getServerTransaction(evt).sendResponse(response);
-
+ } catch (ParseException | SipException | InvalidArgumentException e) {
+ e.printStackTrace();
+ }
+ }));
+ playResult.getResult();
} catch (SipException | InvalidArgumentException | ParseException e) {
e.printStackTrace();
- } catch (IOException e) {
logger.warn("sdp瑙f瀽閿欒");
e.printStackTrace();
+ } catch (SdpParseException e) {
+ e.printStackTrace();
+ } catch (SdpException e) {
+ e.printStackTrace();
}
-
}
/***
- * 鍥炲100 trying
+ * 鍥炲鐘舵�佺爜
+ * 100 trying
+ * 200 OK
+ * 400
+ * 404
* @param evt
* @throws SipException
* @throws InvalidArgumentException
* @throws ParseException
*/
- private void response100Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
+ private void responseAck(RequestEvent evt, int statusCode) throws SipException, InvalidArgumentException, ParseException {
Response response = getMessageFactory().createResponse(Response.TRYING, evt.getRequest());
getServerTransaction(evt).sendResponse(response);
}
- /***
- * 鍥炲404
+ /**
+ * 鍥炲甯dp鐨�200
* @param evt
- * @throws SipException
- * @throws InvalidArgumentException
- * @throws ParseException
- */
- private void response404Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
- Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest());
- getServerTransaction(evt).sendResponse(response);
- }
-
- /***
- * 鍥炲400
- * @param evt
- * @throws SipException
- * @throws InvalidArgumentException
- * @throws ParseException
- */
- private void response400Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
- Response response = getMessageFactory().createResponse(Response.BAD_REQUEST, evt.getRequest());
- getServerTransaction(evt).sendResponse(response);
- }
-
- /***
- * 鍥炲488
- * @param evt
- * @throws SipException
- * @throws InvalidArgumentException
- * @throws ParseException
- */
- private void response488Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
- Response response = getMessageFactory().createResponse(Response.NOT_ACCEPTABLE_HERE, evt.getRequest());
- getServerTransaction(evt).sendResponse(response);
- }
-
- /***
- * 鍥炲200 OK
- * @param evt
+ * @param sdp
* @throws SipException
* @throws InvalidArgumentException
* @throws ParseException
*/
private void responseAck(RequestEvent evt, String sdp) throws SipException, InvalidArgumentException, ParseException {
Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest());
- ContentTypeHeader contentTypeHeader = getHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
+ SipFactory sipFactory = SipFactory.getInstance();
+ ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
response.setContent(sdp, contentTypeHeader);
+
+ SipURI sipURI = (SipURI)evt.getRequest().getRequestURI();
+
+ Address concatAddress = sipFactory.createAddressFactory().createAddress(
+ sipFactory.createAddressFactory().createSipURI(sipURI.getUser(), sipURI.getHost()+":"+sipURI.getPort()
+ ));
+ response.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
getServerTransaction(evt).sendResponse(response);
}
-
-
-
-
@@ -222,4 +302,28 @@
public void setStorager(IVideoManagerStorager storager) {
this.storager = storager;
}
+
+ public SIPCommander getCmder() {
+ return cmder;
+ }
+
+ public void setCmder(SIPCommander cmder) {
+ this.cmder = cmder;
+ }
+
+ public IPlayService getPlayService() {
+ return playService;
+ }
+
+ public void setPlayService(IPlayService playService) {
+ this.playService = playService;
+ }
+
+ public IRedisCatchStorage getRedisCatchStorage() {
+ return redisCatchStorage;
+ }
+
+ public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
+ this.redisCatchStorage = redisCatchStorage;
+ }
}
--
Gitblit v1.8.0