ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

4.海康威视-注册与注销

2021-12-07 14:05:18  阅读:682  来源: 互联网

标签:hCNetSDK 威视 byte NET 海康 new 注销 public DVR


1. 准备

  1. postman 接口测试工具
  2. spring boot

2. 添加NET_DVR_Login_V40注册登录接口

添加NET_DVR_Login_V40接口需要在HCNetSDK.java中添加

参考开发手册参数定义:
在这里插入图片描述
输入参数设定参考:
在这里插入图片描述
输出参数参考:
在这里插入图片描述
代码实现:
HCNetSDK.java 继承的 Library修改为 StdCallLibrary,在StdCallLibrary已经继承了Library
然后添加如下代码:

public static final int NET_DVR_DEV_ADDRESS_MAX_LEN = 129;
public static final int NET_DVR_LOGIN_USERNAME_MAX_LEN = 64;
public static final int NET_DVR_LOGIN_PASSWD_MAX_LEN = 64;
public static interface FLoginResultCallBack extends StdCallCallback{
	public int invoke(int lUserID, int dwResult, NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser);
}
//NET_DVR_Login_V40()输入参数
public static class NET_DVR_USER_LOGIN_INFO extends Structure
{
	public byte[] sDeviceAddress = new byte[NET_DVR_DEV_ADDRESS_MAX_LEN];
	public byte byUseTransport;
	public short wPort;
	public byte[] sUserName = new byte[NET_DVR_LOGIN_USERNAME_MAX_LEN];
	public byte[] sPassword = new byte[NET_DVR_LOGIN_PASSWD_MAX_LEN];
	public FLoginResultCallBack cbLoginResult;
	public Pointer pUser;
	public boolean bUseAsynLogin;
	public byte[] byRes2 = new byte[128];
}

// NET_DVR_Login_V40输出参数
public static class NET_DVR_DEVICEINFO_V40 extends Structure
{
	public NET_DVR_DEVICEINFO_V30 struDeviceV30 = new NET_DVR_DEVICEINFO_V30();
	public byte bySupportLock;
	public byte byRetryLoginTime;
	public byte byPasswordLevel;
	public byte byRes1;
	public int dwSurplusLockTime;
	public byte[] byRes2 = new byte[256];
}

// NET_DVR_Login_V40接口添加
 NativeLong NET_DVR_Login_V40(NET_DVR_USER_LOGIN_INFO pLoginInfo, NET_DVR_DEVICEINFO_V40 lpDeviceInfo);

2. 编写海康设备操作控制类

public class HIKDevice {

    public static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;

	HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;//设备信息
	HCNetSDK.NET_DVR_IPPARACFG  m_strIpparaCfg;//IP参数

    public static FMSGCallBack_V31 fMSFCallBack_V31 = null;    //回调函数务必设置成全局静态的,防止被JVM自动垃圾回收,导致收不到报警数据

    //构造函数
    public HIKDevice()
    {
        System.out.println("进入构造函数");
        // 初始化SDK
        boolean initSuc = hCNetSDK.NET_DVR_Init();
        if (initSuc != true) {
            System.out.println("初始化失败");
        }
        // 设置连接时间与重连时间
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        System.out.println("初始化SDK资源完成");
    }

	/**
	 * 初始化资源配置
	 */
	public int initDevices(){
		if(!hCNetSDK.NET_DVR_Init()) return 1;//初始化失败
		return 0;
	}

    //销毁函数
    @PreDestroy
    public void destroy() throws Exception {
        hCNetSDK.NET_DVR_Cleanup();
    }

