首页>代码>基于海康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); } }
最近下载更多
dubersky LV1
4月29日
luoxiaobao LV5
4月29日
80730176 LV7
4月13日
微信网友_6935648786288640 LV1
4月3日
最代码官方 LV167
3月31日
最近浏览更多
可是不知道么 LV23
5月14日
g11865095 LV1
5月14日
genyuan2014 LV6
5月12日
francochan LV6
5月4日
2860615178 LV2
5月1日
kenhomeliu LV29
4月30日
dubersky LV1
4月29日
JulyMagnolia LV4
4月29日
luoxiaobao LV5
4月29日
yuyiyuyi LV6
4月23日