更新 gb28181-docking-platform 依赖版本

This commit is contained in:
shikong 2024-01-11 11:33:58 +08:00
parent e36befe7ef
commit e6819b2a15
13 changed files with 135 additions and 27 deletions

View File

@ -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);
}
}

View File

@ -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;
/**
* 某些特殊情况下 使用 视频回放点播 代替 下载

View File

@ -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)){

View File

@ -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){

View File

@ -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){
}
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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")));
});

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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

View File

@ -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>