主頁 >  其他 > Spring Boot集成海康威視NVR

Spring Boot集成海康威視NVR

2021-11-10 10:19:20 其他

文章目錄

  • 一、海康威視NVR SDK下載
  • 二、引入海康SDK
    • 1.將海康提供的jar包匯入到本地Maven庫
    • 2.將SDK放在專案中
    • 3.組態檔讀取
  • 三、寫常用的介面
    • 3.1根據時間獲取檔案
  • 四、介面請求引數
  • 五、專案地址
  • 六、總結

一、海康威視NVR SDK下載

SDK下載地址
根據你的設備或者運行環境選擇相應的版本(文章用的是win64版)

在這里插入圖片描述

二、引入海康SDK

1.將海康提供的jar包匯入到本地Maven庫

【傳送門】匯入步驟
百度網盤Maven匯入JAR
提取碼:q4w3
Maven匯入方式

<!-- 海康JNA jar包 -->
<dependency>
    <groupId>com.sun.jna</groupId>
    <artifactId>jna</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
<!-- 海康examples jar包 -->
<dependency>
    <groupId>com.sun.jna.examples</groupId>
    <artifactId>examples</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

在這里插入圖片描述

2.將SDK放在專案中

在這里插入圖片描述
將DLL檔案庫放到靜態資源目錄下,一面打JAR包時找不到檔案庫

3.組態檔讀取

獲取靜態資源檔案夾路徑

public class CommonKit {
    /**
     * 獲取DLL檔案路徑
     * @return
     */
    public static String getWebPath(){
        String path = CommonKit.class.getClassLoader().getResource("").getPath().substring(1);
        return path+"dll\\";
    }
}

修改SDK中DLL庫讀取

public interface HCNetSDK extends StdCallLibrary {
    /*加載海康DLL*/
    HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(CommonKit.getWebPath()+"HCNetSDK.dll", HCNetSDK.class);
}

同理PlayCtrl也一樣

public interface PlayCtrl extends StdCallLibrary {
    /*加載播放DLL*/
    PlayCtrl INSTANCE = (PlayCtrl) Native.loadLibrary(CommonKit.getWebPath()+"PlayCtrl.dll", PlayCtrl.class);
}

三、寫常用的介面

3.1根據時間獲取檔案

Controller:

package com.hikvision.nvr.controller;

import com.hikvision.nvr.common.AjaxResult;
import com.hikvision.nvr.domain.RequestVo;
import com.hikvision.nvr.service.FindVideoFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;


@RestController
@RequestMapping(value = "/nvr")
@Api(value = "呼叫NVR介面", description = "呼叫NVR介面", tags = {"呼叫NVR介面"})
public class NvrControcller {

    @Autowired
    private FindVideoFileService downloadVideoService;

    @RequestMapping(value = "/playback")
    @ApiOperation(value = "根據時間獲取檔案", httpMethod = "POST", notes = "根據時間獲取檔案")
    public AjaxResult playback(@RequestBody RequestVo requestVo) throws InterruptedException {
        return AjaxResult.success(downloadVideoService.playback(requestVo));
    }

    @RequestMapping(value = "/downloadByFileNmae")
    @ApiOperation(value = "根據檔案名下載", httpMethod = "POST", notes = "根據檔案名下載")
    public AjaxResult downloadByFileNmae(@RequestParam String fileName, @RequestBody RequestVo requestVo) {
        return AjaxResult.success(downloadVideoService.downloadByFileNmae(fileName, requestVo));
    }

    @RequestMapping(value = "/downloadByFileTime")
    @ApiOperation(value = "根據時間下載", httpMethod = "POST", notes = "根據時間下載")
    public AjaxResult downloadByFileTime(@RequestBody RequestVo requestVo) {
        return AjaxResult.success(downloadVideoService.downloadByFileTime(requestVo));
    }

    @RequestMapping(value = "/getDeviceInformation")
    @ApiOperation(value = "獲取設備資訊", httpMethod = "POST", notes = "獲取設備資訊")
    public AjaxResult getDeviceInformation(@RequestBody RequestVo requestVo)  {
        return AjaxResult.success(downloadVideoService.getDeviceInformation(requestVo));
    }

