首页>代码>基于海康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日
最代码官方  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日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友