| | |
| | | |
| | | private Boolean syncChannelOnDeviceOnline = Boolean.FALSE; |
| | | |
| | | private Boolean sipLog = Boolean.FALSE; |
| | | |
| | | private String serverId = "000000"; |
| | | |
| | | private String thirdPartyGBIdReg = "[\\s\\S]*"; |
| | |
| | | public void setSipUseSourceIpAsRemoteAddress(Boolean sipUseSourceIpAsRemoteAddress) { |
| | | this.sipUseSourceIpAsRemoteAddress = sipUseSourceIpAsRemoteAddress; |
| | | } |
| | | |
| | | public Boolean getSipLog() { |
| | | return sipLog; |
| | | } |
| | | |
| | | public void setSipLog(Boolean sipLog) { |
| | | this.sipLog = sipLog; |
| | | } |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.gb28181;
|
| | |
|
| | | import com.genersoft.iot.vmp.conf.SipConfig;
|
| | | import com.genersoft.iot.vmp.conf.UserSetting;
|
| | | import com.genersoft.iot.vmp.gb28181.conf.DefaultProperties;
|
| | | import com.genersoft.iot.vmp.gb28181.transmit.ISIPProcessorObserver;
|
| | | import gov.nist.javax.sip.SipProviderImpl;
|
| | |
| | |
|
| | | @Autowired
|
| | | private ISIPProcessorObserver sipProcessorObserver;
|
| | |
|
| | | @Autowired
|
| | | private UserSetting userSetting;
|
| | |
|
| | | private final Map<String, SipProviderImpl> tcpSipProviderMap = new ConcurrentHashMap<>();
|
| | | private final Map<String, SipProviderImpl> udpSipProviderMap = new ConcurrentHashMap<>();
|
| | |
| | | private void addListeningPoint(String monitorIp, int port){
|
| | | SipStackImpl sipStack;
|
| | | try {
|
| | | sipStack = (SipStackImpl)sipFactory.createSipStack(DefaultProperties.getProperties(monitorIp, false));
|
| | | sipStack = (SipStackImpl)sipFactory.createSipStack(DefaultProperties.getProperties(monitorIp, false, userSetting.getSipLog()));
|
| | | } catch (PeerUnavailableException e) {
|
| | | logger.error("[Sip Server] SIP服务启动失败, 监听地址{}失败,请检查ip是否正确", monitorIp);
|
| | | return;
|
| | |
| | | */ |
| | | public class DefaultProperties { |
| | | |
| | | public static Properties getProperties(String ip, boolean isDebug) { |
| | | public static Properties getProperties(String ip, boolean isDebug, boolean sipLog) { |
| | | Properties properties = new Properties(); |
| | | properties.setProperty("javax.sip.STACK_NAME", "GB28181_SIP"); |
| | | properties.setProperty("javax.sip.IP_ADDRESS", ip); |
| | |
| | | * sip_server_log.log 和 sip_debug_log.log ERROR, INFO, WARNING, OFF, DEBUG, TRACE |
| | | */ |
| | | Logger logger = LoggerFactory.getLogger(AlarmNotifyMessageHandler.class); |
| | | if (logger.isDebugEnabled()) { |
| | | System.out.println("DEBUG"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); |
| | | }else if (logger.isInfoEnabled()) { |
| | | System.out.println("INFO1"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "INFO"); |
| | | }else if (logger.isWarnEnabled()) { |
| | | System.out.println("WARNING"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "WARNING"); |
| | | }else if (logger.isErrorEnabled()) { |
| | | System.out.println("ERROR"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "ERROR"); |
| | | if (sipLog) { |
| | | if (logger.isDebugEnabled()) { |
| | | System.out.println("DEBUG"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "DEBUG"); |
| | | }else if (logger.isInfoEnabled()) { |
| | | System.out.println("INFO1"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "INFO"); |
| | | }else if (logger.isWarnEnabled()) { |
| | | System.out.println("WARNING"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "WARNING"); |
| | | }else if (logger.isErrorEnabled()) { |
| | | System.out.println("ERROR"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "ERROR"); |
| | | }else { |
| | | System.out.println("INFO2"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "INFO"); |
| | | } |
| | | logger.info("[SIP日志]级别为: {}", properties.getProperty("gov.nist.javax.sip.TRACE_LEVEL")); |
| | | }else { |
| | | System.out.println("INFO2"); |
| | | properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "INFO"); |
| | | logger.info("[SIP日志]已关闭"); |
| | | } |
| | | logger.info("[SIP日志]级别为: {}", properties.getProperty("gov.nist.javax.sip.TRACE_LEVEL")); |
| | | |
| | | |
| | | |
| | | return properties; |
| | |
| | | import com.genersoft.iot.vmp.service.bean.InviteTimeOutCallback; |
| | | import com.genersoft.iot.vmp.service.bean.PlayBackCallback; |
| | | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| | | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
| | | import org.springframework.web.context.request.async.DeferredResult; |
| | | |
| | | import javax.sip.InvalidArgumentException; |
| | | import javax.sip.SipException; |
| | |
| | | |
| | | void onPublishHandlerForDownload(InviteStreamInfo inviteStreamInfo, String deviceId, String channelId, String toString); |
| | | |
| | | DeferredResult<WVPResult<StreamInfo>> playBack(String deviceId, String channelId, String startTime, String endTime, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); |
| | | DeferredResult<WVPResult<StreamInfo>> playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo,String deviceId, String channelId, String startTime, String endTime, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); |
| | | void playBack(String deviceId, String channelId, String startTime, String endTime, InviteStreamCallback infoCallBack, PlayBackCallback playBackCallback); |
| | | void playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); |
| | | |
| | | void zlmServerOffline(String mediaServerId); |
| | | |
| | | DeferredResult<WVPResult<StreamInfo>> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); |
| | | DeferredResult<WVPResult<StreamInfo>> download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo,String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); |
| | | void download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback playBackCallback); |
| | | void download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo,String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack); |
| | | |
| | | StreamInfo getDownLoadInfo(String deviceId, String channelId, String stream); |
| | | |
| | |
| | | package com.genersoft.iot.vmp.service.bean; |
| | | |
| | | import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; |
| | | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
| | | public interface PlayBackCallback<T> { |
| | | |
| | | public interface PlayBackCallback { |
| | | |
| | | void call(PlayBackResult<RequestMessage> msg); |
| | | void call(PlayBackResult<T> msg); |
| | | |
| | | } |
| | |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.ObjectUtils; |
| | | import org.springframework.web.context.request.async.DeferredResult; |
| | | |
| | | import javax.sip.InvalidArgumentException; |
| | | import javax.sip.ResponseEvent; |
| | |
| | | } |
| | | } |
| | | |
| | | private void onPublishHandlerForPlayback(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, String uuid) { |
| | | RequestMessage msg = new RequestMessage(); |
| | | msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId); |
| | | if (!ObjectUtils.isEmpty(uuid)) { |
| | | msg.setId(uuid); |
| | | } |
| | | StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId); |
| | | private void onPublishHandlerForPlayback(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, PlayBackCallback playBackCallback) { |
| | | |
| | | StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId); |
| | | PlayBackResult<StreamInfo> playBackResult = new PlayBackResult<>(); |
| | | if (streamInfo != null) { |
| | | DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId); |
| | | if (deviceChannel != null) { |
| | |
| | | } |
| | | redisCatchStorage.startPlay(streamInfo); |
| | | |
| | | WVPResult wvpResult = new WVPResult(); |
| | | wvpResult.setCode(ErrorCode.SUCCESS.getCode()); |
| | | wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); |
| | | wvpResult.setData(streamInfo); |
| | | msg.setData(wvpResult); |
| | | |
| | | resultHolder.invokeAllResult(msg); |
| | | playBackResult.setCode(ErrorCode.SUCCESS.getCode()); |
| | | playBackResult.setMsg(ErrorCode.SUCCESS.getMsg()); |
| | | playBackResult.setData(streamInfo); |
| | | playBackCallback.call(playBackResult); |
| | | } else { |
| | | logger.warn("录像回放调用失败!"); |
| | | msg.setData(WVPResult.fail(ErrorCode.ERROR100.getCode(), "录像回放调用失败!")); |
| | | resultHolder.invokeAllResult(msg); |
| | | playBackResult.setCode(ErrorCode.ERROR100.getCode()); |
| | | playBackResult.setMsg("录像回放调用失败!"); |
| | | playBackCallback.call(playBackResult); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | public DeferredResult<WVPResult<StreamInfo>> playBack(String deviceId, String channelId, String startTime, |
| | | public void playBack(String deviceId, String channelId, String startTime, |
| | | String endTime, InviteStreamCallback inviteStreamCallback, |
| | | PlayBackCallback callback) { |
| | | Device device = storager.queryVideoDevice(deviceId); |
| | | if (device == null) { |
| | | return null; |
| | | return; |
| | | } |
| | | MediaServerItem newMediaServerItem = getNewMediaServerItem(device); |
| | | SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, device.isSsrcCheck(), true); |
| | | |
| | | return playBack(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, inviteStreamCallback, callback); |
| | | playBack(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, inviteStreamCallback, callback); |
| | | } |
| | | |
| | | @Override |
| | | public DeferredResult<WVPResult<StreamInfo>> playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, |
| | | public void playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, |
| | | String deviceId, String channelId, String startTime, |
| | | String endTime, InviteStreamCallback infoCallBack, |
| | | PlayBackCallback playBackCallback) { |
| | | if (mediaServerItem == null || ssrcInfo == null) { |
| | | return null; |
| | | return; |
| | | } |
| | | String uuid = UUID.randomUUID().toString(); |
| | | String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId; |
| | | |
| | | Device device = storager.queryVideoDevice(deviceId); |
| | | if (device == null) { |
| | | throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备: " + deviceId + "不存在"); |
| | | } |
| | | DeferredResult<WVPResult<StreamInfo>> result = new DeferredResult<>(30000L); |
| | | resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId, uuid, result); |
| | | RequestMessage requestMessage = new RequestMessage(); |
| | | requestMessage.setId(uuid); |
| | | requestMessage.setKey(key); |
| | | PlayBackResult<RequestMessage> playBackResult = new PlayBackResult<>(); |
| | | |
| | | PlayBackResult<StreamInfo> playBackResult = new PlayBackResult<>(); |
| | | String playBackTimeOutTaskKey = UUID.randomUUID().toString(); |
| | | dynamicTask.startDelay(playBackTimeOutTaskKey, () -> { |
| | | logger.warn(String.format("设备回放超时,deviceId:%s ,channelId:%s", deviceId, channelId)); |
| | | playBackResult.setCode(ErrorCode.ERROR100.getCode()); |
| | | playBackResult.setMsg("回放超时"); |
| | | playBackResult.setData(requestMessage); |
| | | |
| | | try { |
| | | cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null); |
| | |
| | | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| | | streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); |
| | | } |
| | | |
| | | // 回复之前所有的点播请求 |
| | | playBackCallback.call(playBackResult); |
| | | result.setResult(WVPResult.fail(ErrorCode.ERROR100.getCode(), "回放超时")); |
| | | resultHolder.exist(DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId, uuid); |
| | | }, userSetting.getPlayTimeout()); |
| | | |
| | | SipSubscribe.Event errorEvent = event -> { |
| | | dynamicTask.stop(playBackTimeOutTaskKey); |
| | | requestMessage.setData(WVPResult.fail(ErrorCode.ERROR100.getCode(), String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg))); |
| | | playBackResult.setCode(ErrorCode.ERROR100.getCode()); |
| | | playBackResult.setMsg(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg)); |
| | | playBackResult.setData(requestMessage); |
| | | playBackResult.setEvent(event); |
| | | playBackCallback.call(playBackResult); |
| | | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| | |
| | | return; |
| | | } |
| | | redisCatchStorage.startPlayback(streamInfo, inviteStreamInfo.getCallId()); |
| | | WVPResult<StreamInfo> success = WVPResult.success(streamInfo); |
| | | requestMessage.setData(success); |
| | | playBackResult.setCode(ErrorCode.SUCCESS.getCode()); |
| | | playBackResult.setMsg(ErrorCode.SUCCESS.getMsg()); |
| | | playBackResult.setData(requestMessage); |
| | | playBackResult.setData(streamInfo); |
| | | playBackResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); |
| | | playBackResult.setResponse(inviteStreamInfo.getResponse()); |
| | | playBackCallback.call(playBackResult); |
| | |
| | | logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString()); |
| | | dynamicTask.stop(playBackTimeOutTaskKey); |
| | | // hook响应 |
| | | onPublishHandlerForPlayback(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid); |
| | | onPublishHandlerForPlayback(mediaServerItemInUse, response, device.getDeviceId(), channelId, playBackCallback); |
| | | hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream())); |
| | | }); |
| | | } |
| | |
| | | eventResult.msg = "命令发送失败"; |
| | | errorEvent.response(eventResult); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | | public DeferredResult<WVPResult<StreamInfo>> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { |
| | | public void download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { |
| | | Device device = storager.queryVideoDevice(deviceId); |
| | | if (device == null) { |
| | | return null; |
| | | return; |
| | | } |
| | | MediaServerItem newMediaServerItem = getNewMediaServerItem(device); |
| | | SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, device.isSsrcCheck(), true); |
| | | |
| | | return download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed, infoCallBack, hookCallBack); |
| | | download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed, infoCallBack, hookCallBack); |
| | | } |
| | | |
| | | @Override |
| | | public DeferredResult<WVPResult<StreamInfo>> download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { |
| | | public void download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { |
| | | if (mediaServerItem == null || ssrcInfo == null) { |
| | | return null; |
| | | return; |
| | | } |
| | | String uuid = UUID.randomUUID().toString(); |
| | | String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId; |
| | | DeferredResult<WVPResult<StreamInfo>> result = new DeferredResult<>(30000L); |
| | | |
| | | Device device = storager.queryVideoDevice(deviceId); |
| | | if (device == null) { |
| | | throw new ControllerException(ErrorCode.ERROR400.getCode(), "设备:" + deviceId + "不存在"); |
| | | } |
| | | |
| | | resultHolder.put(key, uuid, result); |
| | | RequestMessage requestMessage = new RequestMessage(); |
| | | requestMessage.setId(uuid); |
| | | requestMessage.setKey(key); |
| | | WVPResult<StreamInfo> wvpResult = new WVPResult<>(); |
| | | requestMessage.setData(wvpResult); |
| | | PlayBackResult<RequestMessage> downloadResult = new PlayBackResult<>(); |
| | | downloadResult.setData(requestMessage); |
| | | PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>(); |
| | | |
| | | String downLoadTimeOutTaskKey = UUID.randomUUID().toString(); |
| | | dynamicTask.startDelay(downLoadTimeOutTaskKey, () -> { |
| | | logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId)); |
| | | wvpResult.setCode(ErrorCode.ERROR100.getCode()); |
| | | wvpResult.setMsg("录像下载请求超时"); |
| | | downloadResult.setCode(ErrorCode.ERROR100.getCode()); |
| | | downloadResult.setMsg("录像下载请求超时"); |
| | | hookCallBack.call(downloadResult); |
| | |
| | | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| | | streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); |
| | | } |
| | | // 回复之前所有的点播请求 |
| | | hookCallBack.call(downloadResult); |
| | | }, userSetting.getPlayTimeout()); |
| | | |
| | | SipSubscribe.Event errorEvent = event -> { |
| | | dynamicTask.stop(downLoadTimeOutTaskKey); |
| | | downloadResult.setCode(ErrorCode.ERROR100.getCode()); |
| | | downloadResult.setMsg(String.format("录像下载失败, 错误码: %s, %s", event.statusCode, event.msg)); |
| | | wvpResult.setCode(ErrorCode.ERROR100.getCode()); |
| | | wvpResult.setMsg(String.format("录像下载失败, 错误码: %s, %s", event.statusCode, event.msg)); |
| | | downloadResult.setEvent(event); |
| | | hookCallBack.call(downloadResult); |
| | | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| | |
| | | streamInfo.setStartTime(startTime); |
| | | streamInfo.setEndTime(endTime); |
| | | redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId()); |
| | | wvpResult.setCode(ErrorCode.SUCCESS.getCode()); |
| | | wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); |
| | | wvpResult.setData(streamInfo); |
| | | downloadResult.setCode(ErrorCode.SUCCESS.getCode()); |
| | | downloadResult.setMsg(ErrorCode.SUCCESS.getMsg()); |
| | | downloadResult.setData(streamInfo); |
| | | downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); |
| | | downloadResult.setResponse(inviteStreamInfo.getResponse()); |
| | | hookCallBack.call(downloadResult); |
| | |
| | | eventResult.msg = "命令发送失败"; |
| | | errorEvent.response(eventResult); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | |
| | | package com.genersoft.iot.vmp.vmanager.bean; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | |
| | | /** |
| | | * 全局错误码 |
| | | */ |
| | |
| | | SUCCESS(0, "成功"), |
| | | ERROR100(100, "失败"), |
| | | ERROR400(400, "参数不全或者错误"), |
| | | ERROR404(404, "资源未找到"), |
| | | ERROR403(403, "无权限操作"), |
| | | ERROR401(401, "请登录后重新请求"), |
| | | ERROR500(500, "系统异常"); |
| | |
| | | private String mediaServerId; |
| | | private Object tracks; |
| | | |
| | | private String startTime; |
| | | |
| | | private String endTime; |
| | | |
| | | private double progress; |
| | | |
| | | public StreamContent(StreamInfo streamInfo) { |
| | | if (streamInfo == null) { |
| | | return; |
| | |
| | | |
| | | this.mediaServerId = streamInfo.getMediaServerId(); |
| | | this.tracks = streamInfo.getTracks(); |
| | | this.startTime = streamInfo.getStartTime(); |
| | | this.endTime = streamInfo.getEndTime(); |
| | | this.progress = streamInfo.getProgress(); |
| | | } |
| | | |
| | | public String getApp() { |
| | |
| | | public void setTracks(Object tracks) { |
| | | this.tracks = tracks; |
| | | } |
| | | |
| | | public String getStartTime() { |
| | | return startTime; |
| | | } |
| | | |
| | | public void setStartTime(String startTime) { |
| | | this.startTime = startTime; |
| | | } |
| | | |
| | | public String getEndTime() { |
| | | return endTime; |
| | | } |
| | | |
| | | public void setEndTime(String endTime) { |
| | | this.endTime = endTime; |
| | | } |
| | | |
| | | public double getProgress() { |
| | | return progress; |
| | | } |
| | | |
| | | public void setProgress(double progress) { |
| | | this.progress = progress; |
| | | } |
| | | } |
| | |
| | | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| | | import com.genersoft.iot.vmp.service.IPlayService; |
| | | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| | | import com.genersoft.iot.vmp.vmanager.bean.StreamContent; |
| | | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | |
| | | import javax.sip.InvalidArgumentException; |
| | | import javax.sip.SipException; |
| | | import java.text.ParseException; |
| | | import java.util.UUID; |
| | | |
| | | /** |
| | | * @author lin |
| | |
| | | @Parameter(name = "startTime", description = "开始时间", required = true) |
| | | @Parameter(name = "endTime", description = "结束时间", required = true) |
| | | @GetMapping("/start/{deviceId}/{channelId}") |
| | | public DeferredResult<WVPResult<StreamInfo>> play(@PathVariable String deviceId, @PathVariable String channelId, |
| | | String startTime, String endTime) { |
| | | public DeferredResult<WVPResult<StreamContent>> play(@PathVariable String deviceId, @PathVariable String channelId, |
| | | String startTime, String endTime) { |
| | | |
| | | if (logger.isDebugEnabled()) { |
| | | logger.debug(String.format("设备回放 API调用,deviceId:%s ,channelId:%s", deviceId, channelId)); |
| | | } |
| | | |
| | | String uuid = UUID.randomUUID().toString(); |
| | | String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId; |
| | | DeferredResult<WVPResult<StreamContent>> result = new DeferredResult<>(30000L); |
| | | resultHolder.put(key, uuid, result); |
| | | |
| | | return playService.playBack(deviceId, channelId, startTime, endTime, null, |
| | | WVPResult<StreamContent> wvpResult = new WVPResult<>(); |
| | | |
| | | RequestMessage msg = new RequestMessage(); |
| | | msg.setKey(key); |
| | | msg.setId(uuid); |
| | | |
| | | playService.playBack(deviceId, channelId, startTime, endTime, null, |
| | | playBackResult->{ |
| | | if (playBackResult.getCode() != ErrorCode.SUCCESS.getCode()) { |
| | | RequestMessage data = playBackResult.getData(); |
| | | data.setData(WVPResult.fail(playBackResult.getCode(), playBackResult.getMsg())); |
| | | resultHolder.invokeResult(data); |
| | | }else { |
| | | resultHolder.invokeResult(playBackResult.getData()); |
| | | wvpResult.setCode(playBackResult.getCode()); |
| | | wvpResult.setMsg(playBackResult.getMsg()); |
| | | if (playBackResult.getCode() == ErrorCode.SUCCESS.getCode()) { |
| | | StreamInfo streamInfo = (StreamInfo)playBackResult.getData(); |
| | | wvpResult.setData(new StreamContent(streamInfo)); |
| | | } |
| | | msg.setData(wvpResult); |
| | | resultHolder.invokeResult(msg); |
| | | }); |
| | | |
| | | return result; |
| | | } |
| | | |
| | | |
| | |
| | | import com.genersoft.iot.vmp.service.IPlayService; |
| | | import com.genersoft.iot.vmp.utils.DateUtil; |
| | | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| | | import com.genersoft.iot.vmp.vmanager.bean.StreamContent; |
| | | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
| | | |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | |
| | | @Parameter(name = "endTime", description = "结束时间", required = true) |
| | | @Parameter(name = "downloadSpeed", description = "下载倍速", required = true) |
| | | @GetMapping("/download/start/{deviceId}/{channelId}") |
| | | public DeferredResult<WVPResult<StreamInfo>> download(@PathVariable String deviceId, @PathVariable String channelId, |
| | | public DeferredResult<WVPResult<StreamContent>> download(@PathVariable String deviceId, @PathVariable String channelId, |
| | | String startTime, String endTime, String downloadSpeed) { |
| | | |
| | | if (logger.isDebugEnabled()) { |
| | | logger.debug(String.format("历史媒体下载 API调用,deviceId:%s,channelId:%s,downloadSpeed:%s", deviceId, channelId, downloadSpeed)); |
| | | } |
| | | |
| | | DeferredResult<WVPResult<StreamInfo>> result = playService.download(deviceId, channelId, startTime, endTime, Integer.parseInt(downloadSpeed), null, hookCallBack->{ |
| | | resultHolder.invokeResult(hookCallBack.getData()); |
| | | String uuid = UUID.randomUUID().toString(); |
| | | String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId; |
| | | DeferredResult<WVPResult<StreamContent>> result = new DeferredResult<>(30000L); |
| | | resultHolder.put(key, uuid, result); |
| | | RequestMessage msg = new RequestMessage(); |
| | | msg.setId(uuid); |
| | | msg.setKey(key); |
| | | |
| | | WVPResult<StreamContent> wvpResult = new WVPResult<>(); |
| | | |
| | | playService.download(deviceId, channelId, startTime, endTime, Integer.parseInt(downloadSpeed), null, playBackResult->{ |
| | | |
| | | wvpResult.setCode(playBackResult.getCode()); |
| | | wvpResult.setMsg(playBackResult.getMsg()); |
| | | if (playBackResult.getCode() == ErrorCode.SUCCESS.getCode()) { |
| | | StreamInfo streamInfo = (StreamInfo)playBackResult.getData(); |
| | | wvpResult.setData(new StreamContent(streamInfo)); |
| | | } |
| | | msg.setData(wvpResult); |
| | | resultHolder.invokeResult(msg); |
| | | }); |
| | | |
| | | return result; |
| | |
| | | @Parameter(name = "channelId", description = "通道国标编号", required = true) |
| | | @Parameter(name = "stream", description = "流ID", required = true) |
| | | @GetMapping("/download/progress/{deviceId}/{channelId}/{stream}") |
| | | public StreamInfo getProgress(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) { |
| | | return playService.getDownLoadInfo(deviceId, channelId, stream); |
| | | public StreamContent getProgress(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) { |
| | | StreamInfo downLoadInfo = playService.getDownLoadInfo(deviceId, channelId, stream); |
| | | if (downLoadInfo == null) { |
| | | throw new ControllerException(ErrorCode.ERROR404); |
| | | } |
| | | return new StreamContent(downLoadInfo); |
| | | } |
| | | } |
| | |
| | | sync-channel-on-device-online: false |
| | | # 是否使用设备来源Ip作为回复IP, 不设置则为 false |
| | | sip-use-source-ip-as-remote-address: false |
| | | # 是否开启sip日志 |
| | | sip-log: true |
| | | |
| | | # 关闭在线文档(生产环境建议关闭) |
| | | springdoc: |