    @RequestMapping(value = "/getBackUrl")
    @ApiOperation(value = "獲取回放視頻流", httpMethod = "POST", notes = "獲取回放視頻流")
    public AjaxResult getBackUrl(@RequestBody RequestVo requestVo) {
        requestVo.getPlayBack().setUrlType(1);
        Map map = downloadVideoService.getBackUrl(requestVo);
        String value = (String) map.get("msg");
        if (value.startsWith("rtsp:")) {
            return AjaxResult.success(map);
        }
        return AjaxResult.error();
    }

    @RequestMapping(value = "/getLiveUrl")
    @ApiOperation(value = "獲取實時視頻流", httpMethod = "POST", notes = "獲取實時視頻流")
    public AjaxResult getLiveUrl(@RequestBody RequestVo requestVo){
        requestVo.getPlayBack().setUrlType(0);
        Map map = downloadVideoService.getBackUrl(requestVo);
        String value = (String) map.get("msg");
        if (value.startsWith("rtsp:")) {
            return AjaxResult.success(map);
        }
        return AjaxResult.error();
    }
}

Service:

package com.hikvision.nvr.service;

import com.hikvision.nvr.domain.RequestVo;
import com.hikvision.nvr.domain.SignIn;
import com.hikvision.nvr.domain.VideoFile;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
public interface FindVideoFileService {
    List<VideoFile> playback(RequestVo requestVo) throws InterruptedException;

    boolean downloadByFileNmae(String fileName,RequestVo requestVo);

    boolean downloadByFileTime(RequestVo requestVo);

    List<SignIn> getDeviceInformation(RequestVo requestVo);

    Map getBackUrl(RequestVo requestVo);
}

ServiceImpl:

package com.hikvision.nvr.service.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hikvision.nvr.domain.NvrTime;
import com.hikvision.nvr.domain.PlayBack;
import com.hikvision.nvr.domain.RequestVo;
import com.hikvision.nvr.domain.SignIn;
import com.hikvision.nvr.domain.VideoFile;
import com.hikvision.nvr.service.FindVideoFileService;
import com.hikvision.nvr.service.hk.HCNetSDK;
import com.hikvision.nvr.util.*;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;


/**
 * @author wgq
 */
@Slf4j
@Service
public class FindVideoFileServiceImpl implements FindVideoFileService {

    /*獲取IP接入配置資訊*/
    public static final int NET_DVR_GET_IPPARACFG = 1048;
    /*允許加入的最多IP通道數*/
    public static final int MAX_IP_CHANNEL = 32;
    /*獲得檔案資訊*/
    public static final int NET_DVR_FILE_SUCCESS = 1000;
    /*正在查找檔案*/
    public static final int NET_DVR_ISFINDING = 1002;
    /*沒有檔案*/
    public static final int NET_DVR_FILE_NOFIND = 1001;
    /*開始播放*/
    public static final int NET_DVR_PLAYSTART = 1;
    /*獲取檔案回放的進度*/
    public static final int NET_DVR_PLAYGETPOS = 13;

    NativeLong lUserID;

    /*下載句柄*/
    NativeLong m_lDownloadHandle;


    /*設備資訊*/
    NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;
    HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;


    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private DataUtil dataUtil;

