panlinlin
2021-01-07 059a5a678ab21738c3fecb9e2bd1e2dc47220a4f
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -1,6 +1,7 @@
package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
import java.text.ParseException;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -12,11 +13,13 @@
import javax.sip.message.Request;
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.MediaServerConfig;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -53,6 +56,9 @@
   @Autowired
   private IVideoManagerStorager storager;
   @Autowired
   private IRedisCatchStorage redisCatchStorage;
   
   @Autowired
   @Qualifier(value="tcpSipProvider")
@@ -176,11 +182,10 @@
   /**
   * 云台指令码计算 
   *
    * @param leftRight  镜头左移右移 0:停止 1:左移 2:右移
    * @param upDown     镜头上移下移 0:停止 1:上移 2:下移
    * @param inOut      镜头放大缩小 0:停止 1:缩小 2:放大
    * @param moveSpeed  镜头移动速度 默认 0XFF (0-255)
    * @param zoomSpeed  镜头缩放速度 默认 0X1 (0-255)
   * @param cmdCode      指令码
   * @param parameter1   数据1
   * @param parameter2   数据2
   * @param combineCode2   组合码2
    */
    public static String frontEndCmdString(int cmdCode, int parameter1, int parameter2, int combineCode2) {
      StringBuilder builder = new StringBuilder("A50F01");
@@ -229,7 +234,7 @@
         
         Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
         
         transmitRequest(device, request, null);
         transmitRequest(device, request);
         return true;
      } catch (SipException | ParseException | InvalidArgumentException e) {
         e.printStackTrace();
@@ -264,7 +269,7 @@
         ptzXml.append("</Control>\r\n");
         
         Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
         transmitRequest(device, request, null);
         transmitRequest(device, request);
         return true;
      } catch (SipException | ParseException | InvalidArgumentException e) {
         e.printStackTrace();
@@ -291,7 +296,7 @@
            streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
         }
         String streamMode = device.getStreamMode().toUpperCase();
         MediaServerConfig mediaInfo = storager.getMediaInfo();
         MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
         if (mediaInfo == null) {
            logger.warn("点播时发现ZLM尚未连接...");
            return;
@@ -344,15 +349,14 @@
         }
         content.append("y="+ssrc+"\r\n");//ssrc
//         String fromTag = UUID.randomUUID().toString();
//         Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, fromTag, null, ssrc);
         Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null, ssrc);
         ClientTransaction transaction = transmitRequest(device, request, errorEvent);
         streamSession.put(streamId, transaction);
         DeviceChannel deviceChannel = storager.queryChannel(device.getDeviceId(), channelId);
         if (deviceChannel != null) {
            deviceChannel.setStreamId(streamId);
            storager.updateChannel(device.getDeviceId(), deviceChannel);
         }
      } catch ( SipException | ParseException | InvalidArgumentException e) {
@@ -372,7 +376,7 @@
   public void playbackStreamCmd(Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event
         , SipSubscribe.Event errorEvent) {
      try {
         MediaServerConfig mediaInfo = storager.getMediaInfo();
         MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
         String ssrc = streamSession.createPlayBackSsrc();
         String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
         // 添加订阅
@@ -457,17 +461,28 @@
         e.printStackTrace();
      }
   }
   /**
    * 视频流停止
    * 
    */
   @Override
   public void streamByeCmd(String streamId) {
   public void streamByeCmd(String ssrc) {
      streamByeCmd(ssrc, null);
   }
   @Override
   public void streamByeCmd(String streamId, SipSubscribe.Event okEvent) {
      
      try {
         ClientTransaction transaction = streamSession.get(streamId);
         // 服务重启后
         if (transaction == null) {
            StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
            if (streamInfo != null) {
            }
            return;
         }
         
@@ -475,6 +490,9 @@
         if (dialog == null) {
            return;
         }
         Request byeRequest = dialog.createRequest(Request.BYE);
         SipURI byeURI = (SipURI) byeRequest.getRequestURI();
         String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString();
@@ -491,7 +509,14 @@
         } else if("UDP".equals(protocol)) {
            clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest);
         }
         CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME);
         if (okEvent != null) {
            sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
         }
         dialog.sendRequest(clientTransaction);
         streamSession.remove(streamId);
         zlmrtpServerFactory.closeRTPServer(streamId);
      } catch (TransactionDoesNotExistException e) {
@@ -612,7 +637,7 @@
         
         Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaDeviceInfoBranch", "FromDeviceInfoTag", "ToDeviceInfoTag");
         transmitRequest(device, request, null);
         transmitRequest(device, request);
         
      } catch (SipException | ParseException | InvalidArgumentException e) {
         e.printStackTrace();
@@ -675,8 +700,7 @@
         
         Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "ViaRecordInfoBranch", "FromRecordInfoTag", null);
         transmitRequest(device, request, null);
         transmitRequest(device, request);
      } catch (SipException | ParseException | InvalidArgumentException e) {
         e.printStackTrace();
         return false;
@@ -727,8 +751,16 @@
      // TODO Auto-generated method stub
      return false;
   }
   private ClientTransaction transmitRequest(Device device, Request request) throws SipException {
      return transmitRequest(device, request, null, null);
   }
   private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent) throws SipException {
      return transmitRequest(device, request, errorEvent, null);
   }
   private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException {
      ClientTransaction clientTransaction = null;
      if("TCP".equals(device.getTransport())) {
         clientTransaction = tcpSipProvider.getNewClientTransaction(request);
@@ -736,10 +768,14 @@
         clientTransaction = udpSipProvider.getNewClientTransaction(request);
      }
      // 添加订阅
      CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
      // 添加错误订阅
      if (errorEvent != null) {
         CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
         sipSubscribe.addSubscribe(callIdHeader.getCallId(), errorEvent);
         sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), errorEvent);
      }
      // 添加订阅
      if (okEvent != null) {
         sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
      }
      clientTransaction.sendRequest();
@@ -747,6 +783,8 @@
   }
   @Override
   public void closeRTPServer(Device device, String channelId) {
      if (rtpEnable) {