diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/VirtualFtpFile.java b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/VirtualFtpFile.java index a30fbddd5..5ee48ab0b 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/VirtualFtpFile.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/ftpServer/VirtualFtpFile.java @@ -155,7 +155,6 @@ public class VirtualFtpFile implements FtpFile { @Override public OutputStream createOutputStream(long offset) throws IOException { - System.out.println("createOutputStream++++"); return outputStream; } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTMediaEventInfo.java b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTMediaEventInfo.java index 1468107ec..6622d87f9 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTMediaEventInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/bean/JTMediaEventInfo.java @@ -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 + '}'; } } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/codec/decode/MultiPacketManager.java b/src/main/java/com/genersoft/iot/vmp/jt1078/codec/decode/MultiPacketManager.java index 7a3778714..2073cdbc2 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/codec/decode/MultiPacketManager.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/codec/decode/MultiPacketManager.java @@ -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 multiPackets = packetMap.computeIfAbsent(key, k -> new ArrayList<>(packet.getCount())); multiPackets.add(packet); packetTimeMap.put(key, System.currentTimeMillis()); 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 44def5ffd..b73908f90 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 @@ -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 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 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 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 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 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 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 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 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> queryAreaForCircle(String phoneNumber, @RequestParam(value = "ids", required = false) List 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 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 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 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> queryAreaForRectangle(String phoneNumber, @RequestParam(value = "ids", required = false) List 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 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> queryAreaForPolygon(String phoneNumber, @RequestParam(value = "ids", required = false) List 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 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> queryRoute(String phoneNumber, @RequestParam(value = "ids", required = false) List 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 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> 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> 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>> 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, diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078TerminalController.java b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078TerminalController.java index 3c9036bef..eb8c665a7 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078TerminalController.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/controller/JT1078TerminalController.java @@ -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){ diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/event/MediaFileUploadEvent.java b/src/main/java/com/genersoft/iot/vmp/jt1078/event/MediaFileUploadEvent.java new file mode 100644 index 000000000..ef582c211 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/event/MediaFileUploadEvent.java @@ -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; +} diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0801.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0801.java index 9cd7d8770..dee2cbd5c 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0801.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0801.java @@ -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; diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0A00.java b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0A00.java index 1b48687db..7f7d4e69b 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0A00.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/proc/request/J0A00.java @@ -18,6 +18,7 @@ public class J0A00 extends Re { /** * 透传消息类型, 0x00: GNSS 模块详细定位数据, 0X0B: 道路运输证 IC卡信息, 0X41: 串口1 透传, 0X42: 串口2 透传, 0XF0 ~ 0XFF: 用户自定义透传 */ + private Integer type; /** 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 1323925c0..8358f14b6 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 @@ -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); + } 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 56ce86d7a..1ae58730d 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,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 ids = (List) 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(), "数据写入异常"); + } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/jt1078/session/DownloadManager.java b/src/main/java/com/genersoft/iot/vmp/jt1078/session/FtpDownloadManager.java similarity index 94% rename from src/main/java/com/genersoft/iot/vmp/jt1078/session/DownloadManager.java rename to src/main/java/com/genersoft/iot/vmp/jt1078/session/FtpDownloadManager.java index 25d91bbe4..01ce90b97 100644 --- a/src/main/java/com/genersoft/iot/vmp/jt1078/session/DownloadManager.java +++ b/src/main/java/com/genersoft/iot/vmp/jt1078/session/FtpDownloadManager.java @@ -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 downloadCatchMap = new ConcurrentHashMap<>(); private final DelayQueue downloadCatchQueue = new DelayQueue<>(); diff --git a/web/src/views/jtDevice/channel/index.vue b/web/src/views/jtDevice/channel/index.vue index 22be1e82a..2f5cd91c0 100755 --- a/web/src/views/jtDevice/channel/index.vue +++ b/web/src/views/jtDevice/channel/index.vue @@ -92,8 +92,10 @@ 设备录像 云端录像 - - + + 抓图 + + 数据检索 @@ -114,6 +116,7 @@ + @@ -121,12 +124,14 @@