Compare commits

..

6 Commits
master ... test

1
.gitignore vendored

@ -3,7 +3,6 @@ target/
!.mvn/wrapper/maven-wrapper.jar !.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/ !**/src/main/**/target/
!**/src/test/**/target/ !**/src/test/**/target/
logs/
all.log all.log
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 { public class DhFaceDevices {
private List<DhDevice> faceDevice = new ArrayList<>(); 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 { public class DhRecordDevices {
private List<DhDevice> recordDevice = new ArrayList<>(); 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 cn.hutool.core.map.MapUtil;
import com.educoder.netsdk.config.AppConfig; import com.educoder.netsdk.config.AppConfig;
import com.educoder.netsdk.config.DhRecordDevices; import com.educoder.netsdk.model.ApiResult;
import com.educoder.netsdk.model.*; import com.educoder.netsdk.model.DhModule;
import com.educoder.netsdk.model.DownloadRecordFileParam;
import com.educoder.netsdk.service.DhDownLoadRecordService; import com.educoder.netsdk.service.DhDownLoadRecordService;
import com.educoder.netsdk.service.DhLoginService; import com.educoder.netsdk.service.DhLoginService;
import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; 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.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* @author jshixiong * @author jshixiong
@ -32,169 +33,61 @@ public class DhDownLoadRecordController {
@Autowired @Autowired
private DhLoginService dhLoginService; private DhLoginService dhLoginService;
@Autowired
private DhRecordDevices dhRecordDevices;
@Autowired @Autowired
private AppConfig appConfig; 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") @PostMapping("/download")
public ApiResult<?> download(@RequestBody @Validated DownloadRecordFileParam downloadRecordFileParam) { public ApiResult<?> download(@RequestBody @Validated DownloadRecordFileParam downloadRecordFileParam) {
log.info("[start] 下载录像 downloadRecordFileParam:{}", downloadRecordFileParam); log.info("[start] 下载录像 downloadRecordFileParam:{}", downloadRecordFileParam);
String ip = downloadRecordFileParam.getIp(); // 已有下载任务,提示退出
NetSDKLib.LLong dhDownLoadLoginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip); if (DhModule.dhDownLoadLoginHandle.longValue() != 0 || DhModule.dhDownLoadByTimeHandle.longValue() != 0) {
if (dhDownLoadLoginHandle == null) { return ApiResult.failResult(-1, "已有下载任务,请先停止下载并退出登录", getHandlerMap());
dhDownLoadLoginHandle = new NetSDKLib.LLong(0);
DhModule.dhDownLoadLoginHandleMap.put(ip, dhDownLoadLoginHandle);
} }
// 设置下载录像登录句柄 // 设置下载录像登录句柄
if (dhDownLoadLoginHandle.longValue() == 0) { long loginHandle = dhLoginService.login(downloadRecordFileParam.getIp(), downloadRecordFileParam.getPort(), appConfig.getSdkUsername(), appConfig.getSdkPassword());
long loginHandle = dhLoginService.login(ip, downloadRecordFileParam.getPort(), appConfig.getSdkUsername(), appConfig.getSdkPassword()); if (loginHandle == 0){
if (loginHandle == 0){ log.error("下载录像前登录失败 downloadRecordFileParam:{}", downloadRecordFileParam);
log.error("下载录像前登录失败 downloadRecordFileParam:{}", downloadRecordFileParam); return ApiResult.failResult(-1, "登录失败");
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, dhDownLoadLoginHandle); dhDownLoadRecordService.setStreamType(0, DhModule.dhDownLoadLoginHandle);
// 开始下载 // 开始下载
String mp4SavePath = dhDownLoadRecordService.getMp4SavePath(downloadRecordFileParam.getCallbackUid(), long downloadedHandle = dhDownLoadRecordService.downloadRecordFile(DhModule.dhDownLoadLoginHandle, downloadRecordFileParam.getChannel(),
downloadRecordFileParam.getStTimeStart(), ip); downloadRecordFileParam.getRecordFileType(),
long downloadedHandle = dhDownLoadRecordService.downloadMp4ByTime(dhDownLoadLoginHandle, downloadRecordFileParam.getChannel(),
mp4SavePath,
dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeStart()), dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeStart()),
dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeEnd())); dhDownLoadRecordService.getNetTimeByString(downloadRecordFileParam.getStTimeEnd()),
dhDownLoadRecordService.getSavePath(downloadRecordFileParam.getCallbackUid()),
DhModule.DownLoadPosCallBackByTime.getInstance());
if (downloadedHandle == 0) { if (downloadedHandle == 0) {
log.error("下载录像失败 downloadRecordFileParam:{}", downloadRecordFileParam); log.error("下载录像失败 downloadRecordFileParam:{}", downloadRecordFileParam);
return ApiResult.failResult(-1, "下载录像失败"); return ApiResult.failResult(-1, "下载录像失败");
} }
dhDownLoadByTimeHandle.setValue(downloadedHandle); return ApiResult.successResult("正在下载录像", getHandlerMap());
// 存下载路径
DhModule.bridgeDownLoadFilePathMap.put(downloadedHandle, mp4SavePath);
log.info("[end] 下载录像 downloadRecordFileParam:{}", downloadRecordFileParam);
return ApiResult.successResult("正在下载录像", getHandlerMap(ip));
} }
@PostMapping("/stopDownload") @PostMapping("/stopAndLogout")
public ApiResult<?> stopDownload(@RequestParam String ip) { public ApiResult<?> stopAndLogout() {
log.info("[start] 停止下载"); log.info("[start] 停止下载并退出登录");
// 停止下载 // 停止下载
NetSDKLib.LLong dhDownLoadLoginHandle = DhModule.dhDownLoadLoginHandleMap.get(ip); dhDownLoadRecordService.stopDownLoadRecordFile(DhModule.dhDownLoadLoginHandle);
long l = dhDownLoadLoginHandle == null ? 0 : dhDownLoadLoginHandle.longValue();
dhDownLoadRecordService.stopDownLoadRecordFile(DhModule.dhDownLoadByTimeHandleMap.get(l));
log.info("[end] 停止下载");
return ApiResult.successResult("停止下载", getHandlerMap(ip));
}
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); log.info("[end] 停止下载并退出登录");
long downloadHandle = downloadByTimeHandle == null ? 0 : downloadByTimeHandle.longValue(); return ApiResult.successResult("停止下载并退出登录", getHandlerMap());
}
private Map<String, Object> getHandlerMap() {
return MapUtil.builder(new HashMap<String, Object>()) return MapUtil.builder(new HashMap<String, Object>())
.put("loginHandle", loginHandle) .put("loginHandle", DhModule.dhDownLoadLoginHandle.longValue())
.put("downloadHandle", downloadHandle) .put("downloadHandle", DhModule.dhDownLoadByTimeHandle.longValue())
.build(); .build();
} }
} }

