From c1b3f2beb4b76e89d4938d2f7d5b31ff0f10220d Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期日, 24 一月 2021 20:46:06 +0800
Subject: [PATCH] 国标级联--点播-未完成

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java |  205 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 163 insertions(+), 42 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..9d0a9a3 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,5 +1,6 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
+import javax.sdp.*;
 import javax.sip.InvalidArgumentException;
 import javax.sip.RequestEvent;
 import javax.sip.SipException;
@@ -10,23 +11,30 @@
 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.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 +48,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璇锋眰
@@ -87,41 +111,105 @@
 			}else {
 				response100Ack(evt); // 閫氶亾瀛樺湪锛屽彂100锛宼rying
 			}
-			// 瑙f瀽sdp娑堟伅
-			SessionDescription sdp = new SdpParser().parse(request.getRawContent());
+			// 瑙f瀽sdp娑堟伅, 浣跨敤jainsip 鑷甫鐨剆dp瑙f瀽鏂瑰紡
+			String contentString = new String(request.getRawContent());
+			SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(contentString);
+
+			// TODO 鍖哄垎TCP鍙戞祦杩樻槸udp锛� 褰撳墠榛樿udp
 			//  鑾峰彇鏀寔鐨勬牸寮�
-			List<MediaDescription> mediaDescriptions = sdp.getMediaDescriptions();
+			Vector mediaDescriptions = sdp.getMediaDescriptions(true);
 			// 鏌ョ湅鏄惁鏀寔PS 璐熻浇96
 			String ip = null;
 			int port = -1;
-			for (MediaDescription mediaDescription : mediaDescriptions) {
-
-				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;
-					}
-				}
+			for (int i = 0; i < mediaDescriptions.size(); i++) {
+				MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i);
+				Media media = mediaDescription.getMedia();
+				port = media.getMediaPort();
 			}
-			if (ip == null || port == -1) { // TODO 娌℃湁鍚堥�傜殑瑙嗛娴佹牸寮忥紝 鍙厤缃槸鍚︿娇鐢ㄧ涓�涓猰edia淇℃伅
-				if (mediaDescriptions.size() > 0) {
-					ip = mediaDescriptions.get(0).getIpAddress().getHostName();
-					port = mediaDescriptions.get(0).getPort();
-				}
-			}
-
-			if (ip == null || port == -1) {
-				response488Ack(evt);
-				return;
-			}
-
-
-			String ssrc = sdp.getSsrc();
-			// 閫氱煡涓嬬骇鎺ㄦ祦锛�
+//			for (MediaDescription mediaDescription : mediaDescriptions) {
+//
+//				List<Codec> codecs = mediaDescription.getCodecs();
+//				for (Codec codec : codecs) {
+//					if("96".equals(codec.getPayloadType()) || "PS".equals(codec.getName()) || "ps".equals(codec.getName())) {
+//						// TODO 杩欓噷寰堟參
+//						ip = mediaDescription.getIpAddress().getHostName();
+//						port = mediaDescription.getPort();
+//						break;
+//					}
+//				}
+//			}
+//			if (ip == null || port == -1) { // TODO 娌℃湁鍚堥�傜殑瑙嗛娴佹牸寮忥紝 鍙厤缃槸鍚︿娇鐢ㄧ涓�涓猰edia淇℃伅
+//				if (mediaDescriptions.size() > 0) {
+//					ip = mediaDescriptions.get(0).getIpAddress().getHostName();
+//					port = mediaDescriptions.get(0).getPort();
+//				}
+//			}
+//
+//			if (ip == null || port == -1) {
+//				response488Ack(evt);
+//				return;
+//			}
+//
+//
+//			String ssrc = sdp.getSsrc();
+//
+//			Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, channelId);
+//			if (device == null) {
+//				logger.warn("鐐规挱骞冲彴{}鐨勯�氶亾{}鏃舵湭鎵惧埌璁惧淇℃伅", platformId, channel);
+//				response500Ack(evt);
+//				return;
+//			}
+//
+//			// 閫氱煡涓嬬骇鎺ㄦ祦锛�
+//			PlayResult playResult = playService.play(device.getDeviceId(), channelId, (responseJSON)->{
+//				// 鏀跺埌鎺ㄦ祦锛� 鍥炲200OK
+//				UUID uuid = UUID.randomUUID();
+//				int rtpServer = zlmrtpServerFactory.createRTPServer(uuid.toString());
+//				if (rtpServer == -1) {
+//					logger.error("涓鸿幏鍙栧埌鍙敤绔彛");
+//					return;
+//				}else {
+//					zlmrtpServerFactory.closeRTPServer(uuid.toString());
+//				}
+//				// 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 "+ rtpServer+" 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();
+//				}
+//
+//				// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
+////				redisCatchStorage.waiteAck()
+//			},(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();
 			// 鏌ユ壘鍚堥�傜殑绔彛鎺ㄦ祦锛�
-			// 鍙戦�� 200ok
 			// 鏀跺埌ack鍚庤皟鐢ㄦ帹娴佹帴鍙�
 
 
@@ -129,8 +217,11 @@
 
 		} 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();
 		}
 
@@ -149,14 +240,16 @@
 	}
 
 	/***
-	 * 鍥炲404
+	 * 鍥炲200 OK
 	 * @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());
+	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");
+		response.setContent(sdp, contentTypeHeader);
 		getServerTransaction(evt).sendResponse(response);
 	}
 
@@ -173,6 +266,18 @@
 	}
 
 	/***
+	 * 鍥炲404
+	 * @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);
+	}
+
+	/***
 	 * 鍥炲488
 	 * @param evt
 	 * @throws SipException
@@ -185,18 +290,18 @@
 	}
 
 	/***
-	 * 鍥炲200 OK
+	 * 鍥炲500
 	 * @param evt
 	 * @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");
-		response.setContent(sdp, contentTypeHeader);
+	private void response500Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
+		Response response = getMessageFactory().createResponse(Response.SERVER_INTERNAL_ERROR, evt.getRequest());
 		getServerTransaction(evt).sendResponse(response);
 	}
+
+
 
 
 
@@ -222,4 +327,20 @@
 	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;
+	}
 }

--
Gitblit v1.8.0