Compare commits

..

6 Commits
master ... test

1
.gitignore vendored

@ -3,7 +3,6 @@ target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
logs/
all.log
all.log.*

@ -1,6 +0,0 @@
# 大华SDK调用
打包前需将大华SDK安装到Maven本地仓库项目下执行
mvn install:install-file -Dfile=./src/main/resources/sdk/netsdk-1.0-demo.jar -DgroupId=com.netsdk -DartifactId=netsdk -Dversion=1.0-demo -Dpackaging=jar

@ -14,7 +14,4 @@ import java.util.List;
public class DhFaceDevices {
private List<DhDevice> faceDevice = new ArrayList<>();
public DhDevice getDeviceByIp(String ip) {
return faceDevice.stream().filter(dhDevice -> dhDevice.getIp().equals(ip)).findFirst().orElse(null);
}
}

@ -14,7 +14,4 @@ import java.util.List;
public class DhRecordDevices {
private List<DhDevice> recordDevice = new ArrayList<>();
public DhDevice getDeviceByIp(String ip) {
return recordDevice.stream().filter(dhDevice -> dhDevice.getIp().equals(ip)).findFirst().orElse(null);
}
}

@ -2,21 +2,22 @@ package com.educoder.netsdk.controller;
import cn.hutool.core.map.MapUtil;
import com.educoder.netsdk.config.AppConfig;
import com.educoder.netsdk.config.DhRecordDevices;
import com.educoder.netsdk.model.*;
import com.educoder.netsdk.model.ApiResult;
import com.educoder.netsdk.model.DhModule;
import com.educoder.netsdk.model.DownloadRecordFileParam;
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.*;
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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author jshixiong
@ -32,169 +33,61 @@ 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);
String ip = downloadRecordFileParam.getIp();
NetSDKLib.LLong dhDownLoadLoginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip);
if (dhDownLoadLoginHandle == null) {
dhDownLoadLoginHandle = new NetSDKLib.LLong(0);
DhModule.dhDownLoadLoginHandleMap.put(ip, dhDownLoadLoginHandle);
// 已有下载任务,提示退出
if (DhModule.dhDownLoadLoginHandle.longValue() != 0 || DhModule.dhDownLoadByTimeHandle.longValue() != 0) {
return ApiResult.failResult(-1, "已有下载任务,请先停止下载并退出登录", getHandlerMap());
}
// 设置下载录像登录句柄
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);
long loginHandle = dhLoginService.login(downloadRecordFileParam.getIp(), downloadRecordFileParam.getPort(), appConfig.getSdkUsername(), appConfig.getSdkPassword());
if (loginHandle == 0){
log.error("下载录像前登录失败 downloadRecordFileParam:{}", downloadRecordFileParam);
return ApiResult.failResult(-1, "登录失败");
}
// 已有下载任务,提示退出
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));
}
DhModule.dhDownLoadLoginHandle = new NetSDKLib.LLong(loginHandle);
// 设置码流类型
dhDownLoadRecordService.setStreamType(0, dhDownLoadLoginHandle);
dhDownLoadRecordService.setStreamType(0, DhModule.dhDownLoadLoginHandle);
// 开始下载
String mp4SavePath = dhDownLoadRecordService.getMp4SavePath(downloadRecordFileParam.getCallbackUid(),
downloadRecordFileParam.getStTimeStart(), ip);
long downloadedHandle = dhDownLoadRecordService.downloadMp4ByTime(dhDownLoadLoginHandle, downloadRecordFileParam.getChannel(),
mp4SavePath,
long downloadedHandle = dhDownLoadRecordService.downloadRecordFile(DhModule.dhDownLoadLoginHandle, downloadRecordFileParam.getChannel(),
downloadRecordFileParam.getRecordFileType(),
dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeStart()),
dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeEnd()));
dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeEnd()),
dhDownLoadRecordService.getSavePath(downloadRecordFileParam.getCallbackUid()),
DhModule.DownLoadPosCallBackByTime.getInstance());
if (downloadedHandle == 0) {
log.error("下载录像失败 downloadRecordFileParam:{}", downloadRecordFileParam);
return ApiResult.failResult(-1, "下载录像失败");
}
dhDownLoadByTimeHandle.setValue(downloadedHandle);
// 存下载路径
DhModule.bridgeDownLoadFilePathMap.put(downloadedHandle, mp4SavePath);
log.info("[end] 下载录像 downloadRecordFileParam:{}", downloadRecordFileParam);
return ApiResult.successResult("正在下载录像", getHandlerMap(ip));
return ApiResult.successResult("正在下载录像", getHandlerMap());
}
@PostMapping("/stopDownload")
public ApiResult<?> stopDownload(@RequestParam String ip) {
log.info("[start] 停止下载");
@PostMapping("/stopAndLogout")
public ApiResult<?> stopAndLogout() {
log.info("[start] 停止下载并退出登录");
// 停止下载
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));
}
dhDownLoadRecordService.stopDownLoadRecordFile(DhModule.dhDownLoadLoginHandle);
private Map<String, Object> getHandlerMap(String ip) {
long loginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip).longValue();
// 下载录像登出
dhLoginService.logout(DhModule.dhDownLoadLoginHandle);
NetSDKLib.LLong downloadByTimeHandle = DhModule.dhDownLoadByTimeHandleMap.get(loginHandle);
long downloadHandle = downloadByTimeHandle == null ? 0 : downloadByTimeHandle.longValue();
log.info("[end] 停止下载并退出登录");
return ApiResult.successResult("停止下载并退出登录", getHandlerMap());
}
private Map<String, Object> getHandlerMap() {
return MapUtil.builder(new HashMap<String, Object>())
.put("loginHandle", loginHandle)
.put("downloadHandle", downloadHandle)
.put("loginHandle", DhModule.dhDownLoadLoginHandle.longValue())
.put("downloadHandle", DhModule.dhDownLoadByTimeHandle.longValue())
.build();
}
}

