当前位置:   article > 正文

Java-Spring Boot 集成海康威视明眸门禁 布防|报警|回调|获取事件|查询用户信息_明眸门禁设备代码

明眸门禁设备代码

最近做门禁的集成,突然感觉海康这个东西挺有意思的,于是记录一下。

好了废话不多说,开始上环境、代码

本集成是海康-设备网络集成(以人为中心)

环境:windows

开发工具:IDEA

JDK版本:JDK-11.0.12

海康jar包:怎么引入都行(本地引入、maven上传到私服)

                链接:https://pan.baidu.com/s/12limkwExPqn9q-vUc6zA6g?pwd=xr0s 
                提取码:xr0s 

海康库:

        windows环境:链接:https://pan.baidu.com/s/10iADLziw-jdxWd9Awmuu4Q?pwd=o26k 
                                提取码:o26k 

        linux环境:     链接:https://pan.baidu.com/s/10iADLziw-jdxWd9Awmuu4Q?pwd=o26k 
                                提取码:o26k 

布防整体流程:

我们就以此流程开始:

1、初始化SDK:
  1. /**
  2. * 海康设备提前操作方法(第一步)
  3. */
  4. private Integer preparation(String ip, String user, String password, Integer port, Boolean isLogin) {
  5. // 创建操作类
  6. createHkSdkInstance();
  7. // 加载组件库
  8. loadLinuxSystem(SystemHkSelect.isLinux());
  9. // 初始话操作类
  10. HK_NET_SDK.NET_DVR_Init();
  11. log.info("海康设备初始化成功!");
  12. // 操作完成,首先登录设备
  13. return loginAccessHk(ip, user, password, ObjectUtils.isNotEmpty(port) ? Short.parseShort(port.toString()) : (short) 8000;
  14. }

参数解释:

ip:门禁设备的IP地址

user:门禁设备的管理员

password:管理员密码

port:端口   默认8000

isLogin:暂时无用

  1. /**
  2. * 创建海康SDK操作类(第二步)
  3. */
  4. private void createHkSdkInstance() {
  5. try {
  6. // 海康SDK操作类
  7. if (HK_NET_SDK == null) {
  8. log.info("海康SDK操作类为空,开始创建海康SDK操作类");
  9. HK_NET_SDK = (HCNetSDK) Native.loadLibrary(stringDllPath,
  10. HCNetSDK.class);
  11. log.info("海康SDK操作类创建成功");
  12. } else {
  13. log.info("海康SDK操作类不为空,无需创建");
  14. }
  15. } catch (Exception e) {
  16. throw exception(UNKNOWN_OPERATING_SYSTEM);
  17. }
  18. }

参数解释:

 stringDllPath:海康库的加载地址(配置成海康库里HCNetSDK.dll这个文件的路径)

        windows环境:C:\\Users\\PinRu\\Desktop\\CH-HCNetSDKV6.1.9.48_build20230410_win64\\lib\\HCNetSDK.dll

        linux环境:C:\\Users\\PinRu\\Desktop\\CH-HCNetSDKV6.1.9.48_build20230410_linux64\\lib\\libhcnetsdk.so

  1. /**
  2. * linux系统建议调用以下接口加载组件库(win下不需要操作)(第三步)
  3. */
  4. private void loadLinuxSystem(Boolean isLinux) {
  5. // linux系统建议调用以下接口加载组件库(win下不需要操作)
  6. if (isLinux) {
  7. log.info("加载海康组件库" + isLinux);
  8. HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
  9. HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
  10. //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
  11. // cry组件库
  12. System.arraycopy(stringCryPath.getBytes(), 0, ptrByteArray1.byValue, 0,
  13. stringCryPath.length());
  14. ptrByteArray1.write();
  15. HK_NET_SDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());
  16. System.arraycopy(stringSslPath.getBytes(), 0, ptrByteArray2.byValue, 0,
  17. stringSslPath.length());
  18. ptrByteArray2.write();
  19. // ssl组件库
  20. HK_NET_SDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
  21. HCNetSDK.NET_DVR_LOCAL_SDK_PATH strComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
  22. // lib组件库
  23. System.arraycopy(stringLibPath.getBytes(), 0, strComPath.sPath, 0,
  24. stringLibPath.length());
  25. strComPath.write();
  26. HK_NET_SDK.NET_DVR_SetSDKInitCfg(2, strComPath.getPointer());
  27. }
  28. }

参数解释: 

 isLinusx:是否是linux环境(win开发环境下,直接写成false)

stringCryPath:cry路径         默认路径:/lib/libcrypto.so.1.1

stringSslPath:ssl路径          默认路径:/lib/libssl.so.1.1

stringLibPath:lib库路径       默认路径:/lib/

