[1078] 增加抓图

This commit is contained in:
lin
2025-07-11 20:15:45 +08:00
parent b7a2b6816b
commit 8c3e9320fa
13 changed files with 181 additions and 244 deletions

View File

@@ -155,7 +155,6 @@ public class VirtualFtpFile implements FtpFile {
@Override
public OutputStream createOutputStream(long offset) throws IOException {
System.out.println("createOutputStream++++");
return outputStream;
}

View File

@@ -2,7 +2,9 @@ package com.genersoft.iot.vmp.jt1078.bean;
import io.netty.buffer.ByteBuf;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "多媒体事件信息")
public class JTMediaEventInfo {
@@ -21,6 +23,10 @@ public class JTMediaEventInfo {
@Schema(description = "通道 ID")
private int channelId;
@Schema(description = "媒体数据")
private byte[] mediaData;
public static JTMediaEventInfo decode(ByteBuf buf) {
JTMediaEventInfo jtMediaEventInfo = new JTMediaEventInfo();
jtMediaEventInfo.setId(buf.readUnsignedInt());
@@ -28,49 +34,14 @@ public class JTMediaEventInfo {
jtMediaEventInfo.setCode(buf.readUnsignedByte());
jtMediaEventInfo.setEventCode(buf.readUnsignedByte());
jtMediaEventInfo.setChannelId(buf.readUnsignedByte());
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
jtMediaEventInfo.setMediaData(bytes);
return jtMediaEventInfo;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public int getEventCode() {
return eventCode;
}
public void setEventCode(int eventCode) {
this.eventCode = eventCode;
}
public int getChannelId() {
return channelId;
}
public void setChannelId(int channelId) {
this.channelId = channelId;
}
@Override
public String toString() {
return "JTMediaEventInfo{" +
@@ -79,6 +50,7 @@ public class JTMediaEventInfo {
", code=" + code +
", eventCode=" + eventCode +
", channelId=" + channelId +
", fileSize=" + mediaData.length +
'}';
}
}

View File

@@ -25,7 +25,7 @@ public enum MultiPacketManager {
*/
public ByteBuf add(MultiPacket packet) {
String key = packet.getHeader().getMsgId() + "/" + packet.getHeader().getPhoneNumber();
logger.debug("分包消息: \n{}", packet);
logger.info("分包消息: \n{}", packet);
List<MultiPacket> multiPackets = packetMap.computeIfAbsent(key, k -> new ArrayList<>(packet.getCount()));
multiPackets.add(packet);
packetTimeMap.put(key, System.currentTimeMillis());

View File

@@ -30,6 +30,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.MediaType;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.DeferredResult;
@@ -74,7 +75,7 @@ public class JT1078Controller {
@Autowired
private ThreadPoolTaskExecutor taskExecutor;
@Operation(summary = "1078-开始点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-开始点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道编号, 一般为从1开始的数字", required = true)
@Parameter(name = "type", description = "类型0:音视频,1:视频,3:音频", required = true)
@@ -125,7 +126,7 @@ public class JT1078Controller {
return result;
}
@Operation(summary = "1078-结束点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-结束点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@GetMapping("/live/stop")
@@ -135,7 +136,7 @@ public class JT1078Controller {
jt1078PlayService.stopPlay(phoneNumber, channelId);
}
@Operation(summary = "1078-语音对讲", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-语音对讲", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "app", description = "推流应用名", required = true)
@@ -189,7 +190,7 @@ public class JT1078Controller {
return result;
}
@Operation(summary = "1078-结束对讲", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-结束对讲", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@GetMapping("/talk/stop")
@@ -200,7 +201,7 @@ public class JT1078Controller {
}
@Operation(summary = "1078-暂停点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-暂停点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@GetMapping("/live/pause")
@@ -210,7 +211,7 @@ public class JT1078Controller {
jt1078PlayService.pausePlay(phoneNumber, channelId);
}
@Operation(summary = "1078-继续点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-继续点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@GetMapping("/live/continue")
@@ -221,7 +222,7 @@ public class JT1078Controller {
jt1078PlayService.continueLivePlay(phoneNumber, channelId);
}
@Operation(summary = "1078-切换码流类型", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-切换码流类型", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "streamType", description = "0:主码流; 1:子码流", required = true)
@@ -233,7 +234,7 @@ public class JT1078Controller {
service.changeStreamType(phoneNumber, channelId, streamType);
}
@Operation(summary = "1078-录像-查询资源列表", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-录像-查询资源列表", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "startTime", description = "开始时间,格式: yyyy-MM-dd HH:mm:ss", required = true)
@@ -252,7 +253,7 @@ public class JT1078Controller {
return WVPResult.success(recordList);
}
}
@Operation(summary = "1078-录像-开始回放", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-录像-开始回放", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "startTime", description = "开始时间,格式: yyyy-MM-dd HH:mm:ss", required = true)
@@ -310,7 +311,7 @@ public class JT1078Controller {
return result;
}
@Operation(summary = "1078-录像-回放控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-录像-回放控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "command", description = "0:开始回放; 1:暂停回放; 2:结束回放; 3:快进回放; 4:关键帧快退回放; 5:拖动回放; 6:关键帧播放", required = true)
@@ -327,7 +328,7 @@ public class JT1078Controller {
jt1078PlayService.playbackControl(phoneNumber, channelId, command, playbackSpeed,time);
}
@Operation(summary = "1078-录像-结束回放", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-录像-结束回放", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@GetMapping("/playback/stop")
@@ -337,67 +338,7 @@ public class JT1078Controller {
jt1078PlayService.stopPlayback(phoneNumber, channelId);
}
// @Operation(summary = "1078-录像-下载", security = @SecurityRequirement(name = JwtUtils.HEADER))
// @Parameter(name = "phoneNumber", 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 = "alarmSign", description = "报警标志", required = true)
// @Parameter(name = "mediaType", description = "音视频资源类型: 0.音视频 1.音频 2.视频 3.视频或音视频", required = true)
// @Parameter(name = "streamType", description = "码流类型0.所有码流 1.主码流 2.子码流(如果此通道只传输音频,此字段置0)", required = true)
// @Parameter(name = "storageType", description = "存储器类型", required = true)
// @GetMapping("/playback/download")
// public DeferredResult<Void> recordDownload(HttpServletRequest request,
// HttpServletResponse response,
// @Parameter(required = true) String phoneNumber,
// @Parameter(required = true) Integer channelId,
// @Parameter(required = true) String startTime,
// @Parameter(required = true) String endTime,
// @Parameter(required = false) Integer alarmSign,
// @Parameter(required = false) Integer mediaType,
// @Parameter(required = false) Integer streamType,
// @Parameter(required = false) Integer storageType
//
// ) throws IOException {
// log.info("[JT-录像] 下载,设备:{} 通道: {} 开始时间: {} 结束时间: {},报警标志: {}, 音视频类型: {} 码流类型: {},存储器类型: {} ",
// phoneNumber, channelId, startTime, endTime, alarmSign, mediaType, streamType, storageType);
// if (!ftpSetting.getEnable()) {
// throw new ControllerException(ErrorCode.ERROR100.getCode(), "未启用ftp服务无法下载录像");
// }
// DeferredResult<Void> result = new DeferredResult<>(600000L);
// ServletOutputStream outputStream = response.getOutputStream();
// response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
// response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(phoneNumber + "_" + channelId + ".mp4", "UTF-8"));
// response.setStatus(HttpServletResponse.SC_OK);
//
// service.recordDownload(phoneNumber, channelId, startTime, endTime, alarmSign, mediaType, streamType, storageType, outputStream, wvpResult -> {
// String filePath = "ftp" + wvpResult.getData();
// File file = new File(filePath);
// if (!file.exists()) {
// log.warn("[下载录像] 收到通知时未找到录像文件: {}", filePath);
// return;
// }
// try {
// final InputStream in = Files.newInputStream(file.toPath());
// IOUtils.copy(in, outputStream);
// outputStream.flush();
// in.close();
// } catch (IOException e) {
// log.warn("[下载录像] 读取文件异常: {}", filePath, e);
// return;
// } finally {
// try {
// outputStream.close();
// result.setResult(null);
// } catch (IOException ignored) {
// }
// }
// });
// return result;
// }
@Operation(summary = "1078-录像-获取下载地址", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-录像-获取下载地址", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "startTime", description = "开始时间,格式: yyyy-MM-dd HH:mm:ss", required = true)
@@ -426,7 +367,7 @@ public class JT1078Controller {
return service.getRecordTempUrl(phoneNumber, channelId, startTime, endTime, alarmSign, mediaType, streamType, storageType);
}
@Operation(summary = "1078-录像-下载", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-录像-下载", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "path", description = "临时下载路径", required = true)
@GetMapping("/playback/download")
public void download(HttpServletRequest request, HttpServletResponse response, @Parameter(required = true) String path) throws IOException {
@@ -437,11 +378,12 @@ public class JT1078Controller {
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(path + ".mp4", "UTF-8"));
// response.setContentLength(394983300);
response.setStatus(HttpServletResponse.SC_OK);
service.recordDownload(path, outputStream);
}
@Operation(summary = "1078-云台控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-云台控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "command", description = "控制指令,允许值: left, right, up, down, zoomin, zoomout, irisin, irisout, focusnear, focusfar, stop", required = true)
@@ -453,7 +395,7 @@ public class JT1078Controller {
service.ptzControl(phoneNumber, channelId, command, speed);
}
@Operation(summary = "1078-补光灯开关", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-补光灯开关", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "command", description = "控制指令,允许值: on off", required = true)
@@ -464,7 +406,7 @@ public class JT1078Controller {
service.supplementaryLight(phoneNumber, channelId, command);
}
@Operation(summary = "1078-雨刷开关", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-雨刷开关", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "channelId", description = "通道国标编号, 一般为从1开始的数字", required = true)
@Parameter(name = "command", description = "控制指令,允许值: on off", required = true)
@@ -475,7 +417,7 @@ public class JT1078Controller {
service.wiper(phoneNumber, channelId, command);
}
@Operation(summary = "1078-查询终端参数", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询终端参数", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@GetMapping("/config")
public JTDeviceConfig config(String phoneNumber, String[] params){
@@ -484,7 +426,7 @@ public class JT1078Controller {
return service.queryConfig(phoneNumber, params, null);
}
@Operation(summary = "1078-设置终端参数", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-设置终端参数", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "config", description = "终端参数", required = true)
@PostMapping("/set-config")
@@ -503,7 +445,7 @@ public class JT1078Controller {
service.connectionControl(control.getPhoneNumber(), control.getControl());
}
@Operation(summary = "1078-终端控制-复位", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-终端控制-复位", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@PostMapping("/control/reset")
public void resetControl(String phoneNumber){
@@ -512,7 +454,7 @@ public class JT1078Controller {
service.resetControl(phoneNumber);
}
@Operation(summary = "1078-终端控制-恢复出厂设置", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-终端控制-恢复出厂设置", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@PostMapping("/control/factory-reset")
public void factoryResetControl(String phoneNumber){
@@ -521,7 +463,7 @@ public class JT1078Controller {
service.factoryResetControl(phoneNumber);
}
@Operation(summary = "1078-查询终端属性", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询终端属性", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@GetMapping("/attribute")
public JTDeviceAttribute attribute(String phoneNumber){
@@ -530,7 +472,7 @@ public class JT1078Controller {
return service.attribute(phoneNumber);
}
@Operation(summary = "1078-查询位置信息", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询位置信息", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@GetMapping("/position-info")
public JTPositionBaseInfo queryPositionInfo(String phoneNumber){
@@ -539,7 +481,7 @@ public class JT1078Controller {
return service.queryPositionInfo(phoneNumber);
}
@Operation(summary = "1078-临时位置跟踪控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-临时位置跟踪控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "timeInterval", description = "时间间隔,单位为秒,时间间隔为0 时停止跟踪,停止跟踪无需带后继字段", required = true)
@Parameter(name = "validityPeriod", description = "位置跟踪有效期, 单位为秒,终端在接收到位置跟踪控制消息后,在有效期截止时间之前依据消息中的时间间隔发送位置汇报", required = true)
@@ -550,7 +492,7 @@ public class JT1078Controller {
service.tempPositionTrackingControl(phoneNumber, timeInterval, validityPeriod);
}
@Operation(summary = "1078-人工确认报警消息", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-人工确认报警消息", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "timeInterval", description = "时间间隔,单位为秒,时间间隔为0 时停止跟踪,停止跟踪无需带后继字段", required = true)
@Parameter(name = "validityPeriod", description = "位置跟踪有效期, 单位为秒,终端在接收到位置跟踪控制消息后,在有效期截止时间之前依据消息中的时间间隔发送位置汇报", required = true)
@@ -561,7 +503,7 @@ public class JT1078Controller {
service.confirmationAlarmMessage(param.getPhoneNumber(), param.getAlarmPackageNo(), param.getAlarmMessageType());
}
@Operation(summary = "1078-链路检测", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-链路检测", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@GetMapping("/link-detection")
public WVPResult<Integer> linkDetection(String phoneNumber){
@@ -577,7 +519,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-文本信息下发", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-文本信息下发", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "textMessageParam", description = "文本信息下发参数", required = true)
@PostMapping("/text-msg")
public WVPResult<Integer> textMessage(@RequestBody TextMessageParam textMessageParam){
@@ -593,7 +535,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-电话回拨", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-电话回拨", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "sign", description = "标志: 0:普通通话,1:监听", required = true)
@Parameter(name = "destPhoneNumber", description = "回拨电话号码", required = true)
@@ -611,7 +553,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-设置电话本", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-设置电话本", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "setPhoneBookParam", description = "设置电话本参数", required = true)
@PostMapping("/set-phone-book")
public WVPResult<Integer> setPhoneBook(@RequestBody SetPhoneBookParam setPhoneBookParam){
@@ -627,7 +569,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-车门控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-车门控制", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "open", description = "开启车门", required = true)
@GetMapping("/control/door")
@@ -643,7 +585,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-更新圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-更新圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "areaParam", description = "设置区域参数", required = true)
@PostMapping("/area/circle/update")
public WVPResult<Integer> updateAreaForCircle(@RequestBody SetAreaParam areaParam){
@@ -659,7 +601,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-追加圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-追加圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "areaParam", description = "设置区域参数", required = true)
@PostMapping("/area/circle/add")
public WVPResult<Integer> addAreaForCircle(@RequestBody SetAreaParam areaParam){
@@ -675,7 +617,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-修改圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-修改圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "areaParam", description = "设置区域参数", required = true)
@PostMapping("/area/circle/edit")
public WVPResult<Integer> editAreaForCircle(@RequestBody SetAreaParam areaParam){
@@ -691,7 +633,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-删除圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-删除圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "ids", description = "待删除圆形区域的id例如1,2,3", required = true)
@GetMapping("/area/circle/delete")
@@ -708,7 +650,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-查询圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询圆形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@GetMapping("/area/circle/query")
public WVPResult<List<JTAreaOrRoute>> queryAreaForCircle(String phoneNumber, @RequestParam(value = "ids", required = false) List<Long> ids){
@@ -723,7 +665,7 @@ public class JT1078Controller {
}
@Operation(summary = "1078-更新矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-更新矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "areaParam", description = "设置区域参数", required = true)
@PostMapping("/area/rectangle/update")
public WVPResult<Integer> updateAreaForRectangle(@RequestBody SetAreaParam areaParam){
@@ -739,7 +681,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-追加矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-追加矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "areaParam", description = "设置区域参数", required = true)
@PostMapping("/area/rectangle/add")
public WVPResult<Integer> addAreaForRectangle(@RequestBody SetAreaParam areaParam){
@@ -755,7 +697,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-修改矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-修改矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "areaParam", description = "设置区域参数", required = true)
@PostMapping("/area/rectangle/edit")
public WVPResult<Integer> editAreaForRectangle(@RequestBody SetAreaParam areaParam){
@@ -771,7 +713,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-删除矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-删除矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "ids", description = "待删除圆形区域的id例如1,2,3", required = true)
@GetMapping("/area/rectangle/delete")
@@ -788,7 +730,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-查询矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询矩形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@GetMapping("/area/rectangle/query")
public WVPResult<List<JTAreaOrRoute>> queryAreaForRectangle(String phoneNumber, @RequestParam(value = "ids", required = false) List<Long> ids){
@@ -802,7 +744,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-设置多边形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-设置多边形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "areaParam", description = "设置区域参数", required = true)
@PostMapping("/area/polygon/set")
public WVPResult<Integer> setAreaForPolygon(@RequestBody SetAreaParam areaParam){
@@ -818,7 +760,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-删除多边形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-删除多边形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "ids", description = "待删除圆形区域的id例如1,2,3", required = true)
@GetMapping("/area/polygon/delete")
@@ -835,7 +777,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-查询多边形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询多边形区域", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@GetMapping("/area/polygon/query")
public WVPResult<List<JTAreaOrRoute>> queryAreaForPolygon(String phoneNumber, @RequestParam(value = "ids", required = false) List<Long> ids){
@@ -849,7 +791,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-设置路线", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-设置路线", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "areaParam", description = "设置区域参数", required = true)
@PostMapping("/route/set")
public WVPResult<Integer> setRoute(@RequestBody SetAreaParam areaParam){
@@ -865,7 +807,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-删除路线", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-删除路线", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "ids", description = "待删除圆形区域的id例如1,2,3", required = true)
@GetMapping("/route/delete")
@@ -882,7 +824,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-查询路线", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询路线", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@GetMapping("/route/query")
public WVPResult<List<JTAreaOrRoute>> queryRoute(String phoneNumber, @RequestParam(value = "ids", required = false) List<Long> ids){
@@ -898,7 +840,7 @@ public class JT1078Controller {
// TODO 待实现 行驶记录数据采集命令 行驶记录数据上传 行驶记录参数下传命令 电子运单上报 CAN总线数据上传
@Operation(summary = "1078-上报驾驶员身份信息请求", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-上报驾驶员身份信息请求", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@GetMapping("/driver-information")
public WVPResult<JTDriverInformation> queryDriverInformation(String phoneNumber){
@@ -912,7 +854,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-摄像头立即拍摄命令", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-摄像头立即拍摄命令", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@PostMapping("/shooting")
public WVPResult<List<Long>> shooting(@RequestBody ShootingParam param){
@@ -926,7 +868,25 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-存储多媒体数据检索", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-抓图", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备编号", required = true)
@Parameter(name = "channelId", description = "通道编号", required = true)
@PostMapping("/snap")
public void snap(HttpServletResponse response, String phoneNumber, Integer channelId){
log.info("[JT-抓图] 设备编号: {}, 通道编号: {}", phoneNumber, channelId );
Assert.notNull(channelId, "缺少通道编号");
try {
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(phoneNumber + "_" + channelId + ".jpg", "UTF-8"));
service.snap(phoneNumber, channelId, outputStream);
}catch (Exception e) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage());
}
}
@Operation(summary = "JT-存储多媒体数据检索", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "param", description = "存储多媒体数据参数", required = true)
@PostMapping("/media-data-info")
public WVPResult<List<JTMediaDataInfo>> queryMediaData(@RequestBody QueryMediaDataParam param){
@@ -940,7 +900,7 @@ public class JT1078Controller {
}
}
@Operation(summary = "1078-存储多媒体数据上传命令", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-存储多媒体数据上传命令", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "param", description = "存储多媒体数据参数", required = true)
@PostMapping("/media-data-upload")
public DeferredResult<WVPResult<List<String>>> updateMediaData(@RequestBody QueryMediaDataParam param){
@@ -1006,7 +966,7 @@ public class JT1078Controller {
return deferredResult;
}
@Operation(summary = "1078-开始录音", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-开始录音", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "time", description = "录音时间,单位为秒(s) ,0 表示一直录音", required = false)
@Parameter(name = "save", description = "0:实时上传1:保存", required = false)
@@ -1030,7 +990,7 @@ public class JT1078Controller {
service.record(phoneNumber, 1, time, save, samplingRate);
}
@Operation(summary = "1078-停止录音", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-停止录音", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@Parameter(name = "time", description = "录音时间,单位为秒(s) ,0 表示一直录音", required = false)
@Parameter(name = "save", description = "0:实时上传1:保存", required = false)
@@ -1054,7 +1014,7 @@ public class JT1078Controller {
service.record(phoneNumber, 0, time, save, samplingRate);
}
@Operation(summary = "1078-查询终端音视频属性", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询终端音视频属性", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "phoneNumber", description = "设备手机号", required = true)
@GetMapping("/media/attribute")
public JTMediaAttribute queryMediaAttribute(HttpServletRequest request,

View File

@@ -33,7 +33,7 @@ public class JT1078TerminalController {
@Autowired
UserSetting userSetting;
@Operation(summary = "1078-分页查询部标设备", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-分页查询部标设备", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "page", description = "当前页", required = true)
@Parameter(name = "count", description = "每页查询数量", required = true)
@Parameter(name = "query", description = "查询内容")
@@ -54,7 +54,7 @@ public class JT1078TerminalController {
service.updateDevice(device);
}
@Operation(summary = "1078-新增设备", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-新增设备", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "device", description = "设备", required = true)
@PostMapping("/add")
public void addDevice(JTDevice device){
@@ -76,7 +76,7 @@ public class JT1078TerminalController {
}
@Operation(summary = "1078-查询部标通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询部标通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "page", description = "当前页", required = true)
@Parameter(name = "count", description = "每页查询数量", required = true)
@Parameter(name = "deviceId", description = "设备ID", required = true)
@@ -89,7 +89,7 @@ public class JT1078TerminalController {
return service.getChannelList(page, count, deviceId, query);
}
@Operation(summary = "1078-查询单个部标通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-查询单个部标通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "id", description = "通道数据库ID", required = true)
@GetMapping("/channel/one")
public JTChannel getChannel(Integer id) {
@@ -97,7 +97,7 @@ public class JT1078TerminalController {
return service.getChannelByDbId(id);
}
@Operation(summary = "1078-更新通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-更新通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "channel", description = "通道", required = true)
@PostMapping("/channel/update")
public void updateChannel(@RequestBody JTChannel channel){
@@ -106,7 +106,7 @@ public class JT1078TerminalController {
service.updateChannel(channel);
}
@Operation(summary = "1078-新增通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-新增通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "channel", description = "通道", required = true)
@PostMapping("/channel/add")
public JTChannel addChannel(@RequestBody JTChannel channel){
@@ -115,7 +115,7 @@ public class JT1078TerminalController {
service.addChannel(channel);
return channel;
}
@Operation(summary = "1078-删除通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Operation(summary = "JT-删除通道", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "id", description = "通道的数据库ID", required = true)
@DeleteMapping("/channel/delete")
public void deleteChannel(Integer id){

View File

@@ -0,0 +1,22 @@
package com.genersoft.iot.vmp.jt1078.event;
import com.genersoft.iot.vmp.jt1078.bean.JTMediaEventInfo;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;
public class MediaFileUploadEvent extends ApplicationEvent {
public MediaFileUploadEvent(Object source) {
super(source);
}
@Getter
@Setter
private JTMediaEventInfo mediaEventInfo;
@Getter
@Setter
private byte[] bytes;
}

View File

@@ -27,48 +27,17 @@ public class J0801 extends Re {
private final static Logger log = LoggerFactory.getLogger(J0801.class);
private JTMediaEventInfo mediaEventInfo;
private JTPositionBaseInfo positionBaseInfo;
@Override
protected Rs decode0(ByteBuf buf, Header header, Session session) {
mediaEventInfo = JTMediaEventInfo.decode(buf);
JTMediaEventInfo mediaEventInfo = JTMediaEventInfo.decode(buf);
ByteBuf byteBuf = buf.readSlice(28);
positionBaseInfo = JTPositionBaseInfo.decode(byteBuf);
String fileName = "mediaEvent/" + mediaEventInfo.getId() + ".";
File mediaEventFile = new File("mediaEvent");
if (!mediaEventFile.exists()) {
mediaEventFile.mkdirs();
}
switch (mediaEventInfo.getCode()){
case 0:
fileName += "jpg";
break;
case 1:
fileName += "tif";
break;
case 2:
fileName += "mp3";
break;
case 3:
fileName += "wav";
break;
case 4:
fileName += "wmv";
break;
}
try {
File file = new File(fileName);
file.deleteOnExit();
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
fileOutputStream.write(bytes);
fileOutputStream.close();
} catch (IOException e) {
log.info("[JT-多媒体数据上传] 写入文件失败", e);
}
log.info("[JT-多媒体数据上传]: {}", mediaEventInfo);
SessionManager.INSTANCE.response(header.getPhoneNumber(), "0801", null, mediaEventInfo);
return null;

View File

@@ -18,6 +18,7 @@ public class J0A00 extends Re {
/**
* 透传消息类型, 0x00: GNSS 模块详细定位数据, 0X0B: 道路运输证 IC卡信息, 0X41: 串口1 透传, 0X42: 串口2 透传, 0XF0 ~ 0XFF: 用户自定义透传
*/
private Integer type;
/**

View File

@@ -122,4 +122,7 @@ public interface Ijt1078Service {
String getRecordTempUrl(String phoneNumber, Integer channelId, String startTime, String endTime, Integer alarmSign, Integer mediaType, Integer streamType, Integer storageType);
void recordDownload(String filePath, ServletOutputStream outputStream);
void snap(String phoneNumber, int channelId, ServletOutputStream outputStream);
}

View File

@@ -5,22 +5,18 @@ 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.FtpFileSystemFactory;
import com.genersoft.iot.vmp.conf.ftpServer.FtpFileSystemView;
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.event.sip.MessageEvent;
import com.genersoft.iot.vmp.gb28181.service.IGbChannelService;
import com.genersoft.iot.vmp.gb28181.task.deviceStatus.DeviceStatusTask;
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.JTChannelMapper;
import com.genersoft.iot.vmp.jt1078.dao.JTTerminalMapper;
import com.genersoft.iot.vmp.jt1078.event.FtpUploadEvent;
import com.genersoft.iot.vmp.jt1078.proc.response.*;
import com.genersoft.iot.vmp.jt1078.service.Ijt1078Service;
import com.genersoft.iot.vmp.jt1078.session.DownloadManager;
import com.genersoft.iot.vmp.jt1078.session.FtpDownloadManager;
import com.genersoft.iot.vmp.media.event.media.MediaArrivalEvent;
import com.genersoft.iot.vmp.media.event.media.MediaDepartureEvent;
import com.genersoft.iot.vmp.utils.DateUtil;
@@ -38,15 +34,13 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.web.context.request.async.DeferredResult;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.SynchronousQueue;
@Service
@Slf4j
@@ -80,7 +74,7 @@ public class jt1078ServiceImpl implements Ijt1078Service {
private FtpFileSystemFactory fileSystemFactory;
@Autowired
private DownloadManager downloadManager;
private FtpDownloadManager downloadManager;
/**
* 流到来的处理
@@ -694,7 +688,7 @@ public class jt1078ServiceImpl implements Ijt1078Service {
log.info("[JT-录像] 下载,设备:{} 通道: {} 开始时间: {} 结束时间: {},等待上传文件路径: {} ",
phoneNumber, channelId, startTime, endTime, filePath);
// 发送停止命
// 文件上传指
J9206 j9206 = new J9206();
j9206.setChannelId(channelId);
j9206.setStartTime(DateUtil.yyyy_MM_dd_HH_mm_ssTo1078(startTime));
@@ -732,4 +726,44 @@ public class jt1078ServiceImpl implements Ijt1078Service {
fileSystemFactory.removeOutputStream(filePath);
}
@Override
public void snap(String phoneNumber, int channelId, ServletOutputStream outputStream) {
J8801 j8801 = new J8801();
JTShootingCommand shootingCommand = new JTShootingCommand();
shootingCommand.setChanelId(channelId);
shootingCommand.setCommand(1);
shootingCommand.setTime(0);
shootingCommand.setSave(0);
shootingCommand.setResolvingPower(0xff);
shootingCommand.setQuality(1);
shootingCommand.setBrightness(125);
shootingCommand.setContrastRatio(60);
shootingCommand.setSaturation(60);
shootingCommand.setChroma(125);
j8801.setCommand(shootingCommand);
log.info("[JT-抓图] 设备编号: {} 通道编号: {}", phoneNumber, channelId);
@SuppressWarnings("unchecked")
List<Long> ids = (List<Long>) jt1078Template.shooting(phoneNumber, j8801, 300);
log.info("[JT-抓图] 抓图编号: {} 设备编号: {} 通道编号: {}", ids.get(0), phoneNumber, channelId);
J8805 j8805 = new J8805();
j8805.setMediaId(ids.get(0));
j8805.setDelete(1);
log.info("[JT-抓图] 请求上传图片,抓图编号: {} 设备编号: {} 通道编号: {}", ids.get(0), phoneNumber, channelId);
JTMediaEventInfo mediaEventInfo = (JTMediaEventInfo)jt1078Template.uploadMediaDataForSingle(phoneNumber, j8805, 300);
if (mediaEventInfo == null) {
log.info("[]");
throw new ControllerException(ErrorCode.ERROR100.getCode(), ErrorCode.ERROR100.getMsg());
}
log.info("[JT-抓图] 图片上传完成,抓图编号: {} 设备编号: {} 通道编号: {}", ids.get(0), phoneNumber, channelId);
try {
outputStream.write(mediaEventInfo.getMediaData());
} catch (IOException e) {
log.info("[JT-抓图] 数据写入异常,抓图编号: {} 设备编号: {} 通道编号: {}", ids.get(0), phoneNumber, channelId, e);
throw new ControllerException(ErrorCode.ERROR100.getCode(), "数据写入异常");
}
}
}

View File

@@ -1,11 +1,8 @@
package com.genersoft.iot.vmp.jt1078.session;
import com.genersoft.iot.vmp.common.CommonCallback;
import com.genersoft.iot.vmp.jt1078.bean.JTRecordDownloadCatch;
import com.genersoft.iot.vmp.jt1078.event.FtpUploadEvent;
import com.genersoft.iot.vmp.jt1078.proc.response.J9206;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Scheduled;
@@ -19,7 +16,7 @@ import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class DownloadManager {
public class FtpDownloadManager {
private final Map<String, JTRecordDownloadCatch> downloadCatchMap = new ConcurrentHashMap<>();
private final DelayQueue<JTRecordDownloadCatch> downloadCatchQueue = new DelayQueue<>();

View File

@@ -92,8 +92,10 @@
设备录像</el-dropdown-item>
<el-dropdown-item command="cloudRecords" :disabled="device == null || device.online === 0">
云端录像</el-dropdown-item>
<!-- <el-dropdown-item command="shooting" v-bind:disabled="device == null || device.online === 0" >-->
<!-- 立即拍摄</el-dropdown-item>-->
<el-dropdown-item command="shooting" v-bind:disabled="device == null || device.online === 0" >
抓图</el-dropdown-item>
<el-dropdown-item command="searchData" v-bind:disabled="device == null || device.online === 0" >
数据检索</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
@@ -114,6 +116,7 @@
</div>
<devicePlayer ref="devicePlayer" />
<channelEdit v-if="jtChannel" ref="channelEdit" :jt-channel="jtChannel" :close-edit="closeEdit" />
<shooting ref="shooting" />
</div>
</template>
@@ -121,12 +124,14 @@
<script>
import devicePlayer from '../jtDevicePlayer.vue'
import channelEdit from './edit.vue'
import shooting from './shooting.vue'
export default {
name: 'ChannelList',
components: {
channelEdit,
devicePlayer
devicePlayer,
shooting
},
props: {
deviceId: {
@@ -240,6 +245,8 @@ export default {
this.queryRecords(itemData)
} else if (command === 'cloudRecords') {
this.queryCloudRecords(itemData)
} else if (command === 'shooting') {
this.shooting(itemData)
} else {
this.$message.info('尚不支持')
}
@@ -315,6 +322,12 @@ export default {
// 编辑
closeEdit(row) {
this.jtChannel = null
},
// 编辑
shooting(row) {
const baseUrl = window.baseUrl
let dev = (process.env.NODE_ENV === 'development' ? process.env.VUE_APP_BASE_API : baseUrl)
window.open(`${dev}/api/jt1078/snap?phoneNumber=${this.deviceId}&channelId=${row.channelId}`)
}
}
}

View File

@@ -498,39 +498,6 @@ export default {
}).finally(() => {
loading.close()
})
// const baseUrl = window.baseUrl ? window.baseUrl : ''
// const downloadFileUrl = ((process.env.NODE_ENV === 'development') ? process.env.VUE_APP_BASE_API : baseUrl) +
// `/api/jt1078/playback/download?phoneNumber=${this.phoneNumber}&channelId=${this.channelId}&startTime=${row.startTime}&endTime=${row.endTime}` +
// `&alarmSign=${row.alarmSign}&mediaType=${row.mediaType}&streamType=${row.streamType}&storageType=${row.storageType}&access-token=${this.$store.getters.token}`
// const x = new XMLHttpRequest()
// x.open('GET', downloadFileUrl, true)
// x.responseType = 'blob'
// x.onload = (e) => {
// const url = window.URL.createObjectURL(x.response)
// const a = document.createElement('a')
// a.href = url
// a.download = this.phoneNumber + '-' + this.channelId + '.mp4'
// a.click()
// loading.close()
// }
// x.ontimeout = (e) => {
// loading.close()
// this.$message.error({
// showClose: true,
// message: '加载超时'
// })
// }
// x.onerror = (e) => {
// loading.close()
// this.$message.error({
// showClose: true,
// message: e.error
// })
// }
// x.send()
},
getFileShowName(item) {
return moment(item.startTime).format('HH:mm:ss') + '-' + moment(item.endTime).format('HH:mm:ss')