基于海康SDK开发文档分析+云台控制实现+经典案例

基于海康SDK开发文档分析+云台控制实现+经典案例

上一篇:海康威视java开发+demo运行+调用dll动态库坑

一、准备

  1. 海康的SDK下载 https://www.hikvision.com/cn/download_61.html
  2. 开发环境
  3. 海康设备(ip、端口、账号、密码)

二、SDK开发文档分析

  1. 开发文档位置:CH-HCNetSDKV5.3.6.30_build20180816_Win64 ->开发文档 -> 设备网络SDK使用手册.chm
  2. 打开文档注意下面这两个地方(这两个地方是开发寻找调用的接口的关键)
    基于海康SDK开发文档分析+云台控制实现+经典案例_第1张图片
  3. 由于该文档并不是开发文档,所以我们自己构建结构体不知道应该怎样定义(举一个典型的例子)

这是SDK定义
基于海康SDK开发文档分析+云台控制实现+经典案例_第2张图片

这是Java代码

//报警设备信息
public static class NET_DVR_ALARMER extends Structure
{
   public  byte byUserIDValid;                 /* userid是否有效 0-无效,1-有效 */
   public  byte bySerialValid;                 /* 序列号是否有效 0-无效,1-有效 */
   public  byte byVersionValid;                /* 版本号是否有效 0-无效,1-有效 */
   public  byte byDeviceNameValid;             /* 设备名字是否有效 0-无效,1-有效 */
   public  byte byMacAddrValid;                /* MAC地址是否有效 0-无效,1-有效 */
   public  byte byLinkPortValid;               /* login端口是否有效 0-无效,1-有效 */
   public  byte byDeviceIPValid;               /* 设备IP是否有效 0-无效,1-有效 */
   public  byte bySocketIPValid;               /* socket ip是否有效 0-无效,1-有效 */
    //原本是NativeLong类型   但是在之后的测试中发现在windows中这个是偏移了4字节  所以改为int
   public  int lUserID;                        /* NET_DVR_Login()返回值, 布防时有效    */
   public  byte[] sSerialNumber = new byte[SERIALNO_LEN];	/* 序列号 */
   public  int dwDeviceVersion;			    /* 版本信息 高16位表示主版本,低16位表示次版本*/
   public  byte[] sDeviceName = new byte[NAME_LEN];		    /* 设备名字 */
   public  byte[] byMacAddr = new byte[MACADDR_LEN];		/* MAC地址 */
   public  short wLinkPort;                     /* link port */
   public  byte[] sDeviceIP = new byte[128];    			/* IP地址 */
   public  byte[] sSocketIP = new byte[128];    			/* 报警主动上传时的socket IP地址 */
   public  byte byIpProtocol;                  /* Ip协议 0-IPV4, 1-IPV6 */
   public  byte[] byRes2 = new byte[11];
}
  1. 知道接口需要搜索的时候
    基于海康SDK开发文档分析+云台控制实现+经典案例_第3张图片

三、云台控制实现

  1. 按照上面的分析找到开发的流程结合java版本的Demo
    基于海康SDK开发文档分析+云台控制实现+经典案例_第4张图片

  2. 调用接口的时候需要注意

    ①、海康的demo是启动了预览的(如果需要和海康的demo一致的话,海康有些好的web控件)

    ②、我采用的方案是前端采用Video.js播放,通过EasyNVR流媒体服务(也可以自己搭建,我自

    己搭建的不太稳定)拿到对应的RTMP/HLS/FLV播放路径

  3. 根据上面的两种在调用接口的时候会有区别

    ①、启动预览(海康demo方案)
    基于海康SDK开发文档分析+云台控制实现+经典案例_第5张图片

    ②、不启动预览
    基于海康SDK开发文档分析+云台控制实现+经典案例_第6张图片

四、经典的案例

  1. 下面写出了经典的设置值和获取值的方法(在一些参数不知道怎么赋值的情况下,可以参照这个)
 /**
     * 设置视频参数
     */
    public boolean setParm(String lUser, Integer lCannel, VideoParmBean videoParmBean){
        IntByReference ibrBytesReturned = new IntByReference(0);
        HCNetSDK.NET_DVR_CAMERAPARAMCFG_EX struCameraCfg_ex = new HCNetSDK.NET_DVR_CAMERAPARAMCFG_EX();
        Pointer lpOutBuffer = struCameraCfg_ex.getPointer();
        struCameraCfg_ex.write();
        if(!hCNetSDK.NET_DVR_GetDVRConfig(new NativeLong(Long.parseLong(lUser)), 3368/*NET_DVR_GET_CCDPARAMCFG_EX*/, new NativeLong(lCannel), lpOutBuffer, struCameraCfg_ex.size(), ibrBytesReturned)){
            return false;
        }
        struCameraCfg_ex.read();
        struCameraCfg_ex.dwSize = struCameraCfg_ex.size();
        //给结构体赋值
        struCameraCfg_ex.struVideoEffect.liangdu = videoParmBean.getLiangdu().byteValue();
        struCameraCfg_ex.struVideoEffect.ruidu = videoParmBean.getRuidu().byteValue();
        struCameraCfg_ex.struVideoEffect.sedu = videoParmBean.getSedu().byteValue();
        struCameraCfg_ex.struVideoEffect.baohedu = videoParmBean.getBaohedu().byteValue();
        struCameraCfg_ex.struVideoEffect.duibidu = videoParmBean.getDuibidu().byteValue();
        struCameraCfg_ex.struNoiseRemove.byDigitalNoiseRemoveLevel = videoParmBean.getQuzao().byteValue();
        Pointer lpInBuffer = struCameraCfg_ex.getPointer();
        struCameraCfg_ex.write();
        if(!hCNetSDK.NET_DVR_SetDVRConfig(new NativeLong(Long.parseLong(lUser)), 3369/*NET_DVR_SET_CCDPARAMCFG_EX*/, new NativeLong(lCannel), lpInBuffer, struCameraCfg_ex.size())){
            return false;
        }
        return true;
    }
  1. 关于回调函数的设置,可以在报警的地方找到

你可能感兴趣的:(技术)