panlinlin
2021-01-15 1b44ba33671e27c3d206d875306b226c770b7980
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -10,19 +10,26 @@
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;
@@ -40,6 +47,10 @@
   private SIPCommanderFroPlatform cmderFroPlatform;
   private IVideoManagerStorager storager;
   private SIPCommander cmder;
   private IPlayService playService;
   /**
    * 处理invite请求
@@ -75,10 +86,6 @@
         SipUri uri = (SipUri) address.getURI();
         platformId = uri.getUser();
//         if (platformId == null) { // 不存在则从fromHeader 获取平台信息
//            FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME);
//            platformId = fromHeader.getName();
//         }
         if (platformId == null || channelId == null) {
            response400Ack(evt); // 参数不全, 发400,请求错误
            return;
@@ -92,9 +99,7 @@
            response100Ack(evt); // 通道存在,发100,trying
         }
         // 解析sdp消息
         byte[] sdpByteArray = request.getRawContent();
         SdpParser sdpParser = new SdpParser(); // TODO keng
         SessionDescription sdp = sdpParser.parse(sdpByteArray);
         SessionDescription sdp = new SdpParser().parse(request.getRawContent());
         //  获取支持的格式
         List<MediaDescription> mediaDescriptions = sdp.getMediaDescriptions();
         // 查看是否支持PS 负载96
@@ -125,7 +130,30 @@
         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后调用推流接口
@@ -155,14 +183,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);
   }
@@ -179,6 +209,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
@@ -191,18 +233,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);
   }
@@ -228,4 +270,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;
   }
}