海康威视SDK控制台程序consoleDemo

陈拓 2021/08/10-2020/08/10

1. 下载海康威视SDK

见《海康威视SDK实例QtDemo显示NVR视频窗口(Linux+Qt)》

https://zhuanlan.zhihu.com/p/395178052

https://blog.csdn.net/chentuo2000/article/details/119299045

2. 开发环境

我的开发环境:PC机(Win10)+工控机(Ubuntu)+海康NVR+海康摄像头

lsb_release -a

Win10操作Linux见《Win10命令窗口的SSH和SFTP操作》

https://zhuanlan.zhihu.com/p/403558589

https://blog.csdn.net/chentuo2000/article/details/119918637

和《Ubuntu18.04和Win10共享文件夹》

https://zhuanlan.zhihu.com/p/397913390

https://blog.csdn.net/chentuo2000/article/details/119539502

3. 复制consoleDemo到Ubuntu。

如果所有者和组不是当前登录用户,要改变所有者和组:

sudo chown -R ccdc:ccdc consoleDemo/

查看consoleDemo目录

4. 复制库文件

  • 查看readme.txt

在构建源代码之前:

  1. 请将SDK/lib目录下所有的库文件(.so)拷贝到consoleDemo/Linux64/lib
  2. 进入目录consoleDemo/Linux64/proj,执行make命令。
  • 复制库文件

  • 安装tree命令

  • 查看目录结构

tree linux64/

5. 编译Demo

进入目录consoleDemo/Linux64/proj

  • 编译

执行make命令

在lib目录下生成了可执行文件sdkTest:

为方便测试我们修改一下Makefile文件。

将EXE = ../lib/sdkTest改为:EXE = ./hkConsole

再编译make

这样生成的可执行文件就在本地了:

6. 连接NVR

见《Ubuntu18.04网络配置》

https://zhuanlan.zhihu.com/p/398167001

https://blog.csdn.net/chentuo2000/article/details/119564109

设备可以是NVR或者DVR,我用NVR。

我的NVR参数

我的摄像头参数

海康威视DS-IPC-B12-I4mm

7. 修改程序代码

将连接参数设置成我们自己的。

  • C++程序

  • 编辑consolemain.cpp

修改网络连接参数:

nano src/consoleMain.cpp

如图将下面3句:

改为

找到其他要修改的地方:

grep -r "10.8.98.80" src

如同修改consolemain.cpp一样,一一修改。

nano src/Voice.cpp

nano src/GetStream.cpp

nano src/Alarm.cpp

nano src/ConfigParams.cpp

nano src/CapPicture.cpp

nano src/playback.cpp

nano src/playback.cpp

再编译make。

8. 运行Demo

  • 运行

./hkConsole

程序可以运行了。

登录设备:Login dev 192.168.137.2:8000.

界面上有太多的调试日志信息,可以改变信息显示等级,我的修改如下:

修改consoleMain.cpp

将NET_DVR_SetLogToFile(3, "./sdkLog");中的3改为0,保存。

日志的等级(默认为0):0-表示关闭日志,1-表示只输出ERROR错误日志,2-输出ERROR错误信息和DEBUG调试信息,3-输出ERROR错误信息、DEBUG调试信息和INFO普通信息等所有信息。你可以根据自己的需要设置日志等级。

编译

警告,在"./sdkLog"前面加上类型。

再编译就没有警告了。

运行

画面干净。

程序虽然可以运行了,但是所列出的功能基本上都不能用,需要根据设备的具体情况修改。

9. 修改连接

例子程序中多个功能程序单独初始化连接设备,下面我们把初始化放在主程序中,以后只要将用户ID作为参数传递到各个功能模块程序就可以了。

  • 修改consoleMain.cpp
#include <stdio.h>
#include <iostream>
#include "GetStream.h"
#include "public.h"
#include "ConfigParams.h"
#include "Alarm.h"
#include "CapPicture.h"
#include "playback.h"
#include "Voice.h"
#include "tool.h"
#include <string.h>
using namespace std;

void Demo_SDK_Version();
void Demo_SDK_Ability();

char * iIP = (char *)"192.168.137.2";
WORD wPort = 8000;
char * iUserName = (char *)"admin";
char * iPassword = (char *)"xxxxxxxx";

int lUserID = -1;

