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

This commit is contained in:
mk1990 2022-06-22 14:26:46 +08:00
parent e1a4790ed1
commit 615d11145e
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: 2020年5月3日 下午9:16:34 * @date: 2020年5月3日 下午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);
/** /**
* 前端控制包括PTZ指令FI指令预置位指令巡航指令扫描指令和辅助开关指令 * 前端控制包括PTZ指令FI指令预置位指令巡航指令扫描指令和辅助开关指令
* *
* @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);
}
}
}