    //登录设备
    public static HKResturnDTO loginDevice(String sDeviceIP, int iPort, String sUserName, String sPassWord)
    {
        NativeLong lUserID = new NativeLong(-1);    // 用户句柄
		//设备信息, 输出参数
		HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
		HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
		// 注册设备-登录参数,包括设备地址、登录用户、密码等
		m_strLoginInfo.sDeviceAddress = new byte[hCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
		System.arraycopy(sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, sDeviceIP.length());
		m_strLoginInfo.sUserName = new byte[hCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
		System.arraycopy(sUserName.getBytes(), 0, m_strLoginInfo.sUserName, 0, sUserName.length());
		m_strLoginInfo.sPassword = new byte[hCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
		System.arraycopy(sPassWord.getBytes(), 0, m_strLoginInfo.sPassword, 0, sPassWord.length());
		m_strLoginInfo.wPort = Short.parseShort(String.valueOf(iPort)) ;
		m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
		m_strLoginInfo.write();
        //注册设备
        lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
		HKResturnDTO dto = new HKResturnDTO();
		dto.setDeviceIP(sDeviceIP);
		dto.setDevicePort(iPort);
        if (lUserID.intValue() < 0)
        {
            System.out.println("注册失败,设备IP:"+sDeviceIP + " 端口:"+ iPort + "错误码:" + hCNetSDK.NET_DVR_GetLastError());
            dto.setErrorCode(hCNetSDK.NET_DVR_GetLastError());
            return dto;
        }
        else {
            System.out.println("注册成功,设备IP:"+sDeviceIP + " 端口:"+ iPort);
            dto.setErrorCode(0);
            dto.setUserId(lUserID.intValue());
            dto.setNativeLong(lUserID);
            dto.setM_strDeviceInfo(m_strDeviceInfo);
            return dto;
        }
    }

	//注销设备
    public String logoutDevice(int lUserID)
    {
        NativeLong nlUserID = new NativeLong(lUserID);
        if (!hCNetSDK.NET_DVR_Logout(nlUserID))
        {
            System.out.println("注销失败,设备ID:"+ nlUserID.intValue() + "错误码:"+hCNetSDK.NET_DVR_GetLastError());
            return "{\"result\":\"loginDevice Fail\",\"userID\":"+nlUserID.intValue()+",\"errorCode\":"+hCNetSDK.NET_DVR_GetLastError()+"}";
        }else{
            System.out.println("注销成功,设备ID:"+ nlUserID.intValue());
            return "{\"result\":\"logoutDevice Success\",\"userID\":"+nlUserID.intValue()+",\"errorCode\":0}";
        }
    }
}

  • 注解:1.NET_DVR_DEVICEINFO_V30
    在这里插入图片描述
  • 注解:2.NET_DVR_Login_V40 与 NET_DVR_Login_V30区别
    NET_DVR_Login_V40:支持同步,异步登录。并兼容了NET_DVR_Login_V30
    NET_DVR_Login_V30:只支持同步登录

2. 设备登录

2.1 代码实现

在controller层调用设备登录方法

@RestController
public class DeviceController {
	HIKDevice hikDevice;
	// 初始化海康设备操作类
	DeviceController() {
		if (hikDevice == null) {
			hikDevice = new HIKDevice();
		}
	}
	/*
	 * 功能:登录设备
	 * 参数:
	 *      deviceIP-设备局域网IP地址
	 *      devicePort-设备SDK服务端口
	 *      userName-用户名
	 *      passWord-密码
	 * */
	@ApiOperation(value = "登录设备", notes = "登录设备")
	@PostMapping(value = "/loginDevice")
	@ResponseBody
	public Object loginDevice(@RequestBody JSONObject jsonPrama) {
		String deviceIP = jsonPrama.get("deviceIP").toString();
		int devicePort = Integer.parseInt(jsonPrama.get("devicePort").toString());
		String userName = jsonPrama.get("userName").toString();
		String passWord = jsonPrama.get("passWord").toString();
		String strRet = "";
		HKResturnDTO dto = hikDevice.loginDevice(deviceIP, devicePort, userName, passWord);
		System.out.println(strRet);
		return ResponseUtil.ok(dto);
	}
}

2.2 测试结果

  1. 创建测试接口
    在这里插入图片描述
  2. 获取测试结果
# 测试成功结果显示
{
    "errno": 0,
    "data": {
        "deviceIP": "192.168.1.64",
        "devicePort": 8000,
        "userId": 0,
        "errorCode": 0,
        "nativeLong": 0,
        "byChanNum": null,
        "m_strDeviceInfo": {
            "autoRead": true,
            "autoWrite": true,
            "struDeviceV30": {
                "autoRead": true,
                "autoWrite": true,
                "sSerialNumber": "aURTLTJERjg0NDBJWC1BMjAyMTA3MjNDQ0NIRzM5ODI1MzIwAAAAAAAAAAAAAAAA",
                "byAlarmInPortNum": 7,
                "byAlarmOutPortNum": 2,
                "byDiskNum": 0,
                "byDVRType": 0,
                "byChanNum": 1,
                "byStartChan": 1,
                "byAudioChanNum": 1,
                "byIPChanNum": 0,
                "byRes1": "AAICgG0GKQABwQAAANUBAAAQAAAAAJwA",
                "pointer": {
                    "size": 344,
                    "valid": true
                }
            },
            "bySupportLock": 0,
            "byRetryLoginTime": 0,
            "byPasswordLevel": 2,
            "byRes1": 0,
            "dwSurplusLockTime": 0,
            "byRes2": "AgAAAAEAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
            "pointer": {
                "size": 344,
                "valid": true
            }
        }
    },
    "errmsg": "成功"
}

3. 设备注销

3.1 代码实现

在controller层调用设备注销方法

@ApiOperation(value = "注销设备", notes = "注销设备")
@PutMapping(value = "/logoutDevice")
@ResponseBody
public Object logoutDevice(@RequestParam Integer lUserID) {
	String str = hikDevice.logoutDevice(lUserID.intValue());
	System.out.println(str);
	return ResponseUtil.ok(str);
}

3.2 测试结果

  1. 创建测试接口
    在这里插入图片描述
  2. 查看测试结果
    在这里插入图片描述
{
    "errno": 0,
    "data": "{\"result\":\"logoutDevice Success\",\"userID\":0,\"errorCode\":0}",
    "errmsg": "成功"
}

通过调用设备的控制方法将显示47错误,设备注销成功。在这里插入图片描述在这里插入图片描述

标签:hCNetSDK,威视,byte,NET,海康,new,注销,public,DVR
来源: https://blog.csdn.net/qq_19331985/article/details/121766494

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有