From 8da6906e40c8a96a94624b468833bebc2c3a3d5c Mon Sep 17 00:00:00 2001
From: Lawrence <1934378145@qq.com>
Date: 星期三, 20 一月 2021 20:43:40 +0800
Subject: [PATCH] 修改功能说明
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java | 318 ++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 268 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..58e11ad 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,289 @@
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.alibaba.fastjson.JSONObject;
+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.callback.DeferredResultHolder;
+import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
+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 com.genersoft.iot.vmp.vmanager.play.bean.PlayResult;
+import com.genersoft.iot.vmp.vmanager.service.IPlayService;
+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;
/**
* @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;
+
+ private SIPCommander cmder;
+
+ private IPlayService playService;
/**
* 澶勭悊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();
+
+ Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, channelId);
+ if (device == null) {
+ logger.warn("鐐规挱骞冲彴{}鐨勯�氶亾{}鏃舵湭鎵惧埌璁惧淇℃伅", platformId, channel);
+ response500Ack(evt);
+ return;
+ }
+
+ // 閫氱煡涓嬬骇鎺ㄦ祦锛�
+ PlayResult playResult = playService.play(device.getDeviceId(), channelId, (response)->{
+ // 鏀跺埌鎺ㄦ祦锛� 鍥炲200OK
+
+ },(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鍚庤皟鐢ㄦ帹娴佹帴鍙�
+
+
+
+
+ } 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);
+ }
+
+ /***
+ * 鍥炲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);
+ }
+
+ /***
+ * 鍥炲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);
+ }
+
+ /***
+ * 鍥炲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
+ * @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);
+ }
+
+ /***
+ * 鍥炲500
+ * @param evt
+ * @throws SipException
+ * @throws InvalidArgumentException
+ * @throws ParseException
+ */
+ private void response500Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
+ Response response = getMessageFactory().createResponse(Response.SERVER_INTERNAL_ERROR, evt.getRequest());
+ 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;
+ }
+
+ 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