首页>代码>基于海康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);
    }
}
最近下载更多
zrxu1992  LV1 2024年12月16日
就爱吃饺子啊  LV1 2024年10月21日
newhaijun  LV16 2024年7月22日
255921158  LV5 2024年7月17日
kinggode  LV14 2024年5月22日
dubersky  LV1 2024年4月29日
luoxiaobao  LV5 2024年4月29日
80730176  LV7 2024年4月13日
微信网友_6935648786288640  LV1 2024年4月3日
最代码官方  LV168 2024年3月31日
最近浏览更多
zrxu1992  LV1 2024年12月16日
yimaoermao  LV1 2024年11月28日
alancathy 2024年11月28日
暂无贡献等级
笨小孩一号  LV22 2024年11月26日
就爱吃饺子啊  LV1 2024年10月21日
Peny_ZH  LV5 2024年9月21日
kaye7549317 2024年8月15日
暂无贡献等级
newhaijun  LV16 2024年7月22日
栈道小生  LV10 2024年7月19日
255921158  LV5 2024年7月17日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友