场景:
java调用海康一体机下发卡
pom依赖:
<dependency>
<groupId>examples</groupId>
<artifactId>examples</artifactId>
<version>1.0.0</version>
<systemPath>${lib.path}/examples.jar</systemPath>
<scope>system</scope>
</dependency>
<dependency>
<groupId>jna</groupId>
<artifactId>jna</artifactId>
<version>1.0.0</version>
<systemPath>${lib.path}/jna.jar</systemPath>
<scope>system</scope>
</dependency>
<dependency>
<groupId>com.hikvision.ga</groupId>
<artifactId>artemis-http-client</artifactId>
<version>1.1.3</version>
</dependency>
调用一体机必须先初始化,增加设备字符集统一使用utf8
static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
static {
hCNetSDK.NET_DVR_Init();//SDK初始化
}
static int iCharEncodeType = 0;//设备字符集(全局统一确保设备编码一致)
设备调用成功回返回一个句柄,封装句柄为全局使用(多个设备区分)
//SDK启用写日志
hCNetSDK.NET_DVR_SetLogToFile(3, IsecureCommunity.logWritePath, false);
//注册
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(deviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, deviceIP.length());
m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
System.arraycopy(username.getBytes(), 0, m_strLoginInfo.sUserName, 0, username.length());
m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
System.arraycopy(password.getBytes(), 0, m_strLoginInfo.sPassword, 0, password.length());
m_strLoginInfo.wPort = (short) port;
m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
m_strLoginInfo.write();
HCNetSDK.NET_DVR_DEVICEINFO_V40 strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, strDeviceInfo);
if (lUserID == -1)
{
log.info("登录失败,错误码为"+hCNetSDK.NET_DVR_GetLastError());
}
else
{
log.info("登录成功!");
iCharEncodeType = strDeviceInfo.byCharEncodeType;
}
return lUserID;
提示:这里填写问题的分析:
例如:Handler
发送消息有两种方式,分别是 Handler.obtainMessage()
和 Handler.sendMessage()
,其中 obtainMessage
方式当数据量过大时,由于 MessageQuene
大小也有限,所以当 message
处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
已卡为中心,下发卡使用NET_DVR_SET_CARD方法下发命令
HCNetSDK.NET_DVR_CARD_COND strCardCond = new HCNetSDK.NET_DVR_CARD_COND();
strCardCond.read();
strCardCond.dwSize = strCardCond.size();
strCardCond.dwCardNum = 1; //下发一张
strCardCond.write();
Pointer ptrStrCond = strCardCond.getPointer();
int setCardCfgHandle = hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_SET_CARD, ptrStrCond, strCardCond.size(),null ,null);
通过长连接NET_DVR_SendWithRecvRemoteConfig读取返回状态区分数据是否下发完成。
通过hCNetSDK.NET_DVR_StopRemoteConfig(setCardCfgHandle获取最终状态判断连接是否完成。
hCNetSDK.NET_DVR_StopRemoteConfig(setCardCfgHandle