添加国标级联录像控制功能

pull/530/head
mk1990 2022-06-22 14:26:46 +08:00
parent 4d2c36edcd
commit 9bb61a70ab
3 changed files with 2428 additions and 2277 deletions

View File

@ -1,347 +1,355 @@
package com.genersoft.iot.vmp.gb28181.transmit.cmd; package com.genersoft.iot.vmp.gb28181.transmit.cmd;
import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.service.bean.SSRCInfo;
import javax.sip.Dialog; import javax.sip.Dialog;
/** /**
* @description: * @description:
* @author: swwheihei * @author: swwheihei
* @date: 202053 9:16:34 * @date: 202053 9:16:34
*/ */
public interface ISIPCommander { public interface ISIPCommander {
/** /**
* 使 * 使
* *
* @param device * @param device
* @param channelId * @param channelId
* @param leftRight 0: 1: 2: * @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2: * @param upDown 0: 1: 2:
*/ */
boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown); boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown);
/** /**
* *
* *
* @param device * @param device
* @param channelId * @param channelId
* @param leftRight 0: 1: 2: * @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2: * @param upDown 0: 1: 2:
* @param moveSpeed * @param moveSpeed
*/ */
boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed); boolean ptzdirectCmd(Device device,String channelId,int leftRight, int upDown, int moveSpeed);
/** /**
* 使 * 使
* *
* @param device * @param device
* @param channelId * @param channelId
* @param inOut 0: 1: 2: * @param inOut 0: 1: 2:
*/ */
boolean ptzZoomCmd(Device device,String channelId,int inOut); boolean ptzZoomCmd(Device device,String channelId,int inOut);
/** /**
* *
* *
* @param device * @param device
* @param channelId * @param channelId
* @param inOut 0: 1: 2: * @param inOut 0: 1: 2:
*/ */
boolean ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed); boolean ptzZoomCmd(Device device,String channelId,int inOut, int moveSpeed);
/** /**
* *
* *
* @param device * @param device
* @param channelId * @param channelId
* @param leftRight 0: 1: 2: * @param leftRight 0: 1: 2:
* @param upDown 0: 1: 2: * @param upDown 0: 1: 2:
* @param inOut 0: 1: 2: * @param inOut 0: 1: 2:
* @param moveSpeed * @param moveSpeed
* @param zoomSpeed * @param zoomSpeed
*/ */
boolean ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed); boolean ptzCmd(Device device,String channelId,int leftRight, int upDown, int inOut, int moveSpeed, int zoomSpeed);
/** /**
* PTZFI * PTZFI
* *
* @param device * @param device
* @param channelId * @param channelId
* @param cmdCode * @param cmdCode
* @param parameter1 1 * @param parameter1 1
* @param parameter2 2 * @param parameter2 2
* @param combineCode2 2 * @param combineCode2 2
*/ */
boolean frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2); boolean frontEndCmd(Device device, String channelId, int cmdCode, int parameter1, int parameter2, int combineCode2);
/** /**
* *
* @param device * @param device
* @param channelId * @param channelId
* @param cmdString * @param cmdString
*/ */
boolean fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent); boolean fronEndCmd(Device device, String channelId, String cmdString, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent);
/** /**
* *
* @param device * @param device
* @param channelId * @param channelId
*/ */
void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent); void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent);
/** /**
* *
* *
* @param device * @param device
* @param channelId * @param channelId
* @param startTime ,yyyy-MM-dd HH:mm:ss * @param startTime ,yyyy-MM-dd HH:mm:ss
* @param endTime ,yyyy-MM-dd HH:mm:ss * @param endTime ,yyyy-MM-dd HH:mm:ss
*/ */
void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInf, Device device, String channelId, String startTime, String endTime,InviteStreamCallback inviteStreamCallback, InviteStreamCallback event, SipSubscribe.Event errorEvent); void playbackStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInf, Device device, String channelId, String startTime, String endTime,InviteStreamCallback inviteStreamCallback, InviteStreamCallback event, SipSubscribe.Event errorEvent);
/** /**
* *
* *
* @param device * @param device
* @param channelId * @param channelId
* @param startTime ,yyyy-MM-dd HH:mm:ss * @param startTime ,yyyy-MM-dd HH:mm:ss
* @param endTime ,yyyy-MM-dd HH:mm:ss * @param endTime ,yyyy-MM-dd HH:mm:ss
* @param downloadSpeed * @param downloadSpeed
*/ */
void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent, String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent,
SipSubscribe.Event errorEvent); SipSubscribe.Event errorEvent);
/** /**
* *
*/ */
void streamByeCmd(String deviceId, String channelId, String stream, String callId, SipSubscribe.Event okEvent); void streamByeCmd(String deviceId, String channelId, String stream, String callId, SipSubscribe.Event okEvent);
void streamByeCmd(String deviceId, String channelId, String stream, String callId); void streamByeCmd(String deviceId, String channelId, String stream, String callId);
/** /**
* *
*/ */
void playPauseCmd(Device device, StreamInfo streamInfo); void playPauseCmd(Device device, StreamInfo streamInfo);
/** /**
* *
*/ */
void playResumeCmd(Device device, StreamInfo streamInfo); void playResumeCmd(Device device, StreamInfo streamInfo);
/** /**
* *
*/ */
void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime); void playSeekCmd(Device device, StreamInfo streamInfo, long seekTime);
/** /**
* *
*/ */
void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed); void playSpeedCmd(Device device, StreamInfo streamInfo, Double speed);
/** /**
* 广 *
* * @param device
* @param device * @param streamInfo
* @param channelId * @param content
*/ */
boolean audioBroadcastCmd(Device device,String channelId); void playbackControlCmd(Device device, StreamInfo streamInfo, String content);
/** /**
* 广 * 广
* *
* @param device * @param device
*/ * @param channelId
void audioBroadcastCmd(Device device, SipSubscribe.Event okEvent); */
boolean audioBroadcastCmd(Device device); boolean audioBroadcastCmd(Device device,String channelId);
/** /**
* * 广
* *
* @param device * @param device
* @param channelId */
* @param recordCmdStr Record / StopRecord void audioBroadcastCmd(Device device, SipSubscribe.Event okEvent);
*/ boolean audioBroadcastCmd(Device device);
boolean recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent);
/**
/** *
* *
* * @param device
* @param device * @param channelId
*/ * @param recordCmdStr Record / StopRecord
boolean teleBootCmd(Device device); */
boolean recordCmd(Device device, String channelId, String recordCmdStr, SipSubscribe.Event errorEvent);
/**
* / /**
* *
* @param device *
*/ * @param device
boolean guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent); */
boolean teleBootCmd(Device device);
/**
* /**
* * /
* @param device *
* @param alarmMethod * @param device
* @param alarmType */
*/ boolean guardCmd(Device device, String guardCmdStr, SipSubscribe.Event errorEvent);
boolean alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent);
/**
/** *
* ,IDR *
* * @param device
* @param device * @param alarmMethod
* @param channelId * @param alarmType
*/ */
boolean iFrameCmd(Device device, String channelId); boolean alarmCmd(Device device, String alarmMethod, String alarmType, SipSubscribe.Event errorEvent);
/** /**
* * ,IDR
* *
* @param device * @param device
* @param enabled 使1 = 0 = * @param channelId
* @param resetTime 使:(s) */
* @param presetIndex 使0~255 boolean iFrameCmd(Device device, String channelId);
*/
boolean homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent); /**
*
/** *
* * @param device
* * @param enabled 使1 = 0 =
* @param device * @param resetTime 使:(s)
*/ * @param presetIndex 使0~255
boolean deviceConfigCmd(Device device); */
boolean homePositionCmd(Device device, String channelId, String enabled, String resetTime, String presetIndex, SipSubscribe.Event errorEvent);
/**
* basicParam /**
* *
* @param device *
* @param channelId * @param device
* @param name / */
* @param expiration boolean deviceConfigCmd(Device device);
* @param heartBeatInterval
* @param heartBeatCount /**
*/ * basicParam
boolean deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent); *
* @param device
/** * @param channelId
* * @param name /
* * @param expiration
* @param device * @param heartBeatInterval
*/ * @param heartBeatCount
boolean deviceStatusQuery(Device device, SipSubscribe.Event errorEvent); */
boolean deviceBasicConfigCmd(Device device, String channelId, String name, String expiration, String heartBeatInterval, String heartBeatCount, SipSubscribe.Event errorEvent);
/**
* /**
* *
* @param device *
* @return * @param device
*/ */
boolean deviceInfoQuery(Device device); boolean deviceStatusQuery(Device device, SipSubscribe.Event errorEvent);
/** /**
* *
* *
* @param device * @param device
*/ * @return
boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent); */
boolean deviceInfoQuery(Device device);
/**
* /**
* *
* @param device *
* @param startTime ,yyyy-MM-dd HH:mm:ss * @param device
* @param endTime ,yyyy-MM-dd HH:mm:ss */
* @param sn boolean catalogQuery(Device device, int sn, SipSubscribe.Event errorEvent);
*/
boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent); /**
*
/** *
* * @param device
* * @param startTime ,yyyy-MM-dd HH:mm:ss
* @param device * @param endTime ,yyyy-MM-dd HH:mm:ss
* @param startPriority * @param sn
* @param endPriority */
* @param alarmMethod boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent);
* @param alarmType
* @param startTime /**
* @param endTime *
* @return true = *
*/ * @param device
boolean alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod, * @param startPriority
String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent); * @param endPriority
* @param alarmMethod
/** * @param alarmType
* * @param startTime
* * @param endTime
* @param device * @return true =
* @param channelId */
* @param configType boolean alarmInfoQuery(Device device, String startPriority, String endPriority, String alarmMethod,
*/ String alarmType, String startTime, String endTime, SipSubscribe.Event errorEvent);
boolean deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent);
/**
/** *
* *
* * @param device
* @param device * @param channelId
*/ * @param configType
boolean presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent); */
boolean deviceConfigQuery(Device device, String channelId, String configType, SipSubscribe.Event errorEvent);
/**
* /**
* *
* @param device *
*/ * @param device
boolean mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent); */
boolean presetQuery(Device device, String channelId, SipSubscribe.Event errorEvent);
/**
* /**
* *
* @param device *
* @return true = * @param device
*/ */
boolean mobilePositionSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent , SipSubscribe.Event errorEvent); boolean mobilePostitionQuery(Device device, SipSubscribe.Event errorEvent);
/** /**
* *
* @param device *
* @param expires 0 = * @param device
* @param startPriority * @return true =
* @param endPriority */
* @param alarmType boolean mobilePositionSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent , SipSubscribe.Event errorEvent);
* @param startTime
* @param endTime /**
* @return true = *
*/ * @param device
boolean alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime); * @param expires 0 =
* @param startPriority
/** * @param endPriority
* * @param alarmType
* @param device * @param startTime
* @return true = * @param endTime
*/ * @return true =
boolean catalogSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent); */
boolean alarmSubscribe(Device device, int expires, String startPriority, String endPriority, String alarmMethod, String alarmType, String startTime, String endTime);
/**
* /**
* *
* @param device * @param device
* @param channelId id * @return true =
* @param cmdString */
*/ boolean catalogSubscribe(Device device, Dialog dialog, SipSubscribe.Event okEvent ,SipSubscribe.Event errorEvent);
boolean dragZoomCmd(Device device, String channelId, String cmdString);
/**
*
/** *
* NOTIFY * @param device
* @param device * @param channelId id
* @param deviceAlarm * @param cmdString
* @return */
*/ boolean dragZoomCmd(Device device, String channelId, String cmdString);
boolean sendAlarmMessage(Device device, DeviceAlarm deviceAlarm);
}
/**
* NOTIFY
* @param device
* @param deviceAlarm
* @return
*/
boolean sendAlarmMessage(Device device, DeviceAlarm deviceAlarm);
}