    /**
     * 根據時間搜索視頻
     *
     * @param requestVo
     */
    @Override
    public List<VideoFile> playback(RequestVo requestVo) throws InterruptedException {
        SignIn signIn = requestVo.getSignIn();
        PlayBack playBack = requestVo.getPlayBack();
        NativeLong m_lUserID = userId(signIn);
        /*設定檢索開始結束時間*/
        NvrTime startTime = dataUtil.dateToNum(playBack.getStartTime());
        NvrTime endTime = dataUtil.dateToNum(playBack.getEndTime());
        NET_DVR_TIME struStartTime;
        NET_DVR_TIME struStopTime;
        NET_DVR_FILECOND m_strFilecond = new NET_DVR_FILECOND();
        m_strFilecond.struStartTime = new NET_DVR_TIME();
        m_strFilecond.struStopTime = new NET_DVR_TIME();
        /*組裝開始時間*/
        m_strFilecond.struStartTime.dwYear = startTime.getDwYear();
        m_strFilecond.struStartTime.dwMonth = startTime.getDwMonth();
        m_strFilecond.struStartTime.dwDay = startTime.getDwDay();
        m_strFilecond.struStartTime.dwHour = startTime.getDwHour();
        m_strFilecond.struStartTime.dwMinute = startTime.getDwMinute();
        m_strFilecond.struStartTime.dwSecond = startTime.getDwSecond();
        /*組裝結束時間*/
        m_strFilecond.struStopTime.dwYear = endTime.getDwYear();
        m_strFilecond.struStopTime.dwMonth = endTime.getDwMonth();
        m_strFilecond.struStopTime.dwDay = endTime.getDwDay();
        m_strFilecond.struStopTime.dwHour = endTime.getDwHour();
        m_strFilecond.struStopTime.dwMinute = endTime.getDwMinute();
        m_strFilecond.struStopTime.dwSecond = endTime.getDwSecond();
        /*檔案型別*/
        m_strFilecond.dwFileType = 0;
        m_strFilecond.dwIsLocked = 0xff;
        m_strFilecond.dwUseCardNo = 0;
        /*通道號*/
        m_strFilecond.lChannel = new NativeLong(playBack.getChannelNumber());
        /*獲取檔案*/
        NativeLong lFindFile = hCNetSDK.NET_DVR_FindFile_V30(m_lUserID, m_strFilecond);
        NET_DVR_FINDDATA_V30 strFile = new NET_DVR_FINDDATA_V30();
        long findFile = lFindFile.longValue();
        if (findFile > -1) {
            log.info("file:{}" + findFile);
        }
        NativeLong lnext;
        strFile = new NET_DVR_FINDDATA_V30();
        List<VideoFile> videoFiles = new ArrayList<>();
        while (true) {
            lnext = hCNetSDK.NET_DVR_FindNextFile_V30(lFindFile, strFile);
            if (lnext.longValue() == NET_DVR_FILE_SUCCESS) {
                log.info("搜索成功");
                /*添加檔案名資訊*/
                String[] s = new String[2];
                s = new String(strFile.sFileName).split("\0", 2);
                VideoFile videoFile = new VideoFile();
                /*添加檔案大小資訊*/
                int iTemp;
                String MyString;
                if (strFile.dwFileSize < 1024 * 1024) {
                    iTemp = (strFile.dwFileSize) / (1024);
                    MyString = iTemp + "K";
                } else {
                    iTemp = (strFile.dwFileSize) / (1024 * 1024);
                    MyString = iTemp + "M   ";
                    iTemp = ((strFile.dwFileSize) % (1024 * 1024)) / (1204);
                    MyString = MyString + iTemp + "K";
                }
                videoFile.setFileNme(new String(s[0]));
                videoFile.setFileSize(MyString);
                videoFile.setStartTime(strFile.struStartTime.toStringTime());
                videoFile.setEndTime(strFile.struStopTime.toStringTime());
                videoFiles.add(videoFile);
            } else {
                /*搜索中*/
                if (lnext.longValue() == NET_DVR_ISFINDING) {
                    log.info("搜索中");
                    continue;
                } else {
                    if (lnext.longValue() == NET_DVR_FILE_NOFIND) {
                        log.info("沒有搜到檔案");
                        return videoFiles;
                    } else {
                        log.info("搜索檔案結束");
                        boolean flag = hCNetSDK.NET_DVR_FindClose_V30(lFindFile);
                        if (flag == false) {
                            log.info("結束搜索失敗");
                        }
                        return videoFiles;
                    }
                }
            }
        }
    }