2、用户注册
  1. public static Integer loginAccessHk(String deviceIp, String userName, String password,
  2. short port) {
  3. //注册(登录海康设备)
  4. //设备登录信息
  5. HCNetSDK.NET_DVR_USER_LOGIN_INFO strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
  6. //设备ip地址
  7. strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
  8. System.arraycopy(deviceIp.getBytes(), 0, strLoginInfo.sDeviceAddress, 0, deviceIp.length());
  9. //设备用户名
  10. strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
  11. System.arraycopy(userName.getBytes(), 0, strLoginInfo.sUserName, 0, userName.length());
  12. //设备密码
  13. strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
  14. System.arraycopy(password.getBytes(), 0, strLoginInfo.sPassword, 0, password.length());
  15. //sdk端口
  16. strLoginInfo.wPort = port;
  17. //是否异步登录:0- 否,1- 是
  18. strLoginInfo.bUseAsynLogin = false;
  19. strLoginInfo.write();
  20. //设备信息
  21. HCNetSDK.NET_DVR_DEVICEINFO_V40 strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
  22. AtomicInteger userId = new AtomicInteger(-1);
  23. userId.set(HK_NET_SDK.NET_DVR_Login_V40(strLoginInfo, strDeviceInfo));
  24. if (userId.get() == -1) {
  25. return HK_NET_SDK.NET_DVR_GetLastError();
  26. } else {
  27. log.info("设备登录成功,用户ID:" + userId);
  28. strDeviceInfo.read();
  29. CHAR_ENCODE_TYPE = strDeviceInfo.byCharEncodeType;
  30. }
  31. return userId.get();
  32. }

参数解释:

deviceIp:门禁设备的IP地址

userName:门禁设备的管理员

password:管理员密码

port:端口   默认8000

3、门禁设备布防
  1. public Boolean equipmentRegistration() {
  2. // 设备准备工作(必须调用)
  3. try {
  4. Integer userId = preparation("", "", "", null, null);
  5. // 回调函数
  6. if (callBack == null) {
  7. callBack = new HkEquipmentCallBack();
  8. }
  9. // 设置回调
  10. HK_NET_SDK.NET_DVR_SetDVRMessageCallBack_V50(0, callBack, null);
  11. //布防参数
  12. HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50 param =
  13. new HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50();
  14. param.dwSize = param.size();
  15. //布防等级
  16. param.byLevel = 0;
  17. // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
  18. param.byAlarmInfoType = 1;
  19. //布防类型:0-客户端布防,1-实时布防
  20. param.byDeployType = 1;
  21. param.write();
  22. // 设备布防
  23. int v41 = HK_NET_SDK.NET_DVR_SetupAlarmChan_V50(userId, param, null, 0);
  24. if (v41 < 0) {
  25. log.info("设备布防失败,布防结果:" + v41);
  26. // 布防失败
  27. logout(userId);
  28. }
  29. } catch (Exception e) {
  30. log.error("门禁设备设置门禁布防失败!错误信息:", e);
  31. return Boolean.FALSE;
  32. }
  33. log.info("布防成功");
  34. return Boolean.TRUE;
  35. }

