|
|
|
|
@ -2,22 +2,21 @@ package com.educoder.netsdk.controller;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
|
|
import com.educoder.netsdk.config.AppConfig;
|
|
|
|
|
import com.educoder.netsdk.model.ApiResult;
|
|
|
|
|
import com.educoder.netsdk.model.DhModule;
|
|
|
|
|
import com.educoder.netsdk.model.DownloadRecordFileParam;
|
|
|
|
|
import com.educoder.netsdk.config.DhRecordDevices;
|
|
|
|
|
import com.educoder.netsdk.model.*;
|
|
|
|
|
import com.educoder.netsdk.service.DhDownLoadRecordService;
|
|
|
|
|
import com.educoder.netsdk.service.DhLoginService;
|
|
|
|
|
import com.netsdk.lib.NetSDKLib;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
|
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author jshixiong
|
|
|
|
|
@ -33,61 +32,169 @@ public class DhDownLoadRecordController {
|
|
|
|
|
@Autowired
|
|
|
|
|
private DhLoginService dhLoginService;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private DhRecordDevices dhRecordDevices;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private AppConfig appConfig;
|
|
|
|
|
|
|
|
|
|
@PostMapping("/startRecord")
|
|
|
|
|
public ApiResult<?> startRecord(@RequestParam String ip, @RequestParam Integer channel) {
|
|
|
|
|
log.info("[start] 开始录制 channel: {}", channel);
|
|
|
|
|
NetSDKLib.LLong dhDownLoadLoginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip);
|
|
|
|
|
if (dhDownLoadLoginHandle == null) {
|
|
|
|
|
dhDownLoadLoginHandle = new NetSDKLib.LLong(0);
|
|
|
|
|
DhModule.dhDownLoadLoginHandleMap.put(ip, dhDownLoadLoginHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置下载录像登录句柄
|
|
|
|
|
int port = dhRecordDevices.getDeviceByIp(ip).getPort();
|
|
|
|
|
if (dhDownLoadLoginHandle.longValue() == 0) {
|
|
|
|
|
long loginHandle = dhLoginService.login(ip, port, appConfig.getSdkUsername(), appConfig.getSdkPassword());
|
|
|
|
|
if (loginHandle == 0){
|
|
|
|
|
log.error("开始录制前登录失败 ip: {}, port: {}", ip, port);
|
|
|
|
|
return ApiResult.failResult(-1, "登录失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dhDownLoadLoginHandle.setValue(loginHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
boolean b = dhDownLoadRecordService.startRecord(dhDownLoadLoginHandle, channel);
|
|
|
|
|
log.info("[end] 开始录制 channel:{}, loginHandler: {}", channel, dhDownLoadLoginHandle.longValue());
|
|
|
|
|
return b ? ApiResult.successResult("开始录制", ip) : ApiResult.failResult(-1, "开始录制失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostMapping("/stopRecord")
|
|
|
|
|
public ApiResult<?> stopRecord(@RequestParam String ip, @RequestParam Integer channel) {
|
|
|
|
|
log.info("[start] 停止录制 channel: {}", channel);
|
|
|
|
|
NetSDKLib.LLong loginHandler = DhModule.dhDownLoadLoginHandleMap.get(ip);
|
|
|
|
|
boolean b = dhDownLoadRecordService.stopRecord(loginHandler, channel);
|
|
|
|
|
log.info("[end] 停止录制 channel:{}, loginHandler: {}", channel, loginHandler.longValue());
|
|
|
|
|
return b ? ApiResult.successResult("停止录制", ip) : ApiResult.failResult(-1, "停止录制失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostMapping("/query")
|
|
|
|
|
public ApiResult<?> queryRecordFile(@RequestBody @Validated QueryRecordParam queryRecordParam) {
|
|
|
|
|
log.info("[start] 查询录像 queryRecordParam: {}", queryRecordParam);
|
|
|
|
|
String ip = queryRecordParam.getIp();
|
|
|
|
|
NetSDKLib.LLong dhDownLoadLoginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip);
|
|
|
|
|
if (dhDownLoadLoginHandle == null) {
|
|
|
|
|
dhDownLoadLoginHandle = new NetSDKLib.LLong(0);
|
|
|
|
|
DhModule.dhDownLoadLoginHandleMap.put(ip, dhDownLoadLoginHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置录像登录句柄
|
|
|
|
|
if (dhDownLoadLoginHandle.longValue() == 0) {
|
|
|
|
|
long loginHandle = dhLoginService.login(ip, queryRecordParam.getPort(), appConfig.getSdkUsername(), appConfig.getSdkPassword());
|
|
|
|
|
if (loginHandle == 0){
|
|
|
|
|
log.error("查询录像前登录失败 queryRecordParam:{}", queryRecordParam);
|
|
|
|
|
return ApiResult.failResult(-1, "登录失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dhDownLoadLoginHandle.setValue(loginHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<NetSDKLib.NET_RECORDFILE_INFO> netRecordFileInfos = dhDownLoadRecordService.queryRecordFile(
|
|
|
|
|
dhDownLoadLoginHandle, queryRecordParam.getChannel(),
|
|
|
|
|
dhDownLoadRecordService.getNetTimeByString(queryRecordParam.getStTimeStart()),
|
|
|
|
|
dhDownLoadRecordService.getNetTimeByString(queryRecordParam.getStTimeEnd()));
|
|
|
|
|
|
|
|
|
|
List<RecordInfo> recordInfos = new ArrayList<>();
|
|
|
|
|
for (NetSDKLib.NET_RECORDFILE_INFO netRecordFileInfo : netRecordFileInfos) {
|
|
|
|
|
RecordInfo recordInfo = new RecordInfo();
|
|
|
|
|
recordInfo.setDriveNo(netRecordFileInfo.driveno);
|
|
|
|
|
recordInfo.setFileName(new String(netRecordFileInfo.filename).trim());
|
|
|
|
|
recordInfo.setStartTime(netRecordFileInfo.starttime.toStringTimeEx());
|
|
|
|
|
recordInfo.setEndTime(netRecordFileInfo.endtime.toStringTimeEx());
|
|
|
|
|
recordInfos.add(recordInfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据开始时间去重
|
|
|
|
|
List<RecordInfo> recordInfos2 = new ArrayList<>(recordInfos.stream()
|
|
|
|
|
.collect(Collectors.toMap(
|
|
|
|
|
RecordInfo::getStartTime,
|
|
|
|
|
recordInfo -> recordInfo,
|
|
|
|
|
(existing, replacement) -> existing))
|
|
|
|
|
.values());
|
|
|
|
|
|
|
|
|
|
log.info("[end] 查询录像 去重后 recordInfos: {}", recordInfos2);
|
|
|
|
|
return ApiResult.successResult("查询成功", recordInfos2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostMapping("/download")
|
|
|
|
|
public ApiResult<?> download(@RequestBody @Validated DownloadRecordFileParam downloadRecordFileParam) {
|
|
|
|
|
log.info("[start] 下载录像 downloadRecordFileParam:{}", downloadRecordFileParam);
|
|
|
|
|
// 已有下载任务,提示退出
|
|
|
|
|
if (DhModule.dhDownLoadLoginHandle.longValue() != 0 || DhModule.dhDownLoadByTimeHandle.longValue() != 0) {
|
|
|
|
|
return ApiResult.failResult(-1, "已有下载任务,请先停止下载并退出登录", getHandlerMap());
|
|
|
|
|
String ip = downloadRecordFileParam.getIp();
|
|
|
|
|
NetSDKLib.LLong dhDownLoadLoginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip);
|
|
|
|
|
if (dhDownLoadLoginHandle == null) {
|
|
|
|
|
dhDownLoadLoginHandle = new NetSDKLib.LLong(0);
|
|
|
|
|
DhModule.dhDownLoadLoginHandleMap.put(ip, dhDownLoadLoginHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置下载录像登录句柄
|
|
|
|
|
long loginHandle = dhLoginService.login(downloadRecordFileParam.getIp(), downloadRecordFileParam.getPort(), appConfig.getSdkUsername(), appConfig.getSdkPassword());
|
|
|
|
|
if (loginHandle == 0){
|
|
|
|
|
log.error("下载录像前登录失败 downloadRecordFileParam:{}", downloadRecordFileParam);
|
|
|
|
|
return ApiResult.failResult(-1, "登录失败");
|
|
|
|
|
if (dhDownLoadLoginHandle.longValue() == 0) {
|
|
|
|
|
long loginHandle = dhLoginService.login(ip, downloadRecordFileParam.getPort(), appConfig.getSdkUsername(), appConfig.getSdkPassword());
|
|
|
|
|
if (loginHandle == 0){
|
|
|
|
|
log.error("下载录像前登录失败 downloadRecordFileParam:{}", downloadRecordFileParam);
|
|
|
|
|
return ApiResult.failResult(-1, "登录失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dhDownLoadLoginHandle.setValue(loginHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DhModule.dhDownLoadLoginHandle = new NetSDKLib.LLong(loginHandle);
|
|
|
|
|
// 已有下载任务,提示退出
|
|
|
|
|
NetSDKLib.LLong dhDownLoadByTimeHandle = DhModule.dhDownLoadByTimeHandleMap.get(dhDownLoadLoginHandle.longValue());
|
|
|
|
|
if (dhDownLoadByTimeHandle == null) {
|
|
|
|
|
dhDownLoadByTimeHandle = new NetSDKLib.LLong(0);
|
|
|
|
|
DhModule.dhDownLoadByTimeHandleMap.put(dhDownLoadLoginHandle.longValue(), dhDownLoadByTimeHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (dhDownLoadByTimeHandle.longValue() != 0) {
|
|
|
|
|
return ApiResult.failResult(-1, "已有下载任务,请先停止下载", getHandlerMap(ip));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置码流类型
|
|
|
|
|
dhDownLoadRecordService.setStreamType(0, DhModule.dhDownLoadLoginHandle);
|
|
|
|
|
dhDownLoadRecordService.setStreamType(0, dhDownLoadLoginHandle);
|
|
|
|
|
|
|
|
|
|
// 开始下载
|
|
|
|
|
long downloadedHandle = dhDownLoadRecordService.downloadRecordFile(DhModule.dhDownLoadLoginHandle, downloadRecordFileParam.getChannel(),
|
|
|
|
|
downloadRecordFileParam.getRecordFileType(),
|
|
|
|
|
String mp4SavePath = dhDownLoadRecordService.getMp4SavePath(downloadRecordFileParam.getCallbackUid(),
|
|
|
|
|
downloadRecordFileParam.getStTimeStart(), ip);
|
|
|
|
|
long downloadedHandle = dhDownLoadRecordService.downloadMp4ByTime(dhDownLoadLoginHandle, downloadRecordFileParam.getChannel(),
|
|
|
|
|
mp4SavePath,
|
|
|
|
|
dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeStart()),
|
|
|
|
|
dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeEnd()),
|
|
|
|
|
dhDownLoadRecordService.getSavePath(downloadRecordFileParam.getCallbackUid()),
|
|
|
|
|
DhModule.DownLoadPosCallBackByTime.getInstance());
|
|
|
|
|
dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeEnd()));
|
|
|
|
|
if (downloadedHandle == 0) {
|
|
|
|
|
log.error("下载录像失败 downloadRecordFileParam:{}", downloadRecordFileParam);
|
|
|
|
|
return ApiResult.failResult(-1, "下载录像失败");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ApiResult.successResult("正在下载录像", getHandlerMap());
|
|
|
|
|
dhDownLoadByTimeHandle.setValue(downloadedHandle);
|
|
|
|
|
// 存下载路径
|
|
|
|
|
DhModule.bridgeDownLoadFilePathMap.put(downloadedHandle, mp4SavePath);
|
|
|
|
|
log.info("[end] 下载录像 downloadRecordFileParam:{}", downloadRecordFileParam);
|
|
|
|
|
return ApiResult.successResult("正在下载录像", getHandlerMap(ip));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@PostMapping("/stopAndLogout")
|
|
|
|
|
public ApiResult<?> stopAndLogout() {
|
|
|
|
|
log.info("[start] 停止下载并退出登录");
|
|
|
|
|
@PostMapping("/stopDownload")
|
|
|
|
|
public ApiResult<?> stopDownload(@RequestParam String ip) {
|
|
|
|
|
log.info("[start] 停止下载");
|
|
|
|
|
// 停止下载
|
|
|
|
|
dhDownLoadRecordService.stopDownLoadRecordFile(DhModule.dhDownLoadLoginHandle);
|
|
|
|
|
NetSDKLib.LLong dhDownLoadLoginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip);
|
|
|
|
|
long l = dhDownLoadLoginHandle == null ? 0 : dhDownLoadLoginHandle.longValue();
|
|
|
|
|
dhDownLoadRecordService.stopDownLoadRecordFile(DhModule.dhDownLoadByTimeHandleMap.get(l));
|
|
|
|
|
log.info("[end] 停止下载");
|
|
|
|
|
return ApiResult.successResult("停止下载", getHandlerMap(ip));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 下载录像登出
|
|
|
|
|
dhLoginService.logout(DhModule.dhDownLoadLoginHandle);
|
|
|
|
|
private Map<String, Object> getHandlerMap(String ip) {
|
|
|
|
|
long loginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip).longValue();
|
|
|
|
|
|
|
|
|
|
log.info("[end] 停止下载并退出登录");
|
|
|
|
|
return ApiResult.successResult("停止下载并退出登录", getHandlerMap());
|
|
|
|
|
}
|
|
|
|
|
NetSDKLib.LLong downloadByTimeHandle = DhModule.dhDownLoadByTimeHandleMap.get(loginHandle);
|
|
|
|
|
long downloadHandle = downloadByTimeHandle == null ? 0 : downloadByTimeHandle.longValue();
|
|
|
|
|
|
|
|
|
|
private Map<String, Object> getHandlerMap() {
|
|
|
|
|
return MapUtil.builder(new HashMap<String, Object>())
|
|
|
|
|
.put("loginHandle", DhModule.dhDownLoadLoginHandle.longValue())
|
|
|
|
|
.put("downloadHandle", DhModule.dhDownLoadByTimeHandle.longValue())
|
|
|
|
|
.put("loginHandle", loginHandle)
|
|
|
|
|
.put("downloadHandle", downloadHandle)
|
|
|
|
|
.build();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|