    /**
     * 按照檔案下載
     *
     * @param fileName
     * @param requestVo
     * @return
     */
    @Override
    public boolean downloadByFileNmae(String fileName, RequestVo requestVo) {
        /*初始化用戶*/
        NativeLong nativeLong = userId(requestVo.getSignIn());
        /*初始化下載值*/
        m_lDownloadHandle = new NativeLong(-1);
        if (m_lDownloadHandle.intValue() == -1) {
            /*根據輸入的檔案名查找檔案*/
            m_lDownloadHandle = hCNetSDK.NET_DVR_GetFileByName(nativeLong, fileName, "D:\\fileNme.3GP");
            if (m_lDownloadHandle.intValue() >= 0) {
                /*下載檔案*/
                boolean downloadFlag = hCNetSDK.NET_DVR_PlayBackControl(m_lDownloadHandle, NET_DVR_PLAYSTART, 0, null);
                int tmp = -1;
                IntByReference pos = new IntByReference();
                while (true) {
                    boolean backFlag = hCNetSDK.NET_DVR_PlayBackControl(m_lDownloadHandle, NET_DVR_PLAYGETPOS, 0, pos);
                    /*防止單個執行緒死回圈*/
                    if (!backFlag) {
                        return downloadFlag;
                    }
                    int produce = pos.getValue();
                    /*獲取下載進度*/
                    if ((produce % 10) == 0 && tmp != produce) {
                        tmp = produce;
                        log.info("視頻下載進度:{}", produce + "%");
                    }
                    /*下載成功*/
                    if (produce == 100) {
                        hCNetSDK.NET_DVR_StopGetFile(m_lDownloadHandle);
                        m_lDownloadHandle.setValue(-1);
                        /*退出錄像機*/
                        hCNetSDK.NET_DVR_Logout(lUserID);
                        log.info("退出狀態:{}", hCNetSDK.NET_DVR_GetLastError());
                        return true;
                    }
                    /*下載失敗*/
                    if (produce > 100) {
                        hCNetSDK.NET_DVR_StopGetFile(m_lDownloadHandle);
                        m_lDownloadHandle.setValue(-1);
                        log.warn("由于網路原因或NVR較忙,下載例外終止!錯誤原因:{}", hCNetSDK.NET_DVR_GetLastError());
                        hCNetSDK.NET_DVR_Logout(lUserID);
                        return false;
                    }
                }
            } else {
                log.info("視頻下載失敗!失敗原因:{}", hCNetSDK.NET_DVR_GetLastError());
                return false;
            }
        }
        return true;
    }

    /**
     * 按照時間下載檔案
     *
     * @param requestVo
     * @return
     */
    @Override
    public boolean downloadByFileTime(RequestVo requestVo) {
        PlayBack playBack = requestVo.getPlayBack();
        /*初始化用戶*/
        NativeLong nativeLong = userId(requestVo.getSignIn());
        if (nativeLong.intValue() == -1) {
            return false;
        }
        m_lDownloadHandle = new NativeLong(-1);
        if (m_lDownloadHandle.intValue() == -1) {
            /*根據輸入的檔案名查找檔案*/
            m_lDownloadHandle = hCNetSDK.NET_DVR_GetFileByTime(nativeLong, new NativeLong(playBack.getChannelNumber().longValue())
                    , dataUtil.getHkTime(playBack.getStartTime()), dataUtil.getHkTime(playBack.getEndTime()), "D:\\fileNme.mp4");
            if (m_lDownloadHandle.intValue() >= 0) {
                /*下載檔案*/
                boolean downloadFlag = hCNetSDK.NET_DVR_PlayBackControl(m_lDownloadHandle, NET_DVR_PLAYSTART, 0, null);
                int tmp = -1;
                IntByReference pos = new IntByReference();
                while (true) {
                    boolean backFlag = hCNetSDK.NET_DVR_PlayBackControl(m_lDownloadHandle, NET_DVR_PLAYGETPOS, 0, pos);
                    /*防止單個執行緒死回圈*/
                    if (!backFlag) {
                        return downloadFlag;
                    }
                    int produce = pos.getValue();
                    /*獲取下載進度*/
                    if ((produce % 10) == 0 && tmp != produce) {
                        tmp = produce;
                        log.info("視頻下載進度:{}", produce + "%");
                    }
                    /*下載成功*/
                    if (produce == 100) {
                        hCNetSDK.NET_DVR_StopGetFile(m_lDownloadHandle);
                        m_lDownloadHandle.setValue(-1);
                        /*退出錄像機*/
                        hCNetSDK.NET_DVR_Logout(lUserID);
                        log.info("退出狀態:{}", hCNetSDK.NET_DVR_GetLastError());
                        return true;
                    }
                    /*下載失敗*/
                    if (produce > 100) {
                        hCNetSDK.NET_DVR_StopGetFile(m_lDownloadHandle);
                        m_lDownloadHandle.setValue(-1);
                        log.warn("由于網路原因或NVR較忙,下載例外終止!錯誤原因:{}", hCNetSDK.NET_DVR_GetLastError());
                        hCNetSDK.NET_DVR_Logout(lUserID);
                        return false;
                    }
                }
            } else {
                log.info("視頻下載失敗!失敗原因:{}", hCNetSDK.NET_DVR_GetLastError());
                return false;
            }
        }
        return true;
    }


