首页>代码>基于海康sdk二次开发,实现nvr下设备列表信息>/hikvision-sdk-integration/src/main/java/com/ramble/hikvisionsdkintegration/controller/NvrController.java
package com.ramble.hikvisionsdkintegration.controller; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.ramble.hikvisionsdkintegration.dto.CameraPojo; import com.ramble.hikvisionsdkintegration.dto.GlobalResponseEntity; import com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK; import com.ramble.hikvisionsdkintegration.service.HCNetAlarm; import com.ramble.hikvisionsdkintegration.service.RealtimeThermometry; import com.ramble.hikvisionsdkintegration.service.SdkInitService; import com.ramble.hikvisionsdkintegration.service.ThreadGetOnceTempData; import com.ramble.hikvisionsdkintegration.util.AjaxResult; import com.ramble.hikvisionsdkintegration.util.DateUtils2; import com.ramble.hikvisionsdkintegration.util.FFMpegUtil; import com.sun.jna.Pointer; import com.sun.jna.examples.win32.W32API; import com.sun.jna.ptr.IntByReference; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import java.io.*; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import static com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK.*; import static com.ramble.hikvisionsdkintegration.service.SdkInitService.hCNetSDK; /** * Project hikvision-sdk-integration * Package com.ramble.hikvisionsdkintegration.controller * Class TestController * Date 2023/3/14 11:40 * Author wgw * Email cnaylor@163.com * Description */ @Slf4j @AllArgsConstructor @RestController @RequestMapping("/nvr") public class NvrController { private static Integer userId = null; /** * ip list */ @GetMapping("/ipList") public AjaxResult getIpList() { if (userId == null) { userId = new HCNetAlarm().login(); } log.info("userId={}", userId); IntByReference ibrBytesReturned = new IntByReference(0); NET_DVR_IPPARACFG_V40 ipDevInfo = new NET_DVR_IPPARACFG_V40(); ipDevInfo.write(); Pointer pointer = ipDevInfo.getPointer(); boolean b = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_IPPARACFG_V40, 0, pointer, ipDevInfo.size(), ibrBytesReturned); ipDevInfo.read(); if (!b) { log.info("获取所有IP,错误码:{}", SdkInitService.hCNetSDK.NET_DVR_GetLastError()); return AjaxResult.error("下获取所有IP,错误码:" + SdkInitService.hCNetSDK.NET_DVR_GetLastError()); } log.info("数字通道个数:{}", ipDevInfo.dwDChanNum); log.info("起始数字通道:{}", ipDevInfo.dwStartDChan); int dwStartDChan = ipDevInfo.dwStartDChan; int dwStartDNum = ipDevInfo.dwDChanNum; JSONArray jsonArray = new JSONArray(); for (int i = 0; i < dwStartDNum; i++) { int channelNum = i + dwStartDChan; NET_DVR_IPDEVINFO_V31 ip = ipDevInfo.struIPDevInfo[i]; if (StringUtils.isEmpty(new String(ip.sUserName).trim())) { continue; } log.info("状态:{}", String.valueOf(ip.byEnable).trim()); log.info("ip4:{}", new String(ip.struIP.sIpV4).trim()); log.info("端口号:{}", ip.wDVRPort); JSONObject jsonObject = new JSONObject(); jsonObject.put("ip", new String(ip.struIP.sIpV4).trim()); jsonObject.put("port", ip.wDVRPort); jsonObject.put("userId", userId); jsonObject.put("channelNo", channelNum); jsonObject.put("status", String.valueOf(ip.byEnable).trim()); jsonArray.add(jsonObject); } return AjaxResult.success(jsonArray); } /** * @Description: 获取指定时间内的视频 * @return: void **/ @PostMapping(value = "/downFile") public AjaxResult downFile(@RequestBody CameraPojo pojo) { Integer userId = null; if (pojo.getUserId() == null) { userId = new HCNetAlarm().login(); } else { userId = pojo.getUserId(); } log.info("userId={}", userId); int bRes = 1; String[] dateString = DateUtils2.beforeAndAfter(pojo.getStatTime(), 5); HCNetSDK.NET_DVR_TIME lpStartTime = DateUtils2.getNvrTime(dateString[0]); HCNetSDK.NET_DVR_TIME lpStopTime = DateUtils2.getNvrTime(dateString[1]); String time = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date()); String path = "E://pic/" + pojo.getChannelId() + "_" + time + ".h264"; HCNetSDK.NET_DVR_PLAYCOND pDownloadCond = new HCNetSDK.NET_DVR_PLAYCOND(); pDownloadCond.dwChannel = pojo.getChannelId(); pDownloadCond.struStartTime = lpStartTime; pDownloadCond.struStopTime = lpStopTime; pDownloadCond.byStreamType = 0; int hPlayback = SdkInitService.hCNetSDK.NET_DVR_GetFileByTime_V40(userId, path, pDownloadCond); if (hPlayback < 0) { log.info("按文件名回放录像文件,错误码:{}", SdkInitService.hCNetSDK.NET_DVR_GetLastError()); return AjaxResult.error("按文件名回放录像文件,错误码:" + SdkInitService.hCNetSDK.NET_DVR_GetLastError()); } boolean b = SdkInitService.hCNetSDK.NET_DVR_PlayBackControl_V40(hPlayback, NET_DVR_PLAYSTART, null, 0, null, null); if (!b) { log.info("播放录像失败,错误码:{}", SdkInitService.hCNetSDK.NET_DVR_GetLastError()); return AjaxResult.error("下载录像失败,错误码:" + SdkInitService.hCNetSDK.NET_DVR_GetLastError()); } //获取下载进度 int nPos = 0; for (nPos = 0; nPos < 100 && nPos >= 0; nPos = SdkInitService.hCNetSDK.NET_DVR_GetDownloadPos(hPlayback)) { log.info("下载中...{}%", nPos); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } log.info("进度...{}%\n", nPos); if (nPos < 0 || nPos > 100) { log.info("下载录像文件错误:{}", SdkInitService.hCNetSDK.NET_DVR_GetLastError()); bRes = -1; return AjaxResult.error("下载录像失败1,错误码:" + bRes); } //视频格式转换 String coverOutputPath = path.substring(0, path.lastIndexOf(".")) + ".mp4"; try { FFMpegUtil.convetor(path, coverOutputPath); } catch (Exception e) { e.printStackTrace(); } //退出登录 // SdkInitService.hCNetSDK.NET_DVR_Logout(userId); return AjaxResult.success(coverOutputPath); } /** * @Description: 获取指定时间内的图片 * @return: void **/ @PostMapping(value = "/cutVideoPic") public AjaxResult cutVideoPic(@RequestBody CameraPojo pojo) { Boolean result = false; int count = 0; String path =null; while (!result) { Integer userId = null; if (pojo.getUserId() == null) { userId = new HCNetAlarm().login(); } else { userId = pojo.getUserId(); } log.info("userId={}", userId); HCNetSDK.NET_DVR_VOD_PARA netDvrVodPara = new HCNetSDK.NET_DVR_VOD_PARA(); //流ID信息结构体 HCNetSDK.NET_DVR_STREAM_INFO netDvrStreamInfo = new HCNetSDK.NET_DVR_STREAM_INFO(); netDvrStreamInfo.dwChannel = pojo.getChannelId(); netDvrVodPara.struIDInfo = netDvrStreamInfo; String[] dateString = DateUtils2.beforeAndAfter(pojo.getStatTime(), 2); HCNetSDK.NET_DVR_TIME lpStartTime = DateUtils2.getNvrTime(dateString[0]); HCNetSDK.NET_DVR_TIME lpStopTime = DateUtils2.getNvrTime(dateString[1]); netDvrVodPara.struBeginTime = lpStartTime; netDvrVodPara.struEndTime = lpStopTime; netDvrVodPara.byDownload = 1; netDvrVodPara.byStreamType = 0; netDvrVodPara.byAudioFile = 0; Pointer pointer = netDvrVodPara.getPointer(); netDvrVodPara.hWnd = new W32API.HWND(pointer); int i = SdkInitService.hCNetSDK.NET_DVR_PlayBackByTime_V40(userId, netDvrVodPara); if (i < 0) { log.info("实时预览,错误码:{}", SdkInitService.hCNetSDK.NET_DVR_GetLastError()); return AjaxResult.error("实时预览,错误码:" + SdkInitService.hCNetSDK.NET_DVR_GetLastError()); } boolean b = SdkInitService.hCNetSDK.NET_DVR_PlayBackControl_V40(i, NET_DVR_PLAYSTART, null, 0, null, null); if (!b) { log.info("播放录像失败,错误码:{}", SdkInitService.hCNetSDK.NET_DVR_GetLastError()); return AjaxResult.error("播放录像失败,错误码:" + SdkInitService.hCNetSDK.NET_DVR_GetLastError()); } String time = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date()); path = "E://pic/" + pojo.getChannelId() + "_" + time + ".jpg"; boolean c = SdkInitService.hCNetSDK.NET_DVR_PlayBackCaptureFile(i, path); if (!c) { log.info("录像回放时抓图,错误码:{}", SdkInitService.hCNetSDK.NET_DVR_GetLastError()); return AjaxResult.error("录像回放时抓图,错误码:" + SdkInitService.hCNetSDK.NET_DVR_GetLastError()); } count++; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } File tgtPath = new File(path); boolean exists = tgtPath.exists(); if (exists) { result = true; break; }else { if (count > 4) { result = true; break; } } } if (!result) { return AjaxResult.error("录像抓图失败,请稍后再试!"); } //退出登录 //hCNetSDK.NET_DVR_Logout(dvrAlarm.lUserID); //SdkInitService.hCNetSDK.NET_DVR_Cleanup(); return AjaxResult.success(path); } /** * 实时设备抓图 */ @PostMapping("/cutCurrentPic") public AjaxResult cutPic(@RequestBody CameraPojo pojo) { Boolean result = false; int count = 0; String path =null; while (!result) { Integer userId = null; if (pojo.getUserId() == null) { userId = new HCNetAlarm().login(); } else { userId = pojo.getUserId(); } log.info("lUserID:{}", userId); String time = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date()); path = "E://pic/" + pojo.getChannelId() + "_" + time + ".jpg"; byte[] fileByte = new byte[0]; try { fileByte = path.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } HCNetSDK.BYTE_ARRAY byte_array = new HCNetSDK.BYTE_ARRAY(fileByte.length); byte_array.read(); byte_array.byValue = fileByte; byte_array.write(); // IntByReference a = new IntByReference(); HCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new HCNetSDK.NET_DVR_JPEGPARA(); lpJpegPara.read(); lpJpegPara.wPicSize = 2; lpJpegPara.wPicQuality = 0; // Pointer sJpegPicBuffer = lpJpegPara.getPointer(); lpJpegPara.write(); boolean b = hCNetSDK.NET_DVR_CaptureJPEGPicture(userId, pojo.getChannelId(), lpJpegPara, fileByte); // boolean b = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, pojo.getChannelId(), lpJpegPara,sJpegPicBuffer,480 * 480, a); if (!b) { log.info("抓图失败,错误码为:" + hCNetSDK.NET_DVR_GetLastError()); return AjaxResult.error("抓图失败,错误码:" + SdkInitService.hCNetSDK.NET_DVR_GetLastError()); } count++; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } File tgtPath = new File(path); boolean exists = tgtPath.exists(); if (exists) { result = true; break; }else { if (count > 4) { result = true; break; } } } if (!result) { return AjaxResult.error("录像抓图失败,请稍后再试!"); } //退出登录 //hCNetSDK.NET_DVR_Logout(dvrAlarm.lUserID); //SdkInitService.hCNetSDK.NET_DVR_Cleanup(); return AjaxResult.success(path); } /** * channel list */ @PostMapping("/channelList") public AjaxResult channelList(@RequestBody CameraPojo pojo) { Integer userId = null; if (pojo.getUserId() == null) { userId = new HCNetAlarm().login(); } else { userId = pojo.getUserId(); } log.info("lUserID:{}", userId); IntByReference ibrBytesReturned = new IntByReference(0); NET_DVR_PICCFG_V30 ipDevInfo = new NET_DVR_PICCFG_V30(); ipDevInfo.write(); Pointer pointer = ipDevInfo.getPointer(); boolean b = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_PICCFG_V30, pojo.getChannelId(), pointer, ipDevInfo.size(), ibrBytesReturned); ipDevInfo.read(); String channlName=null; if (!b) { log.info("获取所有IP,错误码:{}", SdkInitService.hCNetSDK.NET_DVR_GetLastError()); return AjaxResult.error("下获取所有IP,错误码:" + SdkInitService.hCNetSDK.NET_DVR_GetLastError()); } try { channlName = new String(ipDevInfo.sChanName, "gbk").trim(); log.info(" 通道名称:{}", channlName); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return AjaxResult.success(channlName); } /** * 获取sdk状态 * * @return {@link GlobalResponseEntity}<{@link String}> * 返回值举例:{"success":true,"code":"000000","message":"request successfully", * "data":"{\"dwRes\":[0,0,0,0,0,0,0,0,0,0],\"dwTotalAlarmChanNum\":0,\"dwTotalBroadCastNum\":0,\"dwTotalFileSearchNum\":0,\"dwTotalFormatNum\":0, * \"dwTotalLogSearchNum\":0,\"dwTotalLoginNum\":1,\"dwTotalPlayBackNum\":0,\"dwTotalRealPlayNum\":0,\"dwTotalSerialNum\":0,\"dwTotalUpgradeNum\":0, * \"dwTotalVoiceComNum\":0,\"autoRead\":true,\"autoWrite\":true,\"pointer\":{\"size\":84,\"valid\":true}}"} */ @GetMapping("/state") public GlobalResponseEntity<String> getSdkState() { //登录 Integer userId = new HCNetAlarm().login(); log.info("userId={}", userId); HCNetSDK.NET_DVR_SDKSTATE sdkState = new HCNetSDK.NET_DVR_SDKSTATE(); //获取当前SDK状态信息 boolean result = SdkInitService.hCNetSDK.NET_DVR_GetSDKState(sdkState); if (result) { sdkState.read(); String s = JSON.toJSONString(sdkState); return GlobalResponseEntity.success(s); } else { int error = SdkInitService.hCNetSDK.NET_DVR_GetLastError(); return GlobalResponseEntity.error("获取失败,错误码为:" + error); } } @GetMapping("/ability") public GlobalResponseEntity<String> getAbility() { if (userId == null) { userId = new HCNetAlarm().login(); } log.info("userId={}", userId); Boolean b = getSTDAbility(userId); if (b) { String s = JSON.toJSONString("sdkState"); return GlobalResponseEntity.success(s); } else { int error = SdkInitService.hCNetSDK.NET_DVR_GetLastError(); return GlobalResponseEntity.error("获取失败,错误码为:" + error); } } @GetMapping("/wd") public GlobalResponseEntity<String> getWd() { if (userId == null) { userId = new HCNetAlarm().login(); } log.info("userId={}", userId); return GlobalResponseEntity.success(poiner(userId)); } @GetMapping("/wdCurrent") public void getCurrentWd() { if (userId == null) { userId = new HCNetAlarm().login(); } log.info("userId={}", userId); cunrent(userId); } @GetMapping("/bf") public void bf() { HCNetAlarm hcNetAlarm = new HCNetAlarm(); if (userId == null) { userId = hcNetAlarm.login(); } //设置连接超时时间与重连功能 hCNetSDK.NET_DVR_SetConnectTime(2000, 1); hCNetSDK.NET_DVR_SetReconnect(10000, true); int lAlarmHandle = -1; /**设置报警回调函数 *建立报警上传通道(启用布防) 布防参数 */ hcNetAlarm.setupAlarmChan(userId, lAlarmHandle); try { //等待设备上传报警信息 log.info("等待设备上传报警信息===================="); Thread.sleep(100 * 60 * 60); } catch (InterruptedException e) { e.printStackTrace(); } //撤销布防上传通道 hcNetAlarm.closeAlarmChan(lAlarmHandle); //注销 释放sdk资源 hcNetAlarm.logout(userId); } /** * 以获取设备是否支持热成像功能、支持配置的测温配置 * 参数能力和联动能力 * * @param userId * @return */ private Boolean getSTDAbility(Integer userId) { log.info("------获取设备热成像能力------"); HCNetSDK.NET_DVR_STD_ABILITY ability = new HCNetSDK.NET_DVR_STD_ABILITY(); ability.dwOutSize = ability.size(); ability.lpOutBuffer = ability.getPointer(); ability.dwCondSize = ability.size(); ability.lpStatusBuffer = ability.getPointer(); ability.dwStatusSize = ability.size(); ability.dwRetSize = ability.size(); ability.write(); Boolean rr = SdkInitService.hCNetSDK.NET_DVR_GetDeviceAbility(userId, 0x011, null, 0, ability.getPointer(), ability.size()); Boolean a = SdkInitService.hCNetSDK.NET_DVR_GetSTDAbility(userId, HCNetSDK.NET_DVR_GET_THERMAL_CAPABILITIES, ability); Boolean b = SdkInitService.hCNetSDK.NET_DVR_GetSTDAbility(userId, HCNetSDK.NET_DVR_GET_THERMOMETRY_BASICPARAM_CAPABILITIES, ability); Boolean c = SdkInitService.hCNetSDK.NET_DVR_GetSTDAbility(userId, HCNetSDK.NET_DVR_GET_THERMOMETRY_SCENE_CAPABILITIES, ability); Boolean d = SdkInitService.hCNetSDK.NET_DVR_GetSTDAbility(userId, HCNetSDK.NET_DVR_GET_THERMOMETRY_ALARMRULE_CAPABILITIES, ability); Boolean e = SdkInitService.hCNetSDK.NET_DVR_GetSTDAbility(userId, HCNetSDK.NET_DVR_GET_EVENT_TRIGGERS_CAPABILITIES, ability); return a && b && c && d && e; } /** * 手动获取温度 */ public String poiner(Integer lUserID) { ThreadGetOnceTempData threadGetOnceTempData = new ThreadGetOnceTempData(SdkInitService.hCNetSDK); return threadGetOnceTempData.threadGetOnceTempData(lUserID, 1); } /** * 实时获取温度 */ public void cunrent(Integer lUserID) { /*测试实时获取测温规则温度信息*/ RealtimeThermometry realtimeThermometry = new RealtimeThermometry(SdkInitService.hCNetSDK); realtimeThermometry.realtimeThermometry(lUserID, 2, (byte) 0, (byte) 1, (short) 1); } /** * 云台预置点操作 * * @param userId * @return */ private Boolean pTZPreset(Integer userId) { log.info("------云台预置点操作------"); int lChannel = 1; int dwPresetIndex = 1; return SdkInitService.hCNetSDK.NET_DVR_PTZPreset_Other(userId, lChannel, HCNetSDK.SET_PRESET, dwPresetIndex); } /** * 获取能力通用接口 * * @param userId * @param dwCommand NET_DVR_GET_THERMINTELL * @return */ private Boolean getSTDConfig(Integer userId, int dwCommand) { log.info("------获取设备的配置信息------"); HCNetSDK.NET_DVR_STD_CONFIG lpConfigParam = new HCNetSDK.NET_DVR_STD_CONFIG(); return SdkInitService.hCNetSDK.NET_DVR_GetSTDConfig(userId, dwCommand, lpConfigParam); } private Boolean setSTDConfig(Integer userId, int dwCommand) { log.info("------设置设备的配置信息------"); HCNetSDK.NET_DVR_STD_CONFIG lpConfigParam = new HCNetSDK.NET_DVR_STD_CONFIG(); return SdkInitService.hCNetSDK.NET_DVR_GetSTDConfig(userId, dwCommand, lpConfigParam); } }