4.海康威视-注册与注销
作者:互联网
1. 准备
- postman 接口测试工具
- 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 测试结果
- 创建测试接口
- 获取测试结果
# 测试成功结果显示
{
"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 测试结果
- 创建测试接口
- 查看测试结果
{
"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