    /**
     * 獲取用戶登錄資訊
     *
     * @return 回傳用戶狀態
     */
    public NativeLong userId(SignIn signIn) {
        boolean initSuc = hCNetSDK.NET_DVR_Init();
        if (initSuc != true) {
            log.info("初始化失敗");
        }
        /*判斷用戶狀態*/
        if (lUserID != null && lUserID.longValue() > -1) {
            hCNetSDK.NET_DVR_Logout_V30(lUserID);
            lUserID = new NativeLong(-1);
        }
        /*用戶登錄*/
        lUserID = hCNetSDK.NET_DVR_Login_V30(signIn.getIp(),
                (short) signIn.getPort(), signIn.getUserName(), signIn.getPassword(), m_strDeviceInfo);
        return lUserID;
    }

    /**
     * 用戶登錄 初始化設備
     *
     * @param requestVo
     * @return
     */
    @Override
    public List<SignIn> getDeviceInformation(RequestVo requestVo) {
        SignIn sign = requestVo.getSignIn();
        /*IP引數*/
        NET_DVR_IPPARACFG m_strIpparaCfg;
        /* 設備串列*/
        List<SignIn> signIns = new ArrayList<>();
        m_strDeviceInfo = new NET_DVR_DEVICEINFO_V30();
        NativeLong lUserID = userId(sign);
        long userID = lUserID.longValue();
        if (userID == -1) {
            log.info("注冊失敗");
            return signIns;
        } else {
            log.info("注冊成功");
            /*通道樹節點數目*/
            int m_iTreeNodeNum = 0;
            /*獲取IP接入配置引數*/
            IntByReference ibrBytesReturned = new IntByReference(0);
            /*IP接入配置結構獲取*/
            m_strIpparaCfg = new NET_DVR_IPPARACFG();
            m_strIpparaCfg.write();
            Pointer lpIpParaConfig = m_strIpparaCfg.getPointer();
            /*獲取通道引數*/
            boolean bRet = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG, new NativeLong(0),
                    lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned);
            m_strIpparaCfg.read();
            if (!bRet) {
                /*設備不支持,則表示沒有IP通道*/
                for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum++) {
                    SignIn s = new SignIn();
                    s.setDeviceId("Camera" + (iChannum + m_strDeviceInfo.byStartChan));
                    signIns.add(s);
                }
            } else {
                /*設備支持IP通道*/
                for (int iChannum = 0; iChannum < m_strDeviceInfo.byChanNum; iChannum++) {
                    if (m_strIpparaCfg.byAnalogChanEnable[iChannum] == 1) {
                        SignIn s = new SignIn();
                        s.setDeviceId("Camera" + (iChannum + m_strDeviceInfo.byStartChan));
                        signIns.add(s);
                        m_iTreeNodeNum++;
                    }
                }
                for (int iChannum = 0; iChannum < MAX_IP_CHANNEL; iChannum++) {
                    /*判斷該通道號是否存在攝像頭*/
                    if (m_strIpparaCfg.struIPChanInfo[iChannum].byChannel == 1) {
                        SignIn s = new SignIn();
                        NET_DVR_IPDEVINFO dev = m_strIpparaCfg.struIPDevInfo[iChannum];
                        s.setIp(new String(dev.struIP.sIpV4).trim());
                        s.setUserName(new String(dev.sUserName).trim());
                        s.setPort(dev.wDVRPort);
                        s.setIsLine(String.valueOf(m_strIpparaCfg.struIPChanInfo[iChannum].byEnable));
                        s.setDeviceId("IPCamera" + (iChannum + m_strDeviceInfo.byStartChan));
                        Integer channelNumber = getChannelNumber(s.getDeviceId());
                        s.setChannelNumber(channelNumber);
                        signIns.add(s);
                    }
                }
            }
            log.info("攝像頭資源:{}", signIns);
        }
        return signIns;
    }

    /**
     * 回放拉流
     *
     * @param requestVo
     * @return
     */
    @Override
    public Map getBackUrl(RequestVo requestVo) {
        Map map = new HashMap();
        /*初始化用戶*/
        SignIn sign = requestVo.getSignIn();
        PlayBack playBack = requestVo.getPlayBack();
        NativeLong nativeLong = userId(sign);
        if (nativeLong.intValue() == -1) {
            log.info("回放推流用戶初始化失敗");
            map.put("msg", "回放推流用戶初始化失敗");
            return map;
        }
        String url = sign.getAppId() + "/" + sign.getDeviceId();
        /*獲取設備通道號*/
        List<SignIn> signIns = getDeviceInformation(requestVo);
        int channelNum = 0;
        for (SignIn signIn : signIns) {
            if (signIn.getIp().equals(sign.getDeviceIp())) {
                channelNum = signIn.getChannelNumber();
            }
        }
        if (channelNum == 0) {
            log.info("獲取設備通道失敗");
            map.put("msg", "獲取設備通道失敗!");
            return map;
        }
        String backUrl = "";
        if (playBack.getUrlType() == 1) {
            /*組裝回放流地址*/
            backUrl = "rtsp://admin:" + sign.getPassword() + "@" + sign.getIp() + ":554/Streaming/tracks/" + (channelNum - 32) + "01/?" +
                    "starttime=" + dataUtil.backTimeAssemble(playBack.getStartTime()) + "&endtime=" + dataUtil.backTimeAssemble(playBack.getEndTime());
        } else {
            /*組裝實時流地址*/
            backUrl = "rtsp://admin:" + sign.getPassword() + "@" + sign.getDeviceIp() + ":554/Streaming/tracks/" + (channelNum - 32) + "02/?" +
                    "transportmode=multicast";
        }
        map.put("msg", backUrl);
        return map;
    }


    /**
     * 獲取選中的通道名,對通道名進行分析:
     *
     * @param sChannelName
     * @return
     */
    public int getChannelNumber(String sChannelName) {
        int iChannelNum = -1;
        /*Camara開頭表示模擬通道*/
        if (sChannelName.charAt(0) == 'C') {
            /*子字串中獲取通道號*/
            iChannelNum = Integer.parseInt(sChannelName.substring(6));
        } else {
            /*IPCamara開頭表示IP通道*/
            if (sChannelName.charAt(0) == 'I') {
                /*子字符創中獲取通道號,IP通道號要加32,如IPCamera3 == 35*/
                iChannelNum = Integer.parseInt(sChannelName.substring(8)) + 32;
            } else {
                return -1;
            }
        }
        return iChannelNum;
    }

}

