From e09e541c827157884e013ff0b50aa88b8b0f46be Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期五, 15 一月 2021 17:47:58 +0800
Subject: [PATCH] 完成向上级联->点播--精简代码

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java |  254 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 204 insertions(+), 50 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 ab70a5e..4dea5d4 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,71 +1,225 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
+import javax.sip.InvalidArgumentException;
 import javax.sip.RequestEvent;
+import javax.sip.SipException;
+import javax.sip.address.SipURI;
+import javax.sip.header.ContentTypeHeader;
+import javax.sip.header.FromHeader;
+import javax.sip.header.SubjectHeader;
+import javax.sip.message.Request;
+import javax.sip.message.Response;
 
+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.storager.IVideoManagerStorager;
+import gov.nist.javax.sip.address.AddressImpl;
+import gov.nist.javax.sip.address.SipUri;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.List;
 
 /**    
  * @Description:澶勭悊INVITE璇锋眰
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍4:43:52     
+ * @author: panll
+ * @date:   2021骞�1鏈�14鏃�
  */
 public class InviteRequestProcessor extends SIPRequestAbstractProcessor {
+
+	private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class);
+
+	private SIPCommanderFroPlatform cmderFroPlatform;
+
+	private IVideoManagerStorager storager;
 
 	/**
 	 * 澶勭悊invite璇锋眰
 	 * 
-	 * @param request
+	 * @param evt
 	 *            璇锋眰娑堟伅
 	 */ 
 	@Override
 	public void process(RequestEvent evt) {
-		// TODO 浼樺厛绾�99 Invite Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽姹傝棰戞寚浠�
-//		Request request = requestEvent.getRequest();
-//
-//		try {
-//			// 鍙戦��100 Trying
-//			ServerTransaction serverTransaction = getServerTransaction(requestEvent);
-//			// 鏌ヨ鐩爣鍦板潃
-//			URI reqUri = request.getRequestURI();
-//			URI contactURI = currUser.get(reqUri);
-//
-//			System.out.println("processInvite rqStr=" + reqUri + " contact=" + contactURI);
-//
-//			// 鏍规嵁Request uri鏉ヨ矾鐢憋紝鍚庣画鐨勫搷搴旀秷鎭�氳繃VIA鏉ヨ矾鐢�
-//			Request cliReq = messageFactory.createRequest(request.toString());
-//			cliReq.setRequestURI(contactURI);
-//
-//			HeaderFactory headerFactory = SipFactory.getInstance().createHeaderFactory();
-//			Via callerVia = (Via) request.getHeader(Via.NAME);
-//			Via via = (Via) headerFactory.createViaHeader(SIPMain.ip, SIPMain.port, "UDP",
-//					callerVia.getBranch() + "sipphone");
-//
-//			cliReq.removeHeader(Via.NAME);
-//			cliReq.addHeader(via);
-//
-//			// 鏇存柊contact鐨勫湴鍧�
-//			ContactHeader contactHeader = headerFactory.createContactHeader();
-//			Address address = SipFactory.getInstance().createAddressFactory()
-//					.createAddress("sip:sipsoft@" + SIPMain.ip + ":" + SIPMain.port);
-//			contactHeader.setAddress(address);
-//			contactHeader.setExpires(3600);
-//			cliReq.setHeader(contactHeader);
-//
-//			clientTransactionId = sipProvider.getNewClientTransaction(cliReq);
-//			clientTransactionId.sendRequest();
-//
-//			System.out.println("processInvite clientTransactionId=" + clientTransactionId.toString());
-//
-//			System.out.println("send invite to callee: " + cliReq);
-//		} catch (TransactionUnavailableException e1) {
-//			e1.printStackTrace();
-//		} catch (SipException e) {
-//			e.printStackTrace();
-//		} catch (ParseException e) {
-//			e.printStackTrace();
-//		} catch (Exception e) {
-//			e.printStackTrace();
-//		}
+		//  Invite Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽姹傝棰戞寚浠�
+		try {
+			Request request = evt.getRequest();
+			SipURI sipURI = (SipURI) request.getRequestURI();
+			String channelId = sipURI.getUser();
+			String platformId = null;
+//			SubjectHeader subjectHeader = (SubjectHeader)request.getHeader(SubjectHeader.NAME);
+//			// 鏌ヨ閫氶亾鏄惁瀛樺湪 涓嶅瓨鍦ㄥ洖澶�404
+//			if (subjectHeader != null) { // 瀛樺湪鍒欎粠subjectHeader 鑾峰彇骞冲彴淇℃伅
+//				String subject = subjectHeader.getSubject();
+//				if (subject != null) {
+//					String[] info1 = subject.split(",");
+//					if (info1 != null && info1 .length == 2) {
+//						String[] info2 = info1[1].split(":");
+//						if (info2 != null && info2.length == 2) {
+//							platformId = info2[0];
+//						}
+//					}
+//				}
+//			}
+
+			FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME);
+			AddressImpl address = (AddressImpl) fromHeader.getAddress();
+			SipUri uri = (SipUri) address.getURI();
+			platformId = uri.getUser();
+
+			if (platformId == null || channelId == null) {
+				response400Ack(evt); // 鍙傛暟涓嶅叏锛� 鍙�400锛岃姹傞敊璇�
+				return;
+			}
+			// 鏌ヨ骞冲彴涓嬫槸鍚︽湁璇ラ�氶亾
+			DeviceChannel channel = storager.queryChannelInParentPlatform(platformId, channelId);
+			if (channel == null) {
+				response404Ack(evt); // 閫氶亾涓嶅瓨鍦紝鍙�404锛岃祫婧愪笉瀛樺湪
+				return;
+			}else {
+				response100Ack(evt); // 閫氶亾瀛樺湪锛屽彂100锛宼rying
+			}
+			// 瑙f瀽sdp娑堟伅
+			SessionDescription sdp = new SdpParser().parse(request.getRawContent());
+			//  鑾峰彇鏀寔鐨勬牸寮�
+			List<MediaDescription> mediaDescriptions = sdp.getMediaDescriptions();
+			// 鏌ョ湅鏄惁鏀寔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;
+					}
+				}
+			}
+			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();
+			// 閫氱煡涓嬬骇鎺ㄦ祦锛�
+			// 鏌ユ壘鍚堥�傜殑绔彛鎺ㄦ祦锛�
+			// 鍙戦�� 200ok
+			// 鏀跺埌ack鍚庤皟鐢ㄦ帹娴佹帴鍙�
+
+
+
+
+		} catch (SipException | InvalidArgumentException | ParseException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			logger.warn("sdp瑙f瀽閿欒");
+			e.printStackTrace();
+		}
+
 	}
 
+	/***
+	 * 鍥炲100 trying
+	 * @param evt
+	 * @throws SipException
+	 * @throws InvalidArgumentException
+	 * @throws ParseException
+	 */
+	private void response100Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
+		Response response = getMessageFactory().createResponse(Response.TRYING, evt.getRequest());
+		getServerTransaction(evt).sendResponse(response);
+	}
+
+	/***
+	 * 鍥炲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);
+	}
+
+	/***
+	 * 鍥炲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
+	 * @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);
+		getServerTransaction(evt).sendResponse(response);
+	}
+
+
+
+
+
+
+
+
+
+
+	public SIPCommanderFroPlatform getCmderFroPlatform() {
+		return cmderFroPlatform;
+	}
+
+	public void setCmderFroPlatform(SIPCommanderFroPlatform cmderFroPlatform) {
+		this.cmderFroPlatform = cmderFroPlatform;
+	}
+
+	public IVideoManagerStorager getStorager() {
+		return storager;
+	}
+
+	public void setStorager(IVideoManagerStorager storager) {
+		this.storager = storager;
+	}
 }

--
Gitblit v1.8.0