From 3728219177660f1bf074469aad92ac4605fe1458 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Sun, 2 Jun 2024 00:50:45 +0800 Subject: [PATCH] =?UTF-8?q?1078-=E6=B7=BB=E5=8A=A0=E5=BD=95=E5=83=8F?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vmp/conf/ftpServer/FtpServerConfig.java | 2 +- .../iot/vmp/conf/ftpServer/FtpSetting.java | 61 +++++++ .../ftpServer/{FtpPlet.java => ftplet.java} | 29 ++-- .../jt1078/controller/JT1078Controller.java | 41 ++++- .../iot/vmp/jt1078/proc/response/J9206.java | 20 +-- .../vmp/jt1078/service/Ijt1078Service.java | 3 + .../service/impl/jt1078ServiceImpl.java | 161 ++++++++++++------ 7 files changed, 240 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java rename src/main/java/com/genersoft/iot/vmp/conf/ftpServer/{FtpPlet.java => ftplet.java} (56%) diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpServerConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpServerConfig.java index 332986f1a..881551576 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpServerConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpServerConfig.java @@ -21,7 +21,7 @@ public class FtpServerConfig { private UserManager userManager; @Autowired - private FtpPlet ftpPlet; + private ftplet ftpPlet; /** * ftp server init diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java new file mode 100644 index 000000000..d9b798ab2 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java @@ -0,0 +1,61 @@ +package com.genersoft.iot.vmp.conf.ftpServer; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +/** + * 配置文件 user-settings 映射的配置信息 + */ +@Component +@ConfigurationProperties(prefix = "ftp", ignoreInvalidFields = true) +@Order(0) +public class FtpSetting { + + private Boolean enable = Boolean.FALSE; + + private String ip; + private int port = 21; + private String username = "admin"; + private String password = "admin"; + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpPlet.java b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/ftplet.java similarity index 56% rename from src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpPlet.java rename to src/main/java/com/genersoft/iot/vmp/conf/ftpServer/ftplet.java index 6e63b39a6..fc1d9c049 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpPlet.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/ftplet.java @@ -2,7 +2,8 @@ package com.genersoft.iot.vmp.conf.ftpServer; import com.genersoft.iot.vmp.jt1078.event.FtpUploadEvent; import org.apache.ftpserver.ftplet.*; -import org.apache.ftpserver.impl.DefaultFtpSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; @@ -12,9 +13,9 @@ import java.io.IOException; @Component -public class FtpPlet extends DefaultFtplet { +public class ftplet extends DefaultFtplet { - private FtpletContext ftpletContext; + private final Logger logger = LoggerFactory.getLogger(ftplet.class); @Value("${ftp.username}") private String username; @@ -28,22 +29,26 @@ public class FtpPlet extends DefaultFtplet { return FtpletResult.DISCONNECT; } super.beforeCommand(session, request); -// if (request.getCommand().equalsIgnoreCase("STOR") ) { -// FtpUploadEvent ftpUploadEvent = new FtpUploadEvent(this); -// ftpUploadEvent.setFileName(request.getArgument()); -// applicationEventPublisher.publishEvent(ftpUploadEvent); -// } return FtpletResult.DEFAULT; } @Override - public FtpletResult onUploadStart(FtpSession session, FtpRequest request) throws FtpException, IOException { - DefaultFtpSession ftpSession = (DefaultFtpSession) session; - return super.onUploadStart(session, request); + public FtpletResult onUploadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { + FtpUploadEvent event = new FtpUploadEvent(this); + event.setFileName(session.getFileSystemView().getFile(request.getArgument()).getAbsolutePath()); + applicationEventPublisher.publishEvent(event); + + logger.info("[文件已上传]: {}", session.getFileSystemView().getFile(request.getArgument()).getAbsolutePath()); + return super.onUploadEnd(session, request); } @Override - public FtpletResult onUploadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { + public FtpletResult onAppendEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { + FtpUploadEvent event = new FtpUploadEvent(this); + event.setFileName(session.getFileSystemView().getFile(request.getArgument()).getAbsolutePath()); + applicationEventPublisher.publishEvent(event); + + logger.info("[文件已上传]: {}", session.getFileSystemView().getFile(request.getArgument()).getAbsolutePath()); return super.onUploadEnd(session, request); } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java index 1a23e0d44..f63751bf2 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078Controller.java @@ -1,6 +1,8 @@ package com.genersoft.iot.vmp.jt1078.controller; +import com.genersoft.iot.vmp.conf.ftpServer.FtpSetting; import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.conf.security.JwtUtils; import com.genersoft.iot.vmp.jt1078.bean.*; import com.genersoft.iot.vmp.jt1078.controller.bean.*; @@ -29,8 +31,11 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.File; +import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; @@ -53,6 +58,9 @@ public class JT1078Controller { @Autowired UserSetting userSetting; + @Autowired + private FtpSetting ftpSetting; + @Qualifier("taskExecutor") @Autowired private ThreadPoolTaskExecutor taskExecutor; @@ -252,7 +260,7 @@ public class JT1078Controller { return WVPResult.success(recordList); } } - @Operation(summary = "1078-开始回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Operation(summary = "1078-录像-开始回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "deviceId", description = "设备国标编号", required = true) @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) @Parameter(name = "startTime", description = "开始时间,格式: yyyy-MM-dd HH:mm:ss", required = true) @@ -321,7 +329,7 @@ public class JT1078Controller { return result; } - @Operation(summary = "1078-回放控制", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Operation(summary = "1078-录像-回放控制", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "deviceId", description = "设备国标编号", required = true) @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) @Parameter(name = "command", description = "0:开始回放; 1:暂停回放; 2:结束回放; 3:快进回放; 4:关键帧快退回放; 5:拖动回放; 6:关键帧播放", required = true) @@ -338,7 +346,7 @@ public class JT1078Controller { service.playbackControl(deviceId, channelId, command, playbackSpeed,time); } - @Operation(summary = "1078-结束回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Operation(summary = "1078-录像-结束回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "deviceId", description = "设备国标编号", required = true) @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) @GetMapping("/playback/stop") @@ -351,6 +359,33 @@ public class JT1078Controller { service.stopPlayback(deviceId, channelId); } + @Operation(summary = "1078-录像-下载", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "设备国标编号", required = true) + @Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true) + @Parameter(name = "startTime", description = "开始时间,格式: yyyy-MM-dd HH:mm:ss", required = true) + @Parameter(name = "endTime", description = "结束时间,格式: yyyy-MM-dd HH:mm:ss", required = true) + @Parameter(name = "type", description = "0.音视频 1.音频 2.视频 3.视频或音视频", required = true) + @Parameter(name = "rate", description = "0.所有码流 1.主码流 2.子码流(如果此通道只传输音频,此字段置0)", required = true) + @GetMapping("/playback/download") + public void recordDownload(HttpServletRequest request, + HttpServletResponse response, + @Parameter(required = true) String deviceId, + @Parameter(required = false) String channelId, + @Parameter(required = true) String startTime, + @Parameter(required = true) String endTime, + @Parameter(required = false) Integer type, + @Parameter(required = false) Integer rate + + ) throws IOException { + logger.info("[1078-录像] 下载,设备:{}, 通道: {}, 开始时间: {}, 结束时间: {}, 音视频类型: {}, 码流类型: {}, ", + deviceId, channelId, startTime, endTime, type, rate); + if (!ftpSetting.getEnable()) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "未启用ftp服务,无法下载录像"); + } + ServletOutputStream outputStream = response.getOutputStream(); + service.recordDownload(deviceId, channelId, startTime, endTime, type, rate, outputStream); + } + @Operation(summary = "1078-分页查询部标设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "page", description = "当前页", required = true) @Parameter(name = "count", description = "每页查询数量", required = true) diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J9206.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J9206.java index 060f81657..c41d5965e 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J9206.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/response/J9206.java @@ -4,7 +4,6 @@ import com.genersoft.iot.vmp.jt1078.annotation.MsgId; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; -import io.netty.util.CharsetUtil; import java.nio.charset.Charset; @@ -20,7 +19,7 @@ public class J9206 extends Rs { // 服务器端口 private int port; // 用户名 - private String user; + private String username; // 密码 private String password; // 文件上传路径 @@ -62,9 +61,9 @@ public class J9206 extends Rs { buffer.writeByte(serverIp.getBytes(Charset.forName("GBK")).length); buffer.writeCharSequence(serverIp, Charset.forName("GBK")); - buffer.writeByte(port); - buffer.writeByte(user.getBytes(Charset.forName("GBK")).length); - buffer.writeCharSequence(user, Charset.forName("GBK")); + buffer.writeShort(port); + buffer.writeByte(username.getBytes(Charset.forName("GBK")).length); + buffer.writeCharSequence(username, Charset.forName("GBK")); buffer.writeByte(password.getBytes(Charset.forName("GBK")).length); buffer.writeCharSequence(password, Charset.forName("GBK")); buffer.writeByte(path.getBytes(Charset.forName("GBK")).length); @@ -77,7 +76,6 @@ public class J9206 extends Rs { buffer.writeByte(streamType); buffer.writeByte(storageType); buffer.writeByte(taskConditions); - return buffer; } @@ -98,12 +96,12 @@ public class J9206 extends Rs { this.port = port; } - public String getUser() { - return user; + public String getUsername() { + return username; } - public void setUser(String user) { - this.user = user; + public void setUsername(String username) { + this.username = username; } public String getPassword() { @@ -187,7 +185,7 @@ public class J9206 extends Rs { return "J9206{" + "serverIp='" + serverIp + '\'' + ", port=" + port + - ", user='" + user + '\'' + + ", user='" + username + '\'' + ", password='" + password + '\'' + ", path='" + path + '\'' + ", channelId=" + channelId + diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java index 0eb12fa2f..272cfd2ef 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/Ijt1078Service.java @@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.jt1078.bean.*; import com.genersoft.iot.vmp.jt1078.proc.request.J1205; import com.github.pagehelper.PageInfo; +import javax.servlet.ServletOutputStream; import java.util.List; public interface Ijt1078Service { @@ -115,4 +116,6 @@ public interface Ijt1078Service { void changeStreamType(String deviceId, String channelId, Integer streamType); void playbackControl(String deviceId, String channelId, Integer command, Integer playbackSpeed, String time); + + void recordDownload(String deviceId, String channelId, String startTime, String endTime, Integer type, Integer rate, ServletOutputStream outputStream); } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java index 8f5f51225..b5b88c128 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/service/impl/jt1078ServiceImpl.java @@ -5,19 +5,19 @@ import com.genersoft.iot.vmp.common.GeneralCallback; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.conf.ftpServer.FtpSetting; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.exception.ControllerException; -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; import com.genersoft.iot.vmp.jt1078.bean.*; import com.genersoft.iot.vmp.jt1078.bean.common.ConfigAttribute; import com.genersoft.iot.vmp.jt1078.cmd.JT1078Template; import com.genersoft.iot.vmp.jt1078.dao.JTDeviceMapper; import com.genersoft.iot.vmp.jt1078.event.CallbackManager; +import com.genersoft.iot.vmp.jt1078.event.FtpUploadEvent; import com.genersoft.iot.vmp.jt1078.proc.request.J1205; import com.genersoft.iot.vmp.jt1078.proc.response.*; import com.genersoft.iot.vmp.jt1078.service.Ijt1078Service; -import com.genersoft.iot.vmp.jt1078.util.SSRCUtil; import com.genersoft.iot.vmp.media.bean.MediaInfo; import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.event.hook.Hook; @@ -35,22 +35,19 @@ import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import org.apache.commons.compress.utils.IOUtils; import org.apache.commons.lang3.ObjectUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.EventListener; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import javax.sip.InvalidArgumentException; -import javax.sip.SipException; +import javax.servlet.ServletOutputStream; +import java.io.*; import java.lang.reflect.Field; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Service @@ -91,6 +88,9 @@ public class jt1078ServiceImpl implements Ijt1078Service { @Autowired private IRedisCatchStorage redisCatchStorage; + @Autowired + private FtpSetting ftpSetting; + @Override public JTDevice getDevice(String terminalId) { @@ -136,14 +136,14 @@ public class jt1078ServiceImpl implements Ijt1078Service { String playKey = VideoManagerConstants.INVITE_INFO_1078_PLAY + deviceId + ":" + channelId; List> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playKey, k -> new ArrayList<>()); errorCallbacks.add(callback); - StreamInfo streamInfo = (StreamInfo)redisTemplate.opsForValue().get(playKey); + StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playKey); if (streamInfo != null) { String mediaServerId = streamInfo.getMediaServerId(); MediaServer mediaServer = mediaServerService.getOne(mediaServerId); if (mediaServer != null) { // 查询流是否存在,不存在则删除缓存数据 JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServer, "rtp", "rtsp", streamInfo.getStream()); - if (mediaInfo != null && mediaInfo.getInteger("code") == 0 ) { + if (mediaInfo != null && mediaInfo.getInteger("code") == 0) { Boolean online = mediaInfo.getBoolean("online"); if (online != null && online) { logger.info("[1078-点播] 点播已经存在,直接返回, deviceId: {}, channelId: {}", deviceId, channelId); @@ -190,7 +190,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { }, userSetting.getPlayTimeout()); // 开启收流端口 - SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServer, stream, null, false, false, 0, false, false, false,1); + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServer, stream, null, false, false, 0, false, false, false, 1); logger.info("[1078-点播] deviceId: {}, channelId: {}, 端口: {}", deviceId, channelId, ssrcInfo.getPort()); J9101 j9101 = new J9101(); j9101.setChannel(Integer.valueOf(channelId)); @@ -291,7 +291,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { return null; } logger.info("[1078-查询录像列表] deviceId: {}, channelId: {}, startTime: {}, endTime: {}, 结果: {}条" - , deviceId, channelId, startTime, endTime, JRecordItemList.size() ); + , deviceId, channelId, startTime, endTime, JRecordItemList.size()); return JRecordItemList; } @@ -305,14 +305,14 @@ public class jt1078ServiceImpl implements Ijt1078Service { List> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playbackKey, k -> new ArrayList<>()); errorCallbacks.add(callback); String logInfo = String.format("deviceId:%s, channelId:%s, startTime:%s, endTime:%s", deviceId, channelId, startTime, endTime); - StreamInfo streamInfo = (StreamInfo)redisTemplate.opsForValue().get(playbackKey); + StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playbackKey); if (streamInfo != null) { String mediaServerId = streamInfo.getMediaServerId(); MediaServer mediaServer = mediaServerService.getOne(mediaServerId); if (mediaServer != null) { // 查询流是否存在,不存在则删除缓存数据 JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServer, "rtp", "rtsp", streamInfo.getStream()); - if (mediaInfo != null && mediaInfo.getInteger("code") == 0 ) { + if (mediaInfo != null && mediaInfo.getInteger("code") == 0) { Boolean online = mediaInfo.getBoolean("online"); if (online != null && online) { logger.info("[1078-回放] 回放已经存在,直接返回, logInfo: {}", logInfo); @@ -424,6 +424,67 @@ public class jt1078ServiceImpl implements Ijt1078Service { playbackControl(deviceId, channelId, 2, null, String.valueOf(0)); } + private Map fileUploadMap = new ConcurrentHashMap<>(); + + @EventListener + public void onApplicationEvent(FtpUploadEvent event) { + if (fileUploadMap.isEmpty()) { + return; + } + fileUploadMap.keySet().forEach(key -> { + if (!event.getFileName().contains(key)) { + return; + } + ServletOutputStream servletOutputStream = fileUploadMap.get(event.getFileName()); + String filePath = "ftp" + event.getFileName(); + File file = new File(filePath); + if (!file.exists()) { + logger.warn("[下载录像] 收到通知时未找到录像文件: {}", filePath); + return; + } + try { + FileInputStream fileInputStream = new FileInputStream(file); + IOUtils.copy(fileInputStream, servletOutputStream); + fileInputStream.close(); + servletOutputStream.close(); + } catch (IOException e) { + logger.warn("[下载录像] 读取文件异常: {}", filePath, e); + return; + } finally { + try { + servletOutputStream.close(); + } catch (IOException ignored) { + } + } + }); + } + + @Override + public void recordDownload(String deviceId, String channelId, String startTime, String endTime, Integer type, Integer rate, ServletOutputStream outputStream) { + String filePath = UUID.randomUUID().toString(); + fileUploadMap.put(filePath, outputStream); + logger.info("[1078-录像] 下载,设备:{}, 通道: {}, 开始时间: {}, 结束时间: {},等待上传文件路径: {} ", + deviceId, channelId, startTime, endTime, filePath); + // 发送停止命令 + J9206 j92026 = new J9206(); + j92026.setChannelId(Integer.parseInt(channelId)); + j92026.setStartTime(DateUtil.yyyy_MM_dd_HH_mm_ssTo1078(startTime)); + j92026.setEndTime(DateUtil.yyyy_MM_dd_HH_mm_ssTo1078(endTime)); + j92026.setServerIp(ftpSetting.getIp()); + j92026.setPort(ftpSetting.getPort()); + j92026.setUsername(ftpSetting.getUsername()); + j92026.setPassword(ftpSetting.getPassword()); + j92026.setPath(filePath); + + if (type != null) { + j92026.setMediaType(type); + } + if (rate != null) { + j92026.setStreamType(rate); + } + jt1078Template.fileUpload(deviceId, j92026, 7200); + } + @Override public void ptzControl(String deviceId, String channelId, String command, int speed) { // 发送停止命令 @@ -467,7 +528,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { j9306.setChannel(Integer.parseInt(channelId)); if (command.equals("zoomin")) { j9306.setZoom(0); - }else { + } else { j9306.setZoom(1); } jt1078Template.ptzZoom(deviceId, j9306, 6); @@ -478,7 +539,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { j9303.setChannel(Integer.parseInt(channelId)); if (command.equals("irisin")) { j9303.setIris(0); - }else { + } else { j9303.setIris(1); } jt1078Template.ptzIris(deviceId, j9303, 6); @@ -489,7 +550,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { j9302.setChannel(Integer.parseInt(channelId)); if (command.equals("focusfar")) { j9302.setFocalDirection(0); - }else { + } else { j9302.setFocalDirection(1); } jt1078Template.ptzFocal(deviceId, j9302, 6); @@ -504,7 +565,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { j9305.setChannel(Integer.parseInt(channelId)); if (command.equalsIgnoreCase("on")) { j9305.setOn(1); - }else { + } else { j9305.setOn(0); } jt1078Template.ptzSupplementaryLight(deviceId, j9305, 6); @@ -516,7 +577,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { j9304.setChannel(Integer.parseInt(channelId)); if (command.equalsIgnoreCase("on")) { j9304.setOn(1); - }else { + } else { j9304.setOn(0); } jt1078Template.ptzWiper(deviceId, j9304, 6); @@ -529,13 +590,13 @@ public class jt1078ServiceImpl implements Ijt1078Service { } if (params == null || params.length == 0) { J8104 j8104 = new J8104(); - return (JTDeviceConfig)jt1078Template.getDeviceConfig(deviceId, j8104, 20); - }else { + return (JTDeviceConfig) jt1078Template.getDeviceConfig(deviceId, j8104, 20); + } else { long[] paramBytes = new long[params.length]; for (int i = 0; i < params.length; i++) { try { Field field = JTDeviceConfig.class.getDeclaredField(params[i]); - if (field.isAnnotationPresent(ConfigAttribute.class) ) { + if (field.isAnnotationPresent(ConfigAttribute.class)) { ConfigAttribute configAttribute = field.getAnnotation(ConfigAttribute.class); long id = configAttribute.id(); String description = configAttribute.description(); @@ -548,7 +609,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { } J8106 j8106 = new J8106(); j8106.setParams(paramBytes); - return (JTDeviceConfig)jt1078Template.getDeviceSpecifyConfig(deviceId, j8106, 20); + return (JTDeviceConfig) jt1078Template.getDeviceSpecifyConfig(deviceId, j8106, 20); } } @@ -583,13 +644,13 @@ public class jt1078ServiceImpl implements Ijt1078Service { @Override public JTDeviceAttribute attribute(String deviceId) { J8107 j8107 = new J8107(); - return (JTDeviceAttribute)jt1078Template.deviceAttribute(deviceId, j8107, 20); + return (JTDeviceAttribute) jt1078Template.deviceAttribute(deviceId, j8107, 20); } @Override public JTPositionBaseInfo queryPositionInfo(String deviceId) { J8201 j8201 = new J8201(); - return (JTPositionBaseInfo)jt1078Template.queryPositionInfo(deviceId, j8201, 20); + return (JTPositionBaseInfo) jt1078Template.queryPositionInfo(deviceId, j8201, 20); } @Override @@ -611,7 +672,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { @Override public int linkDetection(String deviceId) { J8204 j8204 = new J8204(); - return (int)jt1078Template.linkDetection(deviceId, j8204, 6); + return (int) jt1078Template.linkDetection(deviceId, j8204, 6); } @Override @@ -620,7 +681,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { j8300.setSign(sign); j8300.setTextType(textType); j8300.setContent(content); - return (int)jt1078Template.textMessage(deviceId, j8300, 6); + return (int) jt1078Template.textMessage(deviceId, j8300, 6); } @Override @@ -628,7 +689,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { J8400 j8400 = new J8400(); j8400.setSign(sign); j8400.setPhoneNumber(phoneNumber); - return (int)jt1078Template.telephoneCallback(deviceId, j8400, 6); + return (int) jt1078Template.telephoneCallback(deviceId, j8400, 6); } @Override @@ -638,16 +699,16 @@ public class jt1078ServiceImpl implements Ijt1078Service { if (phoneBookContactList != null) { j8401.setPhoneBookContactList(phoneBookContactList); } - return (int)jt1078Template.setPhoneBook(deviceId, j8401, 6); + return (int) jt1078Template.setPhoneBook(deviceId, j8401, 6); } @Override public JTPositionBaseInfo controlDoor(String deviceId, Boolean open) { J8500 j8500 = new J8500(); JTVehicleControl jtVehicleControl = new JTVehicleControl(); - jtVehicleControl.setControlCarDoor(open?1:0); + jtVehicleControl.setControlCarDoor(open ? 1 : 0); j8500.setVehicleControl(jtVehicleControl); - return (JTPositionBaseInfo)jt1078Template.vehicleControl(deviceId, j8500, 20); + return (JTPositionBaseInfo) jt1078Template.vehicleControl(deviceId, j8500, 20); } @Override @@ -655,14 +716,14 @@ public class jt1078ServiceImpl implements Ijt1078Service { J8600 j8600 = new J8600(); j8600.setAttribute(attribute); j8600.setCircleAreaList(circleAreaList); - return (int)jt1078Template.setAreaForCircle(deviceId, j8600, 20); + return (int) jt1078Template.setAreaForCircle(deviceId, j8600, 20); } @Override public int deleteAreaForCircle(String deviceId, List ids) { J8601 j8601 = new J8601(); j8601.setIdList(ids); - return (int)jt1078Template.deleteAreaForCircle(deviceId, j8601, 20); + return (int) jt1078Template.deleteAreaForCircle(deviceId, j8601, 20); } @Override @@ -670,7 +731,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { J8608 j8608 = new J8608(); j8608.setType(1); j8608.setIdList(ids); - return (List)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); + return (List) jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); } @Override @@ -678,14 +739,14 @@ public class jt1078ServiceImpl implements Ijt1078Service { J8602 j8602 = new J8602(); j8602.setAttribute(attribute); j8602.setRectangleAreas(rectangleAreas); - return (int)jt1078Template.setAreaForRectangle(deviceId, j8602, 20); + return (int) jt1078Template.setAreaForRectangle(deviceId, j8602, 20); } @Override public int deleteAreaForRectangle(String deviceId, List ids) { J8603 j8603 = new J8603(); j8603.setIdList(ids); - return (int)jt1078Template.deleteAreaForRectangle(deviceId, j8603, 20); + return (int) jt1078Template.deleteAreaForRectangle(deviceId, j8603, 20); } @Override @@ -693,21 +754,21 @@ public class jt1078ServiceImpl implements Ijt1078Service { J8608 j8608 = new J8608(); j8608.setType(2); j8608.setIdList(ids); - return (List)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); + return (List) jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); } @Override public int setAreaForPolygon(String deviceId, JTPolygonArea polygonArea) { J8604 j8604 = new J8604(); j8604.setPolygonArea(polygonArea); - return (int)jt1078Template.setAreaForPolygon(deviceId, j8604, 20); + return (int) jt1078Template.setAreaForPolygon(deviceId, j8604, 20); } @Override public int deleteAreaForPolygon(String deviceId, List ids) { J8605 j8605 = new J8605(); j8605.setIdList(ids); - return (int)jt1078Template.deleteAreaForPolygon(deviceId, j8605, 20); + return (int) jt1078Template.deleteAreaForPolygon(deviceId, j8605, 20); } @Override @@ -715,21 +776,21 @@ public class jt1078ServiceImpl implements Ijt1078Service { J8608 j8608 = new J8608(); j8608.setType(3); j8608.setIdList(ids); - return (List)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); + return (List) jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); } @Override public int setRoute(String deviceId, JTRoute route) { J8606 j8606 = new J8606(); j8606.setRoute(route); - return (int)jt1078Template.setRoute(deviceId, j8606, 20); + return (int) jt1078Template.setRoute(deviceId, j8606, 20); } @Override public int deleteRoute(String deviceId, List ids) { J8607 j8607 = new J8607(); j8607.setIdList(ids); - return (int)jt1078Template.deleteRoute(deviceId, j8607, 20); + return (int) jt1078Template.deleteRoute(deviceId, j8607, 20); } @Override @@ -737,27 +798,27 @@ public class jt1078ServiceImpl implements Ijt1078Service { J8608 j8608 = new J8608(); j8608.setType(4); j8608.setIdList(ids); - return (List)jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); + return (List) jt1078Template.queryAreaOrRoute(deviceId, j8608, 20); } @Override public JTDriverInformation queryDriverInformation(String deviceId) { J8702 j8702 = new J8702(); - return (JTDriverInformation)jt1078Template.queryDriverInformation(deviceId, j8702, 20); + return (JTDriverInformation) jt1078Template.queryDriverInformation(deviceId, j8702, 20); } @Override public List shooting(String deviceId, JTShootingCommand shootingCommand) { J8801 j8801 = new J8801(); j8801.setCommand(shootingCommand); - return (List)jt1078Template.shooting(deviceId, j8801, 300); + return (List) jt1078Template.shooting(deviceId, j8801, 300); } @Override public List queryMediaData(String deviceId, JTQueryMediaDataCommand queryMediaDataCommand) { J8802 j8802 = new J8802(); j8802.setCommand(queryMediaDataCommand); - return (List)jt1078Template.queryMediaData(deviceId, j8802, 300); + return (List) jt1078Template.queryMediaData(deviceId, j8802, 300); } @Override @@ -788,7 +849,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { @Override public JTMediaAttribute queryMediaAttribute(String deviceId) { J9003 j9003 = new J9003(); - return (JTMediaAttribute)jt1078Template.queryMediaAttribute(deviceId, j9003, 300); + return (JTMediaAttribute) jt1078Template.queryMediaAttribute(deviceId, j9003, 300); } /** @@ -819,7 +880,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { String playKey = VideoManagerConstants.INVITE_INFO_1078_TALK + deviceId + ":" + channelId; List> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playKey, k -> new ArrayList<>()); errorCallbacks.add(callback); - StreamInfo streamInfo = (StreamInfo)redisTemplate.opsForValue().get(playKey); + StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playKey); if (streamInfo != null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "对讲进行中"); } @@ -874,7 +935,7 @@ public class jt1078ServiceImpl implements Ijt1078Service { }); Hook hookForDeparture = Hook.getInstance(HookType.on_media_departure, "rtp", receiveStream, mediaServer.getId()); subscribe.addSubscribe(hookForDeparture, (hookData) -> { - logger.info("[1078-对讲] 对讲时源流注销, app: {}. stream: {}, deviceId: {}, channelId: {}",app, stream, deviceId, channelId); + logger.info("[1078-对讲] 对讲时源流注销, app: {}. stream: {}, deviceId: {}, channelId: {}", app, stream, deviceId, channelId); stopTalk(deviceId, channelId); }); // 设置超时监听