HCNetSDK:

package com.hikvision.nvr.service.hk;

import com.hikvision.nvr.util.*;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;

public interface HCNetSDK extends StdCallLibrary {

    /*加載海康DLL*/
    HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(CommonKit.getWebPath()+"HCNetSDK.dll", HCNetSDK.class);

    /*初始化*/
    boolean NET_DVR_Init();

    /*用戶登錄*/
    NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);

    /* 引數配置 begin*/
    boolean NET_DVR_GetDVRConfig(NativeLong lUserID, int dwCommand, NativeLong lChannel, Pointer lpOutBuffer, int dwOutBufferSize, IntByReference lpBytesReturned);

    /*查詢視頻檔案*/
    NativeLong NET_DVR_FindFile_V30(NativeLong lUserID, NET_DVR_FILECOND pFindCond);

    /*查找下一個檔案*/
    NativeLong NET_DVR_FindNextFile_V30(NativeLong lFindHandle, NET_DVR_FINDDATA_V30 lpFindData);

    /*結束搜索檔案*/
    boolean NET_DVR_FindClose_V30(NativeLong lFindHandle);

    /*用戶注銷*/
    boolean NET_DVR_Logout_V30(NativeLong lUserID);

    /* 根據名稱搜索檔案 */
    NativeLong NET_DVR_GetFileByName(NativeLong lUserID, String sDVRFileName, String sSavedFileName);

    /*下載檔案*/
    boolean NET_DVR_PlayBackControl(NativeLong lPlayHandle, int dwControlCode, int dwInValue, IntByReference LPOutValue);

    /* 停止檔案下載 */
    boolean  NET_DVR_StopGetFile(NativeLong lFileHandle);

    /*退出NVR*/
    boolean  NET_DVR_Logout(NativeLong lUserID);

    /*獲取退出狀態*/
    int  NET_DVR_GetLastError();

    /*根據時間下載視頻*/
    NativeLong  NET_DVR_GetFileByTime(NativeLong lUserID, NativeLong lChannel, NET_DVR_TIME lpStartTime, NET_DVR_TIME lpStopTime, String sSavedFileName);

}