// 初始化
int init() {
    NET_DVR_Init(); 
    Demo_SDK_Version(); // 显示SDK版本
    NET_DVR_SetLogToFile(0, (char*)"./sdkLog");

    printf("\nIP %s\n", iIP);
    printf("Port %d\n", wPort);
    printf("UserName %s\n", iUserName);
    printf("Password %s\n", iPassword);

    //Login device
    NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};
    NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};
    struLoginInfo.bUseAsynLogin = false; // false=0,同步登录

    struLoginInfo.wPort = wPort;
    memcpy(struLoginInfo.sDeviceAddress, iIP, NET_DVR_DEV_ADDRESS_MAX_LEN);
    memcpy(struLoginInfo.sUserName, iUserName, NAME_LEN);
    memcpy(struLoginInfo.sPassword, iPassword, NAME_LEN);

    lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40); //接口返回-1表示登录失败,其他值表示返回的用户ID值。用户ID具有唯一性,后续对设备的操作都需要通过此ID实现。
    if (lUserID < 0) {
        printf("pyd---Login error, %d\n", NET_DVR_GetLastError());
        if(NET_DVR_GetLastError()  == 7) {
            printf("连接设备失败。设备不在线或网络原因引起的连接超时等。\n");
        }

        NET_DVR_Cleanup();
        return HPR_ERROR;
    }
    cout << "\nlUserID is " << lUserID << endl;

	DWORD bytesReturned = 0;
	NET_DVR_DEVICECFG devCfg;
	devCfg.dwSize = sizeof(NET_DVR_DEVICECFG);
	bool resCode = NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_DEVICECFG, -1, &devCfg, sizeof(NET_DVR_DEVICECFG), &bytesReturned);
	if (!resCode) {
		DWORD code = NET_DVR_GetLastError();
		std::cout << "NET_DVR_GetDVRConfig failed " << NET_DVR_GetErrorMsg((LONG*)(&code)) << std::endl;
		NET_DVR_Logout(lUserID);
		//释放SDK资源
		NET_DVR_Cleanup();
		::getchar();
		return -1;
	}
    cout << "设备信息: " << endl;
	std::cout << "设备名: " << devCfg.sDVRName << ", 序列号: " << devCfg.sSerialNumber << ", 设备ID号: " << devCfg.dwDVRID << ", 设备类型: " << (int)devCfg.byDVRType << std::endl;

    return 0;
}

int main() {
    int iok = init();
    if (iok == 0) cout << "连接设备化成功!" << endl;
    else cout << "连接设备失败!" << endl;

    char cUserChoose = 'r';

    if (lUserID < 0) {
        printf("pyd---Login error, %d\n", NET_DVR_GetLastError());
        printf("Press any key to quit...\n");
        cin>>cUserChoose;

        NET_DVR_Cleanup();
        return HPR_ERROR;
    }

    while ('q' != cUserChoose) {
        printf("\n");
        printf("Input 1, Test GetStream\n");
        printf("      2, Test Configure params\n");
        printf("      3, Test Alarm\n");
        printf("      4, Test Capture Picture\n");
        printf("      5, Test play back\n");
        printf("      6, Test Voice\n");
        printf("      7, Test SDK ability\n");
        printf("      8, Test tool interface\n");
        printf("      q, Quit.\n");
        printf("Input:");

        cin>>cUserChoose;
        switch (cUserChoose) {
        case '1':
            Demo_GetStream_V30(lUserID); //Get stream.
            break;
        case '2':
            Demo_ConfigParams(lUserID); // 设备参数
            break;
        case '3':
            Demo_Alarm();         //Alarm & listen.
            break;
        case '4':
            Demo_Capture(lUserID);
            break;
        case '5':
            Demo_PlayBack((int)lUserID);     //record & playback
            break;
        case '6':
            Demo_Voice();
            break;
        case '7':
            Demo_SDK_Ability();
            break;
		case '8':
			Demo_DVRIPByResolveSvr();
			break;
        default:
            break;
        }
    }

    //logout
    // NET_DVR_Logout(lUserID);
    NET_DVR_Logout_V30(lUserID); //注销用户
    NET_DVR_Cleanup(); //释放SDK资源
    return 0;
}

void Demo_SDK_Ability() {
    NET_DVR_Init();
    NET_DVR_SDKABL struSDKABL = {0};
    if (NET_DVR_GetSDKAbility(&struSDKABL))
    {
        printf("SDK Max: %d\n", struSDKABL.dwMaxRealPlayNum);
        NET_DVR_Cleanup();
        return;
    }

    NET_DVR_Cleanup();
    return;
}

void Demo_SDK_Version() {
    unsigned int uiVersion = NET_DVR_GetSDKBuildVersion();

    char strTemp[1024] = {0};
    sprintf(strTemp, "HCNetSDK V%d.%d.%d.%d\n", \
        (0xff000000 & uiVersion)>>24, \
        (0x00ff0000 & uiVersion)>>16, \
        (0x0000ff00 & uiVersion)>>8, \
        (0x000000ff & uiVersion));
    printf("%s", strTemp);
}
  • 编译运行

接下来我们要取得摄像头的视频通道号,见

《海康威视SDK控制台程序consoleDemo获取视频通道参数》

https://zhuanlan.zhihu.com/p/404390272

https://blog.csdn.net/chentuo2000/article/details/119963580

おすすめ

転載: blog.csdn.net/chentuo2000/article/details/119939573
おすすめ