更新 gb28181-docking-platform 依赖版本
This commit is contained in:
parent
e36befe7ef
commit
e6819b2a15
@ -2,7 +2,9 @@ package cn.skcks.docking.gb28181.wvp.api.gb28181;
|
||||
|
||||
import cn.skcks.docking.gb28181.annotation.web.JsonMapping;
|
||||
import cn.skcks.docking.gb28181.annotation.web.methods.GetJson;
|
||||
import cn.skcks.docking.gb28181.annotation.web.methods.PostJson;
|
||||
import cn.skcks.docking.gb28181.common.json.JsonResponse;
|
||||
import cn.skcks.docking.gb28181.core.sip.message.processor.message.types.recordinfo.query.dto.RecordInfoRequestDTO;
|
||||
import cn.skcks.docking.gb28181.wvp.config.SwaggerConfig;
|
||||
import cn.skcks.docking.gb28181.wvp.service.catalog.CatalogService;
|
||||
import cn.skcks.docking.gb28181.wvp.service.device.control.DeviceControlService;
|
||||
@ -49,4 +51,9 @@ public class Gb28181Controller {
|
||||
deviceControlService.sendRecordControl(deviceCode, cmd);
|
||||
return JsonResponse.success(null);
|
||||
}
|
||||
|
||||
@PostJson("/recordInfo")
|
||||
public JsonResponse<Void> recordInfo(RecordInfoRequestDTO dto){
|
||||
return JsonResponse.success(null);
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,8 @@
|
||||
package cn.skcks.docking.gb28181.wvp.config;
|
||||
|
||||
import cn.skcks.docking.gb28181.config.sip.SipConfig;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.StreamMode;
|
||||
import cn.skcks.docking.gb28181.sdp.media.MediaStreamMode;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
@ -30,7 +31,7 @@ public class ProxySipConfig {
|
||||
|
||||
private String transport = ListeningPoint.UDP;
|
||||
|
||||
private StreamMode streamMode = StreamMode.TCP_PASSIVE;
|
||||
private MediaStreamMode streamMode = MediaStreamMode.TCP_PASSIVE;
|
||||
|
||||
/**
|
||||
* 某些特殊情况下 使用 视频回放点播 代替 下载
|
||||
|
@ -12,9 +12,6 @@ import cn.skcks.docking.gb28181.common.json.JsonUtils;
|
||||
import cn.skcks.docking.gb28181.common.redis.RedisUtil;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.cache.CacheUtil;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.constant.GB28181Constant;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.GB28181Description;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.MediaSdpHelper;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.StreamMode;
|
||||
import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor;
|
||||
import cn.skcks.docking.gb28181.core.sip.message.subscribe.GenericSubscribe;
|
||||
import cn.skcks.docking.gb28181.core.sip.utils.SipUtil;
|
||||
@ -25,6 +22,9 @@ import cn.skcks.docking.gb28181.media.dto.rtp.OpenRtpServer;
|
||||
import cn.skcks.docking.gb28181.media.dto.rtp.OpenRtpServerResp;
|
||||
import cn.skcks.docking.gb28181.media.dto.status.ResponseStatus;
|
||||
import cn.skcks.docking.gb28181.media.proxy.ZlmMediaService;
|
||||
import cn.skcks.docking.gb28181.sdp.GB28181Description;
|
||||
import cn.skcks.docking.gb28181.sdp.GB28181SDPBuilder;
|
||||
import cn.skcks.docking.gb28181.sdp.media.MediaStreamMode;
|
||||
import cn.skcks.docking.gb28181.service.ssrc.SsrcService;
|
||||
import cn.skcks.docking.gb28181.wvp.config.ProxySipConfig;
|
||||
import cn.skcks.docking.gb28181.wvp.config.WvpProxyConfig;
|
||||
@ -244,7 +244,7 @@ public class Gb28181DownloadService {
|
||||
return result;
|
||||
}
|
||||
|
||||
String existUrl = RedisUtil.StringOps.get(CacheUtil.getKey(MediaSdpHelper.Action.PLAY.getAction(), deviceCode));
|
||||
String existUrl = RedisUtil.StringOps.get(CacheUtil.getKey(GB28181SDPBuilder.Action.PLAY.getAction(), deviceCode));
|
||||
if(Optional.ofNullable(existUrl).isPresent()){
|
||||
result.setResult(JsonResponse.success(existUrl));
|
||||
return result;
|
||||
@ -259,7 +259,7 @@ public class Gb28181DownloadService {
|
||||
log.info("获取媒体信息 {}", videoInfo);
|
||||
|
||||
// 原始链接转换为前端可用的链接
|
||||
RedisUtil.StringOps.set(CacheUtil.getKey(MediaSdpHelper.Action.PLAY.getAction(), videoInfo.getCallId()), JsonUtils.toJson(videoInfo));
|
||||
RedisUtil.StringOps.set(CacheUtil.getKey(GB28181SDPBuilder.Action.PLAY.getAction(), videoInfo.getCallId()), JsonUtils.toJson(videoInfo));
|
||||
String url = StringUtils.isNotBlank(proxySipConfig.getProxyMediaUrl()) ?
|
||||
StringUtils.replace(videoInfo.getUrl(), zlmMediaConfig.getUrl(), proxySipConfig.getProxyMediaUrl()):
|
||||
videoInfo.getUrl();
|
||||
@ -359,9 +359,9 @@ public class Gb28181DownloadService {
|
||||
WvpProxyDevice device = deviceByGbDeviceIdAndChannel.get();
|
||||
WvpProxyDocking docking = deviceByGbDeviceId.get();
|
||||
|
||||
String streamId = MediaSdpHelper.getStreamId(gbDeviceId, channel, IdUtil.getSnowflakeNextIdStr());
|
||||
int isTcp = proxySipConfig.getStreamMode() == StreamMode.UDP ? 0 : 1;
|
||||
StreamMode streamMode = proxySipConfig.getStreamMode();
|
||||
String streamId = GB28181SDPBuilder.getStreamId(gbDeviceId, channel, IdUtil.getSnowflakeNextIdStr());
|
||||
int isTcp = proxySipConfig.getStreamMode() == MediaStreamMode.UDP ? 0 : 1;
|
||||
MediaStreamMode streamMode = proxySipConfig.getStreamMode();
|
||||
String ip = zlmMediaConfig.getIp();
|
||||
int port = openRtpServer(streamId, isTcp);
|
||||
if(port <= 0){
|
||||
@ -370,7 +370,7 @@ public class Gb28181DownloadService {
|
||||
return result;
|
||||
}
|
||||
String ssrc = ssrcService.getPlaySsrc();
|
||||
GB28181Description gb28181Description = MediaSdpHelper.play(gbDeviceId, channel, Connection.IP4, ip, port, ssrc, streamMode);
|
||||
GB28181Description gb28181Description = GB28181SDPBuilder.Receiver.play(gbDeviceId, channel, Connection.IP4, ip, port, ssrc, streamMode);
|
||||
sender.sendRequest(inviteRequest(docking, device, gb28181Description, ssrc, streamId, result));
|
||||
return result;
|
||||
}
|
||||
@ -440,9 +440,9 @@ public class Gb28181DownloadService {
|
||||
ZoneId zoneId = ZoneId.of(GB28181Constant.TIME_ZONE);
|
||||
long start = LocalDateTimeUtil.of(startTime.toInstant(), zoneId).atZone(zoneId).toEpochSecond();
|
||||
long end = LocalDateTimeUtil.of(endTime.toInstant(), zoneId).atZone(zoneId).toEpochSecond();
|
||||
String streamId = MediaSdpHelper.getStreamId(gbDeviceId, channel, String.valueOf(start), String.valueOf(end), IdUtil.getSnowflakeNextIdStr());
|
||||
int isTcp = proxySipConfig.getStreamMode() == StreamMode.UDP ? 0 : 1;
|
||||
StreamMode streamMode = proxySipConfig.getStreamMode();
|
||||
String streamId = GB28181SDPBuilder.getStreamId(gbDeviceId, channel, String.valueOf(start), String.valueOf(end), IdUtil.getSnowflakeNextIdStr());
|
||||
int isTcp = proxySipConfig.getStreamMode() == MediaStreamMode.UDP ? 0 : 1;
|
||||
MediaStreamMode streamMode = proxySipConfig.getStreamMode();
|
||||
String ip = zlmMediaConfig.getIp();
|
||||
int port = openRtpServer(streamId, isTcp);
|
||||
if(port <= 0){
|
||||
@ -455,15 +455,15 @@ public class Gb28181DownloadService {
|
||||
timeField.setStartTime(start);
|
||||
timeField.setStopTime(end);
|
||||
TimeDescription timeDescription = SdpFactory.getInstance().createTimeDescription(timeField);
|
||||
MediaSdpHelper.Action action = MediaSdpHelper.Action.DOWNLOAD;
|
||||
GB28181SDPBuilder.Action action = GB28181SDPBuilder.Action.DOWNLOAD;
|
||||
if(proxySipConfig.isUsePlaybackToDownload()){
|
||||
action = MediaSdpHelper.Action.PLAY_BACK;
|
||||
action = GB28181SDPBuilder.Action.PLAY_BACK;
|
||||
}
|
||||
GB28181Description gb28181Description = MediaSdpHelper.build(action, gbDeviceId, channel, Connection.IP4, ip, port, ssrc, streamMode, timeDescription);
|
||||
GB28181Description gb28181Description = GB28181SDPBuilder.Receiver.build(action, gbDeviceId, channel, Connection.IP4, ip, port, ssrc, streamMode, timeDescription);
|
||||
gb28181Description.setSessionName(SdpFactory.getInstance().createSessionName(action.getAction()));
|
||||
gb28181Description.setTimeDescriptions(new Vector<>(){{add(timeDescription);}});
|
||||
MediaDescriptionImpl media = (MediaDescriptionImpl) gb28181Description.getMediaDescriptions(true).get(0);
|
||||
if(proxySipConfig.getStreamMode() != StreamMode.UDP){
|
||||
if(proxySipConfig.getStreamMode() != MediaStreamMode.UDP){
|
||||
media.getMedia().setProtocol("RTP/AVP/TCP");
|
||||
}
|
||||
if(!proxySipConfig.isUsePlaybackToDownload()){
|
||||
@ -477,7 +477,7 @@ public class Gb28181DownloadService {
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
public SipSender.SendRequest inviteRequest(WvpProxyDocking docking, WvpProxyDevice device, GB28181Description description, MediaSdpHelper.Action action, String ssrc, String streamId, CompletableFuture<VideoInfo> result, long time) {
|
||||
public SipSender.SendRequest inviteRequest(WvpProxyDocking docking, WvpProxyDevice device, GB28181Description description, GB28181SDPBuilder.Action action, String ssrc, String streamId, CompletableFuture<VideoInfo> result, long time) {
|
||||
String cacheKey = CacheUtil.getKey(docking.getGbDeviceId(), device.getGbDeviceChannelId());
|
||||
String existCallId = RedisUtil.StringOps.get(cacheKey);
|
||||
|
||||
@ -581,7 +581,7 @@ public class Gb28181DownloadService {
|
||||
String ip = request.getLocalAddress().getHostAddress();
|
||||
if(time <= 0) {
|
||||
String callId = request.getCallId().getCallId();
|
||||
String infoKey = CacheUtil.getKey(MediaSdpHelper.Action.PLAY.getAction(), callId);
|
||||
String infoKey = CacheUtil.getKey(GB28181SDPBuilder.Action.PLAY.getAction(), callId);
|
||||
VideoInfo parse = JsonUtils.parse(RedisUtil.StringOps.get(infoKey), VideoInfo.class);
|
||||
Optional.ofNullable(parse).ifPresent((info)->{
|
||||
if(info.getCallId().equalsIgnoreCase(callId)){
|
||||
|
@ -3,10 +3,11 @@ package cn.skcks.docking.gb28181.wvp.service.gb28181;
|
||||
import cn.skcks.docking.gb28181.common.json.JsonUtils;
|
||||
import cn.skcks.docking.gb28181.common.redis.RedisUtil;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.cache.CacheUtil;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.MediaSdpHelper;
|
||||
|
||||
import cn.skcks.docking.gb28181.core.sip.utils.SipUtil;
|
||||
import cn.skcks.docking.gb28181.media.dto.rtp.CloseRtpServer;
|
||||
import cn.skcks.docking.gb28181.media.proxy.ZlmMediaService;
|
||||
import cn.skcks.docking.gb28181.sdp.GB28181SDPBuilder;
|
||||
import cn.skcks.docking.gb28181.wvp.orm.mybatis.dynamic.model.WvpProxyDevice;
|
||||
import cn.skcks.docking.gb28181.wvp.orm.mybatis.dynamic.model.WvpProxyDocking;
|
||||
import cn.skcks.docking.gb28181.wvp.service.device.DeviceService;
|
||||
@ -36,7 +37,7 @@ public class RealtimeManager {
|
||||
}
|
||||
|
||||
public void addPlaying(String deviceCode, Gb28181DownloadService.VideoInfo videoInfo) {
|
||||
RedisUtil.StringOps.set(CacheUtil.getKey(MediaSdpHelper.Action.PLAY.getAction(), deviceCode), videoInfo.getUrl());
|
||||
RedisUtil.StringOps.set(CacheUtil.getKey(GB28181SDPBuilder.Action.PLAY.getAction(), deviceCode), videoInfo.getUrl());
|
||||
|
||||
ScheduledFuture<?> schedule = playing.get(deviceCode);
|
||||
if(schedule != null){
|
||||
@ -80,7 +81,7 @@ public class RealtimeManager {
|
||||
*/
|
||||
private void close(String deviceCode, Gb28181DownloadService.VideoInfo videoInfo){
|
||||
RedisUtil.KeyOps.delete(getRealtimeKey(deviceCode));
|
||||
RedisUtil.KeyOps.delete(CacheUtil.getKey(MediaSdpHelper.Action.PLAY.getAction(), deviceCode));
|
||||
RedisUtil.KeyOps.delete(CacheUtil.getKey(GB28181SDPBuilder.Action.PLAY.getAction(), deviceCode));
|
||||
|
||||
WvpProxyDevice device = deviceService.getDeviceByDeviceCode(deviceCode).orElse(null);
|
||||
if(device == null){
|
||||
|
@ -0,0 +1,28 @@
|
||||
package cn.skcks.docking.gb28181.wvp.service.record;
|
||||
|
||||
import cn.skcks.docking.gb28181.core.sip.message.processor.message.types.recordinfo.query.dto.RecordInfoRequestDTO;
|
||||
import cn.skcks.docking.gb28181.wvp.service.device.DeviceService;
|
||||
import cn.skcks.docking.gb28181.wvp.service.docking.DockingService;
|
||||
import cn.skcks.docking.gb28181.wvp.sip.sender.SipSender;
|
||||
import cn.skcks.docking.gb28181.wvp.sip.subscribe.SipSubscribe;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class RecordInfoService {
|
||||
private final SipSender sipSender;
|
||||
private final SipSubscribe sipSubscribe;
|
||||
private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
|
||||
private final DockingService dockingService;
|
||||
private final DeviceService deviceService;
|
||||
|
||||
public void requestRecordInfo(String deviceCode, RecordInfoRequestDTO dto){
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package cn.skcks.docking.gb28181.wvp.service.record.dto;
|
||||
|
||||
import cn.hutool.core.date.DatePattern;
|
||||
import cn.skcks.docking.gb28181.constant.GB28181Constant;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.constant.CmdType;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public class RecordInfoDTO {
|
||||
private String cmdType = CmdType.RECORD_INFO;
|
||||
|
||||
/**
|
||||
* 命令序列号(必选)
|
||||
*/
|
||||
private String sn;
|
||||
|
||||
/**
|
||||
* 目标设备的设备编码(必选)
|
||||
*/
|
||||
private String deviceId;
|
||||
|
||||
@DateTimeFormat(pattern= DatePattern.NORM_DATETIME_PATTERN)
|
||||
@JsonFormat(pattern = GB28181Constant.DATETIME_FORMAT, timezone = GB28181Constant.TIME_ZONE)
|
||||
private Date startTime;
|
||||
|
||||
@DateTimeFormat(pattern= DatePattern.NORM_DATETIME_PATTERN)
|
||||
@JsonFormat(pattern = GB28181Constant.DATETIME_FORMAT, timezone = GB28181Constant.TIME_ZONE)
|
||||
private Date endTime;
|
||||
|
||||
private String filePath;
|
||||
|
||||
private String address;
|
||||
|
||||
|
||||
private Integer Secrecy = 0;
|
||||
|
||||
|
||||
private String type = "all";
|
||||
|
||||
|
||||
private String recorderId;
|
||||
|
||||
private Integer IndistinctQuery;
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package cn.skcks.docking.gb28181.wvp.service.record.dto;
|
||||
|
||||
import cn.skcks.docking.gb28181.core.sip.message.processor.message.types.recordinfo.query.dto.RecordInfoRequestDTO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
@Mapper
|
||||
public interface RecordInfoDTOConvertor {
|
||||
RecordInfoDTOConvertor INSTANCE = Mappers.getMapper(RecordInfoDTOConvertor.class);
|
||||
|
||||
RecordInfoDTO convert(RecordInfoRequestDTO dto);
|
||||
|
||||
RecordInfoRequestDTO convert(RecordInfoDTO dto);
|
||||
}
|
@ -2,10 +2,10 @@ package cn.skcks.docking.gb28181.wvp.sip.message.bye.request.request;
|
||||
|
||||
import cn.skcks.docking.gb28181.common.redis.RedisUtil;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.cache.CacheUtil;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.MediaSdpHelper;
|
||||
import cn.skcks.docking.gb28181.core.sip.listener.SipListener;
|
||||
import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor;
|
||||
import cn.skcks.docking.gb28181.core.sip.message.subscribe.GenericSubscribe;
|
||||
import cn.skcks.docking.gb28181.sdp.GB28181SDPBuilder;
|
||||
import cn.skcks.docking.gb28181.wvp.sip.response.SipResponseBuilder;
|
||||
import cn.skcks.docking.gb28181.wvp.sip.sender.SipSender;
|
||||
import cn.skcks.docking.gb28181.wvp.sip.subscribe.SipSubscribe;
|
||||
@ -50,7 +50,7 @@ public class ByeRequestProcessor implements MessageProcessor {
|
||||
.ifPresentOrElse(
|
||||
publisher -> publisher.submit(request),
|
||||
() -> {
|
||||
RedisUtil.KeyOps.delete(CacheUtil.getKey(MediaSdpHelper.Action.PLAY.getAction(), callId));
|
||||
RedisUtil.KeyOps.delete(CacheUtil.getKey(GB28181SDPBuilder.Action.PLAY.getAction(), callId));
|
||||
sender.sendResponse(ip, transport, ((provider, ip1, port) ->
|
||||
SipResponseBuilder.response(request, Response.OK, "OK")));
|
||||
});
|
||||
|
@ -1,9 +1,9 @@
|
||||
package cn.skcks.docking.gb28181.wvp.sip.response;
|
||||
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.constant.GB28181Constant;
|
||||
import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.GB28181Description;
|
||||
import cn.skcks.docking.gb28181.core.sip.message.MessageHelper;
|
||||
import cn.skcks.docking.gb28181.core.sip.utils.SipUtil;
|
||||
import cn.skcks.docking.gb28181.sdp.GB28181Description;
|
||||
import gov.nist.javax.sip.message.MessageFactoryImpl;
|
||||
import gov.nist.javax.sip.message.SIPRequest;
|
||||
import gov.nist.javax.sip.message.SIPResponse;
|
||||
|
@ -36,4 +36,9 @@ public class ByeSubscribe implements GenericSubscribe<SIPRequest> {
|
||||
public void delPublisher(String key) {
|
||||
Helper.delPublisher(publishers, key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void complete(String key) {
|
||||
delPublisher(key);
|
||||
}
|
||||
}
|
||||
|
@ -36,4 +36,9 @@ public class CatalogSubscribe implements GenericSubscribe<SIPRequest> {
|
||||
public void delPublisher(String key) {
|
||||
Helper.delPublisher(publishers, key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void complete(String key) {
|
||||
delPublisher(key);
|
||||
}
|
||||
}
|
||||
|
@ -34,6 +34,7 @@ excludeFilters = {
|
||||
"cn.skcks.docking.gb28181.service.record.*",
|
||||
"cn.skcks.docking.gb28181.core.sip.message.request.*",
|
||||
"cn.skcks.docking.gb28181.service.catalog.*",
|
||||
"cn.skcks.docking.gb28181.service.notify.*"
|
||||
})
|
||||
})
|
||||
@EnableAsync
|
||||
|
2
pom.xml
2
pom.xml
@ -57,7 +57,7 @@
|
||||
<!-- <docker.registry.password>XXX</docker.registry.password>-->
|
||||
<docker.maven.plugin.version>1.4.13</docker.maven.plugin.version>
|
||||
|
||||
<gb28181.docking.version>0.0.1-SNAPSHOT</gb28181.docking.version>
|
||||
<gb28181.docking.version>0.1.0-SNAPSHOT</gb28181.docking.version>
|
||||
</properties>
|
||||
|
||||
<profiles>
|
||||
|
Loading…
Reference in New Issue
Block a user