以及HCNetSDK中其他物體類:
在這里插入圖片描述

四、介面請求引數

創建一個NVR.postman_collection.json的檔案,將以下文本放入匯入到PostMan中即可請求

{
	"info": {
		"_postman_id": "bb70a6f1-e3a6-45cf-b914-76e3a7622628",
		"name": "NVR",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"item": [
		{
			"name": "根據時間獲取檔案資訊",
			"request": {
				"auth": {
					"type": "noauth"
				},
				"method": "POST",
				"header": [
					{
						"key": "ip",
						"value": "192.168.18.133",
						"type": "text",
						"disabled": true
					},
					{
						"key": "port",
						"value": "8000",
						"type": "text",
						"disabled": true
					},
					{
						"key": "userName",
						"value": "admin",
						"type": "text",
						"disabled": true
					},
					{
						"key": "password",
						"value": "a12345678",
						"type": "text",
						"disabled": true
					},
					{
						"key": "Content-Type",
						"value": "application/json",
						"type": "text",
						"disabled": true
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\r\n  \"playBack\": {\r\n    \"channelNumber\": 34,\r\n    \"endTime\": \"2021-11-04 18:00:00\",\r\n    \"startTime\": \"2021-11-04 15:00:00\"\r\n  },\r\n  \"signIn\": {\r\n    \"ip\": \"192.168.18.133\",\r\n    \"password\": \"a12345678\",\r\n    \"port\": 8000,\r\n    \"userName\": \"admin\"\r\n  }\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "http://localhost:8081/nvr/playback",
					"protocol": "http",
					"host": [
						"localhost"
					],
					"port": "8081",
					"path": [
						"nvr",
						"playback"
					]
				}
			},
			"response": []
		},
		{
			"name": "獲取鏈接設備資訊",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "{\r\n  \"playBack\": {\r\n    \"channelNumber\": 34,\r\n    \"endTime\": \"2021-11-04 18:00:00\",\r\n    \"startTime\": \"2021-11-04 15:00:00\"\r\n  },\r\n  \"signIn\": {\r\n    \"ip\": \"192.168.18.133\",\r\n    \"password\": \"a12345678\",\r\n    \"port\": 8000,\r\n    \"userName\": \"admin\"\r\n  }\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "http://localhost:8081/nvr/getDeviceInformation",
					"protocol": "http",
					"host": [
						"localhost"
					],
					"port": "8081",
					"path": [
						"nvr",
						"getDeviceInformation"
					]
				}
			},
			"response": []
		},
		{
			"name": "根據檔案名下載視頻",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "{\r\n  \"playBack\": {\r\n    \"channelNumber\": 34,\r\n    \"endTime\": \"2021-11-04 18:00:00\",\r\n    \"startTime\": \"2021-11-04 15:00:00\"\r\n  },\r\n  \"signIn\": {\r\n    \"ip\": \"192.168.18.133\",\r\n    \"password\": \"a12345678\",\r\n    \"port\": 8000,\r\n    \"userName\": \"admin\"\r\n  }\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "http://localhost:8081/nvr/downloadByFileNmae?fileName=ch0002_00010000096000000",
					"protocol": "http",
					"host": [
						"localhost"
					],
					"port": "8081",
					"path": [
						"nvr",
						"downloadByFileNmae"
					],
					"query": [
						{
							"key": "fileName",
							"value": "ch0002_00010000096000000"
						}
					]
				}
			},
			"response": []
		},
		{
			"name": "根據時間下載視頻",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "{\r\n  \"playBack\": {\r\n    \"channelNumber\": 33,\r\n    \"endTime\": \"2021-11-05 18:00:00\",\r\n    \"startTime\": \"2021-11-05 16:00:00\"\r\n  },\r\n  \"signIn\": {\r\n    \"ip\": \"192.168.18.133\",\r\n    \"password\": \"a12345678\",\r\n    \"port\": 8000,\r\n    \"userName\": \"admin\"\r\n  }\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "http://localhost:8081/nvr/downloadByFileTime",
					"protocol": "http",
					"host": [
						"localhost"
					],
					"port": "8081",
					"path": [
						"nvr",
						"downloadByFileTime"
					]
				}
			},
			"response": []
		},
		{
			"name": "獲取回放流地址",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "{\r\n  \"playBack\": {\r\n    \"channelNumber\": 34,\r\n    \"endTime\": \"2021-11-08 15:00:00\",\r\n    \"startTime\": \"2021-11-08 13:00:00\"\r\n  },\r\n  \"signIn\": {\r\n    \"ip\": \"192.168.18.133\",\r\n    \"password\": \"a12345678\",\r\n    \"port\": 8000,\r\n    \"userName\": \"admin\",\r\n    \"deviceIp\":\"192.168.18.183\"\r\n  }\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "http://localhost:8081/nvr/getBackUrl",
					"protocol": "http",
					"host": [
						"localhost"
					],
					"port": "8081",
					"path": [
						"nvr",
						"getBackUrl"
					]
				}
			},
			"response": []
		},
		{
			"name": "獲取實時視頻流",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "{\r\n  \"playBack\": {\r\n    \"channelNumber\": 34,\r\n    \"endTime\": \"2021-11-08 15:00:00\",\r\n    \"startTime\": \"2021-11-08 13:00:00\"\r\n  },\r\n  \"signIn\": {\r\n    \"ip\": \"192.168.18.133\",\r\n    \"password\": \"a12345678\",\r\n    \"port\": 8000,\r\n    \"userName\": \"admin\",\r\n    \"deviceIp\":\"192.168.18.180\"\r\n  }\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "http://localhost:8081/nvr/getLiveUrl",
					"protocol": "http",
					"host": [
						"localhost"
					],
					"port": "8081",
					"path": [
						"nvr",
						"getLiveUrl"
					]
				}
			},
			"response": []
		}
	]
}

五、專案地址

避免檔案使用積分問題本專案已上傳至百度網盤
百度網盤Maven匯入JAR
提取碼:s75w

六、總結

這是第一次對接硬體,還有很多不完善的地方希望大家諒解,有寫的不好的地方請大家指出,日后考慮放到gitee以便大家一起維護,在此感謝!
原創不易,歡迎來噴…在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354796.html

標籤:其他

上一篇:【影像檢測】基于Hough變換演算法檢測視頻車道線檢測matlab代碼

下一篇:Jenkins升級

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more