View File

@ -0,0 +1,121 @@
package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.info;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import gov.nist.javax.sip.message.SIPRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.sip.InvalidArgumentException;
import javax.sip.RequestEvent;
import javax.sip.SipException;
import javax.sip.header.*;
import javax.sip.message.Response;
import java.text.ParseException;
@Component
public class InfoRequestProcessor extends SIPRequestProcessorParent implements InitializingBean, ISIPRequestProcessor {
private final static Logger logger = LoggerFactory.getLogger(InfoRequestProcessor.class);
private final String method = "INFO";
@Autowired
private SIPProcessorObserver sipProcessorObserver;
@Autowired
private IVideoManagerStorage storage;
@Autowired
private SipSubscribe sipSubscribe;
@Autowired
private IRedisCatchStorage redisCatchStorage;
@Autowired
private IVideoManagerStorage storager;
@Autowired
private SIPCommander cmder;
@Autowired
private VideoStreamSessionManager sessionManager;
@Override
public void afterPropertiesSet() throws Exception {
// 添加消息处理的订阅
sipProcessorObserver.addRequestProcessor(method, this);
}
@Override
public void process(RequestEvent evt) {
logger.debug("接收到消息:" + evt.getRequest());
String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME);
// 先从会话内查找
SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, callIdHeader.getCallId(), null);
if (ssrcTransaction != null) { // 兼容海康 媒体通知 消息from字段不是设备ID的问题
deviceId = ssrcTransaction.getDeviceId();
}
// 查询设备是否存在
Device device = redisCatchStorage.getDevice(deviceId);
// 查询上级平台是否存在
ParentPlatform parentPlatform = storage.queryParentPlatByServerGBId(deviceId);
try {
if (device != null && parentPlatform != null) {
logger.warn("[重复]平台与设备编号重复:{}", deviceId);
SIPRequest request = (SIPRequest) evt.getRequest();
String hostAddress = request.getRemoteAddress().getHostAddress();
int remotePort = request.getRemotePort();
if (device.getHostAddress().equals(hostAddress + ":" + remotePort)) {
parentPlatform = null;
}else {
device = null;
}
}
if (device == null && parentPlatform == null) {
// 不存在则回复404
responseAck(evt, Response.NOT_FOUND, "device "+ deviceId +" not found");
logger.warn("[设备未找到 ] {}", deviceId);
if (sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()) != null){
SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new DeviceNotFoundEvent(evt.getDialog()));
sipSubscribe.getErrorSubscribe(callIdHeader.getCallId()).response(eventResult);
};
}else {
ContentTypeHeader header = (ContentTypeHeader)evt.getRequest().getHeader(ContentTypeHeader.NAME);
String contentType = header.getContentType();
String contentSubType = header.getContentSubType();
if ("Application".equals(contentType) && "MANSRTSP".equals(contentSubType)) {
SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, null, null, callIdHeader.getCallId());
String streamId = sendRtpItem.getStreamId();
StreamInfo streamInfo = redisCatchStorage.queryPlayback(null, null, streamId, null);
if (null == streamInfo) {
responseAck(evt, Response.NOT_FOUND, "stream " + streamId + " not found");
return;
}
Device device1 = storager.queryVideoDevice(streamInfo.getDeviceID());
cmder.playbackControlCmd(device1,streamInfo,new String(evt.getRequest().getRawContent()));
}
}
} catch (SipException e) {
logger.warn("SIP 回复错误", e);
} catch (InvalidArgumentException e) {
logger.warn("参数无效", e);
} catch (ParseException e) {
logger.warn("SIP回复时解析异常", e);
}
}
}