HkEquipmentCallBack 布防回调:

  1. import cn.hutool.extra.spring.SpringUtil;
  2. import com.sun.jna.Pointer;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * 布防回调的入口
  7. */
  8. @Component
  9. @Slf4j
  10. public class HkEquipmentCallBack implements HCNetSDK.FMSGCallBack_V31 {
  11. @Override
  12. public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlar, Pointer pAlarmInfo,
  13. int dwBufLen, Pointer pUser) {
  14. log.info("hk alarm call back,type:{}", lCommand);
  15. // 轮询处理事件回调
  16. switch (lCommand) {
  17. case HCNetSDK.COMM_ALARM:
  18. saveEquipmentLog(pAlar);
  19. break;
  20. case HCNetSDK.COMM_TRADEINFO:
  21. saveEquipmentLog(pAlar);
  22. break;
  23. case HCNetSDK.COMM_ALARM_V30:
  24. break;
  25. case HCNetSDK.COMM_ALARM_V40:
  26. saveEquipmentLog(pAlar);
  27. break;
  28. case HCNetSDK.COMM_ALARM_RULE:
  29. saveEquipmentLog(pAlar);
  30. break;
  31. case HCNetSDK.COMM_IPCCFG:
  32. saveEquipmentLog(pAlar);
  33. break;
  34. case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT:
  35. saveEquipmentLog(pAlar);
  36. break;
  37. case HCNetSDK.COMM_SNAP_MATCH_ALARM:
  38. saveEquipmentLog(pAlar);
  39. break;
  40. case HCNetSDK.COMM_ALARM_ACS:
  41. // 门禁设备主机报警
  42. EquipmentHandle handle = SpringUtil.getBean(EquipmentHandle.class);
  43. handle.equipmentHandleMethod(pAlar, pAlarmInfo);
  44. break;
  45. case HCNetSDK.COMM_ID_INFO_ALARM:
  46. saveEquipmentLog(pAlar);
  47. break;
  48. case HCNetSDK.COMM_VCA_ALARM:
  49. saveEquipmentLog(pAlar);
  50. break;
  51. case HCNetSDK.COMM_ISAPI_ALARM:
  52. saveEquipmentLog(pAlar);
  53. break;
  54. case HCNetSDK.COMM_ALARMHOST_CID_ALARM:
  55. saveEquipmentLog(pAlar);
  56. break;
  57. case HCNetSDK.COMM_SWITCH_ALARM:
  58. saveEquipmentLog(pAlar);
  59. break;
  60. case HCNetSDK.COMM_ALARMHOST_EXCEPTION:
  61. saveEquipmentLog(pAlar);
  62. break;
  63. case HCNetSDK.COMM_ALARMHOST_OPERATEEVENT_ALARM:
  64. saveEquipmentLog(pAlar);
  65. break;
  66. case HCNetSDK.COMM_ALARMHOST_ALARMOUTSTATUS:
  67. saveEquipmentLog(pAlar);
  68. break;
  69. case HCNetSDK.COMM_UPLOAD_VIDEO_INTERCOM_EVENT:
  70. saveEquipmentLog(pAlar);
  71. break;
  72. case HCNetSDK.COMM_ALARM_VIDEO_INTERCOM:
  73. saveEquipmentLog(pAlar);
  74. break;
  75. case HCNetSDK.COMM_THERMOMETRY_ALARM:
  76. saveEquipmentLog(pAlar);
  77. break;
  78. case HCNetSDK.COMM_FIREDETECTION_ALARM:
  79. saveEquipmentLog(pAlar);
  80. break;
  81. case HCNetSDK.COMM_THERMOMETRY_DIFF_ALARM:
  82. saveEquipmentLog(pAlar);
  83. break;
  84. case HCNetSDK.COMM_UPLOAD_AIOP_VIDEO:
  85. saveEquipmentLog(pAlar);
  86. break;
  87. case HCNetSDK.COMM_UPLOAD_AIOP_POLLING_SNAP:
  88. saveEquipmentLog(pAlar);
  89. break;
  90. case HCNetSDK.COMM_UPLOAD_AIOP_POLLING_VIDEO:
  91. saveEquipmentLog(pAlar);
  92. break;
  93. case HCNetSDK.COMM_IPC_AUXALARM_RESULT:
  94. saveEquipmentLog(pAlar);
  95. break;
  96. default:
  97. break;
  98. }
  99. return false;
  100. }
  101. private void saveEquipmentLog(HCNetSDK.NET_DVR_ALARMER pAlar) {
  102. // 给个回调,嗨嗨嗨
  103. log.info("此报警暂时不需要做何处理,休息一下吧~~~~");
  104. }
  105. }

布防回调目前我这只用到主机报警