@ -3,7 +3,6 @@ package com.educoder.netsdk.controller;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import com.educoder.netsdk.config.AppConfig; import com.educoder.netsdk.config.AppConfig;
import com.educoder.netsdk.model.ApiResult; import com.educoder.netsdk.model.ApiResult;
import com.netsdk.lib.ToolKits;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -22,15 +21,6 @@ public class TestController {
@Autowired @Autowired
private AppConfig appConfig; 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") @GetMapping("/one")
public ApiResult<?> one(@RequestParam String key1, @RequestParam long key2) { public ApiResult<?> one(@RequestParam String key1, @RequestParam long key2) {
log.info("[start]test "); log.info("[start]test ");

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

@ -11,11 +11,7 @@ import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
@ -28,19 +24,14 @@ public class DhModule {
public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE; public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
// 人脸识别登录句柄 // 人脸识别登录句柄
public static NetSDKLib.LLong dhFaceLoginHandle = new NetSDKLib.LLong(0); public static NetSDKLib.LLong dhFaceLoginHandle = new NetSDKLib.LLong(0);
// 设备登录的句柄 key=ip, val=登录句柄 // 按时间下载登录句柄
public static Map<String, NetSDKLib.LLong> dhDownLoadLoginHandleMap = new HashMap<>(); public static NetSDKLib.LLong dhDownLoadLoginHandle = new NetSDKLib.LLong(0);
// 单次下载录像句柄 key=登录句柄, val=下载句柄
public static Map<Long, NetSDKLib.LLong> dhDownLoadByTimeHandleMap = new HashMap<>();
// 下载录像在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 @Override
public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
if ("172.16.1.12".equals(pchDVRIP)) { log.warn("设备重连回调 ReConnect Device: {} Port: {}", pchDVRIP, nDVRPort);
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());
} }
} }
@ -127,9 +109,9 @@ public class DhModule {
log.info("目标识别事件 dwAlarmType: {}, studentId: {}, studentName: {}, szUID: {}", dwAlarmType, studentId, studentName, szUid); log.info("目标识别事件 dwAlarmType: {}, studentId: {}, studentName: {}, szUID: {}", dwAlarmType, studentId, studentName, szUid);
Map<String, Object> map = MapUtil.builder(new HashMap<String, Object>()) Map<String, Object> map = MapUtil.builder(new HashMap<String, Object>())
.put("user_name", studentName) .put("studentName", studentName)
.put("student_id", studentId) .put("studentId", studentId)
.put("sz_uid", szUid) .put("szUid", szUid)
.build(); .build();
String s = OKHttp3Utils3.requestPost(AppConfig.getStaticRecognitionCallBack(), map); String s = OKHttp3Utils3.requestPost(AppConfig.getStaticRecognitionCallBack(), map);
log.info("目标识别事件ruby回调 url: {} 返回值: {}", AppConfig.getStaticRecognitionCallBack(), s); log.info("目标识别事件ruby回调 url: {} 返回值: {}", AppConfig.getStaticRecognitionCallBack(), s);
@ -147,7 +129,7 @@ public class DhModule {
private DownLoadPosCallBackByTime() {} private DownLoadPosCallBackByTime() {}
private static class CallBackHolder { 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() { public static DhModule.DownLoadPosCallBackByTime getInstance() {
@ -156,85 +138,34 @@ public class DhModule {
@Override @Override
public void invoke(NetSDKLib.LLong lLoginID, final int dwTotalSize, final int dwDownLoadSize, int index, NetSDKLib.NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) { 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); log.info("下载进度回调 dwTotalSize: {}, dwDownLoadSize: {}", dwTotalSize, 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);
}
if(dwDownLoadSize == -1 || (dwDownLoadSize / dwTotalSize) == 1) { if(dwDownLoadSize == -1 || (dwDownLoadSize / dwTotalSize) == 1) {
log.info("下载完成"); 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 (dhDownLoadByTimeHandle.longValue() != 0) {
if (lLoginID.longValue() != 0) { netsdk.CLIENT_StopDownload(dhDownLoadByTimeHandle);
Thread stopThread = new Thread(() -> { dhDownLoadByTimeHandle.setValue(0);
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();
} }
}
}
}
private static boolean judgeResult(BigDecimal num) { // 登出
List<String> strings = new ArrayList<>(); if (dhDownLoadLoginHandle.longValue() != 0) {
strings.add("0.100"); boolean bRet = netsdk.CLIENT_Logout(dhDownLoadLoginHandle);
strings.add("0.200"); if (bRet) {
strings.add("0.300"); dhDownLoadLoginHandle.setValue(0);
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;
}
@Override // 回调ruby
public int invoke(NetSDKLib.LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, Pointer dwUser) { String daveFilePath = new String(recordfileinfo.filename);
// if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS)) { log.info("下载进度回调 下载文件路径: {}", daveFilePath);
// System.out.println("DownLoad DataCallBack [ " + dwDataType +" ]"); String course = daveFilePath.replace(AppConfig.getStaticRecordSavePath(), "").split("_")[0];
// } Map<String, Object> map = MapUtil.builder(new HashMap<String, Object>())
return 0; .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 @NotBlank
private String ip; private String ip;
private Integer port = 37777; private Integer port = 22;
private Integer channel = 7; private Integer channel = 2;
private Integer recordFileType = 0; 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; package com.educoder.netsdk.service;
import com.educoder.netsdk.config.AppConfig; import com.educoder.netsdk.config.AppConfig;
import com.educoder.netsdk.model.DhModule;
import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits; import com.netsdk.lib.ToolKits;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -14,13 +12,10 @@ import org.springframework.stereotype.Service;
import java.io.File; import java.io.File;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; 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.netsdk;
import static com.educoder.netsdk.model.DhModule.dhDownLoadByTimeHandle;
@Service @Service
@Slf4j @Slf4j
@ -30,88 +25,6 @@ public class DhDownLoadRecordService {
@Autowired @Autowired
private AppConfig appConfig; 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, public long downloadRecordFile(NetSDKLib.LLong downloadLoginHandle, int nChannelId, int nRecordFileType,
NetSDKLib.NET_TIME stTimeStart, NetSDKLib.NET_TIME stTimeEnd, String savedFileName, NetSDKLib.NET_TIME stTimeStart, NetSDKLib.NET_TIME stTimeEnd, String savedFileName,
@ -121,20 +34,20 @@ public class DhDownLoadRecordService {
path.mkdirs(); path.mkdirs();
} }
NetSDKLib.LLong dhDownLoadByTimeHandle = netsdk.CLIENT_DownloadByTimeEx(downloadLoginHandle, nChannelId, nRecordFileType, dhDownLoadByTimeHandle = netsdk.CLIENT_DownloadByTimeEx(downloadLoginHandle, nChannelId, nRecordFileType,
stTimeStart, stTimeEnd, savedFileName, stTimeStart, stTimeEnd, savedFileName,
cbTimeDownLoadPos, null, null, null, null); cbTimeDownLoadPos, null, null, null, null);
if(dhDownLoadByTimeHandle.longValue() != 0) { if(dhDownLoadByTimeHandle.longValue() != 0) {
log.info("Downloading RecordFile!"); System.out.println("Downloading RecordFile!");
} else { } else {
log.error("Download RecordFile Failed! Get last error: " + ToolKits.getErrorCodePrint()); System.err.println("Download RecordFile Failed!" + ToolKits.getErrorCodePrint());
} }
return dhDownLoadByTimeHandle.longValue(); return dhDownLoadByTimeHandle.longValue();
} }
/** /**
* *
* @param m_streamType * @param m_streamType
*/ */
public void setStreamType(int m_streamType, NetSDKLib.LLong dhLoginHandle) { 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()); boolean bret = netsdk.CLIENT_SetDeviceMode(dhLoginHandle, emType, steamType.getPointer());
if (!bret) { 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 { } else {
log.info("Set Stream Type Succeed!"); System.out.println("Set Stream Type Succeed!");
} }
} }
public void stopDownLoadRecordFile(NetSDKLib.LLong dhDownLoadHandle) { public void stopDownLoadRecordFile(NetSDKLib.LLong dhDownLoadHandle) {
if (dhDownLoadHandle == null || dhDownLoadHandle.longValue() == 0) { if (dhDownLoadHandle.longValue() == 0) {
return; return;
} }
netsdk.CLIENT_StopDownload(dhDownLoadHandle); netsdk.CLIENT_StopDownload(dhDownLoadHandle);
DhModule.bridgeDownLoadFilePathMap.remove(dhDownLoadHandle.longValue());
dhDownLoadHandle.setValue(0); dhDownLoadHandle.setValue(0);
} }
@ -183,61 +95,10 @@ public class DhDownLoadRecordService {
return netTime; return netTime;
} }
public String getSavePath(String uid) { public String getSavePath(String uid) {
String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
return appConfig.getRecordSavePath() + "/" + return appConfig.getRecordSavePath() + "/" +
uid + "_" + format + ".dav"; 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; pstOutParam.stuDeviceInfo=m_stDeviceInfo;
NetSDKLib.LLong dhLoginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam); NetSDKLib.LLong dhLoginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam);
if(dhLoginHandle.longValue() == 0) { 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 { } else {
log.info("登录成功 Login Success DeviceIp: {}, port: {}, dhLoginHandle: {}", deviceIp, port, dhLoginHandle); log.info("登录成功 Login Success DeviceIp: {} port: {}", deviceIp, port);
} }
return dhLoginHandle.longValue(); return dhLoginHandle.longValue();

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

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

Loading…
Cancel
Save