@ -3,7 +3,6 @@ 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.netsdk.lib.ToolKits;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -22,15 +21,6 @@ public class TestController {
@Autowired
private AppConfig appConfig;
@GetMapping("/getErr")
public ApiResult<?> one() {
log.info("[start]getErr ");
String errorCodePrint = ToolKits.getErrorCodePrint();
log.info("Err: {}" , errorCodePrint);
log.info("[end]getErr ");
return ApiResult.successResult(errorCodePrint);
}
@GetMapping("/one")
public ApiResult<?> one(@RequestParam String key1, @RequestParam long key2) {
log.info("[start]test ");

@ -45,35 +45,35 @@ public class Runner implements CommandLineRunner {
}
log.info("初始化SDK成功");
// 登录人脸识别设备
List<DhDevice> faceDevices = dhFaceDevices.getFaceDevice();
if (faceDevices == null || faceDevices.size() == 0) {
log.error("没有配置人脸识别设备 faceDevice");
dhLoginService.cleanup();
Runtime.getRuntime().exit(-1);
}
long loginHandle = dhLoginService.login(faceDevices.get(0).getIp(), faceDevices.get(0).getPort(),
appConfig.getSdkUsername(), appConfig.getSdkPassword());
if (loginHandle == 0) {
log.error("登录人脸识别设备失败");
dhLoginService.cleanup();
Runtime.getRuntime().exit(-1);
}
DhModule.dhFaceLoginHandle.setValue(loginHandle);
log.info("登录人脸识别设备成功");
// 订阅事件
Long aLong = dhTargetRecognitionService.realLoadPicture(0, DhModule.AnalyzerDataCallBack.getInstance(),
DhModule.dhFaceLoginHandle);
if (aLong == 0) {
log.error("订阅事件失败");
dhLoginService.cleanup();
Runtime.getRuntime().exit(-1);
}
log.info("订阅事件成功");
// // 登录人脸识别设备
// List<DhDevice> faceDevices = dhFaceDevices.getFaceDevice();
// if (faceDevices == null || faceDevices.size() == 0) {
// log.error("没有配置人脸识别设备 faceDevice");
// dhLoginService.cleanup();
// Runtime.getRuntime().exit(-1);
// }
//
// long loginHandle = dhLoginService.login(faceDevices.get(0).getIp(), faceDevices.get(0).getPort(),
// appConfig.getSdkUsername(), appConfig.getSdkPassword());
// if (loginHandle == 0) {
// log.error("登录人脸识别设备失败");
// dhLoginService.cleanup();
// Runtime.getRuntime().exit(-1);
// }
//
// DhModule.dhFaceLoginHandle.setValue(loginHandle);
// log.info("登录人脸识别设备成功");
//
// // 订阅事件
// Long aLong = dhTargetRecognitionService.realLoadPicture(0, DhModule.AnalyzerDataCallBack.getInstance(),
// DhModule.dhFaceLoginHandle);
// if (aLong == 0) {
// log.error("订阅事件失败");
// dhLoginService.cleanup();
// Runtime.getRuntime().exit(-1);
// }
//
// log.info("订阅事件成功");
log.info("初始化完成");
}

@ -11,11 +11,7 @@ import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -28,19 +24,14 @@ public class DhModule {
public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
// 人脸识别登录句柄
public static NetSDKLib.LLong dhFaceLoginHandle = new NetSDKLib.LLong(0);
// 设备登录的句柄 key=ip, val=登录句柄
public static Map<String, NetSDKLib.LLong> dhDownLoadLoginHandleMap = new HashMap<>();
// 单次下载录像句柄 key=登录句柄, val=下载句柄
public static Map<Long, NetSDKLib.LLong> dhDownLoadByTimeHandleMap = new HashMap<>();
// 按时间下载登录句柄
public static NetSDKLib.LLong dhDownLoadLoginHandle = new NetSDKLib.LLong(0);
// 下载录像在bridge的地址 key=下载句柄, val=文件路径
public static Map<Long, String> bridgeDownLoadFilePathMap = new HashMap<>();
// 按时间下载句柄
public static NetSDKLib.LLong dhDownLoadByTimeHandle = new NetSDKLib.LLong(0);
/**
* 线
@ -81,16 +72,7 @@ public class DhModule {
@Override
public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
if ("172.16.1.12".equals(pchDVRIP)) {
dhFaceLoginHandle.setValue(m_hLoginHandle.longValue());
}
NetSDKLib.LLong dhDownLoadLoginHand = dhDownLoadLoginHandleMap.get(pchDVRIP);
if (dhDownLoadLoginHand != null) {
dhDownLoadLoginHand.setValue(m_hLoginHandle.longValue());
}
log.warn("设备重连回调 ReConnect Device: {}, Port: {}, loginHandle: {}", pchDVRIP, nDVRPort, m_hLoginHandle.longValue());
log.warn("设备重连回调 ReConnect Device: {} Port: {}", pchDVRIP, nDVRPort);
}
}
@ -127,9 +109,9 @@ public class DhModule {
log.info("目标识别事件 dwAlarmType: {}, studentId: {}, studentName: {}, szUID: {}", dwAlarmType, studentId, studentName, szUid);
Map<String, Object> map = MapUtil.builder(new HashMap<String, Object>())
.put("user_name", studentName)
.put("student_id", studentId)
.put("sz_uid", szUid)
.put("studentName", studentName)
.put("studentId", studentId)
.put("szUid", szUid)
.build();
String s = OKHttp3Utils3.requestPost(AppConfig.getStaticRecognitionCallBack(), map);
log.info("目标识别事件ruby回调 url: {} 返回值: {}", AppConfig.getStaticRecognitionCallBack(), s);
@ -147,7 +129,7 @@ public class DhModule {
private DownLoadPosCallBackByTime() {}
private static class CallBackHolder {
private static final DhModule.DownLoadPosCallBackByTime instance = new DhModule.DownLoadPosCallBackByTime();
private static DhModule.DownLoadPosCallBackByTime instance = new DhModule.DownLoadPosCallBackByTime();
}
public static DhModule.DownLoadPosCallBackByTime getInstance() {
@ -156,85 +138,34 @@ public class DhModule {
@Override
public void invoke(NetSDKLib.LLong lLoginID, final int dwTotalSize, final int dwDownLoadSize, int index, NetSDKLib.NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) {
BigDecimal bd1 = new BigDecimal(dwDownLoadSize);
BigDecimal bd2 = new BigDecimal(dwTotalSize);
BigDecimal bdResult = bd1.divide(bd2, 3, RoundingMode.HALF_UP);
if(judgeResult(bdResult)) {
log.info("下载进度回调 lLoginID: {}, dwTotalSize: {}, dwDownLoadSize: {}",lLoginID.longValue() , dwTotalSize, dwDownLoadSize);
}
log.info("下载进度回调 dwTotalSize: {}, dwDownLoadSize: {}", dwTotalSize, dwDownLoadSize);
if(dwDownLoadSize == -1 || (dwDownLoadSize / dwTotalSize) == 1) {
log.info("下载完成");
// 回调ruby
String bridgeFilePath = bridgeDownLoadFilePathMap.get(lLoginID.longValue());
log.info("下载进度回调 下载文件路径: {}", bridgeFilePath);
if (bridgeFilePath != null) {
String course = bridgeFilePath.replace(AppConfig.getStaticRecordSavePath() + "/", "").split("_")[0];
Map<String, Object> map = MapUtil.builder(new HashMap<String, Object>())
.put("file", bridgeFilePath)
.put("course", course)
.build();
String s = OKHttp3Utils3.requestPost(AppConfig.getStaticRecordCallBack(), map);
log.info("下载进度ruby回调 url: {} 返回值: {}", AppConfig.getStaticRecordCallBack(), s);
} else {
log.error("下载文件路径为空!");
}
// 停止下载
log.info("下载句柄:{}", dhDownLoadByTimeHandleMap);
if (lLoginID.longValue() != 0) {
Thread stopThread = new Thread(() -> {
log.info("stop download thread run...");
netsdk.CLIENT_StopDownload(lLoginID);
});
bridgeDownLoadFilePathMap.remove(lLoginID.longValue());
dhDownLoadByTimeHandleMap.forEach((k, v) -> {
if (v.longValue() == lLoginID.longValue()) {
dhDownLoadByTimeHandleMap.put(k, new NetSDKLib.LLong(0));
}
});
stopThread.start();
if (dhDownLoadByTimeHandle.longValue() != 0) {
netsdk.CLIENT_StopDownload(dhDownLoadByTimeHandle);
dhDownLoadByTimeHandle.setValue(0);
}
}
}
}
private static boolean judgeResult(BigDecimal num) {
List<String> strings = new ArrayList<>();
strings.add("0.100");
strings.add("0.200");
strings.add("0.300");
strings.add("0.400");
strings.add("0.500");
strings.add("0.600");
strings.add("0.700");
strings.add("0.800");
strings.add("0.900");
strings.add("0.990");
return strings.contains(num.toString());
}
public static class DownLoadDataCallBack implements NetSDKLib.fDataCallBack {
private DownLoadDataCallBack() {}
private static class DownloadDataCallBackHolder {
private static final DownLoadDataCallBack dataCB = new DownLoadDataCallBack();
}
public static DownLoadDataCallBack getInstance() {
return DownloadDataCallBackHolder.dataCB;
}
// 登出
if (dhDownLoadLoginHandle.longValue() != 0) {
boolean bRet = netsdk.CLIENT_Logout(dhDownLoadLoginHandle);
if (bRet) {
dhDownLoadLoginHandle.setValue(0);
}
}
@Override
public int invoke(NetSDKLib.LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, Pointer dwUser) {
// if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS)) {
// System.out.println("DownLoad DataCallBack [ " + dwDataType +" ]");
// }
return 0;
// 回调ruby
String daveFilePath = new String(recordfileinfo.filename);
log.info("下载进度回调 下载文件路径: {}", daveFilePath);
String course = daveFilePath.replace(AppConfig.getStaticRecordSavePath(), "").split("_")[0];
Map<String, Object> map = MapUtil.builder(new HashMap<String, Object>())
.put("file", daveFilePath)
.put("course", course)
.build();
String s = OKHttp3Utils3.requestPost(AppConfig.getStaticRecordCallBack(), map);
log.info("下载进度ruby回调 url: {} 返回值: {}", AppConfig.getStaticRecordCallBack(), s);
}
}
}
}

@ -19,9 +19,9 @@ public class DownloadRecordFileParam implements Serializable {
@NotBlank
private String ip;
private Integer port = 37777;
private Integer port = 22;
private Integer channel = 7;
private Integer channel = 2;
private Integer recordFileType = 0;

@ -1,38 +0,0 @@
package com.educoder.netsdk.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
*
* @author jshixiong
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class QueryRecordParam implements Serializable {
@NotBlank
private String ip;
private Integer port = 37777;
private Integer channel = -1;
/**
*
* yyyy-MM-dd HH:mm:ss
*/
@NotBlank
private String stTimeStart;
/**
*
* yyyy-MM-dd HH:mm:ss
*/
@NotBlank
private String stTimeEnd;
}

@ -1,21 +0,0 @@
package com.educoder.netsdk.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RecordInfo implements Serializable {
private Integer driveNo;
private String fileName;
private String startTime;
private String endTime;
}

@ -1,10 +1,8 @@
package com.educoder.netsdk.service;
import com.educoder.netsdk.config.AppConfig;
import com.educoder.netsdk.model.DhModule;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -14,13 +12,10 @@ import org.springframework.stereotype.Service;
import java.io.File;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.educoder.netsdk.model.DhModule.configsdk;
import static com.educoder.netsdk.model.DhModule.netsdk;
import static com.educoder.netsdk.model.DhModule.dhDownLoadByTimeHandle;
@Service
@Slf4j
@ -30,88 +25,6 @@ public class DhDownLoadRecordService {
@Autowired
private AppConfig appConfig;
public boolean startRecord(NetSDKLib.LLong dhLoginHandle, int nChannelId) {
NetSDKLib.AV_CFG_RecordMode recordMode = new NetSDKLib.AV_CFG_RecordMode();
getDevConfig(dhLoginHandle, nChannelId, NetSDKLib.CFG_CMD_RECORDMODE, recordMode);
log.info("录像模式:" + recordMode.nMode + " " + "辅码流录像模式:" + recordMode.nModeExtra1);
recordMode.nMode = 1;
recordMode.nModeExtra1 = 2;
boolean b = setDevConfig(dhLoginHandle, nChannelId, NetSDKLib.CFG_CMD_RECORDMODE, recordMode);
if (!b) {
log.error("开启录像失败 last error: {}", ToolKits.getErrorCodePrint());
}
return b;
}
public boolean stopRecord(NetSDKLib.LLong dhLoginHandle, int nChannelId) {
NetSDKLib.AV_CFG_RecordMode recordMode = new NetSDKLib.AV_CFG_RecordMode();
getDevConfig(dhLoginHandle, nChannelId, NetSDKLib.CFG_CMD_RECORDMODE, recordMode);
log.info("录像模式:" + recordMode.nMode + " " + "辅码流录像模式:" + recordMode.nModeExtra1);
recordMode.nMode = 2;
recordMode.nModeExtra1 = 2;
boolean b = setDevConfig(dhLoginHandle, nChannelId, NetSDKLib.CFG_CMD_RECORDMODE, recordMode);
if (!b) {
log.error("停止录像失败 last error: {}", ToolKits.getErrorCodePrint());
}
return b;
}
public List<NetSDKLib.NET_RECORDFILE_INFO> queryRecordFile(NetSDKLib.LLong downloadLoginHandle, int nChannelId,
NetSDKLib.NET_TIME stTimeStart, NetSDKLib.NET_TIME stTimeEnd) {
NetSDKLib.NET_RECORDFILE_INFO[] stFileInfo = (NetSDKLib.NET_RECORDFILE_INFO[])new NetSDKLib.NET_RECORDFILE_INFO().toArray(120);
IntByReference nFindCount = new IntByReference(0);
int nRecordFileType = 0;
boolean bRet = netsdk.CLIENT_QueryRecordFile(downloadLoginHandle, nChannelId,
nRecordFileType, stTimeStart, stTimeEnd, null, stFileInfo,
stFileInfo.length * stFileInfo[0].size(), nFindCount, 5000, false);
if(bRet) {
log.info("QueryRecordFile Succeed! " + "查询到的视频个数:" + nFindCount.getValue());
} else {
log.error("QueryRecordFile Failed! 错误: {}", ToolKits.getErrorCodePrint());
return null;
}
ArrayList<NetSDKLib.NET_RECORDFILE_INFO> netRecordFileInfos = new ArrayList<>(Arrays.asList(stFileInfo).subList(0, nFindCount.getValue()));
// log.info("查询到的视频:" + netRecordFileInfos);
return netRecordFileInfos;
}
public long downloadMp4ByTime(NetSDKLib.LLong downloadLoginHandle, int nChannelId, String savedFileName,
NetSDKLib.NET_TIME stTimeStart, NetSDKLib.NET_TIME stTimeEnd) {
NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE();
stIn.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_MP4; // 私有码流
stIn.emRecordType = NetSDKLib.EM_QUERY_RECORD_TYPE.EM_RECORD_TYPE_ALL; // 所有录像
stIn.nChannelID = nChannelId;
stIn.stStartTime = stTimeStart; // 开始时间
stIn.stStopTime = stTimeEnd; // 结束时间
stIn.cbDownLoadPos = DhModule.DownLoadPosCallBackByTime.getInstance();
stIn.dwPosUser = null;
stIn.fDownLoadDataCallBack = DhModule.DownLoadDataCallBack.getInstance();
stIn.dwDataUser = null;
stIn.szSavedFileName = savedFileName;
NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE();
stIn.write();
stOut.write();
NetSDKLib.LLong downloadMp4Handle = netsdk.CLIENT_DownloadByDataType(downloadLoginHandle, stIn.getPointer(), stOut.getPointer(), 5000);
if(downloadMp4Handle.longValue() != 0) {
log.info("downloadMp4ByTime Succeed!");
} else {
log.error("downloadMp4ByTime Failed! Error: {}", ToolKits.getErrorCodePrint());
}
return downloadMp4Handle.longValue();
}
public long downloadRecordFile(NetSDKLib.LLong downloadLoginHandle, int nChannelId, int nRecordFileType,
NetSDKLib.NET_TIME stTimeStart, NetSDKLib.NET_TIME stTimeEnd, String savedFileName,
@ -121,20 +34,20 @@ public class DhDownLoadRecordService {
path.mkdirs();
}
NetSDKLib.LLong dhDownLoadByTimeHandle = netsdk.CLIENT_DownloadByTimeEx(downloadLoginHandle, nChannelId, nRecordFileType,
dhDownLoadByTimeHandle = netsdk.CLIENT_DownloadByTimeEx(downloadLoginHandle, nChannelId, nRecordFileType,
stTimeStart, stTimeEnd, savedFileName,
cbTimeDownLoadPos, null, null, null, null);
if(dhDownLoadByTimeHandle.longValue() != 0) {
log.info("Downloading RecordFile!");
System.out.println("Downloading RecordFile!");
} else {
log.error("Download RecordFile Failed! Get last error: " + ToolKits.getErrorCodePrint());
System.err.println("Download RecordFile Failed!" + ToolKits.getErrorCodePrint());
}
return dhDownLoadByTimeHandle.longValue();
}
/**
*
*
* @param m_streamType
*/
public void setStreamType(int m_streamType, NetSDKLib.LLong dhLoginHandle) {
@ -144,19 +57,18 @@ public class DhDownLoadRecordService {
boolean bret = netsdk.CLIENT_SetDeviceMode(dhLoginHandle, emType, steamType.getPointer());
if (!bret) {
log.error("Set Stream Type Failed, Get last error: " + ToolKits.getErrorCodePrint());
System.err.println("Set Stream Type Failed, Get last error." + ToolKits.getErrorCodePrint());
} else {
log.info("Set Stream Type Succeed!");
System.out.println("Set Stream Type Succeed!");
}
}
public void stopDownLoadRecordFile(NetSDKLib.LLong dhDownLoadHandle) {
if (dhDownLoadHandle == null || dhDownLoadHandle.longValue() == 0) {
if (dhDownLoadHandle.longValue() == 0) {
return;
}
netsdk.CLIENT_StopDownload(dhDownLoadHandle);
DhModule.bridgeDownLoadFilePathMap.remove(dhDownLoadHandle.longValue());
dhDownLoadHandle.setValue(0);
}
@ -183,61 +95,10 @@ public class DhDownLoadRecordService {
return netTime;
}
public String getSavePath(String uid) {
String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
return appConfig.getRecordSavePath() + "/" +
uid + "_" + format + ".dav";
}
public String getMp4SavePath(String uid, String startTime, String ip) {
LocalDateTime time = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
String format = time.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
return appConfig.getRecordSavePath() + "/" +
uid + "_" + format + "_" + ip.replaceAll("\\.", "") + ".mp4";
}
private boolean setDevConfig(NetSDKLib.LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) {
int nBufferLen = 2*1024*1024;
byte[] szBuffer = new byte[nBufferLen];
IntByReference error = new IntByReference(0);
IntByReference restart = new IntByReference(0);
cmdObject.write();
if (configsdk.CLIENT_PacketData(strCmd, cmdObject.getPointer(), cmdObject.size(),
szBuffer, nBufferLen)) {
cmdObject.read();
if( netsdk.CLIENT_SetNewDevConfig(hLoginHandle, strCmd , nChn , szBuffer, nBufferLen, error, restart, 3000)) {
return true;
} else {
log.error("Set {} Config Failed! Last Error: {}" , strCmd , ToolKits.getErrorCodePrint());
return false;
}
} else {
log.error("Packet " + strCmd + " Config Failed! " + ToolKits.getErrorCodePrint());
return false;
}
}
private boolean getDevConfig(NetSDKLib.LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) {
IntByReference error = new IntByReference(0);
int nBufferLen = 2*1024*1024;
byte[] strBuffer = new byte[nBufferLen];
if(netsdk.CLIENT_GetNewDevConfig( hLoginHandle, strCmd , nChn, strBuffer, nBufferLen,error,3000,null)) {
cmdObject.write();
if (configsdk.CLIENT_ParseData(strCmd, strBuffer, cmdObject.getPointer(),
cmdObject.size(), null)) {
cmdObject.read();
return true;
} else {
log.error("Parse " + strCmd + " Config Failed! " + ToolKits.getErrorCodePrint());
return false;
}
} else {
log.error("Get {} Config Failed!Last Error: {}", strCmd, ToolKits.getErrorCodePrint());
return false;
}
}
}

@ -95,9 +95,9 @@ public class DhLoginService {
pstOutParam.stuDeviceInfo=m_stDeviceInfo;
NetSDKLib.LLong dhLoginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam);
if(dhLoginHandle.longValue() == 0) {
log.error("登录失败 Login DeviceIp: {}, Port: {}, Failed. {}", deviceIp, port, ToolKits.getErrorCodePrint());
log.error("登录失败 Login DeviceIp: {} Port: {} Failed. {}", deviceIp, port, ToolKits.getErrorCodePrint());
} else {
log.info("登录成功 Login Success DeviceIp: {}, port: {}, dhLoginHandle: {}", deviceIp, port, dhLoginHandle);
log.info("登录成功 Login Success DeviceIp: {} port: {}", deviceIp, port);
}
return dhLoginHandle.longValue();

@ -275,7 +275,7 @@ public class DhTargetRecognitionService {
log.info("添加人员成功 personName: {}, szUID: {} ", personName, uid);
return uid;
} else {
log.error("添加人员失败 personName: {}, e: {}", personName, ToolKits.getErrorCodePrint());
log.error("添加人员失败 personName: {}", personName);
}
return null;

@ -51,7 +51,7 @@ logging:
level:
root: info
file:
name: logs/all.log
name: all.log
sdkconfig:
username: admin

Loading…
Cancel
Save