报警处理类EquipmentHandle :

  1. import cn.hutool.core.codec.Base64Encoder;
  2. import cn.hutool.extra.spring.SpringUtil;
  3. import com.sun.jna.Pointer;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.commons.lang3.ObjectUtils;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.springframework.stereotype.Component;
  8. import java.nio.Buffer;
  9. import java.nio.ByteBuffer;
  10. /**
  11. * 门禁设备布防报警-回调的处理类
  12. */
  13. @Component
  14. @Slf4j
  15. public class EquipmentHandle {
  16. public void equipmentHandleMethod(HCNetSDK.NET_DVR_ALARMER pAlar, Pointer pAlarmInfo) {
  17. // 设备主机事件
  18. HCNetSDK.NET_DVR_ACS_ALARM_INFO strAcsInfo = new HCNetSDK.NET_DVR_ACS_ALARM_INFO();
  19. strAcsInfo.write();
  20. Pointer pAcsInfo = strAcsInfo.getPointer();
  21. pAcsInfo.write(0, pAlarmInfo.getByteArray(0, strAcsInfo.size()), 0, strAcsInfo.size());
  22. strAcsInfo.read();
  23. // 门禁事件的详细信息解析,通过主次类型的可以判断当前的具体门禁类型,例如(主类型:0X5 次类型:0x4b 表示人脸认证通过,
  24. // 主类型:0X5 次类型:0x4c 表示人脸认证失败)
  25. saveEquipmentLogAcs(pAlar, strAcsInfo);
  26. }
  27. private void saveEquipmentLogAcs(HCNetSDK.NET_DVR_ALARMER pAlar, HCNetSDK.NET_DVR_ACS_ALARM_INFO strAcsInfo) {
  28. // 获取事件的类型
  29. String messageMain = HkEventEnum.getMessageByCode(strAcsInfo.dwMajor);
  30. String message = HkEventEnum.getMessageByCode(strAcsInfo.dwMinor);
  31. if (ObjectUtils.isEmpty(messageMain) && ObjectUtils.isEmpty(message)) {
  32. // 主级事件为null,则不记录
  33. return;
  34. }
  35. if (HkEventEnum.Hk_Event_84.getEventType().equals(strAcsInfo.dwMinor)
  36. || HkEventEnum.Hk_Event_85.getEventType().equals(strAcsInfo.dwMinor)
  37. || HkEventEnum.Hk_Event_1024.getEventType().equals(strAcsInfo.dwMinor)) {
  38. // 屏蔽部分非法事件
  39. return;
  40. }
  41. // 获取卡号
  42. String byCardNo = new String(strAcsInfo.struAcsEventInfo.byCardNo).trim();
  43. log.info("卡号:" + byCardNo);
  44. // 获取卡类型 人员类型(0:白名单,1:访客,2:黑名单)
  45. String byCardType = String.valueOf(strAcsInfo.struAcsEventInfo.byCardType);
  46. // 设备唯一编码
  47. String byDeviceNo = String.valueOf(strAcsInfo.struAcsEventInfo.byDeviceNo);
  48. // 通进类型(0:入场,1:离场)
  49. String dwDoorNo = String.valueOf(strAcsInfo.struAcsEventInfo.dwDoorNo);
  50. // 给个回调,嗨嗨嗨
  51. HkCallBackBuilderVo builder = new HkCallBackBuilderVo(pAlar);
  52. log.info("获取到的本机IP地址:{}", builder.sDeviceIpStr);
  53. // 人员工号,需要关联查询
  54. if (ObjectUtils.isNotEmpty(builder.sDeviceIpStr)) {
  55. // 获取设备详情
  56. // 取值类型
  57. HkAdapter hkAdapter = SpringUtil.getBean(HkAdapter.class);
  58. log.info("当前回调的事件编号:{}", strAcsInfo.struAcsEventInfo.dwSerialNo);
  59. String employeeNo = hkAdapter.selectEmployeeNo(strAcsInfo.struAcsEventInfo.dwSerialNo, null);
  60. log.info("获取到的用户编码:{}", employeeNo);
  61. // 获取人员名称
  62. if (ObjectUtils.isNotEmpty(employeeNo)) {
  63. String userName = hkAdapter.selectUserName(employeeNo);
  64. log.info("获取到的用户名称:{}", userName);
  65. } else {
  66. String cardNo = hkAdapter.selectEmployeeNo(strAcsInfo.struAcsEventInfo.dwSerialNo,
  67. EnableFlagEnum.ENABLE_STATUS_1.getCode());
  68. log.info("获取到的用户卡号:{}", cardNo);
  69. }
  70. // 人脸图片数据
  71. String dataBytes = null;
  72. if (strAcsInfo.dwPicDataLen > 0) {
  73. long offset = 0;
  74. Buffer buffers = strAcsInfo.pPicData.getByteBuffer(offset, strAcsInfo.dwPicDataLen);
  75. // 转换成64单独存储
  76. dataBytes = assembleDataBytes(buffers, strAcsInfo.dwPicDataLen);
  77. }
  78. log.info("获取到的人脸图片数据:{}", dataBytes);
  79. }
  80. }
  81. private String assembleDataBytes(Buffer buffers, int dwSnapPicLen) {
  82. byte[] bytes = new byte[dwSnapPicLen];
  83. buffers.rewind();
  84. ((ByteBuffer) buffers).get(bytes);
  85. // 人脸图片数据
  86. return (ObjectUtils.isNotEmpty(bytes) ? "data:image/jpg;base64," + Base64Encoder.encode(bytes) : StringUtils.EMPTY);
  87. }

EquipmentHandle - HkCallBackBuilderVo:

  1. import lombok.Data;
  2. import org.apache.commons.lang3.ObjectUtils;
  3. import org.apache.commons.lang3.StringUtils;
  4. import java.nio.charset.StandardCharsets;
  5. /**
  6. * description
  7. */
  8. @Data
  9. public class HkCallBackBuilderVo {
  10. /**
  11. * userid是否有效 0-无效,1-有效
  12. */
  13. public byte byUserIdValid;
  14. /**
  15. * 序列号是否有效 0-无效,1-有效
  16. */
  17. public byte bySerialValid;
  18. /**
  19. * 版本号是否有效 0-无效,1-有效
  20. */
  21. public byte byVersionValid;
  22. /**
  23. * 设备名字是否有效 0-无效,1-有效
  24. */
  25. public byte byDeviceNameValid;
  26. /**
  27. * MAC地址是否有效 0-无效,1-有效
  28. */
  29. public byte byMacAddrValid;
  30. /**
  31. * login端口是否有效 0-无效,1-有效
  32. */
  33. public byte byLinkPortValid;
  34. /**
  35. * 设备IP是否有效 0-无效,1-有效
  36. */
  37. public byte byDeviceIpValid;
  38. /**
  39. * socket ip是否有效 0-无效,1-有效
  40. */
  41. public byte bySocketIpValid;
  42. /**
  43. * NET_DVR_Login()返回值, 布防时有效
  44. */
  45. public int lUserId;
  46. /**
  47. * 序列号
  48. */
  49. public String sSerialNumberStr;
  50. /**
  51. * 版本信息 高16位表示主版本,低16位表示次版本
  52. */
  53. public int dwDeviceVersion;
  54. /**
  55. * 设备名字
  56. */
  57. public String sDeviceNameStr;
  58. /**
  59. * MAC地址
  60. */
  61. public String byMacAddrStr;
  62. /**
  63. * link port
  64. */
  65. public short wLinkPort;
  66. /**
  67. * IP地址
  68. */
  69. public String sDeviceIpStr;
  70. /**
  71. * 报警主动上传时的socket IP地址
  72. */
  73. public String sSocketIpStr;
  74. /**
  75. * Ip协议 0-IPV4, 1-IPV6
  76. */
  77. public byte byIpProtocol;
  78. /**
  79. * 主动推送
  80. */
  81. public String byRes2Str;
  82. public HkCallBackBuilderVo(HCNetSDK.NET_DVR_ALARMER pAlar) {
  83. byUserIdValid = pAlar.byUserIDValid;
  84. bySerialValid = pAlar.bySerialValid;
  85. byVersionValid = pAlar.byVersionValid;
  86. byDeviceNameValid = pAlar.byDeviceNameValid;
  87. byMacAddrValid = pAlar.byMacAddrValid;
  88. byLinkPortValid = pAlar.byLinkPortValid;
  89. byDeviceIpValid = pAlar.byDeviceIPValid;
  90. bySocketIpValid = pAlar.bySocketIPValid;
  91. lUserId = pAlar.lUserID;
  92. sSerialNumberStr = ObjectUtils.isNotEmpty(pAlar.sSerialNumber) ? StringUtils.toEncodedString(pAlar.sSerialNumber, StandardCharsets.UTF_8) : StringUtils.EMPTY;
  93. dwDeviceVersion = pAlar.dwDeviceVersion;
  94. sDeviceNameStr = ObjectUtils.isNotEmpty(pAlar.sDeviceName)? StringUtils.toEncodedString(pAlar.sDeviceName, StandardCharsets.UTF_8) : StringUtils.EMPTY;
  95. byMacAddrStr = ObjectUtils.isNotEmpty(pAlar.byMacAddr)? StringUtils.toEncodedString(pAlar.byMacAddr, StandardCharsets.UTF_8) : StringUtils.EMPTY;
  96. wLinkPort = pAlar.wLinkPort;
  97. sDeviceIpStr = ObjectUtils.isNotEmpty(pAlar.sDeviceIP)? StringUtils.toEncodedString(pAlar.sDeviceIP, StandardCharsets.UTF_8) : StringUtils.EMPTY;
  98. sSocketIpStr = ObjectUtils.isNotEmpty(pAlar.sSocketIP)? StringUtils.toEncodedString(pAlar.sSocketIP, StandardCharsets.UTF_8) : StringUtils.EMPTY;
  99. byIpProtocol = pAlar.byIpProtocol;
  100. byRes2Str = ObjectUtils.isNotEmpty(pAlar.byRes2)? StringUtils.toEncodedString(pAlar.byRes2, StandardCharsets.UTF_8) : StringUtils.EMPTY;
  101. }

海康适配器(包含设备注册-用户注册-用户登出-布防-查询用户-查询事件):

  1. /**
  2. * 海康适配器
  3. */
  4. @Component
  5. @Slf4j
  6. public class HkAdapter {
  7. // 1. 海康的门禁 || 后端需要先引入海康操作库,目前不在项目内集成海康操作库,是通过海康开放平台
  8. // 【https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10】获取的操作库,
  9. // 不同的服务器须集成不同的操作库,否则会出现异常
  10. // 2. Windows开发时需要将“库文件”文件夹中的HCNetSDK.dll、HCCore.dll、HCNetSDKCom文件夹、libssl-1_1-x64.dll、
  11. // libcrypto-1_1-x64.dll、hlog.dll、hpr.dll、zlib1.dll等文件拷贝到lib文件夹下,HCNetSDKCom文件夹(包含里面的功能组件dll库文件)
  12. // 需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下,且HCNetSDKCom文件夹名不能修改。如果自行开发软件不能正常实现相应功能,
  13. // 而且程序没有指定加载的dll库路径,请在程序运行的情况下尝试删除HCNetSDK.dll。如果可以删除,说明程序可能调用到系统盘
  14. // Windows->System32目录下的dll文件,建议删除或者更新该目录下的相关dll文件;如果不能删除,dll文件右键选择属性确认SDK库版本。
  15. //
  16. // 3. Linux开发时需要将“库文件”文件夹中libhcnetsdk.so、libHCCore.so、libcrypto.so.1.1、libssl.so.1.1、libhpr.so、
  17. // libz.so等文件拷贝到lib文件夹下。HCNetSDKCom文件夹(包含里面的功能组件dll库文件)需要和libhcnetsdk.so、
  18. // libHCCore.so一起加载,放在同一个目录下,且HCNetSDKCom文件夹名不能修改。如果库文件加载有问题,初始化失败,
  19. // 也可以尝试将SDK所在路径添加到LD_LIBRARY_PATH环境变量中。
  20. // 4. 具体请参考海康的开发文档以及文件包结构
  21. /**
  22. * 组件库路径
  23. */
  24. private String stringDllPath;
  25. /**
  26. * cry路径
  27. */
  28. private String stringCryPath;
  29. /**
  30. * ssl路径
  31. */
  32. private String stringSslPath;
  33. /**
  34. * lib路径
  35. */
  36. private String stringLibPath;
  37. /**
  38. * 海康SDK
  39. */
  40. static HCNetSDK HK_NET_SDK = null;
  41. /**
  42. * 海康设备字符集
  43. */
  44. static int CHAR_ENCODE_TYPE = 0;
  45. /**
  46. * 全局回调
  47. */
  48. static HkEquipmentCallBack callBack;
  49. /**
  50. * 海康设备提前操作方法(定时任务登录认证使用)
  51. *
  52. * @param equipment 门禁基本信息
  53. */
  54. public Integer preparationScheduled(GuardEquipmentRespVO equipment) {
  55. try {
  56. // 设置回调
  57. // 当返回值是true时,说明host是可用的,false则不可。
  58. try {
  59. boolean status = InetAddress.getByName(equipment.getAddressIp()).isReachable(3000);
  60. if (!status) {
  61. return EntranceConstants.NET_DVR_NETWORK_FAIL_CONNECT;
  62. }
  63. } catch (IOException e) {
  64. return EntranceConstants.NET_DVR_NETWORK_FAIL_CONNECT;
  65. }
  66. return EntranceConstants.NET_DVR_NO_ERROR;
  67. } catch (Exception e) {
  68. log.error("海康设备加载失败!错误信息:", e);
  69. // 错误状态默认给离线
  70. return EntranceConstants.NET_DVR_NETWORK_FAIL_CONNECT;
  71. }
  72. }
  73. /**
  74. * 海康设备提前操作方法(必须提前调用)
  75. *
  76. * @param equipment 门禁基本信息
  77. */
  78. private Integer preparation(String ip, String user, String password, Integer port, Boolean isLogin) {
  79. // 创建操作类
  80. createHkSdkInstance();
  81. // 加载组件库
  82. loadLinuxSystem(SystemHkSelect.isLinux());
  83. // 初始话操作类
  84. HK_NET_SDK.NET_DVR_Init();
  85. log.info("海康设备初始化成功!");
  86. // 操作完成,首先登录设备
  87. return loginAccessHk(ip, user, password, ObjectUtils.isNotEmpty(port) ? Short.parseShort(port.toString())
  88. : (short) 8000);
  89. }
  90. /**
  91. * 创建海康SDK操作类,调用海康SDK接口
  92. * 根据不同操作系统选择不同的库文件和库路径
  93. * 固定方式不可更改
  94. */
  95. private void createHkSdkInstance() {
  96. try {
  97. // 海康SDK操作类
  98. if (HK_NET_SDK == null) {
  99. log.info("海康SDK操作类为空,开始创建海康SDK操作类");
  100. HK_NET_SDK = (HCNetSDK) Native.loadLibrary(stringDllPath, HCNetSDK.class);
  101. log.info("海康SDK操作类创建成功");
  102. } else {
  103. log.info("海康SDK操作类不为空,无需创建");
  104. }
  105. } catch (Exception e) {
  106. log.info("海康SDK操作类创建失败");
  107. }
  108. }
  109. private void loadLinuxSystem(Boolean isLinux) {
  110. // linux系统建议调用以下接口加载组件库(win下不需要操作)
  111. if (isLinux) {
  112. log.info("加载海康组件库" + isLinux);
  113. HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
  114. HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
  115. //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
  116. // cry组件库
  117. System.arraycopy(stringCryPath.getBytes(), 0, ptrByteArray1.byValue, 0,
  118. stringCryPath.length());
  119. ptrByteArray1.write();
  120. HK_NET_SDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());
  121. System.arraycopy(stringSslPath.getBytes(), 0, ptrByteArray2.byValue, 0,
  122. stringSslPath.length());
  123. ptrByteArray2.write();
  124. // ssl组件库
  125. HK_NET_SDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
  126. HCNetSDK.NET_DVR_LOCAL_SDK_PATH strComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
  127. // lib组件库
  128. System.arraycopy(stringLibPath.getBytes(), 0, strComPath.sPath, 0,
  129. stringLibPath.length());
  130. strComPath.write();
  131. HK_NET_SDK.NET_DVR_SetSDKInitCfg(2, strComPath.getPointer());
  132. }
  133. }
  134. public static Integer loginAccessHk(String deviceIp, String userName, String password,
  135. short port) {
  136. //注册(登录海康设备)
  137. //设备登录信息
  138. HCNetSDK.NET_DVR_USER_LOGIN_INFO strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
  139. //设备ip地址
  140. strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
  141. System.arraycopy(deviceIp.getBytes(), 0, strLoginInfo.sDeviceAddress, 0, deviceIp.length());
  142. //设备用户名
  143. strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
  144. System.arraycopy(userName.getBytes(), 0, strLoginInfo.sUserName, 0, userName.length());
  145. //设备密码
  146. strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
  147. System.arraycopy(password.getBytes(), 0, strLoginInfo.sPassword, 0, password.length());
  148. //sdk端口
  149. strLoginInfo.wPort = port;
  150. //是否异步登录:0- 否,1- 是
  151. strLoginInfo.bUseAsynLogin = false;
  152. strLoginInfo.write();
  153. //设备信息
  154. HCNetSDK.NET_DVR_DEVICEINFO_V40 strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
  155. AtomicInteger userId = new AtomicInteger(-1);
  156. userId.set(HK_NET_SDK.NET_DVR_Login_V40(strLoginInfo, strDeviceInfo));
  157. if (userId.get() == -1) {
  158. return HK_NET_SDK.NET_DVR_GetLastError();
  159. } else {
  160. log.info("设备登录成功,用户ID:" + userId);
  161. strDeviceInfo.read();
  162. CHAR_ENCODE_TYPE = strDeviceInfo.byCharEncodeType;
  163. }
  164. return userId.get();
  165. }
  166. /**
  167. * 登出(完成工作指令时,必须调用)
  168. */
  169. public static void logout(Integer userId) {
  170. // 登出和清理设备操作缓存,释放SDK资源
  171. if (userId >= 0) {
  172. if (!HK_NET_SDK.NET_DVR_Logout(userId)) {
  173. log.info("设备注销失败");
  174. }
  175. log.info("设备注销成功,用户ID:" + userId);
  176. }
  177. // 释放SDK资源,防止一直占用内存
  178. HK_NET_SDK.NET_DVR_Cleanup();
  179. }
  180. /**
  181. * 查询人员信息(预留)
  182. */
  183. public String eventUserInfo(Integer userId, String equipmentNo) {
  184. //数组
  185. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);
  186. //字符串拷贝到数组中
  187. System.arraycopy(USER_INFO.getBytes(), 0, ptrByteArray.byValue, 0, USER_INFO.length());
  188. ptrByteArray.write();
  189. int lHandler = HK_NET_SDK.NET_DVR_StartRemoteConfig(userId, HCNetSDK.NET_DVR_JSON_CONFIG,
  190. ptrByteArray.getPointer(), USER_INFO.length(), null, null);
  191. if (lHandler < 0) {
  192. log.info("SearchUserInfo失败,错误码为" + HK_NET_SDK.NET_DVR_GetLastError());
  193. } else {
  194. //组装查询的JSON报文,这边查询的是所有的人员
  195. JSONObject jsonObject = new JSONObject();
  196. JSONObject jsonSearchCond = new JSONObject();
  197. // 查询指定的工号人员信息
  198. JSONArray jsonArray = new JSONArray();
  199. if (ObjectUtils.isNotEmpty(equipmentNo)) {
  200. jsonArray.put(new JSONObject().set("employeeNo", equipmentNo));
  201. }
  202. jsonSearchCond.set("EmployeeNoList", jsonArray);
  203. jsonSearchCond.set("searchID",
  204. DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN));
  205. jsonSearchCond.set("searchResultPosition", 0);
  206. jsonSearchCond.set("maxResults", 50);
  207. jsonObject.set("UserInfoSearchCond", jsonSearchCond);
  208. String toString = jsonObject.toString();
  209. log.info("查询的json报文:" + toString);
  210. //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
  211. HCNetSDK.BYTE_ARRAY byteArray = new HCNetSDK.BYTE_ARRAY(toString.length());
  212. System.arraycopy(toString.getBytes(), 0, byteArray.byValue, 0, toString.length());
  213. byteArray.write();
  214. //定义接收结果的结构体
  215. HCNetSDK.BYTE_ARRAY ptrOutBuff = new HCNetSDK.BYTE_ARRAY(10 * 1024);
  216. IntByReference pInt = new IntByReference(0);
  217. while (true) {
  218. int dwState = HK_NET_SDK.NET_DVR_SendWithRecvRemoteConfig(lHandler,
  219. byteArray.getPointer(),
  220. toString.length(), ptrOutBuff.getPointer(), 20 * 1024, pInt);
  221. if (dwState == -1) {
  222. break;
  223. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
  224. try {
  225. Thread.sleep(10);
  226. } catch (InterruptedException e) {
  227. e.printStackTrace();
  228. }
  229. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
  230. log.error("查询人员失败");
  231. break;
  232. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
  233. log.error("查询人员异常");
  234. break;
  235. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
  236. ptrOutBuff.read();
  237. String trim = new String(ptrOutBuff.byValue).trim();
  238. // 得到的人员信息
  239. try {
  240. ObjectMapper objectMapper = new ObjectMapper();
  241. JsonNode rootNode = objectMapper.readTree(trim);
  242. JsonNode userInfoSearch = rootNode.get("UserInfoSearch");
  243. JsonNode userInfo = userInfoSearch.get("UserInfo");
  244. JsonNode userInfoOne = userInfo.get(0);
  245. JsonNode name = userInfoOne.get("name");
  246. return name.asText();
  247. } catch (JsonProcessingException e) {
  248. return StringUtils.EMPTY;
  249. }
  250. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  251. log.error("获取人员完成");
  252. break;
  253. }
  254. }
  255. if (!HK_NET_SDK.NET_DVR_StopRemoteConfig(lHandler)) {
  256. log.error("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + HK_NET_SDK.NET_DVR_GetLastError());
  257. } else {
  258. log.info("NET_DVR_StopRemoteConfig接口成功");
  259. }
  260. }
  261. return null;
  262. }
  263. public String selectEmployeeNo(Integer dwSerialNo,
  264. Integer isCard) {
  265. // 设备准备工作(必须调用)
  266. Integer userId = preparation("", "", "", null, null);
  267. // 通过事件类型拿到人员工号
  268. String event = searchAllEvent(userId, dwSerialNo, isCard);
  269. // 句柄完成,登出设备(必须调用)
  270. logout(userId);
  271. return event;
  272. }
  273. public String selectUserName(String employeeNo) {
  274. // 设备准备工作(必须调用)
  275. Integer userId = preparation("", "", "", null, null);
  276. // 通过事件类型拿到人员工号
  277. String event = eventUserInfo(userId, employeeNo);
  278. // 句柄完成,登出设备(必须调用)
  279. logout(userId);
  280. return event;
  281. }
  282. public static String searchAllEvent(int userId, Integer dwSerialNo, Integer isCard) {
  283. //事件条数
  284. int i = 0;
  285. HCNetSDK.NET_DVR_ACS_EVENT_COND strAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND();
  286. strAcsEventCond.read();
  287. strAcsEventCond.dwSize = strAcsEventCond.size();
  288. // 查询全部主次类型的报警
  289. strAcsEventCond.dwMajor = 0;
  290. // 查询次事件报警类型
  291. strAcsEventCond.dwMinor = 0;
  292. strAcsEventCond.dwBeginSerialNo = dwSerialNo;
  293. strAcsEventCond.dwEndSerialNo = dwSerialNo;
  294. strAcsEventCond.write();
  295. Pointer condPointer = strAcsEventCond.getPointer();
  296. int remoteConfig = HK_NET_SDK.NET_DVR_StartRemoteConfig(userId,
  297. HCNetSDK.NET_DVR_GET_ACS_EVENT,
  298. condPointer, strAcsEventCond.size(), null, null);
  299. if (remoteConfig <= -1) {
  300. log.info("NET_DVR_StartRemoteConfig调用失败,错误信息:" +HK_NET_SDK.NET_DVR_GetLastError());
  301. }
  302. HCNetSDK.NET_DVR_ACS_EVENT_CFG eventCfg = new HCNetSDK.NET_DVR_ACS_EVENT_CFG();
  303. eventCfg.read();
  304. eventCfg.dwSize = eventCfg.size();
  305. eventCfg.write();
  306. Pointer cfgPointer = eventCfg.getPointer();
  307. while (true) {
  308. int dwEventSearch = HK_NET_SDK.NET_DVR_GetNextRemoteConfig(remoteConfig, cfgPointer,
  309. eventCfg.size());
  310. if (dwEventSearch == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) {
  311. break;
  312. } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) {
  313. break;
  314. } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
  315. eventCfg.read();
  316. //获取的事件信息通过eventCfg结构体进行解析
  317. if (ObjectUtils.isNotEmpty(isCard)) {
  318. return new String(eventCfg.struAcsEventInfo.byCardNo).trim()
  319. .replace(new String(new char[]{160}), StringUtils.EMPTY);
  320. }
  321. return new String(eventCfg.struAcsEventInfo.byEmployeeNo).trim()
  322. .replace(new String(new char[]{160}), StringUtils.EMPTY);
  323. }
  324. i++;
  325. }
  326. return null;
  327. }
  328. }

好了,这就是海康布防回调、获取用户信息、获取事件类型的所有了,写的比较粗糙,有错误的地方希望大家能指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/850637
推荐阅读
相关标签
  

闽ICP备14008679号