Browse Source

事件监听接口

yingp 7 years ago
parent
commit
a5fa818d73
72 changed files with 5156 additions and 1073 deletions
  1. 23 0
      src/main/java/com/usoftchina/ss/dahua/common/FileNameUtils.java
  2. 0 19
      src/main/java/com/usoftchina/ss/dahua/lib/CertificateType.java
  3. 0 98
      src/main/java/com/usoftchina/ss/dahua/lib/DeviceState.java
  4. 11 1
      src/main/java/com/usoftchina/ss/dahua/lib/DeviceStateType.java
  5. 0 30
      src/main/java/com/usoftchina/ss/dahua/lib/DiskType.java
  6. 93 0
      src/main/java/com/usoftchina/ss/dahua/lib/EventService.java
  7. 439 0
      src/main/java/com/usoftchina/ss/dahua/lib/Events.java
  8. 0 31
      src/main/java/com/usoftchina/ss/dahua/lib/FaceAreaType.java
  9. 0 23
      src/main/java/com/usoftchina/ss/dahua/lib/FaceCompareMode.java
  10. 0 29
      src/main/java/com/usoftchina/ss/dahua/lib/FaceDbType.java
  11. 0 23
      src/main/java/com/usoftchina/ss/dahua/lib/FaceRecognitionFaceType.java
  12. 0 75
      src/main/java/com/usoftchina/ss/dahua/lib/FaceRecognitionService.java
  13. 60 0
      src/main/java/com/usoftchina/ss/dahua/lib/FileService.java
  14. 10 31
      src/main/java/com/usoftchina/ss/dahua/lib/INetSdk.java
  15. 0 86
      src/main/java/com/usoftchina/ss/dahua/lib/LoginSpecCapType.java
  16. 836 0
      src/main/java/com/usoftchina/ss/dahua/lib/NetSdk.java
  17. 3610 555
      src/main/java/com/usoftchina/ss/dahua/lib/NetSdkLib.java
  18. 0 19
      src/main/java/com/usoftchina/ss/dahua/lib/PersonType.java
  19. 18 0
      src/main/java/com/usoftchina/ss/dahua/lib/SdkException.java
  20. 0 45
      src/main/java/com/usoftchina/ss/dahua/lib/UserOperateType.java
  21. BIN
      src/main/resources/H264Parser.dll
  22. BIN
      src/main/resources/HWDec.dll
  23. BIN
      src/main/resources/HevcParser.dll
  24. BIN
      src/main/resources/StreamSvr.dll
  25. BIN
      src/main/resources/avnetsdk.dll
  26. BIN
      src/main/resources/dhconfigsdk.dll
  27. BIN
      src/main/resources/dhconfigsdk.lib
  28. BIN
      src/main/resources/dhnetsdk.lib
  29. BIN
      src/main/resources/dhplay.dll
  30. BIN
      src/main/resources/fisheye.dll
  31. BIN
      src/main/resources/linux-amd64/libInfra.so
  32. BIN
      src/main/resources/linux-amd64/libNetFramework.so
  33. BIN
      src/main/resources/linux-amd64/libStream.so
  34. BIN
      src/main/resources/linux-amd64/libStreamSvr.so
  35. BIN
      src/main/resources/linux-amd64/libavnetsdk.so
  36. BIN
      src/main/resources/linux-amd64/libdhconfigsdk.so
  37. BIN
      src/main/resources/linux-amd64/libdhnetsdk.so
  38. 49 1
      src/main/resources/message_zh_CN.properties
  39. BIN
      src/main/resources/swscale.dll
  40. BIN
      src/main/resources/win32-x86-64/HWDec.dll
  41. 0 0
      src/main/resources/win32-x86-64/Infra.dll
  42. 0 0
      src/main/resources/win32-x86-64/IvsDrawer.dll
  43. 0 0
      src/main/resources/win32-x86-64/Json.dll
  44. BIN
      src/main/resources/win32-x86-64/MCL_FPTZ.dll
  45. 0 0
      src/main/resources/win32-x86-64/NetFramework.dll
  46. 0 0
      src/main/resources/win32-x86-64/Stream.dll
  47. BIN
      src/main/resources/win32-x86-64/StreamSvr.dll
  48. BIN
      src/main/resources/win32-x86-64/VTHStack.dll
  49. 0 0
      src/main/resources/win32-x86-64/aacdec.dll
  50. 0 0
      src/main/resources/win32-x86-64/adpcmdec.dll
  51. 0 0
      src/main/resources/win32-x86-64/amrdec.dll
  52. BIN
      src/main/resources/win32-x86-64/armenc64.dll
  53. BIN
      src/main/resources/win32-x86-64/avnetsdk.dll
  54. BIN
      src/main/resources/win32-x86-64/dhconfigsdk.dll
  55. BIN
      src/main/resources/win32-x86-64/dhconfigsdk.lib
  56. BIN
      src/main/resources/win32-x86-64/dhnetsdk.dll
  57. BIN
      src/main/resources/win32-x86-64/dhnetsdk.lib
  58. BIN
      src/main/resources/win32-x86-64/dhplay.dll
  59. BIN
      src/main/resources/win32-x86-64/fisheye.dll
  60. 0 0
      src/main/resources/win32-x86-64/g7221dec.dll
  61. 0 0
      src/main/resources/win32-x86-64/g729dec.dll
  62. BIN
      src/main/resources/win32-x86-64/h264dec.dll
  63. 0 0
      src/main/resources/win32-x86-64/h26ldec.dll
  64. 0 0
      src/main/resources/win32-x86-64/hevcdec.dll
  65. 0 0
      src/main/resources/win32-x86-64/mjpegdec.dll
  66. 0 0
      src/main/resources/win32-x86-64/mp2dec.dll
  67. 0 0
      src/main/resources/win32-x86-64/mp3dec.dll
  68. BIN
      src/main/resources/win32-x86-64/mpeg4dec.dll
  69. 0 0
      src/main/resources/win32-x86-64/postproc.dll
  70. 0 0
      src/main/resources/win32-x86-64/svac_dec.dll
  71. BIN
      src/main/resources/win32-x86-64/swscale.dll
  72. 7 7
      src/test/java/com/usoftchina/ss/dahua/Main.java

+ 23 - 0
src/main/java/com/usoftchina/ss/dahua/common/FileNameUtils.java

@@ -0,0 +1,23 @@
+package com.usoftchina.ss.dahua.common;
+
+/**
+ * @author yingp
+ * @date 2019/3/6
+ */
+public class FileNameUtils {
+
+    /**
+     * 获取文件名后缀
+     *
+     * @param fileName
+     * @return
+     */
+    public static String getSuffix(String fileName) {
+        int index = fileName.lastIndexOf(".");
+        if (index > -1) {
+            return fileName.substring(index);
+        }
+        return "";
+    }
+
+}

+ 0 - 19
src/main/java/com/usoftchina/ss/dahua/lib/CertificateType.java

@@ -1,19 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 证件类型
- *
- * @author yingp
- * @date 2019/2/15
- */
-public class CertificateType {
-    public static final int CERTIFICATE_TYPE_UNKNOWN = 0;
-    /**
-     * 身份证
-     */
-    public static final int CERTIFICATE_TYPE_IC = 1;
-    /**
-     * 护照
-     */
-    public static final int CERTIFICATE_TYPE_PASSPORT = 2;
-}

+ 0 - 98
src/main/java/com/usoftchina/ss/dahua/lib/DeviceState.java

@@ -1,98 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-import com.sun.jna.Memory;
-import com.sun.jna.ptr.IntByReference;
-
-/**
- * 获取前端设备的当前工作状态
- *
- * @author yingp
- * @date 2019/2/27
- */
-public class DeviceState {
-    /**
-     * 普通报警状态(包括外部报警,动态检测,视频丢失)
-     *
-     * @param sdk
-     */
-    public static void commonAlarm(INetSdk sdk) {
-        if (!sdk.isLoggedIn()) {
-            return;
-        }
-        int nBufLen = 1024;
-        NetSdkLib.NET_CLIENT_STATE_EX clientState = new NetSdkLib.NET_CLIENT_STATE_EX();
-        IntByReference pRetLen = new IntByReference();
-        boolean bRet = sdk.getInstance().CLIENT_QueryRemotDevState(sdk.getLoginHandle(),
-                DeviceStateType.DH_DEVSTATE_COMM_ALARM, 0, clientState.getPointer(),
-                nBufLen, pRetLen, 10000);
-        if (bRet) {
-            System.out.println(clientState);
-            System.out.println(pRetLen.getValue());
-        } else {
-            System.err.println("error");
-        }
-    }
-
-    /**
-     * @param sdk
-     * @param type 类型
-     * @param nBufLen 字节
-     * @return
-     */
-    private static String stringState(INetSdk sdk, int type, int nBufLen) {
-        if (!sdk.isLoggedIn()) {
-            return null;
-        }
-        Memory pBuf = new Memory(nBufLen);
-        IntByReference pRetLen = new IntByReference();
-        try {
-            boolean bRet = sdk.getInstance().CLIENT_QueryRemotDevState(sdk.getLoginHandle(),
-                    type, 0, pBuf, nBufLen, pRetLen, 10000);
-            if (bRet) {
-                return pBuf.getString(0);
-            }
-            return null;
-        } finally {
-            pBuf.clear();
-        }
-    }
-
-    /**
-     * 遮挡报警状态
-     *
-     * @param sdk
-     */
-    public static String shelterAlarm(INetSdk sdk) {
-        return stringState(sdk, DeviceStateType.DH_DEVSTATE_SHELTER_ALARM, 16);
-    }
-
-    /**
-     * 录像状态
-     *
-     * @param sdk
-     */
-    public static String recording(INetSdk sdk) {
-        return stringState(sdk, DeviceStateType.DH_DEVSTATE_RECORDING, 16);
-    }
-
-    /**
-     * 硬盘状态
-     */
-    public static void disk(INetSdk sdk) {
-        if (!sdk.isLoggedIn()) {
-            return;
-        }
-        int nBufLen = 1024;
-        NetSdkLib.DH_HARDDISK_STATE diskState = new NetSdkLib.DH_HARDDISK_STATE();
-        IntByReference pRetLen = new IntByReference();
-        boolean bRet = sdk.getInstance().CLIENT_QueryRemotDevState(sdk.getLoginHandle(),
-                DeviceStateType.DH_DEVSTATE_COMM_ALARM, 0, diskState.getPointer(),
-                nBufLen, pRetLen, 10000);
-        if (bRet) {
-            System.out.println(diskState);
-            System.out.println(pRetLen.getValue());
-        } else {
-            System.err.println("error");
-        }
-    }
-}

+ 11 - 1
src/main/java/com/usoftchina/ss/dahua/lib/DeviceStateType.java

@@ -440,7 +440,17 @@ public class DeviceStateType {
      * 查询防护舱状态
      * <p>ALARM_PROTECTIVE_CAPSULE_INFO</p>
      */
-    public static final int DH_DEVSTATE_PROTECTIVE_CAPSULE = 0X005c;
+    public static final int DH_DEVSTATE_PROTECTIVE_CAPSULE = 0x005c;
+    /**
+     * 获取门锁控制模式
+     * <p>NET_GET_DOORWORK_MODE</p>
+     */
+    public static final int DH_DEVSTATE_GET_DOORWORK_MODE = 0x005d;
+    /**
+     * 查询云台获取光学变倍信息
+     * <p>DH_OUT_PTZ_ZOOM_INFO</p>
+     */
+    public static final int DH_DEVSTATE_PTZ_ZOOM_INFO = 0x005e;
     /**
      * 查询电源状态
      * <p>DH_POWER_STATUS</p>

+ 0 - 30
src/main/java/com/usoftchina/ss/dahua/lib/DiskType.java

@@ -1,30 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 硬盘类型
- *
- * @author yingp
- * @date 2019/2/27
- */
-public class DiskType {
-    /**
-     * 读写驱动器
-     */
-    public static final byte DH_DISK_READ_WRITE = 0;
-    /**
-     * 只读驱动器
-     */
-    public static final byte DH_DISK_READ_ONLY = 1;
-    /**
-     * 备份驱动器或媒体驱动器
-     */
-    public static final byte DH_DISK_BACKUP = 2;
-    /**
-     * 冗余驱动器
-     */
-    public static final byte DH_DISK_REDUNDANT = 3;
-    /**
-     * 快照驱动器
-     */
-    public static final byte DH_DISK_SNAPSHOT = 4;
-}

+ 93 - 0
src/main/java/com/usoftchina/ss/dahua/lib/EventService.java

@@ -0,0 +1,93 @@
+package com.usoftchina.ss.dahua.lib;
+
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+
+/**
+ * @author yingp
+ * @date 2019/3/6
+ */
+public class EventService {
+    private final INetSdk sdk;
+    private final FileService fileService;
+
+    public EventService(INetSdk sdk) {
+        this.sdk = sdk;
+        this.fileService = new FileService(sdk);
+        setMessageCallback();
+    }
+
+    private void setMessageCallback() {
+        sdk.getInstance().CLIENT_SetDVRMessCallBackEx1(new MessageCallback(), new NativeLong());
+    }
+
+    class MessageCallback implements NetSdk.fMessCallBackEx1 {
+        @Override
+        public void invoke(int lCommand, NativeLong lLoginID, Pointer pBuf, int dwBufLen, String pchDVRIP, NativeLong nDVRPort,
+                           boolean bAlarmAckFlag, NativeLong nEventID, NativeLong dwUser) {
+            System.out.println("--------------Callback----------------");
+            switch (lCommand) {
+                /**
+                 * 网络故障事件
+                 */
+                case Events.DH_ALARM_NET_ABORT:
+                    System.out.println("DH_ALARM_NET_ABORT");
+//                    NetSdk.ALARM_NETABORT_INFO netabortInfo = new NetSdk.ALARM_NETABORT_INFO(pBuf);
+                    break;
+                /**
+                 * 订阅事件接口完成异步通知事件
+                 */
+                case Events.DH_START_LISTEN_FINISH_EVENT:
+                    System.out.println("DH_START_LISTEN_FINISH_EVENT");
+                    break;
+                /**
+                 * 门禁状态事件
+                 */
+                case Events.DH_ALARM_ACCESS_CTL_STATUS:
+                    System.out.println("DH_ALARM_ACCESS_CTL_STATUS");
+//                    NetSdk.ALARM_ACCESS_CTL_STATUS_INFO accessCtlStatusInfo = new NetSdk.ALARM_ACCESS_CTL_STATUS_INFO(pBuf);
+                    break;
+                /**
+                 * 新文件事件
+                 */
+                case Events.DH_ALARM_NEW_FILE:
+                    System.out.println("DH_ALARM_NEW_FILE");
+                    NetSdk.ALARM_NEW_FILE_INFO newFileInfo = new NetSdk.ALARM_NEW_FILE_INFO(pBuf);
+                    System.out.println(newFileInfo);
+                    try {
+                        fileService.downloadByName(new String(newFileInfo.szFileName));
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    break;
+                /**
+                 * 视频移动侦测事件
+                 */
+                case Events.DH_EVENT_MOTIONDETECT:
+                    System.out.println("DH_EVENT_MOTIONDETECT");
+//                    NetSdk.ALARM_MOTIONDETECT_INFO motiondetectInfo = new NetSdk.ALARM_MOTIONDETECT_INFO(pBuf);
+                    break;
+                default:
+                    System.err.println(lCommand);
+                    break;
+            }
+        }
+    }
+
+    public boolean startListen() {
+        boolean bRet = sdk.getInstance().CLIENT_StartListenEx(sdk.getLoginHandle());
+        if (!bRet) {
+            System.err.println(sdk.getLastError());
+        }
+        return bRet;
+    }
+
+    public boolean stopListen() {
+        boolean bRet = sdk.getInstance().CLIENT_StopListen(sdk.getLoginHandle());
+        if (!bRet) {
+            System.err.println(sdk.getLastError());
+        }
+        return bRet;
+    }
+
+}

+ 439 - 0
src/main/java/com/usoftchina/ss/dahua/lib/Events.java

@@ -0,0 +1,439 @@
+package com.usoftchina.ss.dahua.lib;
+
+/**
+ * 报警类型,对应CLIENT_StartListenEx接口
+ *
+ * @author yingp
+ * @date 2019/3/6
+ */
+public class Events {
+    public static final int DH_COMM_ALARM = 0x1100;// 常规报警(包括外部报警,视频丢失,动态检测)
+    public static final int DH_SHELTER_ALARM = 0x1101;// 视频遮挡报警
+    public static final int DH_DISK_FULL_ALARM = 0x1102;// 硬盘满报警
+    public static final int DH_DISK_ERROR_ALARM = 0x1103;// 硬盘故障报警
+    public static final int DH_SOUND_DETECT_ALARM = 0x1104;// 音频检测报警
+    public static final int DH_ALARM_DECODER_ALARM = 0x1105;// 报警解码器报警
+    public static final int DH_ALARM_ALARM_EX = 0x2101;// 外部报警,数据字节数与设备报警通道个数相同,每个字节表示一个报警通道的报警状态,1为有报警,0为无报警。
+    public static final int DH_MOTION_ALARM_EX = 0x2102;// 动态检测报警,数据字节数与设备视频通道个数相同,每个字节表示一个视频通道的动态检测报警状态,1为有报警,0为无报警。
+    public static final int DH_VIDEOLOST_ALARM_EX = 0x2103;// 视频丢失报警,数据字节数与设备视频通道个数相同,每个字节表示一个视频通道的视频丢失报警状态,1为有报警,0为无报警。
+    public static final int DH_SHELTER_ALARM_EX = 0x2104;// 视频遮挡报警,数据字节数与设备视频通道个数相同,每个字节表示一个视频通道的遮挡(黑屏)报警状态,1为有报警,0为无报警。
+    public static final int DH_SOUND_DETECT_ALARM_EX = 0x2105;// 音频检测报警,数据为16个字节,每个字节表示一个视频通道的音频检测报警状态,1为有报警,0为无报警。
+    public static final int DH_DISKFULL_ALARM_EX = 0x2106;// 硬盘满报警,数据为1个字节,1为有硬盘满报警,0为无报警。
+    public static final int DH_DISKERROR_ALARM_EX = 0x2107;// 坏硬盘报警,数据为32个字节,每个字节表示一个硬盘的故障报警状态,1为有报警,0为无报警。
+    public static final int DH_ENCODER_ALARM_EX = 0x210A;// 编码器报警,数据为16个字节,每个字节表示一个通道编码器状态,1为有报警,0为无报警。
+    public static final int DH_URGENCY_ALARM_EX = 0x210B;// 紧急报警,数据为16个字节,每个字节表示一个通道编码器状态,1为有报警,0为无报警。
+    public static final int DH_WIRELESS_ALARM_EX = 0x210C;// 无线报警,数据为16个字节,每个字节表示一个通道编码器状态,1为有报警,0为无报警。
+    public static final int DH_NEW_SOUND_DETECT_ALARM_EX = 0x210D;// 新音频检测报警,报警信息的结构体见DH_NEW_SOUND_ALARM_STATE;
+    public static final int DH_ALARM_DECODER_ALARM_EX = 0x210E;// 报警解码器报警,报警信息的结构体见 ALARM_DECODER_ALARM
+    public static final int DH_DECODER_DECODE_ABILITY = 0x210F;// 解码器:解码能力报警,数据为一个字节,0:能正常解码 1:表示超出解码能力。
+    public static final int DH_FDDI_DECODER_ABILITY = 0x2110;// 光纤编码器状态报警,报警信息的结构体见 ALARM_FDDI_ALARM
+    public static final int DH_PANORAMA_SWITCH_ALARM_EX = 0x2111;// 切换场景报警,数据为16个字节,每个字节表示一个通道编码器状态,1为有报警,0为无报警。
+    public static final int DH_LOSTFOCUS_ALARM_EX = 0x2112;// 失去焦点报警,数据为16个字节,每个字节表示一个通道编码器状态,1为有报警,0为无报警。
+    public static final int DH_OEMSTATE_EX = 0x2113;// oem报停状态,数据为 1 BYTE。
+    public static final int DH_DSP_ALARM_EX = 0x2114;// DSP报警,报警信息的结构体见 DSP_ALARM
+    public static final int DH_ATMPOS_BROKEN_EX = 0x2115;// atm和pos机断开报警, 数据为 1 BYTE,0:连接断开 1:连接正常
+    public static final int DH_RECORD_CHANGED_EX = 0x2116;// 录像状态变化报警,报警信息为 ALARM_RECORDING_CHANGED 数组
+    public static final int DH_CONFIG_CHANGED_EX = 0x2117;// 配置发生变化报警,数据 无
+    public static final int DH_DEVICE_REBOOT_EX = 0x2118;// 设备重启报警,数据 无
+    public static final int DH_WINGDING_ALARM_EX = 0x2119;// 线圈/车检器故障报警(对应结构体 ALARM_WINGDING_INFO)
+    public static final int DH_TRAF_CONGESTION_ALARM_EX = 0x211A;// 交通阻塞报警(车辆出现异常停止或者排队)(对应结构体 ALARM_TRAF_CONGESTION_INFO)
+    public static final int DH_TRAF_EXCEPTION_ALARM_EX = 0x211B;// 交通异常报警(交通流量趋于0或异常空闲)(对应结构体 ALARM_TRAF_EXCEPTION_INFO)
+    public static final int DH_EQUIPMENT_FILL_ALARM_EX = 0x211C;// 补光设备故障报警(对应结构体 ALARM_EQUIPMENT_FILL_INFO)
+    public static final int DH_ALARM_ARM_DISARM_STATE = 0x211D;// 报警布撤防状态(对应结构体 ALARM_EQUIPMENT_FILL_INFO)
+    public static final int DH_ALARM_ACC_POWEROFF = 0x211E;// ACC断电报警,数据为 DWORD 0:ACC通电 1:ACC断电 
+    public static final int DH_ALARM_3GFLOW_EXCEED = 0x211F;// 3G流量超出阈值报警(对应结构体 DHDEV_3GFLOW_EXCEED_STATE_INFO)
+    public static final int DH_ALARM_SPEED_LIMIT = 0x2120;// 限速报警(对应结构体 ALARM_SPEED_LIMIT)
+    public static final int DH_ALARM_VEHICLE_INFO_UPLOAD = 0x2121;// 车载自定义信息上传 (对应结构体 ALARM_VEHICLE_INFO_UPLOAD)
+    public static final int DH_STATIC_ALARM_EX = 0x2122;// 静态检测报警,数据字节数与设备视频通道个数相同,每个字节表示一个视频通道的静态检测报警状态,1为有报警,0为无报警。
+    public static final int DH_PTZ_LOCATION_EX = 0x2123;// 云台定位信息(对应结构体 DH_PTZ_LOCATION_INFO)
+    public static final int DH_ALARM_CARD_RECORD_UPLOAD = 0x2124;// 卡号录像信息上传(对应结构体 ALARM_CARD_RECORD_INFO_UPLOAD)
+    public static final int DH_ALARM_ATM_INFO_UPLOAD = 0x2125;// ATM交易信息上传(对应结构体 ALARM_ATM_INFO_UPLOAD)
+    public static final int DH_ALARM_ENCLOSURE = 0x2126;// 电子围栏报警(对应结构体ALARM_ENCLOSURE_INFO)
+    public static final int DH_ALARM_SIP_STATE = 0x2127;// SIP状态报警(对应结构体 ALARM_SIP_STATE)
+    public static final int DH_ALARM_RAID_STATE = 0x2128;// RAID异常报警(对应结构体 ALARM_RAID_INFO)
+    public static final int DH_ALARM_CROSSING_SPEED_LIMIT = 0x2129;// 路口限速报警(对应结构体 ALARM_SPEED_LIMIT)
+    public static final int DH_ALARM_OVER_LOADING = 0x212A;// 超载报警(对应结构体ALARM_OVER_LOADING)
+    public static final int DH_ALARM_HARD_BRAKING = 0x212B;// 急刹车报警(对应机构体ALARM_HARD_BRAKING)
+    public static final int DH_ALARM_SMOKE_SENSOR = 0x212C;// 烟感报警(对应结构体ALARM_SMOKE_SENSOR)
+    public static final int DH_ALARM_TRAFFIC_LIGHT_FAULT = 0x212D;// 交通灯故障报警(对应结构体ALARM_TRAFFIC_LIGHT_FAULT) 
+    public static final int DH_ALARM_TRAFFIC_FLUX_STAT = 0x212E;// 交通流量统计报警(对应结构体ALARM_TRAFFIC_FLUX_LANE_INFO)
+    public static final int DH_ALARM_CAMERA_MOVE = 0x212F;// 摄像机移位报警事件(对应结构体ALARM_CAMERA_MOVE_INFO)
+    public static final int DH_ALARM_DETAILEDMOTION = 0x2130;// 详细动检报警上报信息(对应结构体ALARM_DETAILEDMOTION_CHNL_INFO)
+    public static final int DH_ALARM_STORAGE_FAILURE = 0x2131;// 存储异常报警(对应结构体 ALARM_STORAGE_FAILURE 数组)
+    public static final int DH_ALARM_FRONTDISCONNECT = 0x2132;// 前端IPC断网报警(对应结构体ALARM_FRONTDISCONNET_INFO)
+    public static final int DH_ALARM_ALARM_EX_REMOTE = 0x2133;// 远程外部报警(对应结构体 ALARM_REMOTE_ALARM_INFO)
+    public static final int DH_ALARM_BATTERYLOWPOWER = 0x2134;// 电池电量低报警(对应结构体ALARM_BATTERYLOWPOWER_INFO)
+    public static final int DH_ALARM_TEMPERATURE = 0x2135;// 温度过高报警(对应结构体 ALARM_TEMPERATURE_INFO)
+    public static final int DH_ALARM_TIREDDRIVE = 0x2136;// 疲劳驾驶报警(对应结构体 ALARM_TIREDDRIVE_INFO)
+    public static final int DH_ALARM_LOST_RECORD = 0x2137;// 丢录像事件报警(对应结构体ALARM_LOST_RECORD)
+    public static final int DH_ALARM_HIGH_CPU = 0x2138;// CPU占用率过高事件报警(对应结构体 ALARM_HIGH_CPU)
+    public static final int DH_ALARM_LOST_NETPACKET = 0x2139;// 网络发送数据丢包事件报警(对应结构体 ALARM_LOST_NETPACKET)
+    public static final int DH_ALARM_HIGH_MEMORY = 0x213A;// 内存占用率过高事件报警(对应结构体ALARM_HIGH_MEMORY)
+    public static final int DH_LONG_TIME_NO_OPERATION = 0x213B;// WEB用户长时间无操作事件(无扩展信息)
+    public static final int DH_BLACKLIST_SNAP = 0x213C;// 黑名单车辆抓拍事件(对应结构体DH_BLACKLIST_SNAP_INFO)         
+    public static final int DH_ALARM_DISK = 0x213E;// 硬盘报警(对应 ALARM_DISK_INFO 数组)
+    public static final int DH_ALARM_FILE_SYSTEM = 0x213F;// 文件系统报警(对应ALARM_FILE_SYSTEM_INFO数组)
+    public static final int DH_ALARM_IVS = 0x2140;// 智能报警事件(对应结构体ALARM_IVS_INFO)
+    public static final int DH_ALARM_GOODS_WEIGHT_UPLOAD = 0x2141;// 货重信息上报(对应ALARM_GOODS_WEIGHT_UPLOAD_INFO)
+    public static final int DH_ALARM_GOODS_WEIGHT = 0x2142;// 货重信息报警(对应ALARM_GOODS_WEIGHT_INFO)
+    public static final int DH_GPS_STATUS = 0x2143;// GPS定位信息(对应 NET_GPS_STATUS_INFO)
+    public static final int DH_ALARM_DISKBURNED_FULL = 0x2144;// 硬盘刻录满报警(对应 ALARM_DISKBURNED_FULL_INFO)
+    public static final int DH_ALARM_STORAGE_LOW_SPACE = 0x2145;// 存储容量不足事件(对应 ALARM_STORAGE_LOW_SPACE_INFO)
+    public static final int DH_ALARM_DISK_FLUX = 0x2160;// 硬盘数据异常事件(对应 ALARM_DISK_FLUX)
+    public static final int DH_ALARM_NET_FLUX = 0x2161;// 网络数据异常事件(对应 ALARM_NET_FLUX)
+    public static final int DH_ALARM_FAN_SPEED = 0x2162;// 风扇转速异常事件(对应 ALARM_FAN_SPEED)
+    public static final int DH_ALARM_STORAGE_FAILURE_EX = 0x2163;// 存储错误报警(对应结构体ALARM_STORAGE_FAILURE_EX)
+    public static final int DH_ALARM_RECORD_FAILED = 0x2164;// 录像异常报警(对应结构体ALARM_RECORD_FAILED_INFO)
+    public static final int DH_ALARM_STORAGE_BREAK_DOWN = 0x2165;// 存储崩溃事件(对应结构体 ALARM_STORAGE_BREAK_DOWN_INFO)
+    public static final int DH_ALARM_VIDEO_ININVALID = 0x2166;// 视频输入通道失效事件(例:配置的视频输入通道码流,超出设备处理能力)ALARM_VIDEO_ININVALID_INFO
+    public static final int DH_ALARM_VEHICLE_TURNOVER = 0x2167;// 车辆侧翻报警事件(对应结构体ALARM_VEHICEL_TURNOVER_EVENT_INFO)
+    public static final int DH_ALARM_VEHICLE_COLLISION = 0x2168;// 车辆撞车报警事件(对应结构体ALARM_VEHICEL_COLLISION_EVENT_INFO)
+    public static final int DH_ALARM_VEHICLE_CONFIRM = 0x2169;// 车辆上传信息事件(对应结构体ALARM_VEHICEL_CONFIRM_INFO)
+    public static final int DH_ALARM_VEHICLE_LARGE_ANGLE = 0x2170;// 车载摄像头大角度扭转事件(对应结构体ALARM_VEHICEL_LARGE_ANGLE)
+    public static final int DH_ALARM_TALKING_INVITE = 0x2171;// 设备请求对方发起对讲事件(对应结构体ALARM_TALKING_INVITE_INFO)
+    public static final int DH_ALARM_ALARM_EX2 = 0x2175;// 本地报警事件(对应结构体 ALARM_ALARM_INFO_EX2,对DH_ALARM_ALARM_EX升级)
+    public static final int DH_ALARM_VIDEO_TIMING = 0x2176;// 视频定时检测事件(对应结构体ALARM_VIDEO_TIMING)
+    public static final int DH_ALARM_COMM_PORT = 0x2177;// 串口事件(对应结构体ALARM_COMM_PORT_EVENT_INFO)
+    public static final int DH_ALARM_AUDIO_ANOMALY = 0x2178;// 音频异常事件(对应结构体ALARM_AUDIO_ANOMALY)
+    public static final int DH_ALARM_AUDIO_MUTATION = 0x2179;// 声强突变事件(对应结构体ALARM_AUDIO_MUTATION)
+    public static final int DH_EVENT_TYREINFO = 0x2180;// 轮胎信息上报事件(对应结构体EVENT_TYRE_INFO)
+    public static final int DH_ALARM_POWER_ABNORMAL = 0x2181;// 冗余电源异常报警(对应结构体ALARM_POWER_ABNORMAL_INFO)
+    public static final int DH_EVENT_REGISTER_OFF = 0x2182;// 车载设备主动下线事件(对应结构体 EVENT_REGISTER_OFF_INFO)
+    public static final int DH_ALARM_NO_DISK = 0x2183;// 无硬盘报警(对应结构体ALARM_NO_DISK_INFO)
+    public static final int DH_ALARM_FALLING = 0x2184;// 跌落事件报警(对应结构体ALARM_FALLING_INFO)
+    public static final int DH_ALARM_PROTECTIVE_CAPSULE = 0x2185;// 防护舱事件(对应结构体ALARM_PROTECTIVE_CAPSULE_INFO)
+    public static final int DH_ALARM_NO_RESPONSE = 0x2186;// 呼叫未应答警报(对应结构体ALARM_NO_RESPONSE_INFO)
+    public static final int DH_ALARM_CONFIG_ENABLE_CHANGE = 0x2187;// 配置使能改变上报事件(对应结构体 ALARM_CONFIG_ENABLE_CHANGE_INFO)
+    public static final int DH_EVENT_CROSSLINE_DETECTION = 0x2188;// 警戒线事件( 对应结构体 ALARM_EVENT_CROSSLINE_INFO )
+    public static final int DH_EVENT_CROSSREGION_DETECTION = 0x2189;// 警戒区事件( 对应结构体 ALARM_EVENT_CROSSREGION_INFO )
+    public static final int DH_EVENT_LEFT_DETECTION = 0x218a;// 物品遗留事件( 对应结构体 ALARM_EVENT_LEFT_INFO )
+    public static final int DH_EVENT_FACE_DETECTION = 0x218b;// 人脸检测事件( 对应结构体 ALARM_EVENT_FACE_INFO ) 
+    public static final int DH_ALARM_IPC = 0x218c;// IPC报警,IPC通过DVR或NVR上报的本地报警(对应结构体 ALARM_IPC_INFO)
+    public static final int DH_EVENT_TAKENAWAYDETECTION = 0x218d;// 物品搬移事件(对应结构体 ALARM_TAKENAWAY_DETECTION_INFO)
+    public static final int DH_EVENT_VIDEOABNORMALDETECTION = 0x218e;// 视频异常事件(对应结构体 ALARM_VIDEOABNORMAL_DETECTION_INFO)
+    public static final int DH_EVENT_MOTIONDETECT = 0x218f;// 视频移动侦测事件(对应结构体 ALARM_MOTIONDETECT_INFO)
+    public static final int DH_ALARM_PIR = 0x2190;// PIR警报(对应BYTE*, pBuf长度dwBufLen)
+    public static final int DH_ALARM_STORAGE_HOT_PLUG = 0x2191;// 存储热插拔事件(对应结构体 ALARM_STORAGE_HOT_PLUG_INFO)
+    public static final int DH_ALARM_FLOW_RATE = 0x2192;// 流量使用情况事件(对应结构体 ALARM_FLOW_RATE_INFO)
+    public static final int DH_ALARM_MOVEDETECTION = 0x2193;// 移动事件(对应ALARM_MOVE_DETECTION_INFO)
+    public static final int DH_ALARM_WANDERDETECTION = 0x2194;// 徘徊事件(对应ALARM_WANDERDETECTION_INFO)
+    public static final int DH_ALARM_CROSSFENCEDETECTION = 0x2195;// 翻越围栏事件(对应ALARM_CROSSFENCEDETECTION_INFO)
+    public static final int DH_ALARM_PARKINGDETECTION = 0x2196;// 非法停车事件(对应ALARM_PARKINGDETECTION_INFO)
+    public static final int DH_ALARM_RIOTERDETECTION = 0x2197;// 人员聚集事件(对应ALARM_RIOTERDETECTION_INFO)
+    public static final int DH_CONFIG_RESULT_EVENT_EX = 0x3000;     // 修改配置的返回码;返回结构见DEV_SET_RESULT
+    public static final int DH_REBOOT_EVENT_EX = 0x3001;          // 设备重启事件;如果未发送重启命令,当前修改的配置不会立即生效
+    public static final int DH_AUTO_TALK_START_EX = 0x3002;         // 设备主动邀请开始语音对讲
+    public static final int DH_AUTO_TALK_STOP_EX = 0x3003;         // 设备主动停止语音对讲
+    public static final int DH_CONFIG_CHANGE_EX = 0x3004;        // 设备配置发生改变
+    public static final int DH_IPSEARCH_EVENT_EX = 0x3005;        // IP搜索事件, 返回字符串格式如下:DevName::Manufacturer::MAC::IP::Port::DevType::POEPort::SubMask::GateWay&&DevName::Manufacturer::MAC::IP::Port::DevType::POEPort::SubMask::GateWay &&…
+    public static final int DH_AUTO_RECONNECT_FAILD = 0x3006;        // 自动重连失败事件
+    public static final int DH_REALPLAY_FAILD_EVENT = 0x3007;       // 监视失败事件,返回结构体DEV_PLAY_RESULT
+    public static final int DH_PLAYBACK_FAILD_EVENT = 0x3008;       // 回放失败事件,返回结构体DEV_PLAY_RESULT
+    public static final int DH_IVS_TRAFFIC_REALFLOWINFO = 0x3009;       // 交通实时流量信息事件ALARM_IVS_TRAFFIC_REALFLOW_INFO
+    public static final int DH_DEVICE_ABORT_EVENT = 0x300a;      // 客户端被踢出, 对应结构体 DEV_CLIENT_ABORT_INFO
+    public static final int DH_TALK_FAILD_EVENT = 0x300b;       // 请求语音对讲失败, 对应结构体 DEV_TALK_RESULT
+    public static final int DH_START_LISTEN_FINISH_EVENT = 0x300c;        // 订阅事件接口完成异步通知事件, 信息为NULL
+    public static final int DH_YUEQINGLIGHTING_STATE_EVENT = 0x300d;        // 平台统计灯光开关的时间事件, 对应的结构体 DEV_YUEQINGLIGHTING_STATE_INFO
+    public static final int DH_ALARM_VIOLATE_NO_FLY_TIME = 0x300e;        // 违反禁飞事件, 对应结构体 ALARM_VIOLATE_NO_FLY_TIME_INFO
+    public static final int DH_ALARM_BOX_ALARM = 0x300f;     // 报警盒通道的触发报警事件 (对应结构体 ALARM_BOX_ALARM_INFO )
+    public static final int DH_ALARM_SOSALERT = 0x3010;         // SOS求救报警(对应结构体ALARM_SOSALERT_INFO)
+    public static final int DH_ALARM_GYROABNORMALATTITUDE = 0x3011;         // 车辆的紧急制动、侧翻等状态导致的姿态异常进行报警(对应 ALARM_GYROABNORMALATTITUDE_INFO)
+    public static final int DH_ALARM_ALARMOUTPUT = 0x3012;         //输出通道状态改变事件(对应结构体ALARM_ALARMOUTPUT_INFO)
+    public static final int DH_ALARM_PSTNREPORTFAILURE = 0x3013;         //电话报警未接警事件(对应结构体ALARM_PSTNREPORTFAILURE_INFO)
+    public static final int DH_ALARM_STORAGE_NOT_EXIST = 0x3167;// 存储组不存在事件(对应结构体 ALARM_STORAGE_NOT_EXIST_INFO)
+    public static final int DH_ALARM_NET_ABORT = 0x3169;// 网络故障事件(对应结构体 ALARM_NETABORT_INFO)
+    public static final int DH_ALARM_IP_CONFLICT = 0x3170;// IP冲突事件(对应结构体 ALARM_IP_CONFLICT_INFO)
+    public static final int DH_ALARM_MAC_CONFLICT = 0x3171;// MAC冲突事件(对应结构体 ALARM_MAC_CONFLICT_INFO)
+    public static final int DH_ALARM_POWERFAULT = 0x3172;// 电源故障事件(对应结构体ALARM_POWERFAULT_INFO)
+    public static final int DH_ALARM_CHASSISINTRUDED = 0x3173;// 机箱入侵(防拆)报警事件(对应结构体ALARM_CHASSISINTRUDED_INFO)
+    public static final int DH_ALARM_ALARMEXTENDED = 0x3174;// 本地扩展报警事件(对应结构体 ALARM_ALARMEXTENDED_INFO)
+    public static final int DH_ALARM_ARMMODE_CHANGE_EVENT = 0x3175;// 布撤防状态变化事件(对应结构体ALARM_ARMMODE_CHANGE_INFO)
+    public static final int DH_ALARM_BYPASSMODE_CHANGE_EVENT = 0x3176;// 旁路状态变化事件(对应结构体ALARM_BYPASSMODE_CHANGE_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_NOT_CLOSE = 0x3177;// 门禁未关事件(对应结构体ALARM_ACCESS_CTL_NOT_CLOSE_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_BREAK_IN = 0x3178;// 闯入事件(对应结构体ALARM_ACCESS_CTL_BREAK_IN_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_REPEAT_ENTER = 0x3179;// 反复进入事件(对应结构体ALARM_ACCESS_CTL_REPEAT_ENTER_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_DURESS = 0x3180;// 胁迫卡刷卡事件(对应结构体ALARM_ACCESS_CTL_DURESS_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_EVENT = 0x3181;// 门禁事件(对应结构体 ALARM_ACCESS_CTL_EVENT_INFO)
+    public static final int DH_URGENCY_ALARM_EX2 = 0x3182;// 紧急报警EX2(对DH_URGENCY_ALARM_EX的升级,对应结构体ALARM_URGENCY_ALARM_EX2, 人为触发的紧急事件, 一般处理是联动外部通讯功能请求帮助
+    public static final int DH_ALARM_INPUT_SOURCE_SIGNAL = 0x3183;// 报警输入源信号事件(只要有输入就会产生该事件, 不论防区当前的模式,无法屏蔽, 对应 ALARM_INPUT_SOURCE_SIGNAL_INFO )
+    public static final int DH_ALARM_ANALOGALARM_EVENT = 0x3184;// 模拟量报警输入通道事件(对应结构体ALARM_ANALOGALARM_EVENT_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_STATUS = 0x3185;// 门禁状态事件(对应结构体ALARM_ACCESS_CTL_STATUS_INFO)
+    public static final int DH_ALARM_ACCESS_SNAP = 0x3186;// 门禁抓图事件(对应结构体ALARM_ACCESS_SNAP_INFO)
+    public static final int DH_ALARM_ALARMCLEAR = 0x3187;// 消警事件(对应结构体ALARM_ALARMCLEAR_INFO)
+    public static final int DH_ALARM_CIDEVENT = 0x3188;// CID事件(对应结构体 ALARM_CIDEVENT_INFO)
+    public static final int DH_ALARM_TALKING_HANGUP = 0x3189;// 设备主动挂断对讲事件(对应结构体ALARM_TALKING_HANGUP_INFO)
+    public static final int DH_ALARM_BANKCARDINSERT = 0x318a;// 银行卡插卡事件(对应结构体ALARM_BANKCARDINSERT_INFO)
+    public static final int DH_ALARM_RCEMERGENCY_CALL = 0x318b;// 紧急呼叫报警事件(对应结构体 ALARM_RCEMERGENCY_CALL_INFO)
+    public static final int DH_ALARM_OPENDOORGROUP = 0x318c;// 多人组合开门事件(对应结构体ALARM_OPEN_DOOR_GROUP_INFO)
+    public static final int DH_ALARM_FINGER_PRINT = 0x318d;// 获取指纹事件(对应结构体 ALARM_CAPTURE_FINGER_PRINT_INFO)
+    public static final int DH_ALARM_CARD_RECORD = 0x318e;// 卡号录像事件(对应结构体 ALARM_CARD_RECORD_INFO)
+    public static final int DH_ALARM_SUBSYSTEM_STATE_CHANGE = 0x318f;// 子系统状态改变事件(对应结构体ALARM_SUBSYSTEM_STATE_CHANGE_INFO)
+    public static final int DH_ALARM_BATTERYPOWER_EVENT = 0x3190;// 电池电量定时通知事件(对应结构体 ALARM_BATTERYPOWER_INFO )
+    public static final int DH_ALARM_BELLSTATUS_EVENT = 0x3191;// 警号状态事件(对应结构体ALARM_BELLSTATUS_INFO)
+    public static final int DH_ALARM_DEFENCE_STATE_CHANGE_EVENT = 0x3192;// 防区状态变化事件(对应结构体ALARM_DEFENCE_STATUS_CHANGE_INFO), 
+    ;// 定制需求,和布防撤防变化事件、旁路状态变化事件中的状态定义不同,
+    ;// 该状态通过CLIENT_QueryDevState()接口的DH_DEVSTATE_DEFENCE_STATE命令获取
+    public static final int DH_ALARM_TICKET_STATISTIC = 0x3193;// 车票统计信息事件(对应结构体 ALARM_TICKET_STATISTIC)
+    public static final int DH_ALARM_LOGIN_FAILIUR = 0x3194;// 登陆失败事件(对应结构体ALARM_LOGIN_FAILIUR_INFO)
+    public static final int DH_ALARM_MODULE_LOST = 0x3195;// 扩展模块掉线事件(对应结构体 ALARM_MODULE_LOST_INFO)
+    public static final int DH_ALARM_PSTN_BREAK_LINE = 0x3196;// PSTN掉线事件(对应结构体ALARM_PSTN_BREAK_LINE_INFO)
+    public static final int DH_ALARM_ANALOG_PULSE = 0x3197;// 模拟量报警事件(瞬时型事件), 特定传感器类型时才触发(对应结构体ALARM_ANALOGPULSE_INFO)
+    public static final int DH_ALARM_MISSION_CONFIRM = 0x3198;// 任务确认事件(对应结构体 ALARM_MISSION_CONFIRM_INFO)
+    public static final int DH_ALARM_DEVICE_MSG_NOTIFY = 0x3199;// 设备向平台发通知的事件(对应结构体 ALARM_DEVICE_MSG_NOTIFY_INFO)
+    public static final int DH_ALARM_VEHICLE_STANDING_OVER_TIME = 0x319A;// 停车超时报警(对应结构体 ALARM_VEHICLE_STANDING_OVER_TIME_INFO)
+    public static final int DH_ALARM_ENCLOSURE_ALARM = 0x319B;// 电子围栏事件(对应结构体 ALARM_ENCLOSURE_ALARM_INFO)
+    public static final int DH_ALARM_GUARD_DETECT = 0x319C;// 岗亭检测事件,此事件岗亭有第一个人时上报start事件,岗亭最后一个人离开时上报stop 事件(对应结构体ALARM_GUARD_DETECT_INFO)
+    public static final int DH_ALARM_GUARD_INFO_UPDATE = 0x319D;// 岗亭信息更新事件,只要岗亭有人员出入就上报(对应结构体ALARM_GUARD_UPDATE_INFO)  
+    public static final int DH_ALARM_NODE_ACTIVE = 0x319E;// 节点激活事件(对应结构体ALARM_NODE_ACTIVE_INFO)
+    public static final int DH_ALARM_VIDEO_STATIC = 0x319F;// 视频静态检测事件(对应结构体 ALARM_VIDEO_STATIC_INFO)
+    public static final int DH_ALARM_REGISTER_REONLINE = 0x31a0;// 主动注册设备重新登陆事件(对应结构体ALARM_REGISTER_REONLINE_INFO)
+    public static final int DH_ALARM_ISCSI_STATUS = 0x31a1;// ISCSI告警事件(对应结构体 ALARM_ISCSI_STATUS_INFO)
+    public static final int DH_ALARM_SCADA_DEV_ALARM = 0x31a2;// 检测采集设备报警事件(对应结构体 ALARM_SCADA_DEV_INFO)
+    public static final int DH_ALARM_AUXILIARY_DEV_STATE = 0x31a3;// 辅助设备状态(对应结构体ALARM_AUXILIARY_DEV_STATE)
+    public static final int DH_ALARM_PARKING_CARD = 0x31a4;// 停车刷卡事件(对应结构体ALARM_PARKING_CARD)
+    public static final int DH_ALARM_PROFILE_ALARM_TRANSMIT = 0x31a5;// 报警传输事件(对应结构体ALARM_PROFILE_ALARM_TRANSMIT_INFO)
+    public static final int DH_ALARM_VEHICLE_ACC = 0x31a6;// 车辆ACC报警事件(对应结构体 ALARM_VEHICLE_ACC_INFO)
+    public static final int DH_ALARM_TRAFFIC_SUSPICIOUSCAR = 0x31a7;// 嫌疑车辆上报事件(对应结构体 ALARM_TRAFFIC_SUSPICIOUSCAR_INFO)
+    public static final int DH_ALARM_ACCESS_LOCK_STATUS = 0x31a8;// 门锁状态事件(对应结构体 ALARM_ACCESS_LOCK_STATUS_INFO)
+    public static final int DH_ALARM_FINACE_SCHEME = 0x31a9;// 理财经办事件(对应结构体 ALARM_FINACE_SCHEME_INFO)
+    public static final int DH_ALARM_HEATIMG_TEMPER = 0x31aa;// 热成像测温点温度异常报警事件(对应结构体 ALARM_HEATIMG_TEMPER_INFO)
+    public static final int DH_ALARM_TALKING_IGNORE_INVITE = 0x31ab;// 设备取消对讲请求事件(对应结构体ALARM_TALKING_IGNORE_INVITE_INFO)
+    public static final int DH_ALARM_BUS_SHARP_TURN = 0x31ac;// 车辆急转事件(对应结构体ALARM_BUS_SHARP_TURN_INFO)
+    public static final int DH_ALARM_BUS_SCRAM = 0x31ad;// 车辆急停事件(对应结构体ALARM_BUS_SCRAM_INFO)
+    public static final int DH_ALARM_BUS_SHARP_ACCELERATE = 0x31ae;// 车辆急加速事件(对应结构体ALARM_BUS_SHARP_ACCELERATE_INFO)
+    public static final int DH_ALARM_BUS_SHARP_DECELERATE = 0x31af;// 车辆急减速事件(对应结构体ALARM_BUS_SHARP_DECELERATE_INFO)
+    public static final int DH_ALARM_ACCESS_CARD_OPERATE = 0x31b0;// 门禁卡数据操作事件(对应结构体ALARM_ACCESS_CARD_OPERATE_INFO)
+    public static final int DH_ALARM_POLICE_CHECK = 0x31b1;// 警员签到事件(对应结构体ALARM_POLICE_CHECK_INFO)
+    public static final int DH_ALARM_NET = 0x31b2;// 网络报警事件(对应结构体 ALARM_NET_INFO)
+    public static final int DH_ALARM_NEW_FILE = 0x31b3;// 新文件事件(对应结构体ALARM_NEW_FILE_INFO)
+    public static final int DH_ALARM_FIREWARNING = 0x31b5;// 热成像着火点事件 (对应结构体 ALARM_FIREWARNING_INFO)
+    public static final int DH_ALARM_RECORD_LOSS = 0x31b6;// 录像丢失事件,指硬盘完好的情况下,发生误删等原因引起(对应结构体ALARM_RECORD_LOSS_INFO)
+    public static final int DH_ALARM_VIDEO_FRAME_LOSS = 0x31b7;// 视频丢帧事件,比如网络不好或编码能力不足引起的丢帧(对应结构体ALARM_VIDEO_FRAME_LOSS_INFO)
+    public static final int DH_ALARM_RECORD_VOLUME_FAILURE = 0x31b8;// 由保存录像的磁盘卷发生异常,引起的录像异常(对应结构体 ALARM_RECORD_VOLUME_FAILURE_INFO)
+    public static final int DH_EVENT_SNAP_UPLOAD = 0x31b9;// 图上传完成事件(对应结构体EVENT_SNAP_UPLOAD_INFO)
+    public static final int DH_ALARM_AUDIO_DETECT = 0x31ba;// 音频检测事件(对应结构体 ALARM_AUDIO_DETECT )
+    public static final int DH_ALARM_UPLOADPIC_FAILCOUNT = 0x31bb;// 上传中盟失败数据个数(对应结构体ALARM_UPLOADPIC_FAILCOUNT_INFO)
+    public static final int DH_ALARM_POS_MANAGE = 0x31bc;// POS管理事件事件(对应结构体 ALARM_POS_MANAGE_INFO )
+    public static final int DH_ALARM_REMOTE_CTRL_STATUS = 0x31bd;// 无线遥控器状态事件(对应结构体 ALARM_REMOTE_CTRL_STATUS )
+    public static final int DH_ALARM_PASSENGER_CARD_CHECK = 0x31be;// 废弃, 乘客刷卡事件(对应结构体 ALARM_PASSENGER_CARD_CHECK )
+    public static final int DH_ALARM_SOUND = 0x31bf;// 声音事件(对应结构体 ALARM_SOUND )
+    public static final int DH_ALARM_LOCK_BREAK = 0x31c0;// 撬锁事件(对应结构体 ALARM_LOCK_BREAK_INFO )
+    public static final int DH_ALARM_HUMAN_INSIDE = 0x31c1;// 舱内有人事件(对应结构体ALARM_HUMAN_INSIDE_INFO)
+    public static final int DH_ALARM_HUMAN_TUMBLE_INSIDE = 0x31c2;// 舱内有人摔倒事件(对应结构体ALARM_HUMAN_TUMBLE_INSIDE_INFO)
+    public static final int DH_ALARM_DISABLE_LOCKIN = 0x31c3;// 闭锁进门按钮触发事件(对应ALARM_DISABLE_LOCKIN_INFO)
+    public static final int DH_ALARM_DISABLE_LOCKOUT = 0x31c4;// 闭锁出门按钮触发事件(对应结构体ALARM_DISABLE_LOCKOUT_INFO)
+    public static final int DH_ALARM_UPLOAD_PIC_FAILED = 0x31c5;// 违章数据上传失败事件(对应结构体 ALARM_UPLOAD_PIC_FAILED_INFO )
+    public static final int DH_ALARM_FLOW_METER = 0x31c6;// 水流量统计信息上报事件(对应结构体 ALARM_FLOW_METER_INFO)
+    public static final int DH_ALARM_WIFI_SEARCH = 0x31c7;// 获取到周围环境中WIFI设备上报事件(对应结构体 ALARM_WIFI_SEARCH_INFO)
+    public static final int DH_ALARM_WIRELESSDEV_LOWPOWER = 0x31C8;// 获取无线设备低电量上报事件(对应结构体ALARM_WIRELESSDEV_LOWPOWER_INFO)
+    public static final int DH_ALARM_PTZ_DIAGNOSES = 0x31c9;// 云台诊断事件(对应结构体ALARM_PTZ_DIAGNOSES_INFO)
+    public static final int DH_ALARM_FLASH_LIGHT_FAULT = 0x31ca;// 爆闪灯(闪光灯)报警事件 (对应结构体 ALARM_FLASH_LIGHT_FAULT_INFO)
+    public static final int DH_ALARM_STROBOSCOPIC_LIGTHT_FAULT = 0x31cb;// 频闪灯报警事件 (对应结构体 ALARM_STROBOSCOPIC_LIGTHT_FAULT_INFO)
+    public static final int DH_ALARM_HUMAM_NUMBER_STATISTIC = 0x31cc;// 人数量/客流量统计事件 (对应结构体 ALARM_HUMAN_NUMBER_STATISTIC_INFO)
+    public static final int DH_ALARM_VIDEOUNFOCUS = 0x31ce;// 视频虚焦报警(对应结构体 ALARM_VIDEOUNFOCUS_INFO)
+    public static final int DH_ALARM_BUF_DROP_FRAME = 0x31cd;// 录像缓冲区丢帧事件(对应结构体 ALARM_BUF_DROP_FRAME_INFO)
+    public static final int DH_ALARM_DOUBLE_DEV_VERSION_ABNORMAL = 0x31cf;// 双控设备主板与备板之间版本信息不一致异常事件 (对应结构体 ALARM_DOUBLE_DEV_VERSION_ABNORMAL_INFO)
+    public static final int DH_ALARM_DCSSWITCH = 0x31d0;// 主备切换事件 集群切换报警 (对应结构体 ALARM_DCSSWITCH_INFO)
+    public static final int DH_ALARM_RADAR_CONNECT_STATE = 0x31d1;// 雷达状态事件(对应结构体 ALARM_RADAR_CONNECT_STATE_INFO)
+    public static final int DH_ALARM_DEFENCE_ARMMODE_CHANGE = 0x31d2;// 防区布撤防状态改变事件(对应结构体 ALARM_DEFENCE_ARMMODECHANGE_INFO)
+    public static final int DH_ALARM_SUBSYSTEM_ARMMODE_CHANGE = 0x31d3;// 子系统布撤防状态改变事件(对应结构体 ALARM_SUBSYSTEM_ARMMODECHANGE_INFO)
+    public static final int DH_ALARM_RFID_INFO = 0x31d4;// 红外线检测信息事件(对应结构体 ALARM_RFID_INFO)
+    public static final int DH_ALARM_SMOKE_DETECTION = 0x31d5;// 烟雾报警事件(对应结构体 ALARM_SMOKE_DETECTION_INFO)
+    public static final int DH_ALARM_BETWEENRULE_TEMP_DIFF = 0x31d6;// 热成像规则间温差异常报警(对应结构体 ALARM_BETWEENRULE_DIFFTEMPER_INFO)
+    public static final int DH_ALARM_TRAFFIC_PIC_ANALYSE = 0x31d7;// 图片二次分析事件(对应 ALARM_PIC_ANALYSE_INFO)
+    public static final int DH_ALARM_HOTSPOT_WARNING = 0x31d8;// 热成像热点异常报警(对应结构体 ALARM_HOTSPOT_WARNING_INFO)
+    public static final int DH_ALARM_COLDSPOT_WARNING = 0x31d9;// 热成像冷点异常报警(对应结构体 ALARM_COLDSPOT_WARNING_INFO)
+    public static final int DH_ALARM_FIREWARNING_INFO = 0x31da;// 热成像火情报警信息上报(对应结构体 ALARM_FIREWARNING_INFO_DETAIL)
+    public static final int DH_ALARM_FACE_OVERHEATING = 0x31db;// 热成像人体发烧预警(对应结构体 ALARM_FACE_OVERHEATING_INFO)
+    public static final int DH_ALARM_SENSOR_ABNORMAL = 0x31dc;// 探测器异常报警(对应结构体 ALARM_SENSOR_ABNORMAL_INFO)
+    public static final int DH_ALARM_PATIENTDETECTION = 0x31de;// 监控病人活动状态报警事件(对应结构体 ALARM_PATIENTDETECTION_INFO)
+    public static final int DH_ALARM_RADAR_HIGH_SPEED = 0x31df;// 雷达监测超速报警事件 智能楼宇专用 (对应结构体 ALARM_RADAR_HIGH_SPEED_INFO)
+    public static final int DH_ALARM_POLLING_ALARM = 0x31e0;// 设备巡检报警事件 智能楼宇专用 (对应结构体 ALARM_POLLING_ALARM_INFO)
+    public static final int DH_ALARM_ITC_HWS000 = 0x31e1;// 虚点测速仪设备事件与报警(对应结构体 ALARM_ITC_HWS000)
+    public static final int DH_ALARM_TRAFFICSTROBESTATE = 0x31e2;// 道闸栏状态事件(对应结构体 ALARM_TRAFFICSTROBESTATE_INFO)
+    public static final int DH_ALARM_TELEPHONE_CHECK = 0x31e3;// 手机号码上报事件(对应结构体 ALARM_TELEPHONE_CHECK_INFO)
+    public static final int DH_ALARM_PASTE_DETECTION = 0x31e4;// 贴条事件(对应结构体 ALARM_PASTE_DETECTION_INFO )
+    public static final int DH_ALARM_SHOOTINGSCORERECOGNITION = 0x31e5;// 打靶像机事件(对应结构体 ALARM_PIC_SHOOTINGSCORERECOGNITION_INFO)
+    public static final int DH_ALARM_SWIPEOVERTIME = 0x31e6;// 超时未刷卡事件(对应结构体 ALARM_SWIPE_OVERTIME_INFO)
+    public static final int DH_ALARM_DRIVING_WITHOUTCARD = 0x31e7;// 无卡驾驶事件(对应结构体 ALARM_DRIVING_WITHOUTCARD_INFO)
+    public static final int DH_ALARM_TRAFFIC_PEDESTRIAN_RUN_REDLIGHT_DETECTION = 0x31e8;//闯红灯事件(对应结构体 ALARM_TRAFFIC_PEDESTRIAN_RUN_REDLIGHT_DETECTION_INFO ) 
+    public static final int DH_ALARM_FIGHTDETECTION = 0x31e9;// 斗殴事件(对应结构体 NET_ALARM_FIGHTDETECTION)
+    public static final int DH_ALARM_OIL_4G_OVERFLOW = 0x31ea;// 福山油田4G流量超过阈值的报警事件(对应结构体 NET_ALARM_OIL_4G_OVERFLOW_INFO)
+    public static final int DH_ALARM_ACCESSIDENTIFY = 0x31eb;// VTO人脸识别事件(对应结构体 NET_ALARM_ACCESSIDENTIFY)
+    public static final int DH_ALARM_POWER_SWITCHER_ALARM = 0x31ec;// 供电电源开关状态异常报警事件(对应结构体 DEV_ALRAM_POWERSWITCHER_INFO)
+    public static final int DH_ALARM_SCENNE_CHANGE_ALARM = 0x31ed;// 场景变更事件(对应结构体 ALARM_PIC_SCENECHANGE_INFO)原来是VideoAbnormalDetection的SceneChange子事件,因需求变更,改为单独事件类型
+    public static final int DH_ALARM_WIFI_VIRTUALINFO_SEARCH = 0x31ef;// WIFI虚拟身份上报事件(对应结构体 ALARM_WIFI_VIRTUALINFO_SEARCH_INFO)
+    public static final int DH_ALARM_TRAFFIC_OVERSPEED = 0x31f0;// 超速事件(对应结构体 ALARM_TRAFFIC_OVERSPEED_INFO)
+    public static final int DH_ALARM_TRAFFIC_UNDERSPEED = 0x31f1;// 欠速事件(对应结构体 ALARM_TRAFFIC_UNDERSPEED_INFO)
+    public static final int DH_ALARM_TRAFFIC_PEDESTRAIN = 0x31f2;// 交通行人事件(对应结构体 ALARM_TRAFFIC_PEDESTRAIN_INFO)
+    public static final int DH_ALARM_TRAFFIC_JAM = 0x31f3;// 交通拥堵事件(对应结构体 ALARM_TRAFFIC_JAM)
+    public static final int DH_ALARM_TRAFFIC_PARKING = 0x31f4;// 违章停车事件(对应结构体 ALARM_TRAFFIC_PARKING_INFO)
+    public static final int DH_ALARM_TRAFFIC_THROW = 0x31f5;// 交通抛洒物品事件(对应结构体 ALARM_TRAFFIC_THROW_INFO)
+    public static final int DH_ALARM_TRAFFIC_RETROGRADE = 0x31f6;// 逆行事件(对应结构体 ALARM_TRAFFIC_RETROGRADE_INFO)
+    public static final int DH_ALARM_VTSTATE_UPDATE = 0x31f7;// VTS状态上报(对应结构体 ALARM_VTSTATE_UPDATE_INFO)
+    public static final int DH_ALARM_CALL_NO_ANSWERED = 0x31f8;// 直连情况下,呼叫无答应事件(对应结构体 NET_ALARM_CALL_NO_ANSWERED_INFO)
+    public static final int DH_ALARM_USER_LOCK_EVENT = 0x31f9;// 用户锁定报警事件
+    public static final int DH_ALARM_RETROGRADE_DETECTION = 0x31fa;// 人员逆行事件(对应结构体 ALARM_RETROGRADE_DETECTION_INFO)
+    public static final int DH_ALARM_AIO_APP_CONFIG_EVENT = 0x31fb;// AIO报警事件(对应结构体 ALARM_AIO_APP_CONFIG_EVENT)
+    public static final int DH_ALARM_RAID_STATE_EX = 0x31fc;// RAID异常报警(对应结构体 ALARM_RAID_INFO_EX)
+    public static final int DH_ALARM_STORAGE_IPC_FAILURE = 0x31fd;// IPC的存储介质故障事件(IPC SD卡异常)(对应结构体 ALARM_STORAGE_IPC_FAILURE_INFO)
+    public static final int DH_ALARM_DEVICE_STAY = 0x31fe;// 静止报警,如果设备坐标在指定时间内没有变化,触发静止报警信息(对应的结构体 ALARM_DEVICE_STAY_INFO)
+    public static final int DH_ALARM_SUB_WAY_DOOR_STATE = 0x31ff;// 地铁车厢门状态(对应结构体 ALARM_SUB_WAY_DOOR_STATE_INFO)
+    public static final int DH_ALARM_SUB_WAY_PECE_SWITCH = 0x3200;// 地铁PECE柜门状态(对应结构体 ALARM_SUB_WAY_PECE_SWITCH_INFO)
+    public static final int DH_ALARM_SUB_WAY_FIRE_ALARM = 0x3201;// 地铁火警事件(对应结构体 ALARM_SUB_WAY_FIRE_ALARM_INFO)
+    public static final int DH_ALARM_SUB_WAY_EMER_HANDLE = 0x3202;// 地铁乘客紧急手柄动作(对应结构体 ALARM_SUB_WAY_EMER_HANDLE_INFO)
+    public static final int DH_ALARM_SUB_WAY_CAB_COVER = 0x3203;// 地铁司机室盖板状态(对应结构体 ALARM_SUB_WAY_CAB_COVER_INFO)
+    public static final int DH_ALARM_SUB_WAY_DERA_OBST = 0x3204;// 地铁检测到障碍物或脱轨(对应结构体 ALARM_SUB_WAY_DERA_OBST_INFO)
+    public static final int DH_ALARM_SUB_WAY_PECU_CALL = 0x3205;// 地铁客室报警器状态(对应结构体 ALARM_SUB_WAY_PECU_CALL_INFO)
+    public static final int DH_ALARM_BOX = 0x3206;// 报警盒子报警事件 (对应结构体 ALARM_BOX_INFO)
+    public static final int DH_ALARM_DOOR_CLOSEDMANUALLY = 0x3207;// 人为关门事件(对应结构体 ALARM_DOOR_CLOSEDMANUALLY_INFO)
+    public static final int DH_ALARM_DOOR_NOTCLOSED_LONGTIME = 0x3208;// 门超长时间未关报警事件(对应结构体 ALARM_DOOR_NOTCLOSED_LONGTIME_INFO)
+    public static final int DH_ALARM_UNDER_VOLTAGE = 0x3209;// 电压低于9V, 电源欠压报警, 视频流以红色OSD图标叠加形式报警 (对应结构体 ALARM_UNDER_VOLTAGE_INFO ) 
+    public static final int DH_ALARM_OVER_VOLTAGE = 0x320a;// 电压高于19V, 电源过压报警, 视频流以红色OSD图标叠加形式报警 (对应结构体 ALARM_OVER_VOLTAGE_INFO ) 
+    public static final int DH_ALARM_CUT_LINE = 0x320b;// 剪断报警(对应结构体ALARM_CUT_LINE_INFO)
+    public static final int DH_ALARM_VIDEOMOTION_EVENT = 0x320c;// 动检事件(对应结构体 ALARM_VIDEOMOTION_EVENT_INFO)
+    public static final int DH_ALARM_WIDE_VIEW_REGION_EVENT = 0x320d;// WideViewRegions事件(对应结构体 ALARM_WIDE_VIEW_REGION_EVENT_INFO) 二监项目定制事件。A平台发该事件到球机,将该事件转发给B平台
+    public static final int DH_ALARM_FIBRE_OPTIC_ABORT = 0x320e;// 断纤报警(对应结构体 ALARM_FIBRE_OPTIC_ABORT)
+    public static final int DH_ALARM_TAIL_DETECTION = 0x320f;// 尾随事件(对应结构体 ALARM_TAIL_DETECTION_INFO)
+    public static final int DH_ALARM_BITRATES_OVERLIMIT = 0x3210;// 相机码流大于通道解码规格报警(对应结构体 ALARM_BITRATES_OVERLIMIT_INFO)
+    public static final int DH_ALARM_RECORD_CHANGED_EX = 0x3211;// 录像状态变化报警(对应结构体 ALARM_RECORD_CHANGED_INFO_EX)
+    public static final int DH_ALARM_HIGH_DECIBEL = 0x3212;// 声音高分贝检测报警(对应结构体 ALARM_HIGH_DECIBEL_INFO)
+    public static final int DH_ALARM_SHAKE_DETECTION = 0x3213;// 摇晃检测报警(对应结构体 ALARM_SHAKE_DETECTION_INFO)
+    public static final int DH_ALARM_TUMBLE_DETECTION = 0x3214;// 倒地报警事件(对应结构体 ALARM_TUMBLE_DETECTION_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_MALICIOUS = 0x3215;// 恶意开门事件(对应结构体 ALARM_ACCESS_CTL_MALICIOUS)
+    public static final int DH_ALARM_ACCESS_CTL_USERID_REGISTER = 0x3216;// 用户已注册事件(对应结构体 ALARM_ACCESS_CTL_USERID_REGISTER)
+    public static final int DH_ALARM_ACCESS_CTL_REVERSELOCK = 0x3217;// 锁体状态信息变化事件(对应结构体 ALARM_ACCESS_CTL_REVERSELOCK)
+    public static final int DH_ALARM_ACCESS_CTL_USERID_DELETE = 0x3218;// 删除用户事件(对应结构体 ALARM_ACCESS_CTL_USERID_DELETE)
+    public static final int DH_ALARM_ACCESS_DOOR_BELL = 0x3219;// 响铃事件(对应结构体 ALARM_ACCESS_DOOR_BELL_INFO)
+    public static final int DH_ALARM_ACCESS_FACTORY_RESET = 0x321a;// 门锁恢复出厂(对应结构体 ALARM_ACCESS_FACTORY_RESET)
+    public static final int DH_ALARM_POLICE_RECORD_PROGRESS = 0x321b;// MPT录像导入NVR的进度事件(对应结构体 ALARM_POLICE_RECORD_PROGRESS_INFO)
+    public static final int DH_ALARM_POLICE_PLUGIN = 0x321c;// MPT接入拔出设备事件(对应结构体 ALARM_POLICE_PLUGIN_INFO)
+    public static final int DH_ALARM_GPS_NOT_ALIGNED = 0x321d;// GPS未定位报警(对应结构体 ALARM_GPS_NOT_ALIGNED_INFO)
+    public static final int DH_ALARM_WIRELESS_NOT_CONNECTED = 0x321e;// 网络未连接报警(包括wifi,3G/4G)(对应结构体 ALARM_WIRELESS_NOT_CONNECTED_INFO)
+    public static final int DH_ALARM_CABINET = 0x321f;// 云柜设备发送的物品存放单号信息实时上报事件(对应结构体 ALARM_CABINET_INFO)
+    public static final int DH_SWITCH_SCREEN = 0x3220;// 切换屏幕事件
+    public static final int DH_ALARM_NEAR_DISTANCE_DETECTION = 0x3221;// 近距离接触报警(对应结构体ALARM_NEAR_DISTANCE_INFO)
+    public static final int DH_ALARM_MAN_STAND_DETECTION = 0x3222;// 立体视觉站立报警(对应结构体ALARM_MAN_STAND_INFO)
+    public static final int DH_ALARM_MAN_NUM_DETECTION = 0x3223;// 立体视觉区域内人数统计报警(对应结构体ALARM_MAN_NUM_INFO)
+    public static final int DH_MCS_GENERAL_CAPACITY_LOW = 0x3224;// 微云常规容量事件(对应结构体ALARM_MCS_GENERAL_CAPACITY_LOW_INFO)
+    public static final int DH_MCS_DATA_NODE_OFFLINE = 0x3225;// 微云存储节点下线事件(对应结构体ALARM_MCS_DATA_NODE_OFFLINE_INFO)
+    public static final int DH_MCS_DISK_OFFLINE = 0x3226;// 微云磁盘下线事件(对应结构体ALARM_MCS_DISK_OFFLINE_INFO)
+    public static final int DH_MCS_DISK_SLOW = 0x3227;// 微云磁盘变慢事件(对应结构体ALARM_MCS_DISK_SLOW_INFO)
+    public static final int DH_MCS_DISK_BROKEN = 0x3228;// 微云磁盘损坏事件(对应结构体ALARM_MCS_DISK_BROKEN_INFO)
+    public static final int DH_MCS_DISK_UNKNOW_ERROR = 0x3229;// 微云磁盘未知错误事件(对应结构体ALARM_MCS_DISK_UNKNOW_ERROR_INFO)
+    public static final int DH_MCS_METADATA_SERVER_ABNORMAL = 0x322a;// 微云元数据服务器异常事件(对应结构体ALARM_MCS_METADATA_SERVER_ABNORMAL_INFO)
+    public static final int DH_MCS_CATALOG_SERVER_ABNORMAL = 0x322b;// 微云目录服务器异常事件(对应结构体ALARM_MCS_CATALOG_SERVER_ABNORMAL_INFO)
+    public static final int DH_MCS_GENERAL_CAPACITY_RESUME = 0x322c;// 微云常规容量恢复事件(对应结构体ALARM_MCS_GENERAL_CAPACITY_RESUME_INFO)
+    public static final int DH_MCS_DATA_NODE_ONLINE = 0x322d;// 微云存储节点上线事件(对应结构体ALARM_MCS_DATA_NODE_ONLINE_INFO)
+    public static final int DH_MCS_DISK_ONLINE = 0x322e;// 微云磁盘上线事件(对应结构体ALARM_MCS_DISK_ONLINE_INFO)
+    public static final int DH_MCS_METADATA_SLAVE_ONLINE = 0x322f;// 微云元数据备机上线事件(对应结构体ALARM_MCS_METADATA_SLAVE_ONLINE_INFO)
+    public static final int DH_MCS_CATALOG_SERVER_ONLINE = 0x3230;// 微云目录服务器上线事件(对应结构体ALARM_MCS_CATALOG_SERVER_ONLINE_INFO)
+    public static final int DH_ALARM_OFFLINE_LOGSYNC = 0x3231;// 同步离线日志事件(对应结构体 ALARM_OFFLINE_LOGSYNC_INFO)
+    public static final int DH_ALARM_UPGRADE_STATE = 0x3232;// 设备升级状态事件(对应结构体 ALARM_UPGRADE_STATE)
+    public static final int DH_ALARM_LABELINFO = 0x3233;// IPC新增(2017.4),RFID标签信息采集事件(对应结构体 ALARM_LABELINFO)
+    public static final int DH_ALARM_TIRED_PHYSIOLOGICAL = 0x3234;// 生理疲劳事件(对应结构体 ALARM_TIRED_PHYSIOLOGICAL)
+    public static final int DH_ALARM_CALLING_WHEN_DRIVING = 0x3235;// 开车打电话事件(对应结构体 ALARM_CALLING_WHEN_DRIVING)
+    public static final int DH_ALARM_TRAFFIC_DRIVER_SMOKING = 0x3236;// 开车抽烟事件(对应结构体 ALARM_TRAFFIC_DRIVER_SMOKING)
+    public static final int DH_ALARM_TRAFFIC_DRIVER_LOWER_HEAD = 0x3237;// 开车低头报警事件(对应结构体 ALARM_TRAFFIC_DRIVER_LOWER_HEAD)
+    public static final int DH_ALARM_TRAFFIC_DRIVER_LOOK_AROUND = 0x3238;// 开车左顾右盼报警事件(对应结构体 ALARM_TRAFFIC_DRIVER_LOOK_AROUND)
+    public static final int DH_ALARM_TRAFFIC_DRIVER_LEAVE_POST = 0x3239;// 开车离岗报警事件(对应结构体 ALARM_TRAFFIC_DRIVER_LEAVE_POST)
+    public static final int DH_ALARM_TRAFFIC_DRIVER_YAWN = 0x323a;// 开车打哈欠报警事件(对应结构体 ALARM_TRAFFIC_DRIVER_YAWN)
+    public static final int DH_ALARM_AUTO_INSPECTION = 0x323b;// 设备自检事件(对应结构体 ALARM_AUTO_INSPECTION) 
+    public static final int DH_ALARM_TRAFFIC_VEHICLE_POSITION = 0x323c;// 车辆位置事件(对应的结构体 ALARM_TRAFFIC_VEHICLE_POSITION)
+    public static final int DH_ALARM_FACE_VERIFICATION_ACCESS_SNAP = 0x323d;// 人脸认证开门抓图信息事件(对应结构体 ALARM_FACE_VERIFICATION_ACCESS_SNAP_INFO) 
+    public static final int DH_ALARM_VIDEOBLIND = 0x323e;// 视频遮挡事件(对应结构体ALARM_VIDEO_BLIND_INFO)
+    public static final int DH_ALARM_DRIVER_NOTCONFIRM = 0x323f;// 司机未按确认按钮报警事件(对应结构体ALARM_DRIVER_NOTCONFIRM_INFO)
+    public static final int DH_ALARM_FACEINFO_COLLECT = 0x3240;// 人脸信息录入事件(对应ALARM_FACEINFO_COLLECT_INFO)
+    public static final int DH_ALARM_HIGH_SPEED = 0x3241;// 车辆超速报警事件(对应ALARM_HIGH_SPEED_INFO)
+    public static final int DH_ALARM_VIDEO_LOSS = 0x3242;// 视频丢失事件(对应 ALARM_VIDEO_LOSS_INFO)
+    public static final int DH_ALARM_MPTBASE_CONNECT = 0x3243;// 设备与底座连接状态事件(对应结构体ALARM_MPTBASE_CONNECT) 
+    public static final int DH_ALARM_LATEST_SHUTDOWN = 0x3244;// 设备上次关机状态事件(对应结构体 ALARM_LATEST_SHUTDOWN)
+
+    // ------------- 机器人专用事件 ------------------
+    public static final int DH_ALARM_ROBOT_COLLISION = 0x3245;// 机器人碰撞事件(对应结构体 ALARM_ROBOT_COLLISION)
+    public static final int DH_ALARM_ROBOT_FALLENDOWN = 0x3246;// 机器人跌倒事件(对应结构体 ALARM_ROBOT_FALLENDOWN)
+    public static final int DH_ALARM_ROBOT_UNRECOGNIZED2DCODE = 0x3247;// 机器人二位码识别失败事件(对应结构体 ALARM_ROBOT_UNRECOGNIZED2DCODE) 
+    public static final int DH_ALARM_ROBOT_WRONG2DCODE = 0x3248;// 机器人错误二位码事件(对应的结构体 ALARM_ROBOT_WRONG2DCODE)
+    public static final int DH_ALARM_ROBOT_ROADBLOCKED = 0x3249;// 机器人路障事件(对应结构体 ALARM_ROBOT_ROADBLOCKED) 
+    public static final int DH_ALARM_ROBOT_FAULT = 0x324a;// 机器人故障事件(对应结构体 ALARM_ROBOT_FAULT)
+    public static final int DH_ALARM_ROBOT_OVERLOAD = 0x324b;// 机器人超载事件(对应结构体 ALARM_ROBOT_OVERLOAD)
+    public static final int DH_ALARM_ROBOT_YAWEXCEPTION = 0x324c;// 机器人意外偏航事件(对应 ALARM_ROBOT_YAWEXCEPTION)
+    public static final int DH_ALARM_ROBOT_LOADTIMEOUT = 0x324e;// 机器人意外偏航事件(对应 ALARM_ROBOT_LOADTIMEOUT )
+    public static final int DH_ALARM_ROBOT_UNLOADTIMEOUT = 0x324f;// 机器人上料异常事件(对应 ALARM_ROBOT_UNLOADTIMEOUT)
+    public static final int DH_ALARM_ROBOT_MAPUPDATE = 0x3250;// 机器人卸料异常事件(对应 ALARM_ROBOT_MAPUPDATE)
+    public static final int DH_ALARM_ROBOT_BRAKE = 0x3252;// 机器人紧急刹车事件(对应 ALARM_ROBOT_BRAKE)
+    public static final int DH_ALARM_ROBOT_MANUAL_INTERVENTION = 0x3253;// 机器人人工干预事件(对应 ALARM_ROBOT_MANUAL_INTERVENTION)
+//机器人事件预留至0x3299
+// -----------------------------------------------
+
+
+    public static final int DH_ALARM_VIDEO_TALK_PATH = 0x324d;// 对讲路径事件(对应结构体 ALARM_VIDEO_TALK_PATH_INFO)
+    public static final int DH_ALARM_CGIRECORD = 0x3251;// cgi触发手动录像(对应 ALARM_CGIRECORD)
+    public static final int DH_ALARM_BATTERY_TEMPERATURE = 0x3254;// 电池温度上报事件(对应 ALARM_BATTERY_TEMPERATURE_INFO)
+    public static final int DH_ALARM_TIRE_PRESSURE = 0x3255;// 胎压上报事件(对应 ALARM_TIRE_PRESSURE_INFO )
+    public static final int DH_ALARM_VTH_CONFLICT = 0x3256;// 房间号冲突冲突上报事件(对应 ALARM_VTH_CONFLICT_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_BLACKLIST = 0x3257;// 门禁黑名单刷卡事件上报(对应 ALARM_ACCESS_CTL_BLACKLIST)
+    public static final int DH_ALARM_ROBOT_EMERGENCY_STOP = 0x3258;// 机器人紧急停车按钮事件(对应 ALARM_ROBOT_EMERFEBCY_STOP)
+    public static final int DH_ALARM_ROBOT_PATH_PLAN_FAILED = 0x3259;// 机器人路径规划失败事件(对应 ALARM_ROBOT_PATH_PLAN_FAILED)
+    public static final int DH_ALARM_ROBOT_LOCAL_MAP_UPLOAD = 0x325a;// 机器人本地地图上传事件(对应 ALARM_ROBOT_LOCAL_MAP_UPLOAD)
+    public static final int DH_ALARM_ROBOT_SHELF_ERROR = 0x325b;// 机器人货架异常事件(对应 ALARM_ROBOT_SHELF_ERROR)
+    public static final int DH_ALARM_ROBOT_SENSOR_ERROR = 0x325c;// 机器人传感器异常事件(对应 ALARM_ROBOT_SENSOR_ERROR)
+    public static final int DH_ALARM_ROBOT_DERAILMENT = 0x325d;// 机器人脱轨事件(对应 ALARM_ROBOT_DERAILMENT)
+    public static final int DH_ALARM_ROBOT_MOTOR_UNINIT = 0x325e;// 机器人电机抱闸未使能事件(对应 ALARM_ROBOT_MOTOR_UNINIT)
+    public static final int DH_ALARM_ROBOT_PREVENT_FALLING = 0x325f;// 机器人防跌落事件(对应 ALARM_ROBOT_PREVENT_FALLING)
+    public static final int DH_ALARM_ROBOT_LOCATION_EXCEPTION = 0x3260;// 机器人定位异常事件(对应 ALARM_ROBOT_LOCATION_EXCEPTION )
+    public static final int DH_ALARM_ROBOT_UPGRADER_FAIL = 0x3261;// 机器人升级失败反馈(对应 ALARM_ROBOT_UPGRADER_FAIL)
+    public static final int DH_ALARM_ROBOT_CHARGING_ERROR = 0x3262;// 机器人充电异常事件(对应 ALARM_ROBOT_CHARGING_ERROR)
+    public static final int DH_ALARM_ROBOT_STATIONCHARGING_ERROR = 0x3263;// 机器人充电桩充电异常事件(对应 ALARM_ROBOT_STATIONCHARGING_ERROR)
+    public static final int DH_ALARM_ROBOT_CAMERA_ABNORMAL = 0x3264;// 机器人相机异常事件(对应 ALARM_ROBOT_CAMERA_ABNORMAL)
+    public static final int DH_ALARM_ROBOT_ERROR_REPORT = 0x3265;// 机器人故障信息(对应 ALARM_ROBOT_ERROR_REPORT)
+
+    //新增事件从0x3300开始
+    public static final int DH_ALARM_USERLOCK = 0x3300;// 用户锁定报警事件(对应 ALARM_USERLOCK_INFO)
+    public static final int DH_ALARM_DOWNLOAD_REMOTE_FILE = 0x3301;// 下载远程文件事件(对应ALARM_DOWNLOAD_REMOTE_FILE_INFO)
+    public static final int DH_ALARM_NASFILE_STATUS = 0x3302;// NAS文件状态事件(对应结构体 ALARM_NASFILE_STATUS_INFO) 
+    public static final int DH_ALARM_TALKING_CANCELCALL = 0x3303;// 设备呼叫中取消呼叫事件(对应结构体 ALARM_TALKING_CANCELCALL_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_UNAUTHORIZED_MALICIOUSWIP = 0x3304;// 未授权卡恶意刷卡事件(对应结构体 ALARM_ACCESS_CTL_UNAUTHORIZED_MALICIOUSWIP)已废弃,复用DH_ALARM_ACCESS_CTL_MALICIOUS事件
+    public static final int DH_ALARM_CROWD_DETECTION = 0x3305;// 人群密度检测事件(对应结构体 ALARM_CROWD_DETECTION_INFO)
+    public static final int DH_ALARM_FACE_FEATURE_ABSTRACT = 0x3306;// 人脸特征向量重建结果事件(对应结构体ALARM_FACE_FEATURE_ABSTRACT_INFO)
+    public static final int DH_ALARM_RECORD_SCHEDULE_CHANGE = 0x3307;// 录像计划改变事件(对应结构体 ALARM_RECORD_SCHEDULE_CHANGE_INFO)
+    public static final int DH_ALARM_NTP_CHANGE = 0x3308;// NTP配置修改事件(对应结构体 ALARM_NTP_CHANGE_INFO)
+    public static final int DH_ALARM_HDD_TEMPERATUREALARM = 0x3309;// 硬盘温度报警事件(对应结构体 ALARM_HDD_TEMPERATUREALARM_INFO)
+    public static final int DH_ALARM_HDD_HEALTHALARM = 0x330a;// 硬盘健康状况报警事件(对应结构体 ALARM_HDD_HEALTHALARM_INFO)
+    public static final int DH_ALARM_HDD_SHAKEALARM = 0x330b;// 硬盘震动报警事件(对应结构体 ALARM_HDD_SHAKEALARM_INFO)
+    public static final int DH_ALARM_PATROL_STATUS = 0x330c;// 未巡更报警事件(对应结构体 ALARM_PATROL_STATUS_INFO) 
+    public static final int DH_ALARM_CITIZEN_PICTURE_COMPARE = 0x330d;// 人证比对事件(对应结构体 ALARM_CITIZEN_PICTURE_COMPARE_INFO)
+
+    /*  start  西欧报警主机事件,预留64个事件*/
+    public static final int DH_ALARM_AREAARM_MODECHANGE = 0x330e;// 区域防区模式改变(对应结构体ALARM_AREAARM_MODECHANGE_INFO)
+    public static final int DH_ALARM_ZONEMODULELOST = 0x330f;// 防区模块掉线(对应结构提ALARM_ZONEMODULE_LOST_INFO)
+    public static final int DH_ALARM_AREAALARM = 0x3310;// 区域报警(对应结构体ALARM_AREAALARM_INFO)
+    public static final int DH_ALARM_ZONEOPEN = 0x3311;// 防区打开(对应结构体ALARM_ZONEOPEN_INFO)
+    public static final int DH_ALARM_SYSTEMTAMPER = 0x3312;// 防拆事件(对应结构体ALARM_SYSTEMTAMPER_INFO)
+    public static final int DH_ALARM_ALARMREGION_MAXEVENTID = 0x334d;// 西欧报警主机新品事件最大值,这个值不可用
+    /*  end  西欧报警主机事件,预留64个事件*/
+    public static final int DH_ALARM_DISTANCE_DETECTION = 0x334e;// 异常间距事件(对应 ALARM_DISTANCE_DETECTION_INFO)
+    public static final int DH_ALARM_STAY_DETECTION = 0x334f;// 停留事件(对应 ALARM_STAY_DETECTION_INFO)
+    public static final int DH_ALARM_DEVBOARDHOTPLUG = 0x3350;// 双控设备热插拔事件(对应结构体 ALARM_DEVBOARDHOTPLUG_INFO)
+    public static final int DH_ALARM_HOMESCENE_CHANGE = 0x3351;// 美的地产场景变化事件(对应结构体ALARM_HOMESCENE_CHANGE_INFO)
+    public static final int DH_ALARM_STORAGE_WORKDIRECTORY_SWITCH = 0x3352;// 当前工作目录切换事件(对应结构体 ALARM_STORAGE_WORKDIRECTORY_SWITCH_INFO)
+    public static final int DH_ALARM_TRAFFIC_LINKAGEALARM = 0x3353;// 各种违章事件联动报警输出事件(对应结构体 ALARM_TRAFFIC_LINKAGEALARM_INFO)
+    public static final int DH_ALARM_COAXIAL_ALARM_LOCAL = 0x3354;// 同轴开关量报警事件(对应结构体 ALARM_COAXIAL_ALARM_LOCAL_INFO)
+    public static final int DH_ALARM_NAS_FILE_REMOVE_STATUS = 0x3355;// NAS文件删除状态事件(对应结构体 ALARM_NAS_FILE_REMOVE_STATUS_INFO)
+    public static final int DH_ALARM_NAS_APK_INSTALL_REQUEST = 0x3356;// 请求设备安装APK事件(对应结构体 ALARM_NAS_APK_INSTALL_REQUEST_INFO)
+    public static final int DH_ALARM_NAS_APK_INSTALL_STATUS = 0x3357;// 设备安装APK状态事件(对应结构体 ALARM__APK_INSTALL_STATUS_INFO)
+    public static final int DH_ALARM_FILE_COMPRESS_STATUS = 0x3358;// 文件压缩解压状态事件(对应结构体 ALARM_FILE_COMPRESSS_STATUS_INFO)
+    public static final int DH_ALARM_STRANGER_ALARM = 0x3359;// 陌生人报警事件(对应结构体 ALARM_STRANGER_ALARM_INFO)
+    public static final int DH_ALARM_QR_CODE_CHECK = 0x335a;// 二维码上报事件(对应结构体 ALARM_QR_CODE_CHECK_INFO)
+    public static final int DH_ALARM_ACCESS_CTL_LOCK_MODE = 0x335b;// 门锁模式事件(对应结构体 ALARM_ACCESS_CTL_LOCK_MODE_INFO)
+    public static final int DH_ALARM_LOCK_ROOM_NUM_BIND = 0x335c;// 房间号绑定事件(对应结构体 ALARM_LOCK_ROOM_NUM_BIND_INFO)
+
+
+    /*  start  雷球联动事件,预留64个事件*/
+    public static final int DH_ALARM_RADAR_REGIONDETECTION = 0x3370;// 雷达区域检测事件(对应结构体 ALARM_RADAR_REGIONDETECTION_INFO)
+    public static final int DH_ALARM_RADAR_MAXEVENTID = 0x3433;// 雷达新品事件最大值,这个值不可用
+/*  end  雷球联动事件,预留64个事件*/
+
+    public static final int DH_ALARM_JABLOTRON_ALARM = 0x3434;// 客户报警产品(对应结构体 ALARM_JABLOTRONALARM_INFO)
+    public static final int DH_ALARM_FACE_RECOGNITION = 0x3435;// 人脸识别事件(对应结构体 ALARM_FACE_RECOGNITION_INFO) 
+}

+ 0 - 31
src/main/java/com/usoftchina/ss/dahua/lib/FaceAreaType.java

@@ -1,31 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 人脸区域
- *
- * @author yingp
- * @date 2019/2/15
- */
-public class FaceAreaType {
-    public static final int NET_FACE_AREA_TYPE_UNKOWN = 0;
-    /**
-     * 眉毛
-     */
-    public static final int NET_FACE_AREA_TYPE_EYEBROW = 1;
-    /**
-     * 眼睛
-     */
-    public static final int NET_FACE_AREA_TYPE_EYE = 2;
-    /**
-     * 鼻子
-     */
-    public static final int NET_FACE_AREA_TYPE_NOSE = 3;
-    /**
-     * 嘴巴
-     */
-    public static final int NET_FACE_AREA_TYPE_MOUTH = 4;
-    /**
-     * 脸颊
-     */
-    public static final int NET_FACE_AREA_TYPE_CHEEK = 5;
-}

+ 0 - 23
src/main/java/com/usoftchina/ss/dahua/lib/FaceCompareMode.java

@@ -1,23 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 人脸对比模式
- *
- * @author yingp
- * @date 2019/2/15
- */
-public class FaceCompareMode {
-    public static final int NET_FACE_COMPARE_MODE_UNKOWN = 0;
-    /**
-     * 正常
-     */
-    public static final int NET_FACE_COMPARE_MODE_NORMAL = 1;
-    /**
-     * 指定人脸区域组合区域
-     */
-    public static final int NET_FACE_COMPARE_MODE_AREA = 2;
-    /**
-     * 智能模式,算法根据人脸各个区域情况自动选取组合
-     */
-    public static final int NET_FACE_COMPARE_MODE_AUTO = 3;
-}

+ 0 - 29
src/main/java/com/usoftchina/ss/dahua/lib/FaceDbType.java

@@ -1,29 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 人脸数据类型
- *
- * @author yingp
- * @date 2019/2/15
- */
-public class FaceDbType {
-    public static final int NET_FACE_DB_TYPE_UNKOWN = 0;
-    /**
-     * 历史数据库,存放的是检测出的人脸信息,一般没有包含人脸对应人员信息
-     */
-    public static final int NET_FACE_DB_TYPE_HISTORY = 1;
-    /**
-     * 黑名单数据库
-     */
-    public static final int NET_FACE_DB_TYPE_BLACKLIST = 2;
-    /**
-     * 白名单数据库
-     *
-     * @deprecated
-     */
-    public static final int NET_FACE_DB_TYPE_WHITELIST = 3;
-    /**
-     * 报警库
-     */
-    public static final int NET_FACE_DB_TYPE_ALARM = 4;
-}

+ 0 - 23
src/main/java/com/usoftchina/ss/dahua/lib/FaceRecognitionFaceType.java

@@ -1,23 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 人脸识别人脸类型
- *
- * @author yingp
- * @date 2019/2/15
- */
-public class FaceRecognitionFaceType {
-    public static final int EM_FACERECOGNITION_FACE_TYPE_UNKOWN = 0;
-    /**
-     * 所有人脸
-     */
-    public static final int EM_FACERECOGNITION_FACE_TYPE_ALL = 1;
-    /**
-     * 识别成功
-     */
-    public static final int EM_FACERECOGNITION_FACE_TYPE_REC_SUCCESS = 2;
-    /**
-     * 识别失败
-     */
-    public static final int EM_FACERECOGNITION_FACE_TYPE_REC_FAIL = 3;
-}

+ 0 - 75
src/main/java/com/usoftchina/ss/dahua/lib/FaceRecognitionService.java

@@ -1,75 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 人脸识别
- *
- * @author yingp
- * @date 2019/2/27
- */
-public class FaceRecognitionService {
-
-    private final INetSdk sdk;
-
-    public FaceRecognitionService(INetSdk sdk) {
-        this.sdk = sdk;
-    }
-
-    /**
-     * 添加
-     */
-    public boolean add(String id, String name, Sex sex) {
-        NetSdkLib.FACERECOGNITION_PERSON_INFO info = new NetSdkLib.FACERECOGNITION_PERSON_INFO();
-        info.szID = id.getBytes();
-        info.bySex = sex.getValue();
-        info.wFacePicNum = 1;
-        info.byType = PersonType.PERSON_TYPE_NORMAL;
-        info.byIDType = CertificateType.CERTIFICATE_TYPE_IC;
-        info.szPersonNameEx = name.getBytes();
-
-        NetSdkLib.NET_IN_OPERATE_FACERECONGNITIONDB operateIn = new NetSdkLib.NET_IN_OPERATE_FACERECONGNITIONDB();
-        operateIn.stPersonInfo = info;
-        operateIn.emOperateType = OperateType.NET_FACERECONGNITIONDB_ADD;
-
-        NetSdkLib.NET_OUT_OPERATE_FACERECONGNITIONDB operateOut = new NetSdkLib.NET_OUT_OPERATE_FACERECONGNITIONDB();
-        boolean bRet = sdk.getInstance().CLIENT_OperateFaceRecognitionDB(sdk.getLoginHandle(),
-                operateIn, operateOut, 5000);
-        if (!bRet) {
-            System.err.println(sdk.getLastError());
-        }
-        return bRet;
-    }
-
-    public enum Sex {
-        UNKNOWN((byte) 0), MALE((byte) 1), FEMALE((byte) 2);
-
-        final byte value;
-
-        Sex(byte value) {
-            this.value = value;
-        }
-
-        public byte getValue() {
-            return value;
-        }
-    }
-
-    class OperateType {
-        public static final int NET_FACERECONGNITIONDB_UNKOWN = 0;
-        /**
-         * 添加人员信息和人脸样本,如果人员已经存在,图片数据和原来的数据合并
-         */
-        public static final int NET_FACERECONGNITIONDB_ADD = 1;
-        /**
-         * 删除人员信息和人脸样本
-         */
-        public static final int NET_FACERECONGNITIONDB_DELETE = 2;
-        /**
-         * 修改人员信息和人脸样本,人员的UID标识必填
-         */
-        public static final int NET_FACERECONGNITIONDB_MODIFY = 3;
-        /**
-         * 通过UID删除人员信息和人脸样本
-         */
-        public static final int NET_FACERECONGNITIONDB_DELETE_BY_UID = 4;
-    }
-}

+ 60 - 0
src/main/java/com/usoftchina/ss/dahua/lib/FileService.java

@@ -0,0 +1,60 @@
+package com.usoftchina.ss.dahua.lib;
+
+import com.usoftchina.ss.dahua.common.FileNameUtils;
+import com.usoftchina.ss.dahua.lib.NetSdk.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+/**
+ * @author yingp
+ * @date 2019/3/6
+ */
+public class FileService {
+    private final INetSdk sdk;
+
+    private final static String TEMP_FILE_PREFIX = "dahua-";
+
+    public FileService(INetSdk sdk) {
+        this.sdk = sdk;
+    }
+
+    /**
+     * 按文件名下载远程文件
+     *
+     * @param fileName 源文件
+     * @return
+     * @throws IOException
+     */
+    public File downloadByName(String fileName) throws IOException {
+        Path destPath = Files.createTempFile(TEMP_FILE_PREFIX, FileNameUtils.getSuffix(fileName));
+        downloadByName(fileName, destPath.toFile());
+        return destPath.toFile();
+    }
+
+    /**
+     * 按文件名下载远程文件
+     *
+     * @param fileName 源文件
+     * @param destFile 目标文件
+     * @throws IOException
+     */
+    public void downloadByName(String fileName, File destFile) throws IOException {
+        DH_IN_DOWNLOAD_REMOTE_FILE in = new DH_IN_DOWNLOAD_REMOTE_FILE();
+        in.pszFileName = fileName;
+
+        if (!destFile.exists() || !destFile.isFile()) {
+            destFile.createNewFile();
+        }
+        in.pszFileDst = destFile.getCanonicalPath();
+
+        DH_OUT_DOWNLOAD_REMOTE_FILE out = new DH_OUT_DOWNLOAD_REMOTE_FILE();
+
+        boolean bRet = sdk.getInstance().CLIENT_DownloadRemoteFile(sdk.getLoginHandle(), in, out, 5000);
+        if (!bRet) {
+            throw new SdkException(sdk.getLastError());
+        }
+    }
+}

+ 10 - 31
src/main/java/com/usoftchina/ss/dahua/lib/INetSdk.java

@@ -1,9 +1,8 @@
 package com.usoftchina.ss.dahua.lib;
 
-import com.sun.jna.Memory;
 import com.sun.jna.Native;
 import com.sun.jna.NativeLong;
-import com.sun.jna.Pointer;
+import com.sun.jna.Platform;
 import com.sun.jna.ptr.IntByReference;
 
 /**
@@ -12,10 +11,11 @@ import com.sun.jna.ptr.IntByReference;
  */
 public class INetSdk {
 
-    private final NetSdkLib instance;
+    private final NetSdk instance;
 
     public INetSdk() {
-        this.instance = Native.load("dhnetsdk", NetSdkLib.class);
+        this.instance = Native.load(Platform.RESOURCE_PREFIX +
+                (Platform.isWindows() ? "/dhnetsdk" : "/libdhnetsdk"), NetSdk.class);
     }
 
     private boolean initialized;
@@ -40,10 +40,10 @@ public class INetSdk {
     /**
      * 设备信息
      */
-    private NetSdkLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSdkLib.NET_DEVICEINFO_Ex();
+    private NetSdk.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSdk.NET_DEVICEINFO_Ex();
 
 
-    public NetSdkLib getInstance() {
+    public NetSdk getInstance() {
         return instance;
     }
 
@@ -66,7 +66,7 @@ public class INetSdk {
      * @param haveReConnect
      * @return
      */
-    public boolean init(NetSdkLib.fDisConnect disConnect, NetSdkLib.fHaveReConnect haveReConnect) {
+    public boolean init(NetSdk.fDisConnect disConnect, NetSdk.fHaveReConnect haveReConnect) {
         initialized = instance.CLIENT_Init(disConnect, new NativeLong());
         if (!initialized) {
             System.err.println("Initialize SDK failed");
@@ -91,14 +91,14 @@ public class INetSdk {
         return init(new DefaultDisConnect(), new DefaultHaveReConnect());
     }
 
-    private static class DefaultDisConnect implements NetSdkLib.fDisConnect {
+    private static class DefaultDisConnect implements NetSdk.fDisConnect {
         @Override
         public void invoke(NativeLong m_hLoginHandle, String pchDVRIP, int nDVRPort, NativeLong dwUser) {
             System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
         }
     }
 
-    private static class DefaultHaveReConnect implements NetSdkLib.fHaveReConnect {
+    private static class DefaultHaveReConnect implements NetSdk.fHaveReConnect {
         @Override
         public void invoke(NativeLong m_hLoginHandle, String pchDVRIP, int nDVRPort, NativeLong dwUser) {
             System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
@@ -127,7 +127,7 @@ public class INetSdk {
         IntByReference nError = new IntByReference(0);
         m_hLoginHandle = instance.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError);
         if (m_hLoginHandle.longValue() == 0) {
-            System.err.printf("Login Device[%s] Port[%d]Failed. Last Error[0x%x]\n", m_strIp, m_nPort, instance.CLIENT_GetLastError());
+            System.err.printf("Login Device[%s] Port[%d]Failed. Last Error[%s]\n", m_strIp, m_nPort, getLastError());
             return false;
         }
         System.out.println("Login Success [ " + m_strIp + " ]");
@@ -161,25 +161,4 @@ public class INetSdk {
         return instance.CLIENT_GetSDKVersion();
     }
 
-    /**
-     * 获取前端设备的当前工作状态
-     */
-    public void getDevState() {
-        if (m_hLoginHandle.longValue() == 0) {
-            return;
-        }
-        int nBufLen = 1024*1024;
-        Memory pBuf = new Memory(nBufLen);
-        pBuf.clear();
-        IntByReference pRetLen = new IntByReference();
-        boolean bRet = instance.CLIENT_QueryRemotDevState(m_hLoginHandle, DeviceStateType.DH_DEVSTATE_TYPE, 0,
-                pBuf, nBufLen, pRetLen, 5000);
-        if (bRet) {
-            System.out.println(pBuf.dump());
-            System.out.println(pRetLen.getValue());
-        } else {
-            System.err.println("error");
-        }
-    }
-
 }

+ 0 - 86
src/main/java/com/usoftchina/ss/dahua/lib/LoginSpecCapType.java

@@ -1,86 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 登录类型
- *
- * @author yingp
- * @date 2019/2/15
- */
-public class LoginSpecCapType {
-    /**
-     * TCP登录, 默认方式
-     */
-    public static final int EM_LOGIN_SPEC_CAP_TCP = 0;
-    /**
-     * 无条件登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_ANY = 1;
-    /**
-     * 主动注册的登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_SERVER_CONN = 2;
-    /**
-     * 组播登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_MULTICAST = 3;
-    /**
-     * UDP方式下的登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_UDP = 4;
-    /**
-     * 只建主连接下的登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_MAIN_CONN_ONLY = 6;
-    /**
-     * SSL加密方式登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_SSL = 7;
-    /**
-     * 登录智能盒远程设备
-     */
-    public static final int EM_LOGIN_SPEC_CAP_INTELLIGENT_BOX = 9;
-    /**
-     * 登录设备后不做取配置操作
-     */
-    public static final int EM_LOGIN_SPEC_CAP_NO_CONFIG = 10;
-    /**
-     * 用U盾设备的登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_U_LOGIN = 11;
-    /**
-     * LDAP方式登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_LDAP = 12;
-    /**
-     * AD(ActiveDirectory)登录方式
-     */
-    public static final int EM_LOGIN_SPEC_CAP_AD = 13;
-    /**
-     * Radius登录方式
-     */
-    public static final int EM_LOGIN_SPEC_CAP_RADIUS = 14;
-    /**
-     * Socks5登录方式
-     */
-    public static final int EM_LOGIN_SPEC_CAP_SOCKET_5 = 15;
-    /**
-     * 云登录方式
-     */
-    public static final int EM_LOGIN_SPEC_CAP_CLOUD = 16;
-    /**
-     * 二次鉴权登录方式
-     */
-    public static final int EM_LOGIN_SPEC_CAP_AUTH_TWICE = 17;
-    /**
-     * TS码流客户端登录方式
-     */
-    public static final int EM_LOGIN_SPEC_CAP_TS = 18;
-    /**
-     * 为P2P登录方式
-     */
-    public static final int EM_LOGIN_SPEC_CAP_P2P = 19;
-    /**
-     * 手机客户端登录
-     */
-    public static final int EM_LOGIN_SPEC_CAP_MOBILE = 20;
-}

+ 836 - 0
src/main/java/com/usoftchina/ss/dahua/lib/NetSdk.java

@@ -0,0 +1,836 @@
+package com.usoftchina.ss.dahua.lib;
+
+import com.sun.jna.Library;
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+import com.sun.jna.Structure;
+import com.sun.jna.ptr.IntByReference;
+import com.sun.jna.win32.StdCallLibrary;
+
+import java.util.Date;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+/**
+ * @author yingp
+ * @date 2019/3/4
+ */
+public interface NetSdk extends Library {
+
+    /**
+     * 通用字符串长度4
+     */
+    int DH_COMMON_STRING_4 = 4;
+    /**
+     * 通用字符串长度8
+     */
+    int DH_COMMON_STRING_8 = 8;
+    /**
+     * 通用字符串长度16
+     */
+    int DH_COMMON_STRING_16 = 16;
+    /**
+     * 通用字符串长度32
+     */
+    int DH_COMMON_STRING_32 = 32;
+    /**
+     * 通用字符串长度64
+     */
+    int DH_COMMON_STRING_64 = 64;
+    /**
+     * 通用字符串长度128
+     */
+    int DH_COMMON_STRING_128 = 128;
+    /**
+     * 通用字符串长度256
+     */
+    int DH_COMMON_STRING_256 = 256;
+    /**
+     * 通用字符串长度512
+     */
+    int DH_COMMON_STRING_512 = 512;
+    /**
+     * 通用字符串长度1024
+     */
+    int DH_COMMON_STRING_1024 = 1024;
+    /**
+     * 通用字符串长度2048
+     */
+    int DH_COMMON_STRING_2048 = 2048;
+    /**
+     * 通用字符串长度8
+     */
+    int MAX_COMMON_STRING_8 = 8;
+    /**
+     * 通用字符串长度16
+     */
+    int MAX_COMMON_STRING_16 = 16;
+    /**
+     * 通用字符串长度32
+     */
+    int MAX_COMMON_STRING_32 = 32;
+    /**
+     * 通用字符串长度64
+     */
+    int MAX_COMMON_STRING_64 = 64;
+
+    /**
+     * 时间
+     */
+    @Structure.FieldOrder({"dwYear", "dwMonth", "dwDay", "dwHour", "dwMinute", "dwSecond"})
+    class NET_TIME extends Structure {
+        /**
+         * 年
+         */
+        public int dwYear;
+        /**
+         * 月
+         */
+        public int dwMonth;
+        /**
+         * 日
+         */
+        public int dwDay;
+        /**
+         * 时
+         */
+        public int dwHour;
+        /**
+         * 分
+         */
+        public int dwMinute;
+        /**
+         * 秒
+         */
+        public int dwSecond;
+
+        public NET_TIME() {
+        }
+
+        @Override
+        public String toString() {
+            return String.format("%02d-%02d-%02d %02d:%02d:%02d", dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond);
+        }
+
+        public Date toDate() {
+            return Date.from(LocalDateTime.of(dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond)
+                    .atZone(ZoneId.systemDefault()).toInstant());
+        }
+    }
+
+    /**
+     * 时间
+     */
+    @Structure.FieldOrder({"dwYear", "dwMonth", "dwDay", "dwHour", "dwMinute", "dwSecond", "dwMillisecond", "dwReserved"})
+    class NET_TIME_EX extends Structure {
+        /**
+         * 年
+         */
+        public int dwYear;
+        /**
+         * 月
+         */
+        public int dwMonth;
+        /**
+         * 日
+         */
+        public int dwDay;
+        /**
+         * 时
+         */
+        public int dwHour;
+        /**
+         * 分
+         */
+        public int dwMinute;
+        /**
+         * 秒
+         */
+        public int dwSecond;
+        /**
+         * 毫秒
+         */
+        public int dwMillisecond;
+
+        public byte[] dwReserved = new byte[2];
+
+        public NET_TIME_EX() {
+        }
+
+        @Override
+        public String toString() {
+            return String.format("%02d-%02d-%02d %02d:%02d:%02d:%d", dwYear, dwMonth, dwDay, dwHour, dwMinute,
+                    dwSecond, dwMillisecond);
+        }
+
+        public Date toDate() {
+            return Date.from(LocalDateTime.of(dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond, dwMillisecond)
+                    .atZone(ZoneId.systemDefault()).toInstant());
+        }
+    }
+
+    /*******************SDK初始化*******************/
+
+    /**
+     * 断线回调
+     */
+    interface fDisConnect extends StdCallLibrary.StdCallCallback {
+        /**
+         * @param lLoginID CLIENT_LoginEx2的返回值
+         * @param pchDVRIP 设备IP
+         * @param nDVRPort 设备端口
+         * @param dwUser   用户数据
+         */
+        void invoke(NativeLong lLoginID, String pchDVRIP, int nDVRPort, NativeLong dwUser);
+    }
+
+    /**
+     * 初始化SDK, 在调用SDK另外函数之前调用
+     *
+     * @param cbDisConnect 断线回调函数,通知用户当前断开网络的设备,如果调用SDK的ClIENT_Logout函数主动断开的设备不作断线回调,设置为NULL时不回调
+     * @param dwUser       用户数据
+     * @return
+     */
+    boolean CLIENT_Init(fDisConnect cbDisConnect, NativeLong dwUser);
+
+    /**
+     * 初始化参数
+     */
+    class NETSDK_INIT_PARAM extends Structure {
+        /**
+         * 指定NetSDK常规网络处理线程数, 当值为0时, 使用内部默认值
+         */
+        public int nThreadNum;
+        public byte[] bReserved = new byte[1024];
+    }
+
+    /**
+     * SDK初始化, 通过NETSDK_INIT_PARAM指定初始化参数, 如定制NetSDK启用的常规网络处理线程数
+     *
+     * @param cbDisConnect 断线回调函数,通知用户当前断开网络的设备,如果调用SDK的ClIENT_Logout函数主动断开的设备不作断线回调,设置为NULL时不回调
+     * @param dwUser       用户数据
+     * @param lpInitParam  初始化参数
+     * @return
+     */
+    boolean CLIENT_InitEx(fDisConnect cbDisConnect, NativeLong dwUser, NETSDK_INIT_PARAM lpInitParam);
+
+    /**
+     * 获取SDK的版本号
+     *
+     * @return
+     */
+    int CLIENT_GetSDKVersion();
+
+    /**
+     * 获取函数执行的错误码
+     *
+     * @return
+     * @see ErrorCode
+     */
+    int CLIENT_GetLastError();
+
+    /**
+     * 断线后重连回调
+     */
+    interface fHaveReConnect extends StdCallLibrary.StdCallCallback {
+        /**
+         * @param lLoginID CLIENT_LoginEx2的返回值
+         * @param pchDVRIP 设备IP
+         * @param nDVRPort 设备端口
+         * @param dwUser   用户数据
+         */
+        void invoke(NativeLong lLoginID, String pchDVRIP, int nDVRPort, NativeLong dwUser);
+    }
+
+    /**
+     * 设置断线重连回调函数,在设备断线时自动重连设备
+     *
+     * @param cbAutoConnect 断线重连成功的回调函数,通知用户当前断线重连成功的设备
+     * @param dwUser        用户自定义数据,在回调中可以使用
+     */
+    void CLIENT_SetAutoReconnect(fHaveReConnect cbAutoConnect, NativeLong dwUser);
+
+    /**
+     * 设置连接设备等待时间
+     *
+     * @param nWaitTime 连接设备等待时间(单位毫秒)
+     * @param nTryTimes 连接次数
+     */
+    void CLIENT_SetConnectTime(int nWaitTime, int nTryTimes);
+
+    /**
+     * 登陆网络环境设置
+     */
+    @Structure.FieldOrder({"bReserved", "byNetType", "byPlaybackBufSize", "byReserved1", "nConnectBufSize",
+            "nConnectTime", "nConnectTryNum", "nGetConnInfoTime", "nGetDevInfoTime", "nPicBufSize", "nSearchRecordTime",
+            "nWaittime", "nsubConnectSpaceTime", "nsubDisconnetTime"})
+    class NET_PARAM extends Structure {
+        /**
+         * 保留字段
+         */
+        public byte[] bReserved = new byte[4];
+        /**
+         * 网络类型,0-LAN, 1-WAN
+         */
+        public byte byNetType;
+        /**
+         * 回放数据接收缓冲大小(M为单位),为0默认为4M
+         */
+        public byte byPlaybackBufSize;
+        /**
+         * 保留字段
+         */
+        public byte[] byReserved1 = new byte[2];
+        /**
+         * 每个连接接收数据缓冲大小(字节为单位),为0默认250*1024
+         */
+        public int nConnectBufSize;
+        /**
+         * 连接超时时间(毫秒为单位),为0默认1500ms
+         */
+        public int nConnectTime;
+        /**
+         * 连接尝试次数,为0默认1次
+         */
+        public int nConnectTryNum;
+        /**
+         * 获取子连接信息超时时间(毫秒为单位),为0默认1000ms
+         */
+        public int nGetConnInfoTime;
+        /**
+         * 获取设备信息超时时间,为0默认1000ms
+         */
+        public int nGetDevInfoTime;
+        /**
+         * 实时图片接收缓冲大小(字节为单位),为0默认为2*1024*1024
+         */
+        public int nPicBufSize;
+        /**
+         * 按时间查询录像文件的超时时间(毫秒为单位),为0默认为3000ms
+         */
+        public int nSearchRecordTime;
+        /**
+         * 等待超时时间(毫秒为单位),为0默认5000ms
+         */
+        public int nWaittime;
+        /**
+         * 子连接之间的等待时间(毫秒为单位),为0默认10ms
+         */
+        public int nsubConnectSpaceTime;
+        /**
+         * 检测子链接断线等待时间(毫秒为单位),为0默认为60000ms
+         */
+        public int nsubDisconnetTime;
+    }
+
+    /**
+     * 设置网络参数
+     *
+     * @param pNetParam
+     */
+    void CLIENT_SetNetworkParam(NetSdkLib.NET_PARAM pNetParam);
+
+    /**
+     * 清空SDK, 释放占用的资源,在所有的SDK函数之后调用
+     */
+    void CLIENT_Cleanup();
+
+    /*******************登录设备*******************/
+
+    /**
+     * 登录类型
+     */
+    class EM_LOGIN_SPAC_CAP_TYPE {
+        /**
+         * TCP登录, 默认方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_TCP = 0;
+        /**
+         * 无条件登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_ANY = 1;
+        /**
+         * 主动注册的登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_SERVER_CONN = 2;
+        /**
+         * 组播登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_MULTICAST = 3;
+        /**
+         * UDP方式下的登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_UDP = 4;
+        /**
+         * 只建主连接下的登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_MAIN_CONN_ONLY = 6;
+        /**
+         * SSL加密方式登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_SSL = 7;
+        /**
+         * 登录智能盒远程设备
+         */
+        public static final int EM_LOGIN_SPEC_CAP_INTELLIGENT_BOX = 9;
+        /**
+         * 登录设备后不做取配置操作
+         */
+        public static final int EM_LOGIN_SPEC_CAP_NO_CONFIG = 10;
+        /**
+         * 用U盾设备的登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_U_LOGIN = 11;
+        /**
+         * LDAP方式登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_LDAP = 12;
+        /**
+         * AD(ActiveDirectory)登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_AD = 13;
+        /**
+         * Radius登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_RADIUS = 14;
+        /**
+         * Socks5登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_SOCKET_5 = 15;
+        /**
+         * 云登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_CLOUD = 16;
+        /**
+         * 二次鉴权登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_AUTH_TWICE = 17;
+        /**
+         * TS码流客户端登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_TS = 18;
+        /**
+         * 为P2P登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_P2P = 19;
+        /**
+         * 手机客户端登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_MOBILE = 20;
+    }
+
+    /**
+     * 设备序列号字符长度
+     */
+    int DH_SERIALNO_LEN = 48;
+
+    /**
+     * 设备信息
+     */
+    @Structure.FieldOrder({"Reserved", "bReserved", "byLeftLogTimes", "byLimitLoginTime", "nAlarmInPortNum",
+            "nAlarmOutPortNum", "nChanNum", "nDVRType", "nDiskNum", "nLockLeftTime", "sSerialNumber"})
+    class NET_DEVICEINFO_Ex extends Structure {
+        /**
+         * 保留
+         */
+        public byte[] Reserved = new byte[24];
+        /**
+         * 保留字节
+         */
+        public byte[] bReserved = new byte[2];
+        /**
+         * 当登陆失败原因为密码错误时,通过此参数通知用户,剩余登陆次数,为0时表示此参数无效
+         */
+        public byte byLeftLogTimes;
+        /**
+         * 在线超时时间,为0表示不限制登陆,非0表示限制的分钟数
+         */
+        public byte byLimitLoginTime;
+        /**
+         * DVR报警输入个数
+         */
+        public int nAlarmInPortNum;
+        /**
+         * DVR报警输出个数
+         */
+        public int nAlarmOutPortNum;
+        /**
+         * DVR通道个数
+         */
+        public int nChanNum;
+        /**
+         * DVR类型
+         *
+         * @see DeviceType
+         */
+        public int nDVRType;
+        /**
+         * DVR硬盘个数
+         */
+        public int nDiskNum;
+        /**
+         * 当登陆失败,用户解锁剩余时间(秒数), -1表示设备未设置该参数
+         */
+        public int nLockLeftTime;
+        /**
+         * 序列号
+         */
+        public byte[] sSerialNumber = new byte[DH_SERIALNO_LEN];
+    }
+
+    /**
+     * 登录设备
+     *
+     * @param pchDVRIP     设备IP
+     * @param wDVRPort     设备端口
+     * @param pchUserName  用户名
+     * @param pchPassword  用户密码
+     * @param emSpecCap    设备支持的能力,值为2表示主动侦听模式下的用户登陆(车载dvr登录)
+     * @param pCapParam    对emSpecCap 的补充参数,emSpecCap = 2时,pCapParam填充设备序列号字串(车载dvr登录)
+     * @param lpDeviceInfo 设备信息,属于输出参数,填NULL效果类似emSpecCap=10
+     * @param error        (当函数返回成功时,该参数的值无意义),返回登录错误码
+     * @return
+     * @see EM_LOGIN_SPAC_CAP_TYPE
+     */
+    NativeLong CLIENT_LoginEx2(String pchDVRIP, int wDVRPort, String pchUserName, String pchPassword, int emSpecCap,
+                               Pointer pCapParam, NET_DEVICEINFO_Ex lpDeviceInfo, IntByReference error);
+
+    /**
+     * 登出设备
+     *
+     * @param lLoginID CLIENT_LoginEx2的返回值
+     * @return 成功返回TRUE,失败返回FALSE
+     */
+    boolean CLIENT_Logout(NativeLong lLoginID);
+
+    /*******************事件*******************/
+
+    /**
+     * 消息回调函数
+     */
+    interface fMessCallBackEx1 extends StdCallLibrary.StdCallCallback {
+        void invoke(int lCommand, NativeLong lLoginID, Pointer pBuf, int dwBufLen, String pchDVRIP, NativeLong nDVRPort,
+                    boolean bAlarmAckFlag, NativeLong nEventID, NativeLong dwUser);
+    }
+
+    /**
+     * 设置报警回调函数
+     *
+     * @param cbMessage
+     * @param dwUser
+     */
+    void CLIENT_SetDVRMessCallBackEx1(fMessCallBackEx1 cbMessage, NativeLong dwUser);
+
+    /**
+     * 向设备订阅报警
+     *
+     * @param lLoginID
+     * @return
+     */
+    boolean CLIENT_StartListenEx(NativeLong lLoginID);
+
+    /**
+     * 停止订阅报警
+     *
+     * @param lLoginID
+     * @return
+     */
+    boolean CLIENT_StopListen(NativeLong lLoginID);
+
+    /**
+     * 最大网卡名
+     */
+    int DH_MAX_ETH_NAME = 64;
+
+    /**
+     * 网络故障事件类型
+     */
+    class EM_NETABORT_EVENT_TYPE {
+        /**
+         * 有线网络故障事件
+         */
+        public static final int EM_NETABORT_EVENT_TYPE_WIRE = 0;
+        /**
+         * 无线网络故障事件
+         */
+        public static final int EM_NETABORT_EVENT_TYPE_WIRELESS = 1;
+        /**
+         * 3G网络故障事件
+         */
+        public static final int EM_NETABORT_EVENT_TYPE_3G = 2;
+    }
+
+    /**
+     * 网络故障事件
+     */
+    @Structure.FieldOrder({"dwSize", "nAction", "emNetAbortType", "stuTime", "szInterface"})
+    class ALARM_NETABORT_INFO extends Structure {
+        public int dwSize;
+        /**
+         * 0:开始 1:停止
+         */
+        public int nAction;
+        /**
+         * 事件类型
+         *
+         * @see EM_NETABORT_EVENT_TYPE
+         */
+        public int emNetAbortType;
+        /**
+         * 事件触发时间
+         */
+        public NET_TIME stuTime;
+        /**
+         * 冲突网卡名
+         */
+        public byte[] szInterface = new byte[DH_MAX_ETH_NAME];
+
+        public ALARM_NETABORT_INFO() {
+            this.dwSize = size();
+        }
+
+        public ALARM_NETABORT_INFO(Pointer pointer) {
+            super(pointer);
+            read();
+        }
+
+        @Override
+        public String toString() {
+            return "ALARM_NETABORT_INFO{" +
+                    "nAction=" + nAction +
+                    ", emNetAbortType=" + emNetAbortType +
+                    ", stuTime=" + stuTime +
+                    ", szInterface=" + new String(szInterface) +
+                    '}';
+        }
+    }
+
+    /**
+     * 门禁状态类型
+     */
+    class NET_ACCESS_CTL_STATUS_TYPE {
+        public static final int NET_ACCESS_CTL_STATUS_TYPE_UNKNOWN = 0;
+        /**
+         * 开门
+         */
+        public static final int NET_ACCESS_CTL_STATUS_TYPE_OPEN = 1;
+        /**
+         * 关门
+         */
+        public static final int NET_ACCESS_CTL_STATUS_TYPE_CLOSE = 2;
+        /**
+         * 异常
+         */
+        public static final int NET_ACCESS_CTL_STATUS_TYPE_ABNORMAL = 3;
+        /**
+         * 假锁
+         */
+        public static final int NET_ACCESS_CTL_STATUS_TYPE_FAKELOCKED = 4;
+        /**
+         * 常闭
+         */
+        public static final int NET_ACCESS_CTL_STATUS_TYPE_CLOSEALWAYS = 5;
+        /**
+         * 常开
+         */
+        public static final int NET_ACCESS_CTL_STATUS_TYPE_OPENALWAYS = 6;
+    }
+
+    /**
+     * 门禁状态事件
+     */
+    @Structure.FieldOrder({"dwSize", "nDoor", "stuTime", "emStatus", "szSerialNumber"})
+    class ALARM_ACCESS_CTL_STATUS_INFO extends Structure {
+        public int dwSize;
+        /**
+         * 门通道号
+         */
+        public int nDoor;
+        /**
+         * 事件发生的时间
+         */
+        public NET_TIME stuTime;
+        /**
+         * 门禁状态
+         *
+         * @see NET_ACCESS_CTL_STATUS_TYPE
+         */
+        public int emStatus;
+        /**
+         * 无线设备序列号(智能锁)
+         */
+        public byte[] szSerialNumber = new byte[DH_COMMON_STRING_256];
+
+        public ALARM_ACCESS_CTL_STATUS_INFO() {
+            this.dwSize = size();
+        }
+
+        public ALARM_ACCESS_CTL_STATUS_INFO(Pointer pointer) {
+            super(pointer);
+            read();
+        }
+
+        @Override
+        public String toString() {
+            return "ALARM_ACCESS_CTL_STATUS_INFO{" +
+                    "nDoor=" + nDoor +
+                    ", stuTime=" + stuTime +
+                    ", emStatus=" + emStatus +
+                    ", szSerialNumber=" + new String(szSerialNumber) +
+                    '}';
+        }
+    }
+
+    /**
+     * 报警事件类型DH_ALARM_NEW_FILE(new file事件)对应的数据描述信息
+     */
+    @Structure.FieldOrder({"dwSize", "nChannel", "nEventID", "dwEvent", "FileSize", "nIndex", "dwStorPoint", "szFileName"})
+    class ALARM_NEW_FILE_INFO extends Structure {
+        public int dwSize;
+        /**
+         * 抓图通道号
+         */
+        public int nChannel;
+        /**
+         * 事件ID
+         */
+        public int nEventID;
+        /**
+         * 事件类型
+         */
+        public int dwEvent;
+        /**
+         * 文件大小,单位是字节
+         */
+        public int FileSize;
+        /**
+         * 事件源通道
+         */
+        public int nIndex;
+        /**
+         * 存储点
+         */
+        public int dwStorPoint;
+        /**
+         * 文件名
+         */
+        public byte[] szFileName = new byte[DH_COMMON_STRING_128];
+
+        public ALARM_NEW_FILE_INFO() {
+            this.dwSize = size();
+        }
+
+        public ALARM_NEW_FILE_INFO(Pointer pointer) {
+            super(pointer);
+            read();
+        }
+
+        @Override
+        public String toString() {
+            return "ALARM_NEW_FILE_INFO{" +
+                    "nChannel=" + nChannel +
+                    ", nEventID=" + nEventID +
+                    ", dwEvent=" + dwEvent +
+                    ", FileSize=" + FileSize +
+                    ", nIndex=" + nIndex +
+                    ", dwStorPoint=" + dwStorPoint +
+                    ", szFileName=" + new String(szFileName) +
+                    '}';
+        }
+    }
+
+    /**
+     * 报警事件类型DH_EVENT_MOTIONDETECT(视频移动侦测事件)对应的数据描述信息
+     */
+    @Structure.FieldOrder({"dwSize", "nChannelID", "PTS", "UTC", "nEventID", "nEventAction"})
+    class ALARM_MOTIONDETECT_INFO extends Structure {
+        public int dwSize;
+        /**
+         * 通道号
+         */
+        public int nChannelID;
+        /**
+         * 时间戳(单位是毫秒)
+         */
+        public double PTS;
+        /**
+         * 事件发生的时间
+         */
+        public NET_TIME_EX UTC;
+        /**
+         * 事件ID
+         */
+        public int nEventID;
+        /**
+         * 事件动作,0表示脉冲事件,1表示持续性事件开始,2表示持续性事件结束;
+         */
+        public int nEventAction;
+
+        public ALARM_MOTIONDETECT_INFO() {
+            this.dwSize = size();
+        }
+
+        public ALARM_MOTIONDETECT_INFO(Pointer pointer) {
+            super(pointer);
+            read();
+        }
+
+        @Override
+        public String toString() {
+            return "ALARM_MOTIONDETECT_INFO{" +
+                    "nChannelID=" + nChannelID +
+                    ", PTS=" + PTS +
+                    ", UTC=" + UTC +
+                    ", nEventID=" + nEventID +
+                    ", nEventAction=" + nEventAction +
+                    '}';
+        }
+    }
+
+    /*******************文件管理*******************/
+    /**
+     * CLIENT_DownloadRemoteFile 接口输入参数(文件下载)
+     */
+    @Structure.FieldOrder({"dwSize", "pszFileName", "pszFileDst"})
+    class DH_IN_DOWNLOAD_REMOTE_FILE extends Structure {
+        public int dwSize;
+        /**
+         * 需要下载的文件名
+         */
+        public String pszFileName;
+        /**
+         * 存放文件路径
+         */
+        public String pszFileDst;
+
+        public DH_IN_DOWNLOAD_REMOTE_FILE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_DownloadRemoteFile 接口输出参数(文件下载)
+     */
+    @Structure.FieldOrder("dwSize")
+    class DH_OUT_DOWNLOAD_REMOTE_FILE extends Structure {
+        public int dwSize;
+
+        public DH_OUT_DOWNLOAD_REMOTE_FILE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 文件下载, 只适用于小文件
+     *
+     * @param lLoginID  登录句柄
+     * @param pInParam  输入参数
+     * @param pOutParam 输出参数
+     * @param nWaitTime 等待时间
+     * @return
+     * @see DH_IN_DOWNLOAD_REMOTE_FILE
+     * @see DH_OUT_DOWNLOAD_REMOTE_FILE
+     */
+    boolean CLIENT_DownloadRemoteFile(NativeLong lLoginID, DH_IN_DOWNLOAD_REMOTE_FILE pInParam,
+                                      DH_OUT_DOWNLOAD_REMOTE_FILE pOutParam, int nWaitTime);
+}

+ 3610 - 555
src/main/java/com/usoftchina/ss/dahua/lib/NetSdkLib.java

@@ -1,77 +1,192 @@
 package com.usoftchina.ss.dahua.lib;
 
-import com.sun.jna.*;
+import com.sun.jna.Library;
+import com.sun.jna.NativeLong;
+import com.sun.jna.Pointer;
+import com.sun.jna.Structure;
 import com.sun.jna.ptr.IntByReference;
-import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
+import com.sun.jna.win32.StdCallLibrary;
+import com.usoftchina.ss.dahua.common.MessageBundle;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 
 /**
  * @author yingp
- * @date 2019/2/14
+ * @date 2019/2/28
  */
 public interface NetSdkLib extends Library {
-
-    /*******************常量*******************/
-
     /**
-     * 设备序列号字符长度
+     * 通用字符串长度4
      */
-    int NET_SERIALNO_LEN = 48;
-
+    int DH_COMMON_STRING_4 = 4;
     /**
-     * 通用名字字符串长度
+     * 通用字符串长度8
      */
-    int DH_MAX_NAME_LEN = 16;
-
+    int DH_COMMON_STRING_8 = 8;
     /**
-     * 人员id最大长度
+     * 通用字符串长度16
      */
-    int DH_MAX_PERSON_ID_LEN = 32;
-
+    int DH_COMMON_STRING_16 = 16;
     /**
-     * 每个人员对应的最大人脸图片数
+     * 通用字符串长度32
      */
-    int DH_MAX_PERSON_IMAGE_NUM = 48;
-
+    int DH_COMMON_STRING_32 = 32;
     /**
-     * 省份名称最大长度
+     * 通用字符串长度64
      */
-    int DH_MAX_PROVINCE_NAME_LEN = 64;
-
+    int DH_COMMON_STRING_64 = 64;
     /**
-     * 城市名称最大长度
+     * 通用字符串长度128
      */
-    int DH_MAX_CITY_NAME_LEN = 64;
-
+    int DH_COMMON_STRING_128 = 128;
     /**
-     * 人员名字最大长度
+     * 通用字符串长度256
      */
-    int DH_MAX_PERSON_NAME_LEN = 64;
-
-    int MAX_PATH = 260;
-
-    int MAX_FIND_COUNT = 20;
-
+    int DH_COMMON_STRING_256 = 256;
+    /**
+     * 通用字符串长度512
+     */
+    int DH_COMMON_STRING_512 = 512;
+    /**
+     * 通用字符串长度1024
+     */
+    int DH_COMMON_STRING_1024 = 1024;
     /**
-     * 最大人脸区域个数
+     * 通用字符串长度2048
      */
-    int MAX_FACE_AREA_NUM = 8;
+    int DH_COMMON_STRING_2048 = 2048;
+    /**
+     * 通用字符串长度8
+     */
+    int MAX_COMMON_STRING_8 = 8;
+    /**
+     * 通用字符串长度16
+     */
+    int MAX_COMMON_STRING_16 = 16;
+    /**
+     * 通用字符串长度32
+     */
+    int MAX_COMMON_STRING_32 = 32;
+    /**
+     * 通用字符串长度64
+     */
+    int MAX_COMMON_STRING_64 = 64;
 
     /**
-     * 最大人脸数据库个数
+     * 时间
      */
-    int MAX_FACE_DB_NUM = 8;
+    @Structure.FieldOrder({"dwYear", "dwMonth", "dwDay", "dwHour", "dwMinute", "dwSecond"})
+    class NET_TIME extends Structure {
+        /**
+         * 年
+         */
+        public int dwYear;
+        /**
+         * 月
+         */
+        public int dwMonth;
+        /**
+         * 日
+         */
+        public int dwDay;
+        /**
+         * 时
+         */
+        public int dwHour;
+        /**
+         * 分
+         */
+        public int dwMinute;
+        /**
+         * 秒
+         */
+        public int dwSecond;
+
+        public NET_TIME() {
+        }
+
+        @Override
+        public String toString() {
+            return String.format("%02d-%02d-%02d %02d:%02d:%02d", dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond);
+        }
+
+        public Date toDate() {
+            return Date.from(LocalDateTime.of(dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond)
+                    .atZone(ZoneId.systemDefault()).toInstant());
+        }
+    }
 
     /**
-     * 最大硬盘个数
+     * 时间
      */
-    int DH_MAX_DISKNUM = 256;
+    @Structure.FieldOrder({"dwYear", "dwMonth", "dwDay", "dwHour", "dwMinute", "dwSecond", "dwMillisecond", "dwReserved"})
+    class NET_TIME_EX extends Structure {
+        /**
+         * 年
+         */
+        public int dwYear;
+        /**
+         * 月
+         */
+        public int dwMonth;
+        /**
+         * 日
+         */
+        public int dwDay;
+        /**
+         * 时
+         */
+        public int dwHour;
+        /**
+         * 分
+         */
+        public int dwMinute;
+        /**
+         * 秒
+         */
+        public int dwSecond;
+        /**
+         * 毫秒
+         */
+        public int dwMillisecond;
+
+        public byte[] dwReserved = new byte[2];
+
+        public NET_TIME_EX() {
+        }
+
+        @Override
+        public String toString() {
+            return String.format("%02d-%02d-%02d %02d:%02d:%02d:%d", dwYear, dwMonth, dwDay, dwHour, dwMinute,
+                    dwSecond, dwMillisecond);
+        }
+
+        public Date toDate() {
+            return Date.from(LocalDateTime.of(dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond, dwMillisecond)
+                    .atZone(ZoneId.systemDefault()).toInstant());
+        }
+    }
 
     /*******************SDK初始化*******************/
 
+    /**
+     * 断线回调
+     */
+    interface fDisConnect extends StdCallLibrary.StdCallCallback {
+        /**
+         * @param lLoginID CLIENT_LoginEx2的返回值
+         * @param pchDVRIP 设备IP
+         * @param nDVRPort 设备端口
+         * @param dwUser   用户数据
+         */
+        void invoke(NativeLong lLoginID, String pchDVRIP, int nDVRPort, NativeLong dwUser);
+    }
+
     /**
      * 初始化SDK, 在调用SDK另外函数之前调用
      *
@@ -79,12 +194,28 @@ public interface NetSdkLib extends Library {
      * @param dwUser       用户数据
      * @return
      */
-    boolean CLIENT_Init(StdCallCallback cbDisConnect, NativeLong dwUser);
+    boolean CLIENT_Init(fDisConnect cbDisConnect, NativeLong dwUser);
 
     /**
-     * 清空SDK, 释放占用的资源,在所有的SDK函数之后调用
+     * 初始化参数
      */
-    void CLIENT_Cleanup();
+    class NETSDK_INIT_PARAM extends Structure {
+        /**
+         * 指定NetSDK常规网络处理线程数, 当值为0时, 使用内部默认值
+         */
+        public int nThreadNum;
+        public byte[] bReserved = new byte[1024];
+    }
+
+    /**
+     * SDK初始化, 通过NETSDK_INIT_PARAM指定初始化参数, 如定制NetSDK启用的常规网络处理线程数
+     *
+     * @param cbDisConnect 断线回调函数,通知用户当前断开网络的设备,如果调用SDK的ClIENT_Logout函数主动断开的设备不作断线回调,设置为NULL时不回调
+     * @param dwUser       用户数据
+     * @param lpInitParam  初始化参数
+     * @return
+     */
+    boolean CLIENT_InitEx(fDisConnect cbDisConnect, NativeLong dwUser, NETSDK_INIT_PARAM lpInitParam);
 
     /**
      * 获取SDK的版本号
@@ -101,13 +232,26 @@ public interface NetSdkLib extends Library {
      */
     int CLIENT_GetLastError();
 
+    /**
+     * 断线后重连回调
+     */
+    interface fHaveReConnect extends StdCallLibrary.StdCallCallback {
+        /**
+         * @param lLoginID CLIENT_LoginEx2的返回值
+         * @param pchDVRIP 设备IP
+         * @param nDVRPort 设备端口
+         * @param dwUser   用户数据
+         */
+        void invoke(NativeLong lLoginID, String pchDVRIP, int nDVRPort, NativeLong dwUser);
+    }
+
     /**
      * 设置断线重连回调函数,在设备断线时自动重连设备
      *
      * @param cbAutoConnect 断线重连成功的回调函数,通知用户当前断线重连成功的设备
      * @param dwUser        用户自定义数据,在回调中可以使用
      */
-    void CLIENT_SetAutoReconnect(StdCallCallback cbAutoConnect, NativeLong dwUser);
+    void CLIENT_SetAutoReconnect(fHaveReConnect cbAutoConnect, NativeLong dwUser);
 
     /**
      * 设置连接设备等待时间
@@ -117,13 +261,6 @@ public interface NetSdkLib extends Library {
      */
     void CLIENT_SetConnectTime(int nWaitTime, int nTryTimes);
 
-    /**
-     * 设置网络参数
-     *
-     * @param pNetParam
-     */
-    void CLIENT_SetNetworkParam(NET_PARAM pNetParam);
-
     /**
      * 登陆网络环境设置
      */
@@ -194,31 +331,106 @@ public interface NetSdkLib extends Library {
         }
     }
 
-    /*******************登录设备*******************/
     /**
-     * 登录设备
+     * 设置网络参数
      *
-     * @param pchDVRIP     设备IP
-     * @param wDVRPort     设备端口
-     * @param pchUserName  用户名
-     * @param pchPassword  用户密码
-     * @param emSpecCap    设备支持的能力,值为2表示主动侦听模式下的用户登陆(车载dvr登录)
-     * @param pCapParam    对emSpecCap 的补充参数,emSpecCap = 2时,pCapParam填充设备序列号字串(车载dvr登录)
-     * @param lpDeviceInfo 设备信息,属于输出参数,填NULL效果类似emSpecCap=10
-     * @param error        (当函数返回成功时,该参数的值无意义),返回登录错误码
-     * @return
-     * @see LoginSpecCapType
+     * @param pNetParam
      */
-    NativeLong CLIENT_LoginEx2(String pchDVRIP, int wDVRPort, String pchUserName, String pchPassword, int emSpecCap,
-                               Pointer pCapParam, NET_DEVICEINFO_Ex lpDeviceInfo, IntByReference error);
+    void CLIENT_SetNetworkParam(NetSdkLib.NET_PARAM pNetParam);
 
     /**
-     * 登出设备
-     *
-     * @param lLoginID CLIENT_LoginEx2的返回值
-     * @return 成功返回TRUE,失败返回FALSE
+     * 清空SDK, 释放占用的资源,在所有的SDK函数之后调用
      */
-    boolean CLIENT_Logout(NativeLong lLoginID);
+    void CLIENT_Cleanup();
+
+    /*******************登录设备*******************/
+
+    /**
+     * 登录类型
+     */
+    class EM_LOGIN_SPAC_CAP_TYPE {
+        /**
+         * TCP登录, 默认方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_TCP = 0;
+        /**
+         * 无条件登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_ANY = 1;
+        /**
+         * 主动注册的登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_SERVER_CONN = 2;
+        /**
+         * 组播登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_MULTICAST = 3;
+        /**
+         * UDP方式下的登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_UDP = 4;
+        /**
+         * 只建主连接下的登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_MAIN_CONN_ONLY = 6;
+        /**
+         * SSL加密方式登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_SSL = 7;
+        /**
+         * 登录智能盒远程设备
+         */
+        public static final int EM_LOGIN_SPEC_CAP_INTELLIGENT_BOX = 9;
+        /**
+         * 登录设备后不做取配置操作
+         */
+        public static final int EM_LOGIN_SPEC_CAP_NO_CONFIG = 10;
+        /**
+         * 用U盾设备的登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_U_LOGIN = 11;
+        /**
+         * LDAP方式登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_LDAP = 12;
+        /**
+         * AD(ActiveDirectory)登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_AD = 13;
+        /**
+         * Radius登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_RADIUS = 14;
+        /**
+         * Socks5登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_SOCKET_5 = 15;
+        /**
+         * 云登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_CLOUD = 16;
+        /**
+         * 二次鉴权登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_AUTH_TWICE = 17;
+        /**
+         * TS码流客户端登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_TS = 18;
+        /**
+         * 为P2P登录方式
+         */
+        public static final int EM_LOGIN_SPEC_CAP_P2P = 19;
+        /**
+         * 手机客户端登录
+         */
+        public static final int EM_LOGIN_SPEC_CAP_MOBILE = 20;
+    }
+
+    /**
+     * 设备序列号字符长度
+     */
+    int DH_SERIALNO_LEN = 48;
 
     /**
      * 设备信息
@@ -269,7 +481,7 @@ public interface NetSdkLib extends Library {
         /**
          * 序列号
          */
-        public byte[] sSerialNumber = new byte[NET_SERIALNO_LEN];
+        public byte[] sSerialNumber = new byte[DH_SERIALNO_LEN];
 
         @Override
         protected List<String> getFieldOrder() {
@@ -279,768 +491,3611 @@ public interface NetSdkLib extends Library {
         }
     }
 
-    /*******************查询设备状态*******************/
+    /**
+     * 登录设备
+     *
+     * @param pchDVRIP     设备IP
+     * @param wDVRPort     设备端口
+     * @param pchUserName  用户名
+     * @param pchPassword  用户密码
+     * @param emSpecCap    设备支持的能力,值为2表示主动侦听模式下的用户登陆(车载dvr登录)
+     * @param pCapParam    对emSpecCap 的补充参数,emSpecCap = 2时,pCapParam填充设备序列号字串(车载dvr登录)
+     * @param lpDeviceInfo 设备信息,属于输出参数,填NULL效果类似emSpecCap=10
+     * @param error        (当函数返回成功时,该参数的值无意义),返回登录错误码
+     * @return
+     * @see EM_LOGIN_SPAC_CAP_TYPE
+     */
+    NativeLong CLIENT_LoginEx2(String pchDVRIP, int wDVRPort, String pchUserName, String pchPassword, int emSpecCap,
+                               Pointer pCapParam, NET_DEVICEINFO_Ex lpDeviceInfo, IntByReference error);
 
     /**
-     * 获取前端设备的当前工作状态
+     * 登出设备
      *
-     * @param lLoginID CLIENT_Login或者CLIENT_LoginEx的返回值
-     * @param nType    查询信息类型
-     * @param pBuf     输出参数,用于接收查询返回的数据的缓存。根据查询类型的不同,返回数据的数据结构也不同
-     * @param nBufLen  缓存长度,单位字节
-     * @param pRetLen  输出参数,实际返回的数据长度,单位字节
-     * @param waittime 查询状态等待时间,默认1000ms
+     * @param lLoginID CLIENT_LoginEx2的返回值
      * @return 成功返回TRUE,失败返回FALSE
-     * @see DeviceStateType
      */
-    boolean CLIENT_QueryDevState(NativeLong lLoginID, int nType, Pointer pBuf, int nBufLen, IntByReference pRetLen,
-                                 int waittime);
+    boolean CLIENT_Logout(NativeLong lLoginID);
 
-    /*******************查询远程设备状态*******************/
+    /*******************人脸识别*******************/
 
     /**
-     * 获取前端设备的当前工作状态
-     *
-     * @param lLoginID   CLIENT_Login或者CLIENT_LoginEx的返回值
-     * @param nType      查询信息类型
-     * @param nChannelID 通道号,对于单通道设备,填写为0,多通道设备填写为具体通道值,0 - n
-     * @param pBuf       输出参数,用于接收查询返回的数据的缓存。根据查询类型的不同,返回数据的数据结构也不同
-     * @param nBufLen    缓存长度,单位字节
-     * @param pRetLen    输出参数,实际返回的数据长度,单位字节
-     * @param waittime   查询状态等待时间,默认1000ms
-     * @return 成功返回TRUE,失败返回FALSE
-     * @see DeviceStateType
+     * 最大用户名长度
+     */
+    int MAX_USER_NAME_LEN = 128;
+    /**
+     * 房间最大个数
      */
-    boolean CLIENT_QueryRemotDevState(NativeLong lLoginID, int nType, int nChannelID, Pointer pBuf, int nBufLen,
-                                      IntByReference pRetLen, int waittime);
+    int MAX_ROOMNUM_COUNT = 32;
+    /**
+     * 人脸模板数据最大个数
+     */
+    int MAX_FACE_COUNT = 20;
 
     /**
-     * 普通报警信息扩展结构体
+     * 人脸信息
      */
-    class NET_CLIENT_STATE_EX extends Structure {
+    class NET_FACE_RECORD_INFO extends Structure {
         /**
-         * 通道数
+         * 用户名
          */
-        public int channelcount;
+        public byte[] szUserName = new byte[MAX_USER_NAME_LEN];
         /**
-         * 报警输入口
+         * 房间个
          */
-        public int alarminputcount;
+        public int nRoom;
         /**
-         * 外部报警
+         * 房间号列表
          */
-        public byte[] alarm = new byte[32];
+        public byte[] szRoomNo = new byte[MAX_ROOMNUM_COUNT * DH_COMMON_STRING_16];
         /**
-         * 动态检测
+         * 人脸模板数据个数
          */
-        public byte[] motiondection = new byte[32];
+        public int nFaceData;
         /**
-         * 视频丢失
+         * 人脸模板数据
          */
-        public byte[] videolost = new byte[32];
+        public byte[] szFaceData = new byte[MAX_FACE_COUNT * MAX_FACE_DATA_LEN];
         /**
-         * 扩展字段
+         * 人脸模版数据大小
          */
-        public byte[] bReserved = new byte[32];
-
-        @Override
-        protected List<String> getFieldOrder() {
-            return Collections.unmodifiableList(Arrays.asList("alarm", "alarminputcount", "bReserved", "channelcount",
-                    "motiondection", "videolost"));
-        }
-
-        @Override
-        public String toString() {
-            return "NET_CLIENT_STATE_EX{" +
-                    "channelcount=" + channelcount +
-                    ", alarminputcount=" + alarminputcount +
-                    ", alarm=" + Arrays.toString(alarm) +
-                    ", motiondection=" + Arrays.toString(motiondection) +
-                    ", videolost=" + Arrays.toString(videolost) +
-                    ", bReserved=" + Arrays.toString(bReserved) +
-                    '}';
-        }
-    }
+        public int[] nFaceDataLen = new int[MAX_FACE_COUNT];
+        /**
+         * 人脸照片个数
+         */
+        public int nFacePhoto;
+        /**
+         * 每张图片的大小
+         */
+        public int[] nFacePhotoLen = new int[MAX_PHOTO_COUNT];
+        /**
+         * 人脸照片数据,大小不超过120K
+         */
+        public byte[] pszFacePhoto = new byte[MAX_PHOTO_COUNT];
+        /**
+         * 是否设置人脸有效时间
+         */
+        public boolean bValidDate;
+        /**
+         * 人脸有效开始时间
+         */
+        public NET_TIME stuValidDateStart;
+        /**
+         * 人脸有效结束时间
+         */
+        public NET_TIME stuValidDateEnd;
+        /**
+         * 保留字节
+         */
+        public byte[] byReserved = new byte[332];
+    }
 
     /**
-     * 硬盘信息
+     * 添加人脸记录信息输入参数
      */
-    class NET_DEV_DISKSTATE extends Structure {
+    class NET_IN_ADD_FACE_INFO extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
         /**
-         * 硬盘的容量
+         * 人脸数据
          */
-        public int dwVolume;
+        public NET_FACE_RECORD_INFO stuFaceInfo;
+
+        public NET_IN_ADD_FACE_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    /**
+     * 添加人脸记录信息输出参数
+     */
+    class NET_OUT_ADD_FACE_INFO extends Structure {
+        public int dwSize;
+
+        public NET_OUT_ADD_FACE_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    /**
+     * 获取人脸记录信息输入参数
+     */
+    class NET_IN_GET_FACE_INFO extends Structure {
+        public int dwSize;
         /**
-         * 硬盘的剩余空间
+         * 用户ID
          */
-        public int dwFreeSpace;
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+
+        public NET_IN_GET_FACE_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    /**
+     * 获取人脸记录信息输出参数
+     */
+    class NET_OUT_GET_FACE_INFO extends Structure {
+        public int dwSize;
         /**
-         * 高四位的值表示硬盘类型,具体见表说明;低四位的值表示硬盘的状态,0-休眠,1-活动,2-故障等;将DWORD拆成四个BYTE
-         * @see DiskType
+         * 人脸模板数据个数
          */
-        public byte dwStatus;
+        public int nFaceData;
         /**
-         * 硬盘号
+         * 人脸模板数据
          */
-        public byte bDiskNum;
+        public byte[] szFaceData = new byte[MAX_FACE_COUNT * MAX_FACE_DATA_LEN];
+
+        public NET_OUT_GET_FACE_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    /**
+     * 更新人脸记录信息输入参数
+     */
+    class NET_IN_UPDATE_FACE_INFO extends Structure {
+        public int dwSize;
         /**
-         * 分区号
+         * 用户ID
          */
-        public byte bSubareaNum;
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
         /**
-         * 标识,0为本地 1为远程
+         * 人脸数据
          */
-        public byte bSignal;
+        public NET_FACE_RECORD_INFO stuFaceInfo;
 
-        @Override
-        protected List<String> getFieldOrder() {
-            return Collections.unmodifiableList(Arrays.asList("bDiskNum", "bSignal", "bSubareaNum", "dwFreeSpace",
-                    "dwStatus", "dwVolume"));
+        public NET_IN_UPDATE_FACE_INFO() {
+            this.dwSize = this.size();
         }
+    }
 
-        @Override
-        public String toString() {
-            return "NET_DEV_DISKSTATE{" +
-                    "dwVolume=" + dwVolume +
-                    ", dwFreeSpace=" + dwFreeSpace +
-                    ", dwStatus=" + dwStatus +
-                    ", bDiskNum=" + bDiskNum +
-                    ", bSubareaNum=" + bSubareaNum +
-                    ", bSignal=" + bSignal +
-                    '}';
+    /**
+     * 更新人脸记录信息输出参数
+     */
+    class NET_OUT_UPDATE_FACE_INFO extends Structure {
+        public int dwSize;
+
+        public NET_OUT_UPDATE_FACE_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    /**
+     * 删除人脸记录信息输入参数
+     */
+    class NET_IN_REMOVE_FACE_INFO extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+
+        public NET_IN_REMOVE_FACE_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    /**
+     * 删除人脸记录信息输出参数
+     */
+    class NET_OUT_REMOVE_FACE_INFO extends Structure {
+        public int dwSize;
+
+        public NET_OUT_REMOVE_FACE_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    /**
+     * 清除人脸记录信息输入参数
+     */
+    class NET_IN_CLEAR_FACE_INFO extends Structure {
+        public int dwSize;
+
+        public NET_IN_CLEAR_FACE_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    /**
+     * 清除人脸记录信息输出参数
+     */
+    class NET_OUT_CLEAR_FACE_INFO extends Structure {
+        public int dwSize;
+
+        public NET_OUT_CLEAR_FACE_INFO() {
+            this.dwSize = this.size();
         }
     }
 
     /**
-     * 设备硬盘信息
+     * 人脸信息记录操作类型
      */
-    class DH_HARDDISK_STATE extends Structure {
+    class EM_FACEINFO_OPREATE_TYPE {
+        /**
+         * 添加
+         */
+        public static final int EM_FACEINFO_OPREATE_ADD = 0;
+        /**
+         * 获取
+         */
+        public static final int EM_FACEINFO_OPREATE_GET = 1;
+        /**
+         * 更新
+         */
+        public static final int EM_FACEINFO_OPREATE_UPDATE = 2;
         /**
-         * 硬盘或者分区个数个数
+         * 删除
          */
-        public int dwDiskNum;
+        public static final int EM_FACEINFO_OPREATE_REMOVE = 3;
         /**
-         * 硬盘或分区信息
+         * 清除
          */
-        public NET_DEV_DISKSTATE[] stDisks = (NET_DEV_DISKSTATE[]) new NET_DEV_DISKSTATE().toArray(DH_MAX_DISKNUM);
+        public static final int EM_FACEINFO_OPREATE_CLEAR = 4;
+    }
 
-        @Override
-        protected List<String> getFieldOrder() {
-            return Collections.unmodifiableList(Arrays.asList("dwDiskNum", "stDisks"));
+    /**
+     * 人脸信息记录操作函数
+     *
+     * @param lLoginID  登陆句柄
+     * @param emType    操作类型
+     * @param pInParam  接口输入参数, 资源由用户维护
+     * @param pOutParam 接口输出参数, 资源由用户维护
+     * @param nWaitTime 等待超时时间
+     * @return
+     * @see EM_FACEINFO_OPREATE_TYPE
+     */
+    boolean CLIENT_FaceInfoOpreate(NativeLong lLoginID, int emType, Pointer pInParam, Pointer pOutParam,
+                                   int nWaitTime);
+
+    /**
+     * CLIENT_StartFindFaceInfo 输入参数
+     */
+    class NET_IN_FACEINFO_START_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+
+        public NET_IN_FACEINFO_START_FIND() {
+            this.dwSize = this.size();
         }
+    }
 
-        @Override
-        public String toString() {
-            return "DH_HARDDISK_STATE{" +
-                    "dwDiskNum=" + dwDiskNum +
-                    ", stDisks=" + Arrays.toString(stDisks) +
-                    '}';
+    /**
+     * CLIENT_StartFindFaceInfo 输出参数
+     */
+    class NET_OUT_FACEINFO_START_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 符合查询条件的总数
+         */
+        public int nTotalCount;
+
+        public NET_OUT_FACEINFO_START_FIND() {
+            this.dwSize = this.size();
         }
     }
 
-    /*******************人脸识别*******************/
+    /**
+     * CLIENT_DoFindFaceInfo 输入参数
+     */
+    class NET_IN_FACEINFO_DO_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 起始序号
+         */
+        public int nStartNo;
+        /**
+         * 本次查询的条数
+         */
+        public int nCount;
+
+        public NET_IN_FACEINFO_DO_FIND() {
+            this.dwSize = this.size();
+        }
+    }
 
     /**
-     * 人脸识别数据库信息操作(包括添加和删除)
-     *
-     * @param lLoginID    CLIENT_Login或者CLIENT_LoginEx的返回值
-     * @param pstInParam
-     * @param pstOutParam
-     * @param nWaitTime   等待时间,默认1000ms
-     * @return 失败返回FALSE,成功返回TRUE
-     * @see NET_IN_OPERATE_FACERECONGNITIONDB
+     * 人脸信息
      */
-    boolean CLIENT_OperateFaceRecognitionDB(NativeLong lLoginID, NET_IN_OPERATE_FACERECONGNITIONDB pstInParam,
-                                            NET_OUT_OPERATE_FACERECONGNITIONDB pstOutParam, int nWaitTime);
+    class NET_FACEINFO extends Structure {
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+        /**
+         * 有效的MD5编码数量
+         */
+        public int nMD5;
+        /**
+         * 图片对应的32字节MD5编码加密
+         */
+        public byte[] szMD5 = new byte[5 * DH_COMMON_STRING_64];
+        public byte[] byReserved = new byte[512];
+    }
+
+    /**
+     * CLIENT_DoFindFaceInfo 输出参数
+     */
+    class NET_OUT_FACEINFO_DO_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 本次查询到的个数
+         */
+        public int nRetNum;
+        /**
+         * 查询结果, 用户分配内存,大小为sizeof(NET_FACEINFO)*nMaxNum
+         */
+        public NET_FACEINFO pstuInfo;
+        /**
+         * 用户分配内存的个数
+         */
+        public int nMaxNum;
+        public byte[] byReserved = new byte[4];
+
+        public NET_OUT_FACEINFO_DO_FIND() {
+            this.dwSize = this.size();
+        }
+    }
 
     /**
-     * 查找人脸识别结果
+     * 开始查询人脸信息
      *
-     * @param pstInParam  输入参数 NET_IN_DOFIND_FACERECONGNITION
-     * @param pstOutParam 输出参数 NET_OUT_DOFIND_FACERECONGNITION
-     * @param nWaitTime   等待时间
-     * @return 失败返回FALSE,成功返回TRUE
+     * @param lLoginID  登陆句柄
+     * @param pstIn     输入参数
+     * @param pstOut    输出参数
+     * @param nWaitTime 等待时间
+     * @return
+     * @see NET_IN_FACEINFO_START_FIND
+     * @see NET_OUT_FACEINFO_START_FIND
      */
-    boolean CLIENT_DoFindFaceRecognition(final NET_IN_DOFIND_FACERECONGNITION pstInParam,
-                                         NET_OUT_DOFIND_FACERECONGNITION pstOutParam, int nWaitTime);
+    NativeLong CLIENT_StartFindFaceInfo(NativeLong lLoginID, NET_IN_FACEINFO_START_FIND pstIn,
+                                        NET_OUT_FACEINFO_START_FIND pstOut, int nWaitTime);
 
     /**
-     * 按条件查询人脸识别结果
+     * 获取人脸信息
      *
-     * @param lLoginID    CLIENT_Login或者CLIENT_LoginEx的返回值
-     * @param pstInParam  输入参数 NET_IN_STARTFIND_FACERECONGNITION
-     * @param pstOutParam 输出参数 NET_OUT_STARTFIND_FACERECONGNITION
+     * @param lFindHandle 查询句柄
+     * @param pstIn       输入参数
+     * @param pstOut      输出参数
      * @param nWaitTime   等待时间
-     * @return 失败返回FALSE,成功返回TRUE
+     * @return
+     * @see NET_IN_FACEINFO_DO_FIND
+     * @see NET_OUT_FACEINFO_DO_FIND
      */
-    boolean CLIENT_StartFindFaceRecognition(NativeLong lLoginID, NET_IN_STARTFIND_FACERECONGNITION pstInParam,
-                                            NET_OUT_STARTFIND_FACERECONGNITION pstOutParam, int nWaitTime);
+    boolean CLIENT_DoFindFaceInfo(NativeLong lFindHandle, NET_IN_FACEINFO_DO_FIND pstIn,
+                                  NET_OUT_FACEINFO_DO_FIND pstOut, int nWaitTime);
 
     /**
-     * 结束人脸识别查询
+     * 停止查询人脸信息
      *
-     * @param lFindHandle CLIENT_StartFindFaceRecognition的输出参数中获取
+     * @param lFindHandle 查询句柄
      * @return
      */
-    boolean CLIENT_StopFindFaceRecognition(NativeLong lFindHandle);
+    boolean CLIENT_StopFindFaceInfo(NativeLong lFindHandle);
 
     /**
-     * 检测人脸(输入一张大图,输出大图中被检测出来的人脸图片)
-     *
-     * @param lLoginID    CLIENT_Login或者CLIENT_LoginEx的返回值
-     * @param pstInParam  输入参数 NET_IN_DETECT_FACE
-     * @param pstOutParam 输出参数 NET_OUT_DETECT_FACE
-     * @param nWaitTime   等待时间
-     * @return 失败返回FALSE,成功返回TRUE
+     * 用户类型
+     */
+    class NET_ENUM_USER_TYPE {
+        /**
+         * 未知用户
+         */
+        public static final int NET_ENUM_USER_TYPE_UNKNOWN = -1;
+        /**
+         * 普通用户
+         */
+        public static final int NET_ENUM_USER_TYPE_NORMAL = 0;
+        /**
+         * 黑名单用户
+         */
+        public static final int NET_ENUM_USER_TYPE_BLACKLIST = 1;
+        /**
+         * 来宾账户
+         */
+        public static final int NET_ENUM_USER_TYPE_GUEST = 2;
+        /**
+         * 巡逻用户
+         */
+        public static final int NET_ENUM_USER_TYPE_PATROL = 3;
+        /**
+         * VIP用户
+         */
+        public static final int NET_ENUM_USER_TYPE_VIP = 4;
+        /**
+         * 残疾用户
+         */
+        public static final int NET_ENUM_USER_TYPE_HANDICAP = 5;
+    }
+
+    /**
+     * 用户权限
+     */
+    class NET_ATTENDANCE_AUTHORITY {
+        public static final int NET_ATTENDANCE_AUTHORITY_UNKNOWN = -1;
+        /**
+         * 普通用户
+         */
+        public static final int NET_ATTENDANCE_AUTHORITY_CUSTOMER = 0;
+        /**
+         * 管理员
+         */
+        public static final int NET_ATTENDANCE_AUTHORITY_ADMINISTRATORS = 1;
+    }
+
+    /**
+     * 用户信息
      */
-    boolean CLIENT_DetectFace(NativeLong lLoginID, NET_IN_DETECT_FACE pstInParam, NET_OUT_DETECT_FACE pstOutParam,
-                              int nWaitTime);
+    class NET_ACCESS_USER_INFO extends Structure {
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+        /**
+         * 人员名称
+         */
+        public byte[] szName = new byte[MAX_COMMON_STRING_32];
+        /**
+         * 用户类型
+         *
+         * @see NET_ENUM_USER_TYPE
+         */
+        public int emUserType;
+        /**
+         * 用户状态, 0 正常, 1 冻结
+         */
+        public int nUserStatus;
+        /**
+         * 来宾卡的通行次数
+         */
+        public int nUserTime;
+        /**
+         * 身份证号码
+         */
+        public byte[] szCitizenIDNo = new byte[MAX_COMMON_STRING_32];
+        /**
+         * UserID+密码开门时密码
+         */
+        public byte[] szPsw = new byte[DH_MAX_CARDPWD_LEN];
+        /**
+         * 有效的门数目
+         */
+        public int nDoorNum;
+        /**
+         * 有权限的门序号,即 CFG_CMD_ACCESS_EVENT 配置的数组下标
+         */
+        public int[] nDoors = new int[DH_MAX_DOOR_NUM];
+        /**
+         * 有效的的开门时间段数目
+         */
+        public int nTimeSectionNum;
+        /**
+         * 开门时间段索引,即 CFG_ACCESS_TIMESCHEDULE_INFO 的数组下标
+         */
+        public int[] nTimeSectionNo = new int[DH_MAX_TIMESECTION_NUM];
+        /**
+         * 假日计划表示数量
+         */
+        public int nSpecialDaysScheduleNum;
+        /**
+         * 假日计划标识, 即 NET_EM_CFG_ACCESSCTL_SPECIALDAYS_SCHEDULE 配置的下标
+         */
+        public int[] nSpecialDaysSchedule = new int[MAX_ACCESSDOOR_NUM];
+        /**
+         * 开始有效期
+         */
+        public NET_TIME stuValidBeginTime;
+        /**
+         * 结束有效期
+         */
+        public NET_TIME stuValidEndTime;
+        /**
+         * 是否拥有首卡权限
+         */
+        public boolean bFirstEnter;
+        /**
+         * 拥有首用户权限的门数量
+         */
+        public int nFirstEnterDoorsNum;
+        /**
+         * 拥有首用户权限的门序号,bFirstEnter为TRUE时有效,-1表示全通道
+         */
+        public int[] nFirstEnterDoors = new int[DH_MAX_DOOR_NUM];
+        /**
+         * 用户权限,可选
+         *
+         * @see NET_ATTENDANCE_AUTHORITY
+         */
+        public int emAuthority;
+        /**
+         * 反潜超时时间
+         */
+        public int nRepeatEnterRouteTimeout;
+        /**
+         * 有效的楼层数量
+         */
+        public int nFloorNum;
+        /**
+         * 楼层号
+         */
+        public byte[] szFloorNo = new byte[MAX_ACCESS_FLOOR_NUM * DH_COMMON_STRING_16];
+        /**
+         * 房间个数
+         */
+        public int nRoom;
+        /**
+         * 房间号列表
+         */
+        public byte[] szRoomNo = new byte[MAX_ROOMNUM_COUNT * DH_COMMON_STRING_16];
+        /**
+         * 保留字节
+         */
+        public byte[] byReserved = new byte[4096];
+
+        public NET_ACCESS_USER_INFO() {
+        }
+
+        @Override
+        protected List<String> getFieldOrder() {
+            return Collections.unmodifiableList(Arrays.asList("bFirstEnter", "byReserved", "emAuthority", "emUserType",
+                    "nDoorNum", "nDoors", "nFirstEnterDoors", "nFirstEnterDoorsNum", "nFloorNum",
+                    "nRepeatEnterRouteTimeout", "nRoom", "nSpecialDaysSchedule", "nSpecialDaysScheduleNum",
+                    "nTimeSectionNo", "nTimeSectionNum", "nUserStatus", "nUserTime", "stuValidBeginTime",
+                    "stuValidEndTime", "szCitizenIDNo", "szFloorNo", "szName", "szPsw", "szRoomNo", "szUserID"));
+        }
+    }
 
     /**
-     * CLIENT_OperateFaceRecognitionDB接口输入参数
+     * 新增或更新用户信息入参
      */
-    class NET_IN_OPERATE_FACERECONGNITIONDB extends Structure {
+    class NET_IN_ACCESS_USER_SERVICE_INSERT extends Structure {
+        public int dwSize;
+        /**
+         * 用户信息数量
+         */
+        public int nInfoNum;
+        /**
+         * 用户信息,内存由用户申请释放,申请大小不小于nInfoNum*sizeof(NET_ACCESS_USER_INFO);
+         *
+         * @see NET_ACCESS_USER_INFO
+         */
+        public NET_ACCESS_USER_INFO pUserInfo;
+
+        public NET_IN_ACCESS_USER_SERVICE_INSERT() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 操作错误码
+     */
+    enum NET_EM_FAILCODE {
+        /**
+         * 没有错误
+         */
+        NET_EM_FAILCODE_NOERROR(0),
+        /**
+         * 未知错误
+         */
+        NET_EM_FAILCODE_UNKNOWN(1),
+        /**
+         * 参数错误
+         */
+        NET_EM_FAILCODE_INVALID_PARAM(2),
+        /**
+         * 无效密码
+         */
+        NET_EM_FAILCODE_INVALID_PASSWORD(3),
+        /**
+         * 无效指纹数据
+         */
+        NET_EM_FAILCODE_INVALID_FP(4),
+        /**
+         * 无效人脸数据
+         */
+        NET_EM_FAILCODE_INVALID_FACE(5),
+        /**
+         * 无效卡数据
+         */
+        NET_EM_FAILCODE_INVALID_CARD(6),
+        /**
+         * 无效人数据
+         */
+        NET_EM_FAILCODE_INVALID_USER(7),
+        /**
+         * 能力集子服务获取失败
+         */
+        NET_EM_FAILCODE_FAILED_GET_SUBSERVICE(8),
+        /**
+         * 获取组件的方法集失败
+         */
+        NET_EM_FAILCODE_FAILED_GET_METHOD(9),
+        /**
+         * 获取资源实体能力集失败
+         */
+        NET_EM_FAILCODE_FAILED_GET_SUBCAPS(10),
+        /**
+         * 已达插入上限
+         */
+        NET_EM_FAILCODE_ERROR_INSERT_LIMIT(11),
+        /**
+         * 已达最大插入速度
+         */
+        NET_EM_FAILCODE_ERROR_MAX_INSERT_RATE(12),
+        /**
+         * 清除指纹数据失败
+         */
+        NET_EM_FAILCODE_FAILED_ERASE_FP(13),
+        /**
+         * 清除人脸数据失败
+         */
+        NET_EM_FAILCODE_FAILED_ERASE_FACE(14),
+        /**
+         * 清除卡数据失败
+         */
+        NET_EM_FAILCODE_FAILED_ERASE_CARD(15),
+        /**
+         * 没有记录
+         */
+        NET_EM_FAILCODE_NO_RECORD(16),
+        /**
+         * 查找到最后,没有更多记录
+         */
+        NET_EM_FAILCODE_NOMORE_RECORD(17),
+        /**
+         * 下发卡或指纹时,数据重复
+         */
+        NET_EM_FAILCODE_RECORD_ALREADY_EXISTS(18),
+        /**
+         * 超过个人最大指纹记录数
+         */
+        NET_EM_FAILCODE_MAX_FP_PERUSER(19),
+        /**
+         * 超过个人最大卡片记录数
+         */
+        NET_EM_FAILCODE_MAX_CARD_PERUSER(20);
+
+        final int code;
+
+        NET_EM_FAILCODE(int code) {
+            this.code = code;
+        }
+
+        public static NET_EM_FAILCODE of(int code) {
+            for (NET_EM_FAILCODE err : values()) {
+                if (err.code == code) {
+                    return err;
+                }
+            }
+            return NET_EM_FAILCODE_UNKNOWN;
+        }
+
+        public int getCode() {
+            return code;
+        }
+
+        public String getMessage() {
+            return MessageBundle.instance().getString(name());
+        }
+
+        @Override
+        public String toString() {
+            return "[" + name() + ']' + getMessage();
+        }
+    }
+
+    /**
+     * 新增或更新用户信息出参
+     */
+    class NET_OUT_ACCESS_USER_SERVICE_INSERT extends Structure {
+        public int dwSize;
+        /**
+         * 申请的最大返回的错误信息数量,不小于NET_IN_ACCESS_USER_SERVICE_INSERT中nInfoNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配释放内存,插入失败时,对应插入的每一项的结果,返回个数同NET_IN_ACCESS_USER_SERVICE_INSERT中nInfoNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_USER_SERVICE_INSERT() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 获取用户信息入参
+     */
+    class NET_IN_ACCESS_USER_SERVICE_GET extends Structure {
+        public int dwSize;
+        /**
+         * 查询的数量
+         */
+        public int nUserNum;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[100 * DH_MAX_USERID_LEN];
+
+        public NET_IN_ACCESS_USER_SERVICE_GET() {
+            this.dwSize = size();
+        }
+
+        @Override
+        protected List<String> getFieldOrder() {
+            return Collections.unmodifiableList(Arrays.asList("dwSize", "nUserNum", "szUserID"));
+        }
+    }
+
+    /**
+     * 获取用户信息出参
+     */
+    class NET_OUT_ACCESS_USER_SERVICE_GET extends Structure {
+        public int dwSize;
+        /**
+         * 查询返回的最大数量
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户信息,内存由用户申请释放,申请大小不小于 nUserNum*sizeof(NET_ACCESS_USER_INFO)
+         * 返回个数同NET_IN_ACCESS_USER_SERVICE_GET中nUserNum
+         */
+        public NET_ACCESS_USER_INFO pUserInfo;
+        /**
+         * 查询失败时,内存由用户申请释放,对应查询的每一项的结果,返回个数同NET_IN_ACCESS_USER_SERVICE_GET中nUserNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_USER_SERVICE_GET() {
+            this.dwSize = size();
+        }
+
+        @Override
+        protected List<String> getFieldOrder() {
+            return Collections.unmodifiableList(Arrays.asList("dwSize", "nMaxRetNum", "pUserInfo", "pFailCode"));
+        }
+    }
+
+    /**
+     * 删除指定ID人员信息入参
+     */
+    class NET_IN_ACCESS_USER_SERVICE_REMOVE extends Structure {
+        public int dwSize;
+        /**
+         * 删除的数量
+         */
+        public int nUserNum;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[100 * DH_MAX_USERID_LEN];
+
+        public NET_IN_ACCESS_USER_SERVICE_REMOVE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除指定ID人员信息出参
+     */
+    class NET_OUT_ACCESS_USER_SERVICE_REMOVE extends Structure {
+        public int dwSize;
+        /**
+         * 返回的最大数量,不小于 NET_IN_ACCESS_USER_SERVICE_REMOVE中nUserNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 删除失败时,内存由用户申请释放,对应删除的每一项的结果,返回个数同NET_IN_ACCESS_USER_SERVICE_REMOVE中nUserNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_USER_SERVICE_REMOVE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除所有人员信息入参
+     */
+    class NET_IN_ACCESS_USER_SERVICE_CLEAR extends Structure {
+        public int dwSize;
+
+        public NET_IN_ACCESS_USER_SERVICE_CLEAR() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除所有人员信息出参
+     */
+    class NET_OUT_ACCESS_USER_SERVICE_CLEAR extends Structure {
+        public int dwSize;
+
+        public NET_OUT_ACCESS_USER_SERVICE_CLEAR() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 人员信息操作类型
+     */
+    class NET_EM_ACCESS_CTL_USER_SERVICE {
+        /**
+         * 添加人员信息, pstInParam = NET_IN_ACCESS_USER_SERVICE_INSERT ,
+         * pstOutParam = NET_OUT_ACCESS_USER_SERVICE_INSERT
+         */
+        public static final int NET_EM_ACCESS_CTL_USER_SERVICE_INSERT = 0;
+        /**
+         * 获取人员信息, pstInParam = NET_IN_ACCESS_USER_SERVICE_GET , pstOutParam = NET_OUT_ACCESS_USER_SERVICE_GET
+         */
+        public static final int NET_EM_ACCESS_CTL_USER_SERVICE_GET = 1;
+        /**
+         * 删除人员信息,包含所有授权信息 pstInParam = NET_IN_ACCESS_USER_SERVICE_REMOVE ,
+         * pstOutParam = NET_OUT_ACCESS_USER_SERVICE_REMOVE
+         */
+        public static final int NET_EM_ACCESS_CTL_USER_SERVICE_REMOVE = 2;
+        /**
+         * 清空所有人员信息, pstInParam = NET_IN_ACCESS_USER_SERVICE_CLEAR ,
+         * pstOutParam = NET_OUT_ACCESS_USER_SERVICE_CLEAR
+         */
+        public static final int NET_EM_ACCESS_CTL_USER_SERVICE_CLEAR = 3;
+    }
+
+    /**
+     * 门禁人员信息管理接口
+     *
+     * @param lLoginID    登录句柄
+     * @param ctlType     操作类型
+     * @param pstInParam  输入参数
+     * @param pstOutParam 输出参数
+     * @param nWaitTime   等待时间
+     * @return
+     */
+    boolean CLIENT_OperateAccessUserService(NativeLong lLoginID, int ctlType, Pointer pstInParam,
+                                            Pointer pstOutParam, int nWaitTime);
+
+    /**
+     * CLIENT_StartFindUserInfo 输入参数
+     */
+    class NET_IN_USERINFO_START_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[MAX_COMMON_STRING_32];
+
+        public NET_IN_USERINFO_START_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_StartFindUserInfo 输出参数
+     */
+    class NET_OUT_USERINFO_START_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 符合查询条件的总数
+         */
+        public int nTotalCount;
+        /**
+         * doFind一次查询的最大数量
+         */
+        public int nCapNum;
+
+        public NET_OUT_USERINFO_START_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_DoFindUserInfo 输入参数
+     */
+    class NET_IN_USERINFO_DO_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 起始序号
+         */
+        public int nStartNo;
+        /**
+         * 本次查询的条数
+         */
+        public int nCount;
+
+        public NET_IN_USERINFO_DO_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_DoFindUserInfo 输出参数
+     */
+    class NET_OUT_USERINFO_DO_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 本次查询到的个数
+         */
+        public int nRetNum;
+        /**
+         * 查询结果, 用户分配释放内存,大小为sizeof(NET_ACCESS_USER_INFO)*nMaxNum
+         */
+        public NET_ACCESS_USER_INFO pstuInfo;
+        /**
+         * 用户分配内存的个数
+         */
+        public int nMaxNum;
+        public byte[] byReserved = new byte[4];
+
+        public NET_OUT_USERINFO_DO_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 开始查询人员信息
+     *
+     * @param lLoginID  登录句柄
+     * @param pstIn     输入参数
+     * @param pstOut    输出参数
+     * @param nWaitTime 等待时间
+     * @return
+     * @see NET_IN_USERINFO_START_FIND
+     * @see NET_OUT_USERINFO_START_FIND
+     */
+    NativeLong CLIENT_StartFindUserInfo(NativeLong lLoginID, NET_IN_USERINFO_START_FIND pstIn,
+                                        NET_OUT_USERINFO_START_FIND pstOut, int nWaitTime);
+
+    /**
+     * 获取人员信息
+     *
+     * @param lFindHandle CLIENT_StartFindUserInfo返回的查询句柄
+     * @param pstIn       输入参数
+     * @param pstOut      输出参数
+     * @param nWaitTime   等待时间
+     * @return
+     * @see NET_IN_USERINFO_DO_FIND
+     * @see NET_OUT_USERINFO_DO_FIND
+     */
+    boolean CLIENT_DoFindUserInfo(NativeLong lFindHandle, NET_IN_USERINFO_DO_FIND pstIn,
+                                  NET_OUT_USERINFO_DO_FIND pstOut, int nWaitTime);
+
+    /**
+     * 停止查询人员信息
+     *
+     * @param lFindHandle CLIENT_StartFindUserInfo返回的查询句柄
+     * @return
+     */
+    boolean CLIENT_StopFindUserInfo(NativeLong lFindHandle);
+
+    /**
+     * 卡类型
+     */
+    class NET_ACCESSCTLCARD_TYPE {
+        public static final int NET_ACCESSCTLCARD_TYPE_UNKNOWN = -1;
+        /**
+         * 一般卡
+         */
+        public static final int NET_ACCESSCTLCARD_TYPE_GENERAL = 0;
+        /**
+         * VIP卡
+         */
+        public static final int NET_ACCESSCTLCARD_TYPE_VIP = 1;
+        /**
+         * 来宾卡
+         */
+        public static final int NET_ACCESSCTLCARD_TYPE_GUEST = 2;
+        /**
+         * 巡逻卡
+         */
+        public static final int NET_ACCESSCTLCARD_TYPE_PATROL = 3;
+        /**
+         * 黑名单卡
+         */
+        public static final int NET_ACCESSCTLCARD_TYPE_BLACKLIST = 4;
+        /**
+         * 胁迫卡
+         */
+        public static final int NET_ACCESSCTLCARD_TYPE_CORCE = 5;
+        /**
+         * 巡检卡
+         */
+        public static final int NET_ACCESSCTLCARD_TYPE_POLLING = 6;
+        /**
+         * 母卡
+         */
+        public static final int NET_ACCESSCTLCARD_TYPE_MOTHERCARD = 0xff;
+    }
+
+    /**
+     * 卡片信息
+     */
+    class NET_ACCESS_CARD_INFO extends Structure {
+        /**
+         * 卡号
+         */
+        public byte[] szCardNo = new byte[DH_MAX_CARDNO_LEN];
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+        /**
+         * 卡类型,只支持一般卡、胁迫卡和母卡
+         *
+         * @see NET_ACCESSCTLCARD_TYPE
+         */
+        public int emType;
+        /**
+         * 动态校验码
+         */
+        public byte[] szDynamicCheckCode = new byte[MAX_COMMON_STRING_16];
+        public byte[] byReserved = new byte[4096];
+    }
+
+    /**
+     * 新增卡片信息入参
+     */
+    class NET_IN_ACCESS_CARD_SERVICE_INSERT extends Structure {
+        public int dwSize;
+        /**
+         * 用户信息数量
+         */
+        public int nInfoNum;
+        /**
+         * 卡片信息,用户分配释放内存,大小为sizeof(NET_ACCESS_CARD_INFO)*nInfoNum
+         */
+        public NET_ACCESS_CARD_INFO pCardInfo;
+
+        public NET_IN_ACCESS_CARD_SERVICE_INSERT() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 新增卡片信息出参
+     */
+    class NET_OUT_ACCESS_CARD_SERVICE_INSERT extends Structure {
+        public int dwSize;
+        /**
+         * 最大返回的用户信息数量,不小于NET_IN_ACCESS_CARD_SERVICE_INSERT中nInfoNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配释放内存,插入失败时,对应插入的每一项的结果,返回个数同NET_IN_ACCESS_CARD_SERVICE_INSERT中nInfoNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+        public byte[] byReserved = new byte[4];
+
+        public NET_OUT_ACCESS_CARD_SERVICE_INSERT() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 获取卡片信息入参
+     */
+    class NET_IN_ACCESS_CARD_SERVICE_GET extends Structure {
+        public int dwSize;
+        /**
+         * 查询的数量
+         */
+        public int nCardNum;
+        /**
+         * 卡号
+         */
+        public byte[] szCardNo = new byte[100 * DH_MAX_CARDNO_LEN];
+
+        public NET_IN_ACCESS_CARD_SERVICE_GET() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 获取卡片信息出参
+     */
+    class NET_OUT_ACCESS_CARD_SERVICE_GET extends Structure {
+        public int dwSize;
+        /**
+         * 查询返回的最大数量
+         */
+        public int nMaxRetNum;
+        /**
+         * 卡片信息,内存由用户申请释放,申请大小不小于nCardNum*sizeof(NET_ACCESS_CARD_INFO);
+         * 返回个数同NET_IN_ACCESS_CARD_SERVICE_GET中nCardNum
+         *
+         * @see NET_ACCESS_CARD_INFO
+         */
+        public NET_ACCESS_CARD_INFO pCardInfo;
+        /**
+         * 查询失败时,对应查询的每一项的结果,返回个数同NET_IN_ACCESS_CARD_SERVICE_GET中nCardNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_CARD_SERVICE_GET() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 更新卡片信息入参
+     */
+    class NET_IN_ACCESS_CARD_SERVICE_UPDATE extends Structure {
+        public int dwSize;
+        /**
+         * 用户信息数量
+         */
+        public int nInfoNum;
+        /**
+         * 卡片信息,用户分配释放内存,大小为sizeof(NET_ACCESS_CARD_INFO)*nInfoNum
+         */
+        public NET_ACCESS_CARD_INFO pCardInfo;
+
+        public NET_IN_ACCESS_CARD_SERVICE_UPDATE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 更新卡片信息出参
+     */
+    class NET_OUT_ACCESS_CARD_SERVICE_UPDATE extends Structure {
+        public int dwSize;
+        /**
+         * 最大返回的用户信息数量,不小于NET_IN_ACCESS_CARD_SERVICE_UPDATE中nInfoNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配释放内存,插入失败时,对应插入的每一项的结果,返回个数同NET_IN_ACCESS_CARD_SERVICE_UPDATE中nInfoNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+        public byte[] byReserved = new byte[4];
+
+        public NET_OUT_ACCESS_CARD_SERVICE_UPDATE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除指定卡号信息入参
+     */
+    class NET_IN_ACCESS_CARD_SERVICE_REMOVE extends Structure {
+        public int dwSize;
+        /**
+         * 删除的数量
+         */
+        public int nCardNum;
+        /**
+         * 卡号
+         */
+        public byte[] szCardNo = new byte[100 * DH_MAX_CARDNO_LEN];
+
+        public NET_IN_ACCESS_CARD_SERVICE_REMOVE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除指定卡号信息出参
+     */
+    class NET_OUT_ACCESS_CARD_SERVICE_REMOVE extends Structure {
+        public int dwSize;
+        /**
+         * 最大返回信息数量,不小于 NET_IN_ACCESS_CARD_SERVICE_REMOVE中nCardNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配释放内存,插入失败时,对应删除的每一项的结果,返回个数同NET_IN_ACCESS_CARD_SERVICE_REMOVE中nCardNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+        public byte[] byReserved = new byte[4];
+
+        public NET_OUT_ACCESS_CARD_SERVICE_REMOVE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除所有卡片信息入参
+     */
+    class NET_IN_ACCESS_CARD_SERVICE_CLEAR extends Structure {
+        public int dwSize;
+
+        public NET_IN_ACCESS_CARD_SERVICE_CLEAR() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除所有卡片信息出参
+     */
+    class NET_OUT_ACCESS_CARD_SERVICE_CLEAR extends Structure {
+        public int dwSize;
+
+        public NET_OUT_ACCESS_CARD_SERVICE_CLEAR() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 卡片信息操作类型
+     */
+    class NET_EM_ACCESS_CTL_CARD_SERVICE {
+        /**
+         * 添加, pstInParam = NET_IN_ACCESS_CARD_SERVICE_INSERT , pstOutParam = NET_OUT_ACCESS_CARD_SERVICE_INSERT
+         */
+        public static final int NET_EM_ACCESS_CTL_CARD_SERVICE_INSERT = 0;
+        /**
+         * 获取, pstInParam = NET_IN_ACCESS_CARD_SERVICE_GET , pstOutParam = NET_OUT_ACCESS_CARD_SERVICE_GET
+         */
+        public static final int NET_EM_ACCESS_CTL_CARD_SERVICE_GET = 1;
+        /**
+         * 更新, pstInParam = NET_IN_ACCESS_CARD_SERVICE_UPDATE , pstOutParam = NET_OUT_ACCESS_CARD_SERVICE_UPDATE
+         */
+        public static final int NET_EM_ACCESS_CTL_CARD_SERVICE_UPDATE = 2;
+        /**
+         * 删除, pstInParam = NET_IN_ACCESS_CARD_SERVICE_REMOVE , pstOutParam = NET_OUT_ACCESS_CARD_SERVICE_REMOVE
+         */
+        public static final int NET_EM_ACCESS_CTL_CARD_SERVICE_REMOVE = 3;
+        /**
+         * 清空, pstInParam = NET_IN_ACCESS_CARD_SERVICE_CLEAR , pstOutParam = NET_OUT_ACCESS_CARD_SERVICE_CLEAR
+         */
+        public static final int NET_EM_ACCESS_CTL_CARD_SERVICE_CLEAR = 4;
+    }
+
+    /**
+     * 门禁卡片信息管理接口
+     *
+     * @param lLoginID    登录句柄
+     * @param ctlType     操作类型
+     * @param pstInParam  输入参数
+     * @param pstOutParam 输出参数
+     * @param nWaitTime   等待时间
+     * @return
+     * @see NET_EM_ACCESS_CTL_CARD_SERVICE
+     */
+    boolean CLIENT_OperateAccessCardService(NativeLong lLoginID, int ctlType, Pointer pstInParam,
+                                            Pointer pstOutParam, int nWaitTime);
+
+    /**
+     * CLIENT_StartFindCardInfo 输入参数
+     */
+    class NET_IN_CARDINFO_START_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+        /**
+         * 卡号
+         */
+        public byte[] szCardNo = new byte[DH_MAX_CARDNO_LEN];
+        /**
+         * 卡类型,只支持一般卡、胁迫卡和母卡
+         *
+         * @see NET_ACCESSCTLCARD_TYPE
+         */
+        public int emType;
+
+        public NET_IN_CARDINFO_START_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_StartFindCardInfo 输出参数
+     */
+    class NET_OUT_CARDINFO_START_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 符合查询条件的总数
+         */
+        public int nTotalCount;
+        /**
+         * CLIENT_DoFindCardInfo接口一次查询的最大数量
+         */
+        public int nCapNum;
+
+        public NET_OUT_CARDINFO_START_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_DoFindCardInfo 输入参数
+     */
+    class NET_IN_CARDINFO_DO_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 起始序号
+         */
+        public int nStartNo;
+        /**
+         * 本次查询的条数
+         */
+        public int nCount;
+
+        public NET_IN_CARDINFO_DO_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_DoFindCardInfo 输出参数
+     */
+    class NET_OUT_CARDINFO_DO_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 本次查询到的个数
+         */
+        public int nRetNum;
+        /**
+         * 查询结果, 用户分配释放内存,大小为sizeof(NET_FACEINFO)*nMaxNum
+         */
+        public NET_ACCESS_CARD_INFO pstuInfo;
+        /**
+         * 用户分配内存的个数
+         */
+        public int nMaxNum;
+        public byte[] byReserved = new byte[4];
+
+        public NET_OUT_CARDINFO_DO_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 开始查询卡片信息
+     *
+     * @param lLoginID  登录句柄
+     * @param pstIn     输入参数
+     * @param pstOut    输出参数
+     * @param nWaitTime 等待时间
+     * @return
+     * @see NET_IN_CARDINFO_START_FIND
+     * @see NET_OUT_CARDINFO_START_FIND
+     */
+    NativeLong CLIENT_StartFindCardInfo(NativeLong lLoginID, NET_IN_CARDINFO_START_FIND pstIn,
+                                        NET_OUT_CARDINFO_START_FIND pstOut, int nWaitTime);
+
+    /**
+     * 获取卡片信息
+     *
+     * @param lFindHandle CLIENT_StartFindCardInfo返回的查询句柄
+     * @param pstIn       输入参数
+     * @param pstOut      输出参数
+     * @param nWaitTime   等待时间
+     * @return
+     * @see NET_IN_CARDINFO_DO_FIND
+     * @see NET_OUT_CARDINFO_DO_FIND
+     */
+    boolean CLIENT_DoFindCardInfo(NativeLong lFindHandle, NET_IN_CARDINFO_DO_FIND pstIn,
+                                  NET_OUT_CARDINFO_DO_FIND pstOut, int nWaitTime);
+
+    /**
+     * 停止查询卡片信息
+     *
+     * @param lFindHandle CLIENT_StartFindCardInfo返回的查询句柄
+     * @return
+     */
+    boolean CLIENT_StopFindCardInfo(NativeLong lFindHandle);
+
+    /**
+     * 指纹信息
+     */
+    class NET_ACCESS_FINGERPRINT_INFO extends Structure {
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+        /**
+         * 单个指纹数据包长度
+         */
+        public int nPacketLen;
+        /**
+         * 指纹数据包个数
+         */
+        public int nPacketNum;
+        /**
+         * 指纹数据(数据总长度即nPacketLen*nPacketNum),用户分配释放内存
+         */
+        public byte[] szFingerPrintInfo;
+        /**
+         * 胁迫指纹序号,取值范围[1,nPacketNum] 非法取值的话,该字段无效
+         */
+        public int nDuressIndex;
+        public byte[] byReserved = new byte[4096];
+    }
+
+    /**
+     * 插入指纹信息入参
+     */
+    class NET_IN_ACCESS_FINGERPRINT_SERVICE_INSERT extends Structure {
+        public int dwSize;
+        /**
+         * 指纹信息的数量
+         */
+        public int nFpNum;
+        /**
+         * 指纹信息,用户分配释放内存
+         */
+        public NET_ACCESS_FINGERPRINT_INFO pFingerPrintInfo;
+
+        public NET_IN_ACCESS_FINGERPRINT_SERVICE_INSERT() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 插入指纹信息出参
+     */
+    class NET_OUT_ACCESS_FINGERPRINT_SERVICE_INSERT extends Structure {
+        public int dwSize;
+        /**
+         * 返回信息数量,不小于NET_IN_ACCESS_FINGERPRINT_SERVICE_INSERT 中 nFpNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配释放内存,插入失败时,对应插入的每一项的结果,返回个数同NET_IN_ACCESS_FINGERPRINT_SERVICE_INSERT 中nFpNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_FINGERPRINT_SERVICE_INSERT() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 更新指纹信息入参
+     */
+    class NET_IN_ACCESS_FINGERPRINT_SERVICE_UPDATE extends Structure {
+        public int dwSize;
+        /**
+         * 指纹信息的数量
+         */
+        public int nFpNum;
+        /**
+         * 指纹信息,用户分配释放内存
+         */
+        public NET_ACCESS_FINGERPRINT_INFO pFingerPrintInfo;
+
+        public NET_IN_ACCESS_FINGERPRINT_SERVICE_UPDATE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 更新指纹信息出参
+     */
+    class NET_OUT_ACCESS_FINGERPRINT_SERVICE_UPDATE extends Structure {
+        public int dwSize;
+        /**
+         * 返回信息数量,不小于NET_IN_ACCESS_FINGERPRINT_SERVICE_UPDATE 中 nFpNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配释放内存,更新失败时,对应更新的每一项的结果,返回个数同NET_IN_ACCESS_FINGERPRINT_SERVICE_UPDATE 中nFpNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_FINGERPRINT_SERVICE_UPDATE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 获取指纹信息入参
+     */
+    class NET_IN_ACCESS_FINGERPRINT_SERVICE_GET extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+
+        public NET_IN_ACCESS_FINGERPRINT_SERVICE_GET() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 获取指纹信息出参
+     */
+    class NET_OUT_ACCESS_FINGERPRINT_SERVICE_GET extends Structure {
+        public int dwSize;
+        /**
+         * 实际返回的指纹个数
+         */
+        public int nRetFingerPrintCount;
+        /**
+         * 单个指纹数据包长度
+         */
+        public int nSinglePacketLength;
+        /**
+         * 胁迫指纹序号
+         */
+        public int nDuressIndex;
+        /**
+         * 接受指纹数据的缓存的最大长度
+         */
+        public int nMaxFingerDataLength;
+        /**
+         * 实际返回的总的指纹数据包的长度
+         */
+        public int nRetFingerDataLength;
+        /**
+         * 用户分配释放内存,指纹数据
+         */
+        public byte pbyFingerData;
+
+        public NET_OUT_ACCESS_FINGERPRINT_SERVICE_GET() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除用户指纹信息入参
+     */
+    class NET_IN_ACCESS_FINGERPRINT_SERVICE_REMOVE extends Structure {
+        public int dwSize;
+        /**
+         * 删除的用户数量
+         */
+        public int nUserNum;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[100 * DH_MAX_USERID_LEN];
+
+        public NET_IN_ACCESS_FINGERPRINT_SERVICE_REMOVE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除用户指纹信息出参
+     */
+    class NET_OUT_ACCESS_FINGERPRINT_SERVICE_REMOVE extends Structure {
+        public int dwSize;
+        /**
+         * 最大返回数量,不小于 NET_IN_ACCESS_FINGERPRINT_SERVICE_REMOVE中nUserNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配释放内存,删除失败时,对应插入的每一项的结果,返回个数同NET_IN_ACCESS_FINGERPRINT_SERVICE_REMOVE中nUserNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_FINGERPRINT_SERVICE_REMOVE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 清除所有指纹信息入参
+     */
+    class NET_IN_ACCESS_FINGERPRINT_SERVICE_CLEAR extends Structure {
+        public int dwSize;
+
+        public NET_IN_ACCESS_FINGERPRINT_SERVICE_CLEAR() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 清除所有指纹信息出参
+     */
+    class NET_OUT_ACCESS_FINGERPRINT_SERVICE_CLEAR extends Structure {
+        public int dwSize;
+
+        public NET_OUT_ACCESS_FINGERPRINT_SERVICE_CLEAR() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 指纹信息操作类型
+     */
+    class NET_EM_ACCESS_CTL_FINGERPRINT_SERVICE {
+        /**
+         * 添加, pInbuf = NET_IN_ACCESS_FINGERPRINT_SERVICE_INSERT ,
+         * pOutBuf = NET_OUT_ACCESS_FINGERPRINT_SERVICE_INSERT
+         */
+        public static final int NET_EM_ACCESS_CTL_FINGERPRINT_SERVICE_INSERT = 0;
+        /**
+         * 获取, pInbuf = NET_IN_ACCESS_FINGERPRINT_SERVICE_GET , pOutBuf = NET_OUT_ACCESS_FINGERPRINT_SERVICE_GET
+         */
+        public static final int NET_EM_ACCESS_CTL_FINGERPRINT_SERVICE_GET = 1;
+        /**
+         * 更新, pInbuf = NET_IN_ACCESS_FINGERPRINT_SERVICE_UPDATE , pOutBuf = NET_OUT_ACCESS_FINGERPRINT_SERVICE_UPDATE
+         */
+        public static final int NET_EM_ACCESS_CTL_FINGERPRINT_SERVICE_UPDATE = 2;
+        /**
+         * 删除, pInbuf = NET_IN_ACCESS_FINGERPRINT_SERVICE_REMOVE , pOutBuf = NET_OUT_ACCESS_FINGERPRINT_SERVICE_REMOVE
+         */
+        public static final int NET_EM_ACCESS_CTL_FINGERPRINT_SERVICE_REMOVE = 3;
+        /**
+         * 清空, pInbuf = NET_IN_ACCESS_FINGERPRINT_SERVICE_CLEAR , pOutBuf = NET_OUT_ACCESS_FINGERPRINT_SERVICE_CLEAR
+         */
+        public static final int NET_EM_ACCESS_CTL_FINGERPRINT_SERVICE_CLEAR = 4;
+    }
+
+    /**
+     * 指纹信息管理接口
+     *
+     * @param lLoginID    登录句柄
+     * @param ctlType     操作类型
+     * @param pstInParam  输入参数
+     * @param pstOutParam 输出参数
+     * @param nWaitTime   等待时间
+     * @return
+     */
+    boolean CLIENT_OperateAccessFingerprintService(NativeLong lLoginID, NET_EM_ACCESS_CTL_FINGERPRINT_SERVICE ctlType,
+                                                   Pointer pstInParam, Pointer pstOutParam, int nWaitTime);
+
+    /**
+     * 人脸照片最大个数
+     */
+    int MAX_PHOTO_COUNT = 5;
+
+    /**
+     * 人脸信息
+     */
+    class NET_ACCESS_FACE_INFO extends Structure {
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+        /**
+         * 人脸模板数据个数,最大20
+         */
+        public int nFaceData;
+        /**
+         * 人脸模板数据
+         */
+        public byte[] szFaceData = new byte[MAX_FACE_DATA_NUM * MAX_FACE_DATA_LEN];
+        /**
+         * 人脸模版数据大小
+         */
+        public int[] nFaceDataLen = new int[MAX_FACE_DATA_NUM];
+        /**
+         * 人脸照片个数,不超过5个
+         */
+        public int nFacePhoto;
+        /**
+         * 用户申请的每张图片的大小
+         */
+        public int[] nInFacePhotoLen = new int[MAX_PHOTO_COUNT];
+        /**
+         * 每张图片实际的大小
+         */
+        public int[] nOutFacePhotoLen = new int[MAX_PHOTO_COUNT];
+        /**
+         * 人脸照片数据,大小不超过200K
+         */
+        public byte[] pFacePhoto = new byte[MAX_PHOTO_COUNT];
+        public byte[] byReserved = new byte[2048];
+    }
+
+    /**
+     * 添加人脸记录信息输入参数(NET_EM_ACCESS_CTL_FACE_SERVICE_INSERT)
+     */
+    class NET_IN_ACCESS_FACE_SERVICE_INSERT extends Structure {
+        public int dwSize;
+        /**
+         * 人脸信息数量
+         */
+        public int nFaceInfoNum;
+        /**
+         * 人脸数据,用户自行分配数据
+         */
+        public NET_ACCESS_FACE_INFO pFaceInfo;
+
+        public NET_IN_ACCESS_FACE_SERVICE_INSERT() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 添加人脸记录信息输出参数(NET_EM_ACCESS_CTL_FACE_SERVICE_INSERT)
+     */
+    class NET_OUT_ACCESS_FACE_SERVICE_INSERT extends Structure {
+        public int dwSize;
+        /**
+         * 最大返回数量,不小于 NET_IN_ACCESS_FACE_SERVICE_INSERT 中的nFaceInfoNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配内存,添加失败时,对应插入的每一项的结果,返回个数同NET_IN_ACCESS_FACE_SERVICE_INSERT中的nFaceInfoNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_FACE_SERVICE_INSERT() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 对象的最大个数
+     */
+    int MAX_OBJECT_NUM_EX = 100;
+
+    /**
+     * 批量获取多用户多个人脸输入参数(NET_EM_ACCESS_CTL_FACE_SERVICE_GET)
+     */
+    class NET_IN_ACCESS_FACE_SERVICE_GET extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID数量,最大100
+         */
+        public int nUserNum;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[MAX_OBJECT_NUM_EX * DH_MAX_USERID_LEN];
+
+        public NET_IN_ACCESS_FACE_SERVICE_GET() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 批量获取多用户多个人脸输出参数(NET_EM_ACCESS_CTL_FACE_SERVICE_GET)
+     */
+    class NET_OUT_ACCESS_FACE_SERVICE_GET extends Structure {
+        public int dwSize;
+        /**
+         * 最大返回数量,不小于 NET_IN_ACCESS_FACE_SERVICE_GET 中的 nUserNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 人脸数据,用户分配内存,返回个数同NET_IN_ACCESS_FACE_SERVICE_GET中的nUserNum,只返回人脸模版数据
+         */
+        public NET_ACCESS_FACE_INFO pFaceInfo;
+        /**
+         * 用户分配内存,获取失败时,对应获取的每一项的结果,返回个数同NET_IN_ACCESS_FACE_SERVICE_GET中的nUserNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_FACE_SERVICE_GET() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 更新多用户多个人脸记录信息输入参数(NET_EM_ACCESS_CTL_FACE_SERVICE_UPDATE)
+     */
+    class NET_IN_ACCESS_FACE_SERVICE_UPDATE extends Structure {
+        public int dwSize;
+        /**
+         * 人脸信息数量
+         */
+        public int nFaceInfoNum;
+        /**
+         * 人脸数据,用户分配内存
+         */
+        public NET_ACCESS_FACE_INFO pFaceInfo;
+
+        public NET_IN_ACCESS_FACE_SERVICE_UPDATE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 更新多用户多个人脸记录信息输出参数(NET_EM_ACCESS_CTL_FACE_SERVICE_UPDATE)
+     */
+    class NET_OUT_ACCESS_FACE_SERVICE_UPDATE extends Structure {
+        public int dwSize;
+        /**
+         * 最大返回数量,不小于 NET_IN_ACCESS_FACE_SERVICE_UPDATE中的nFaceInfoNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配内存.更新失败时,对应更新的每一项的结果,返回个数同NET_IN_ACCESS_FACE_SERVICE_UPDATE中的nFaceInfoNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_FACE_SERVICE_UPDATE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除多用户的多个人脸信息输入参数(NET_EM_ACCESS_CTL_FACE_SERVICE_REMOVE)
+     */
+    class NET_IN_ACCESS_FACE_SERVICE_REMOVE extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID数量,最大100
+         */
+        public int nUserNum;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[MAX_OBJECT_NUM_EX * DH_MAX_USERID_LEN];
+
+        public NET_IN_ACCESS_FACE_SERVICE_REMOVE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 删除多用户的多个人脸信息输出参数(NET_EM_ACCESS_CTL_FACE_SERVICE_REMOVE)
+     */
+    class NET_OUT_ACCESS_FACE_SERVICE_REMOVE extends Structure {
+        public int dwSize;
+        /**
+         * 最大返回数量,不小于 NET_IN_ACCESS_FACE_SERVICE_REMOVE中的nUserNum
+         */
+        public int nMaxRetNum;
+        /**
+         * 用户分配内存.删除失败时,对应删除的每一项的结果,返回个数同NET_IN_ACCESS_FACE_SERVICE_REMOVE中的nUserNum
+         *
+         * @see NET_EM_FAILCODE
+         */
+        public int pFailCode;
+
+        public NET_OUT_ACCESS_FACE_SERVICE_REMOVE() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 清空所有人脸记录信息输入参数(NET_EM_ACCESS_CTL_FACE_SERVICE_CLEAR)
+     */
+    class NET_IN_ACCESS_FACE_SERVICE_CLEAR extends Structure {
+        public int dwSize;
+
+        public NET_IN_ACCESS_FACE_SERVICE_CLEAR() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 清空所有人脸记录信息输出参数(NET_EM_ACCESS_CTL_FACE_SERVICE_CLEAR)
+     */
+    class NET_OUT_ACCESS_FACE_SERVICE_CLEAR extends Structure {
+        public int dwSize;
+
+        public NET_OUT_ACCESS_FACE_SERVICE_CLEAR() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 人脸信息操作类型
+     */
+    class NET_EM_ACCESS_CTL_FACE_SERVICE {
+        /**
+         * 添加, pInbuf = NET_IN_ACCESS_FACE_SERVICE_INSERT , pOutBuf = NET_OUT_ACCESS_FACE_SERVICE_INSERT
+         */
+        public static final int NET_EM_ACCESS_CTL_FACE_SERVICE_INSERT = 0;
+        /**
+         * 获取, pInbuf = NET_IN_ACCESS_FACE_SERVICE_GET , pOutBuf = NET_OUT_ACCESS_FACE_SERVICE_GET
+         */
+        public static final int NET_EM_ACCESS_CTL_FACE_SERVICE_GET = 1;
+        /**
+         * 更新, pInbuf = NET_IN_ACCESS_FACE_SERVICE_UPDATE , pOutBuf = NET_OUT_ACCESS_FACE_SERVICE_UPDATE
+         */
+        public static final int NET_EM_ACCESS_CTL_FACE_SERVICE_UPDATE = 2;
+        /**
+         * 删除, pInbuf = NET_IN_ACCESS_FACE_SERVICE_REMOVE , pOutBuf = NET_OUT_ACCESS_FACE_SERVICE_REMOVE
+         */
+        public static final int NET_EM_ACCESS_CTL_FACE_SERVICE_REMOVE = 3;
+        /**
+         * 清空, pInbuf = NET_IN_ACCESS_FACE_SERVICE_CLEAR , pOutBuf = NET_OUT_ACCESS_FACE_SERVICE_CLEAR
+         */
+        public static final int NET_EM_ACCESS_CTL_FACE_SERVICE_CLEAR = 4;
+    }
+
+    /**
+     * 门禁人脸信息管理接口
+     *
+     * @param lLoginID    登录句柄
+     * @param ctlType     操作类型
+     * @param pstInParam  输入参数
+     * @param pstOutParam 输出参数
+     * @param nWaitTime   等待时间
+     * @return
+     */
+    boolean CLIENT_OperateAccessFaceService(NativeLong lLoginID, NET_EM_ACCESS_CTL_FACE_SERVICE ctlType,
+                                            Pointer pstInParam, Pointer pstOutParam, int nWaitTime);
+
+    /**
+     * CLIENT_AccessStartFindFaceInfo 输入参数
+     */
+    class NET_IN_ACCESS_FACEINFO_START_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+
+        public NET_IN_ACCESS_FACEINFO_START_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_AccessStartFindFaceInfo 输出参数
+     */
+    class NET_OUT_ACCESS_FACEINFO_START_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 单次查询最大数量
+         */
+        public int nCapNum;
+        /**
+         * 符合查询条件的总数
+         */
+        public int nTotalCount;
+
+        public NET_OUT_ACCESS_FACEINFO_START_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_AccessDoFindFaceInfo 输入参数
+     */
+    class NET_IN_ACCESS_FACEINFO_DO_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 起始序号
+         */
+        public int nStartNo;
+        /**
+         * 本次查询的条数,不能大于NET_OUT_ACCESS_FACEINFO_START_FIND中的nCapNum
+         */
+        public int nCount;
+
+        public NET_IN_ACCESS_FACEINFO_DO_FIND() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_AccessDoFindFaceInfo 输出参数
+     */
+    class NET_OUT_ACCESS_FACEINFO_DO_FIND extends Structure {
+        public int dwSize;
+        /**
+         * 本次查询到的个数
+         */
+        public int nRetNum;
+        /**
+         * 查询结果, 用户分配内存,大小为sizeof(NET_FACEINFO)*nMaxNum
+         */
+        public NET_FACEINFO pstuInfo;
+        /**
+         * 用户分配内存的个数
+         */
+        public int nMaxNum;
+        public byte[] byReserved = new byte[4];
+    }
+
+    /**
+     * 开始查询人脸信息
+     *
+     * @param lLoginID  登录句柄
+     * @param pstIn     输入参数
+     * @param pstOut    输出参数
+     * @param nWaitTime 等待时间
+     * @return
+     * @see NET_IN_ACCESS_FACEINFO_START_FIND
+     * @see NET_OUT_ACCESS_FACEINFO_START_FIND
+     */
+    NativeLong CLIENT_AccessStartFindFaceInfo(NativeLong lLoginID, NET_IN_ACCESS_FACEINFO_START_FIND pstIn,
+                                              NET_OUT_ACCESS_FACEINFO_START_FIND pstOut, int nWaitTime);
+
+    /**
+     * 获取人脸信息
+     *
+     * @param lFindHandle CLIENT_AccessStartFindFaceInfo返回的查询句柄
+     * @param pstIn       输入参数
+     * @param pstOut      输出参数
+     * @param nWaitTime   等待时间
+     * @return
+     * @see NET_IN_ACCESS_FACEINFO_DO_FIND
+     * @see NET_OUT_ACCESS_FACEINFO_DO_FIND
+     */
+    boolean CLIENT_AccessDoFindFaceInfo(NativeLong lFindHandle, NET_IN_ACCESS_FACEINFO_DO_FIND pstIn,
+                                        NET_OUT_ACCESS_FACEINFO_DO_FIND pstOut, int nWaitTime);
+
+    /**
+     * 停止查询人脸信息
+     *
+     * @param lFindHandle CLIENT_AccessStartFindFaceInfo返回的查询句柄
+     * @return
+     */
+    boolean CLIENT_AccessStopFindFaceInfo(NativeLong lFindHandle);
+
+    /**
+     * 人脸库导入状态
+     */
+    enum EM_IMPORT_FACEDB_STATE {
+        /**
+         * 未知
+         */
+        EM_IMPORT_FACEDB_UNKNOWN(0),
+        /**
+         * 导入中
+         */
+        EM_IMPORT_FACEDB_ONGING(1),
+        /**
+         * 导入结束, 开始生成数据库
+         */
+        EM_IMPORT_FACEDB_END(2),
+        /**
+         * 系统忙,已经有导入任务
+         */
+        EM_IMPORT_FACEDB_BUSY(3),
+        /**
+         * 数据包检验失败
+         */
+        EM_IMPORT_FACEDB_DATAERROR(4),
+        /**
+         * 数据包非法
+         */
+        EM_IMPORT_FACEDB_INVALID(5),
+        /**
+         * 同步成功, 数据库已生成
+         */
+        EM_IMPORT_FACEDB_SYNC_SUCCESS(6),
+        /**
+         * 同步失败, 数据库无法生成
+         */
+        EM_IMPORT_FACEDB_SYNC_FALIED(7),
+        /**
+         * 数据库已满无法导入
+         */
+        EM_IMPORT_FACEDB_DBFULL(8),
+        /**
+         * 存储空间满无法导入
+         */
+        EM_IMPORT_FACEDB_SDFULL(9),
+        /**
+         * 导入压缩包密码不对
+         */
+        EM_IMPORT_FACEDB_CIPHER_ERROR(10);
+
+        final int code;
+
+        EM_IMPORT_FACEDB_STATE(int code) {
+            this.code = code;
+        }
+    }
+
+    /**
+     * 人脸对比库进度类型
+     */
+    class EM_FACEDB_PROGRESS_TYPE {
+        /**
+         * 人脸库导入进度
+         */
+        public static final int EM_FACEDB_PROGRESS_IMPORT = 0;
+        /**
+         * 人脸库部署进度
+         */
+        public static final int EM_FACEDB_PROGRESS_DEPLOY = 1;
+    }
+
+    /**
+     * 导入人脸库状态信息
+     */
+    class NET_IMPORT_FACEDB_STATE extends Structure {
+        /**
+         * 进度, 百分比
+         */
+        public int nProgress;
+        /**
+         * 进度类型
+         *
+         * @see EM_FACEDB_PROGRESS_TYPE
+         */
+        public int emType;
+        /**
+         * 状态信息
+         *
+         * @see EM_IMPORT_FACEDB_STATE
+         */
+        public int emState;
+        public byte[] byReserved = new byte[512];
+    }
+
+    /**
+     * 导入人脸库回调函数原形
+     */
+    interface fImportFaceDbCallBack extends StdCallLibrary.StdCallCallback {
+        /**
+         * @param lImportFaceDbHandle CLIENT_ImportFaceDB的返回句柄
+         * @param pstFaceDbState      状态信息
+         * @param dwUser              用户数据
+         */
+        void invoke(NativeLong lImportFaceDbHandle, NET_IMPORT_FACEDB_STATE pstFaceDbState, NativeLong dwUser);
+    }
+
+    /**
+     * CLIENT_ImportFaceDB 接口输入参数
+     */
+    class NET_IN_IMPORT_FACE_DB extends Structure {
+        public int dwSize;
+        /**
+         * 人员组ID
+         */
+        public byte[] szGroupId = new byte[DH_COMMON_STRING_64];
+        /**
+         * 压缩密码
+         */
+        public byte[] szPassWord = new byte[DH_COMMON_STRING_64];
+        /**
+         * 人脸库路径, 由用户指定
+         */
+        public byte[] pszFaceDBPath;
+        /**
+         * 上传状态回调函数
+         */
+        public fImportFaceDbCallBack cbImportState;
+        /**
+         * 用户数据
+         */
+        public NativeLong dwUser;
+
+        public NET_IN_IMPORT_FACE_DB() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_ImportFaceDB 接口输出参数
+     */
+    class NET_OUT_IMPORT_FACE_DB extends Structure {
+        public int dwSize;
+
+        public NET_OUT_IMPORT_FACE_DB() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 人脸库导入接口
+     *
+     * @param lLoginID  登录句柄
+     * @param pInParam  输入参数
+     * @param pOutParam 输出参数
+     * @return
+     * @see NET_IN_IMPORT_FACE_DB
+     * @see NET_OUT_IMPORT_FACE_DB
+     */
+    NativeLong CLIENT_ImportFaceDB(NativeLong lLoginID, NET_IN_IMPORT_FACE_DB pInParam,
+                                   NET_OUT_IMPORT_FACE_DB pOutParam);
+
+    /**
+     * 停止人脸库导入
+     *
+     * @param lImportFaceDbHandle CLIENT_ImportFaceDB返回的导入句柄
+     * @return
+     */
+    boolean CLIENT_StopImportFaceDB(NativeLong lImportFaceDbHandle);
+
+    /**
+     * 导出人脸对比库错误码
+     */
+    enum EM_EXPORT_FACEDB_ERRORCODE {
+        /**
+         * 人脸库导出请求成功
+         */
+        EM_EXPORT_FACEDB_REQUEST_SUCCESS(1),
+        /**
+         * 无权限
+         */
+        EM_EXPORT_FACEDB_NO_AUTHORITY(2),
+        /**
+         * 文件不存在
+         */
+        EM_EXPORT_FACEDB_NO_THIS_FILE(3),
+        /**
+         * 导出结束
+         */
+        EM_EXPORT_FACEDB_EXPORT_END(4),
+        /**
+         * 导出中
+         */
+        EM_EXPORT_FACEDB_EXPORTING(5),
+        /**
+         * 文件准备完成
+         */
+        EM_EXPORT_FACEDB_FILE_READY(8),
+        /**
+         * 文件准备失败
+         */
+        EM_EXPORT_FACEDB_FILE_FAILED(9),
+        /**
+         * 人脸库导出请求成功, 需要等待设备准备数据
+         */
+        EM_EXPORT_FACEDB_WAIT_FILE(10),
+        /**
+         * 系统忙, 暂时无法导出数据
+         */
+        EM_EXPORT_FACEDB_SYSTEM_BUSY(11),
+        /**
+         * 人脸库数据未定义密码, 不允许导出
+         */
+        EM_EXPORT_FACEDB_NO_PASSWORD(12);
+
+        final int code;
+
+        EM_EXPORT_FACEDB_ERRORCODE(int code) {
+            this.code = code;
+        }
+    }
+
+    /**
+     * 导出人脸库状态信息
+     */
+    class NET_EXPORT_FACEDB_STATE extends Structure {
+        /**
+         * 进度, 百分比
+         */
+        public int nProgress;
+        /**
+         * 错误码
+         *
+         * @see EM_EXPORT_FACEDB_ERRORCODE
+         */
+        public int emErrorCode;
+        /**
+         * 人脸库导出数据
+         */
+        public byte[] pDataBuf;
+        /**
+         * 数据长度
+         */
+        public NativeLong dwDataLen;
+        public byte[] byReserved = new byte[512];
+    }
+
+    /**
+     * 导出人脸库回调函数原形
+     */
+    interface fExportStateCallBack extends StdCallLibrary.StdCallCallback {
+        /**
+         * @param lExportFaceDbHandle CCLIENT_ExportFaceDB的返回句柄
+         * @param pstFaceDbState      状态信息
+         * @param dwUser              用户数据
+         */
+        void invoke(NativeLong lExportFaceDbHandle, NET_EXPORT_FACEDB_STATE pstFaceDbState, NativeLong dwUser);
+    }
+
+    /**
+     * CLIENT_ExportFaceDB 接口输入参数
+     */
+    @Structure.FieldOrder({"dwSize", "szGroupId", "szPassWord", "cbExportFaceDbCallBack", "dwUser"})
+    class NET_IN_EXPORT_FACE_DB extends Structure {
+        public int dwSize;
+        /**
+         * 人员组ID
+         */
+        public byte[] szGroupId = new byte[DH_COMMON_STRING_64];
+        /**
+         * 压缩密码
+         */
+        public byte[] szPassWord = new byte[DH_COMMON_STRING_64];
+        /**
+         * 导出人脸库回调函数
+         */
+        public fExportStateCallBack cbExportFaceDbCallBack;
+        /**
+         * 用户数据
+         */
+        public NativeLong dwUser;
+
+        public NET_IN_EXPORT_FACE_DB() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * CLIENT_ExportFaceDB 接口输出参数
+     */
+    @Structure.FieldOrder("dwSize")
+    class NET_OUT_EXPORT_FACE_DB extends Structure {
+        public int dwSize;
+
+        public NET_OUT_EXPORT_FACE_DB() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 人脸库导出接口
+     *
+     * @param lLoginID  登录句柄
+     * @param pInParam  输入参数
+     * @param pOutParam 输出参数
+     * @return
+     * @see NET_IN_EXPORT_FACE_DB
+     * @see NET_OUT_EXPORT_FACE_DB
+     */
+    NativeLong CLIENT_ExportFaceDB(NativeLong lLoginID, NET_IN_EXPORT_FACE_DB pInParam,
+                                   NET_OUT_EXPORT_FACE_DB pOutParam);
+
+    /**
+     * 停止人脸库导出
+     *
+     * @param lExportFaceDbHandle CLIENT_ExportFaceDB返回的导出句柄
+     * @return
+     */
+    boolean CLIENT_StopExportFaceDB(NativeLong lExportFaceDbHandle);
+
+    /*******************系统能力查询*******************/
+
+    /**
+     * 能力集命令  对应CLIENT_QueryNewSystemInfo
+     */
+    class SystemInfoQueryCommand {
+        /**
+         * 视频分析能力集(对应CFG_CAP_ANALYSE_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_VIDEOANALYSE = "devVideoAnalyse.getCaps".getBytes();
+        /**
+         * 视频分析能力集(对应CFG_CAP_ANALYSE_INFO_EX)
+         */
+        public static final byte[] CFG_CAP_CMD_VIDEOANALYSE_EX = "devVideoAnalyse.getCapsEx".getBytes();
+        /**
+         * 获取后端设备的的在线状态(对应CFG_REMOTE_DEVICE_STATUS)
+         */
+        public static final byte[] CFG_NETAPP_REMOTEDEVICE = "netApp.getRemoteDeviceStatus".getBytes();
+        /**
+         * 接入设备信息(对应 CFG_PRODUCT_DEFINITION_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_PRODUCTDEFINITION = "magicBox.getProductDefinition".getBytes();
+        /**
+         * 设备智能分析能力(对应CFG_CAP_DEVICE_ANALYSE_INFO)兼容老设备
+         */
+        public static final byte[] CFG_DEVICE_CAP_CMD_VIDEOANALYSE = "intelli.getVideoAnalyseDeviceChannels".getBytes();
+        /**
+         * 设备智能分析能力(对应CFG_CAP_DEVICE_ANALYSE_INFO)
+         */
+        public static final byte[] CFG_DEVICE_CAP_NEW_CMD_VIDEOANALYSE = "devVideoAnalyse.factory.getCollect".getBytes();
+        /**
+         * 获得CPU个数
+         */
+        public static final byte[] CFG_CAP_CMD_CPU_COUNT = "magicBox.getCPUCount".getBytes();
+        /**
+         * 获取CPU占用率
+         */
+        public static final byte[] CFG_CAP_CMD_CPU_USAGE = "magicBox.getCPUUsage".getBytes();
+        /**
+         * 获得内存容量
+         */
+        public static final byte[] CFG_CAP_CMD_MEMORY_INFO = "magicBox.getMemoryInfo".getBytes();
+        /**
+         * 获取设备类型(对应CFG_DEVICE_CLASS_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_DEVICE_CLASS = "magicBox.getDeviceClass".getBytes();
+        /**
+         * 获取设备状态信息 (对应CFG_CAP_TRAFFIC_DEVICE_STATUS)
+         */
+        public static final byte[] CFG_CAP_CMD_DEVICE_STATE = "trafficSnap.getDeviceStatus".getBytes();
+        /**
+         * 视频输入能力集(对应CFG_CAP_VIDEOINPUT_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_VIDEOINPUT = "devVideoInput.getCaps".getBytes();
+        /**
+         * 得到所有活动的用户信息(对应CFG_ACTIVEUSER_INFO)
+         */
+        public static final byte[] CFG_USERMANAGER_ACTIVEUSER = "userManager.getActiveUserInfoAll".getBytes();
+        /**
+         * 获取视频统计摘要信息(对应CFG_VIDEOSATA_SUMMARY_INFO)
+         */
+        public static final byte[] CFG_CAP_VIDEOSTAT_SUMMARY = "videoStatServer.getSummary".getBytes();
+        /**
+         * 获取视频诊断服务能力(CFG_VIDEODIAGNOSIS_CAPS_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_VIDEODIAGNOSIS_SERVER = "videoDiagnosisServer.getCaps".getBytes();
+        /**
+         * 获取视频诊断通道数目(CFG_VIDEODIAGNOSIS_GETCOLLECT_INFO)
+         */
+        public static final byte[] CFG_CMD_VIDEODIAGNOSIS_GETCOLLECT = "videoDiagnosisServer.factory.getCollect".getBytes();
+        /**
+         * 获取视频诊断进行状态(CFG_VIDEODIAGNOSIS_STATE_INFO)
+         */
+        public static final byte[] CFG_CMD_VIDEODIAGNOSIS_GETSTATE = "videoDiagnosisServer.getState".getBytes();
+        /**
+         * 获取服务器上支持的服务列表(CFG_DEV_SERVICE_LIST)
+         */
+        public static final byte[] CFG_CAP_CMD_SERVICE_LIST = "system.listService".getBytes();
+        /**
+         * 获取服务器报警联动能力集(CFG_CAP_EVENTHANDLER_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_EVENTHANDLER = "capsManager.get&EventManagerEventHandler".getBytes();
+        /**
+         * 获取报警能力集(CFG_CAP_ALARM_INFO)
+         */
+        public static final byte[] CFG_CAP_ALARM = "alarm.getAlarmCaps".getBytes();
+        /**
+         * 获取音频分析能力集(CFG_CAP_AUDIO_ANALYSE_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_AUDIO_ANALYSE = "devAudioAnalyse.getCaps".getBytes();
+        /**
+         * 获取主从式跟踪器通道数目(对应结构体CFG_MASTERSLAVETRACKER_INFO)
+         */
+        public static final byte[] CFG_CMD_MASTERSLAVE_GETCOLLECT = "masterSlaveTracker.factory.getCollect".getBytes();
+        /**
+         * 获取主从式设备能力集(CFG_CAP_MASTERSLAVE_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_MASTERSLAVE = "capsManager.get&MasterSlaveTracker".getBytes();
+        /**
+         * 获取镜头聚焦状态信息 (对应CFG_CAP_FOCUS_STATUS)
+         */
+        public static final byte[] CFG_CAP_CMD_FOCUS_STATE = "devVideoInput.getFocusStatus".getBytes();
+        /**
+         * 获取网络应用能力集(对应CFG_CAP_NETAPP)
+         */
+        public static final byte[] CFG_CAP_CMD_NETAPP = "netApp.getCaps".getBytes();
+        /**
+         * 获取云台支持信息(CFG_CAP_PTZ_ENABLEINFO )
+         */
+        public static final byte[] CFG_CAP_CMD_PTZ_ENABLE = "ptz.factory.instance".getBytes();
+        /**
+         * 获取录像能力集(CFG_CAP_RECORD_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_RECORD = "recordManager.getCaps".getBytes();
+        /**
+         * 获取刻录管理能力集( CFG_CAP_BURN_MANAGER)
+         */
+        public static final byte[] CFG_CAP_CMD_BURN_MANAGER = "BurnManager.getCaps".getBytes();
+        /**
+         * 获取云台能力集(CFG_PTZ_PROTOCOL_CAPS_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_PTZ = "ptz.getCurrentProtocolCaps".getBytes();
+        /**
+         * 获取编码能力集(CFG_ENCODECAP)
+         */
+        public static final byte[] CFG_CMD_ENCODE_GETCAPS = "encode.getCaps".getBytes();
+        /**
+         * 视频输入能力集扩展(对应CFG_CAP_VIDEOINPUT_INFO_EX)
+         */
+        public static final byte[] CFG_CAP_CMD_VIDEOINPUT_EX = "devVideoInput.getCapsEx".getBytes();
+        /**
+         * 获取设备智能分析模式(对应 CFG_ANALYSE_MODE)
+         */
+        public static final byte[] CFG_CAP_CMD_ANALYSE_MODE = "intelli.getCaps.AnalyseMode".getBytes();
+        /**
+         * 获取设备报警联动能力,老协议已废除,新开发请使用该字段(CFG_CAP_EVENTMANAGER_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_EVENTMANAGER = "eventManager.getCaps".getBytes();
+        /**
+         * 获取文件能力(CFG_CAP_FILEMANAGER)
+         */
+        public static final byte[] CFG_CAP_CMD_FILEMANAGER = "FileManager.getCaps".getBytes();
+        /**
+         * 获取日志服务能力(CFG_CAP_LOG)
+         */
+        public static final byte[] CFG_CAP_CMD_LOG = "log.getCaps".getBytes();
+        /**
+         * 扬声器播放能力(CFG_CAP_SPEAK)
+         */
+        public static final byte[] CFG_CAP_CMD_SPEAK = "speak.getCaps".getBytes();
+        /**
+         * 门禁能力(CFG_CAP_ACCESSCONTROL)
+         */
+        public static final byte[] CFG_CAP_CMD_ACCESSCONTROLMANAGER = "accessControlManager.getCaps".getBytes();
+        /**
+         * 获取扩展报警能力集, (对应结构体 CFG_CAP_EXALARM_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_EXALARM = "alarm.getExAlarmCaps".getBytes();
+        /**
+         * 获取扩展报警盒能力集, (对应结构体 CFG_CAP_EXALARMBOX_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_EXALARMBOX = "alarm.getExAlarmBoxCaps".getBytes();
+        /**
+         * 获取查询记录能力集, (对应结构体 CFG_CAP_RECORDFINDER_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_RECORDFINDER = "RecordFinder.getCaps".getBytes();
+        /**
+         * 模拟量报警输入通道能力(对应结构体 CFG_CAP_ANALOGALARM)
+         */
+        public static final byte[] CFG_CAP_CMD_ANALOGALARM = "AnalogAlarm.getCaps".getBytes();
+        /**
+         * 获取LowRateWPAN能力(对应的结构体 CFG_CAP_LOWRATEWPAN)
+         */
+        public static final byte[] CFG_CAP_CMD_LOWRATEWPAN = "LowRateWPAN.getCaps".getBytes();
+        /**
+         * 获取编码自适应编码能力(对应的结构体 CFG_CAP_ADAPT_ENCODE_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_ADAPTENCODE = "encode.getNAACaps".getBytes();
+        /**
+         * 获取该云台实际能够使用的协议,按介质区分 (对应结构体 CFG_CAP_PTZ_PROTOCOL)
+         */
+        public static final byte[] CFG_CAP_CMD_PTZPROTOCAL = "ptz.getProtocol".getBytes();
+        /**
+         * 查询是否支持视频裁剪能力 (对应结构体 CFG_CAP_MEDIA_CROP)
+         */
+        public static final byte[] CFG_CAP_CMD_MEDIACROP = "encode.getCropCaps".getBytes();
+        /**
+         * 获取OSD叠加能力(对应结构体CFG_CAP_OSDMANAGER_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_OSDMANAGER = "OSDManager.getCaps".getBytes();
+        /**
+         * 获取自定义标题能力集(对应结构体CFG_CAP_CUSTOM_OSD_INFO)
+         */
+        public static final byte[] CFG_CAP_CMD_CUSTOM = "OSDManager.getCustomCaps".getBytes();
+    }
+
+    /**
+     * 新系统能力查询接口,查询系统能力信息
+     *
+     * @param lLoginID        登录句柄
+     * @param szCommand       命令
+     * @param nChannelID      通道ID
+     * @param szOutBuffer     输出
+     * @param dwOutBufferSize 输出大小
+     * @param error           错误码
+     * @param waittime        等待时间
+     * @return
+     * @see SystemInfoQueryCommand
+     */
+    boolean CLIENT_QueryNewSystemInfo(NativeLong lLoginID, byte[] szCommand, int nChannelID, byte[] szOutBuffer,
+                                      int dwOutBufferSize, int error, int waittime);
+
+    /*******************数据库记录相关操作*******************/
+
+    /**
+     * 记录类型
+     */
+    class EM_NET_RECORD_TYPE {
+        public static final int NET_RECORD_UNKNOWN = 0;
+        /**
+         * 交通白名单账户记录
+         * 查询条件对应 FIND_RECORD_TRAFFICREDLIST_CONDITION 结构体
+         * 记录信息对应 NET_TRAFFIC_LIST_RECORD 结构体
+         */
+        public static final int NET_RECORD_TRAFFICREDLIST = 1;
+
+        /**
+         * 交通黑名单账号记录
+         * 查询条件对应 FIND_RECORD_TRAFFICREDLIST_CONDITION 结构体
+         * 记录信息对应 NET_TRAFFIC_LIST_RECORD 结构体
+         */
+        public static final int NET_RECORD_TRAFFICBLACKLIST = 2;
+
+        /**
+         * 刻录案件记录
+         * 查询条件对应 FIND_RECORD_BURN_CASE_CONDITION 结构体
+         * 记录信息对应 NET_BURN_CASE_INFO 结构体
+         */
+        public static final int NET_RECORD_BURN_CASE = 3;
+
+        /**
+         * 门禁卡
+         * 查询条件对应 FIND_RECORD_ACCESSCTLCARD_CONDITION 结构体
+         * 记录信息对应 NET_RECORDSET_ACCESS_CTL_CARD 结构体
+         *
+         * @see FIND_RECORD_ACCESSCTLCARD_CONDITION
+         * @see NET_RECORDSET_ACCESS_CTL_CARD
+         */
+        public static final int NET_RECORD_ACCESSCTLCARD = 4;
+
+        /**
+         * 门禁密码
+         * 查询条件对应 FIND_RECORD_ACCESSCTLPWD_CONDITION 结构体
+         * 记录信息对应 NET_RECORDSET_ACCESS_CTL_PWD
+         */
+        public static final int NET_RECORD_ACCESSCTLPWD = 5;
+
+        /**
+         * 门禁出入记录(必须同时按卡号和时间段查询,建议用NET_RECORD_ACCESSCTLCARDREC_EX查询)
+         * 查询条件对应 FIND_RECORD_ACCESSCTLCARDREC_CONDITION 结构体
+         * 记录信息对应 NET_RECORDSET_ACCESS_CTL_CARDREC 结构体
+         */
+        public static final int NET_RECORD_ACCESSCTLCARDREC = 6;
+
+        /**
+         * 假日记录集
+         * 查询条件对应 FIND_RECORD_ACCESSCTLHOLIDAY_CONDITION 结构体
+         * 记录信息对应 NET_RECORDSET_HOLIDAY 结构体
+         */
+        public static final int NET_RECORD_ACCESSCTLHOLIDAY = 7;
+
+        /**
+         * 查询交通流量记录
+         * 查询条件对应 FIND_RECORD_TRAFFICFLOW_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_TRAFFIC_FLOW_STATE 结构体
+         */
+        public static final int NET_RECORD_TRAFFICFLOW_STATE = 8;
+
+        /**
+         * 通话记录
+         * 查询条件对应 FIND_RECORD_VIDEO_TALK_LOG_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_VIDEO_TALK_LOG 结构体
+         */
+        public static final int NET_RECORD_VIDEOTALKLOG = 9;
+
+        /**
+         * 状态记录
+         * 查询条件对应 FIND_RECORD_REGISTER_USER_STATE_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_REGISTER_USER_STATE 结构体
+         */
+        public static final int NET_RECORD_REGISTERUSERSTATE = 10;
+
+        /**
+         * 联系人记录
+         * 查询条件对应 FIND_RECORD_VIDEO_TALK_CONTACT_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_VIDEO_TALK_CONTACT 结构体
+         */
+        public static final int NET_RECORD_VIDEOTALKCONTACT = 11;
+
+        /**
+         * 公告记录
+         * 查询条件对应 FIND_RECORD_ANNOUNCEMENT_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_ANNOUNCEMENT_INFO 结构体
+         */
+        public static final int NET_RECORD_ANNOUNCEMENT = 12;
+
+        /**
+         * 报警记录
+         * 查询条件对应 FIND_RECORD_ALARMRECORD_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_ALARMRECORD_INFO 结构体
+         */
+        public static final int NET_RECORD_ALARMRECORD = 13;
+
+        /**
+         * 下发商品记录
+         * 查询条件对应 FIND_RECORD_COMMODITY_NOTICE_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_COMMODITY_NOTICE 结构体
+         */
+        public static final int NET_RECORD_COMMODITYNOTICE = 14;
+
+        /**
+         * 就诊信息记录
+         * 查询条件对应 FIND_RECORD_HEALTH_CARE_NOTICE_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_HEALTH_CARE_NOTICE 结构体
+         */
+        public static final int NET_RECORD_HEALTHCARENOTICE = 15;
+
+        /**
+         * 门禁出入记录(可选择部分条件查询,建议替代NET_RECORD_ACCESSCTLCARDREC)
+         * 查询条件对应 FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX 结构体
+         * 记录信息对应 NET_RECORDSET_ACCESS_CTL_CARDREC 结构体
+         */
+        public static final int NET_RECORD_ACCESSCTLCARDREC_EX = 16;
+
+        /**
+         * GPS位置信息记录, 只实现import和clear
+         * 记录信息对应 NET_RECORD_GPS_LOCATION_INFO 结构体
+         */
+        public static final int NET_RECORD_GPS_LOCATION = 17;
+
+        /**
+         * 公租房租户信息
+         * 查询条件对应 FIND_RECORD_RESIDENT_CONDTION结构体
+         * 记录信息对应 NET_RECORD_RESIDENT_INFO 结构体
+         */
+        public static final int NET_RECORD_RESIDENT = 18;
+
+        /**
+         * 监测量数据记录
+         * 查询条件对应 FIND_RECORD_SENSORRECORD_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_SENSOR_RECORD 结构体
+         */
+        public static final int NET_RECORD_SENSORRECORD = 19;
+
+        /**
+         * 开门二维码记录集
+         * 记录信息对应 NET_RECORD_ACCESSQRCODE_INFO结构体
+         */
+        public static final int NET_RECORD_ACCESSQRCODE = 20;
+
+        /**
+         * 电子车牌查询
+         * 查询条件对应FIND_RECORD_ELECTRONICSTAG_CONDITION 结构体
+         * 记录信息对应NET_RECORD_ELECTRONICSTAG_INFO 结构体
+         */
+        public static final int NET_RECORD_ELECTRONICSTAG = 21;
+
+        /**
+         * 蓝牙开门记录集
+         * 查询条件对应 FIND_RECORD_ACCESS_BLUETOOTH_INFO_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_ACCESS_BLUETOOTH_INFO 结构体
+         */
+        public static final int NET_RECORD_ACCESS_BLUETOOTH = 22;
+
+        /**
+         * 门禁报警记录集
+         * 查询条件对应 FIND_NET_RECORD_ACCESS_ALARMRECORD_INFO_CONDITION 结构体
+         * 记录信息对应 NET_RECORD_ACCESS_ALARMRECORD_INFO 结构体
+         */
+        public static final int NET_RECORD_ACCESS_ALARMRECORD = 23;
+    }
+
+    /**
+     * 门禁卡用户ID最大长度
+     */
+    int DH_MAX_USERID_LEN = 32;
+
+    /**
+     * 门禁卡号最大长度
+     */
+    int DH_MAX_CARDNO_LEN = 32;
+
+    /**
+     * 门禁卡记录查询条件
+     */
+    @Structure.FieldOrder({"dwSize", "szCardNo", "szUserID", "bIsValid", "abCardNo", "abUserID", "abIsValid"})
+    class FIND_RECORD_ACCESSCTLCARD_CONDITION extends Structure {
+        public int dwSize;
+        /**
+         * 卡号
+         */
+        public byte[] szCardNo = new byte[DH_MAX_CARDNO_LEN];
+        /**
+         * 用户ID
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
+        /**
+         * 是否有效, TRUE:有效,FALSE:无效
+         */
+        public boolean bIsValid;
+        /**
+         * 卡号查询条件是否有效,针对成员 szCardNo
+         */
+        public boolean abCardNo;
+        /**
+         * 用户ID查询条件是否有效,针对成员 szUserID
+         */
+        public boolean abUserID;
+        /**
+         * IsValid查询条件是否有效,针对成员 bIsValid
+         */
+        public boolean abIsValid;
+
+        public FIND_RECORD_ACCESSCTLCARD_CONDITION() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 卡状态
+     */
+    class NET_ACCESSCTLCARD_STATE {
+        public static final int NET_ACCESSCTLCARD_STATE_UNKNOWN = -1;
+        /**
+         * 正常
+         */
+        public static final int NET_ACCESSCTLCARD_STATE_NORMAL = 0;
+        /**
+         * 挂失
+         */
+        public static final int NET_ACCESSCTLCARD_STATE_LOSE = 0x01;
+        /**
+         * 注销
+         */
+        public static final int NET_ACCESSCTLCARD_STATE_LOGOFF = 0x02;
+        /**
+         * 冻结
+         */
+        public static final int NET_ACCESSCTLCARD_STATE_FREEZE = 0x04;
+        /**
+         * 欠费
+         */
+        public static final int NET_ACCESSCTLCARD_STATE_ARREARAGE = 0x08;
+        /**
+         * 逾期
+         */
+        public static final int NET_ACCESSCTLCARD_STATE_OVERDUE = 0x10;
+        /**
+         * 预欠费(还是可以开门,但有语音提示)
+         */
+        public static final int NET_ACCESSCTLCARD_STATE_PREARREARAGE = 0x20;
+    }
+
+    /**
+     * 最大门禁密码长度
+     */
+    int DH_MAX_CARDPWD_LEN = 64;
+
+    /**
+     * 最大有权限门禁数目
+     */
+    int DH_MAX_DOOR_NUM = 32;
+
+    /**
+     * 最大有效时间段数目
+     */
+    int DH_MAX_TIMESECTION_NUM = 32;
+
+    /**
+     * 门禁卡命名最大长度
+     */
+    int DH_MAX_CARDNAME_LEN = 64;
+
+    /**
+     * 最大指纹个数
+     */
+    int MAX_FINGERPRINT_NUM = 10;
+
+    /**
+     * 指纹数据,只用于下发信息
+     */
+    @Structure.FieldOrder({"dwSize", "nLength", "nCount", "pPacketData"})
+    class NET_ACCESSCTLCARD_FINGERPRINT_PACKET extends Structure {
+        public int dwSize;
+        /**
+         * 单个数据包长度,单位字节
+         */
+        public int nLength;
+        /**
+         * 包个数
+         */
+        public int nCount;
+        /**
+         * 所有指纹数据包,用户申请内存并填充,长度为 nLength*nCount
+         */
+        public Pointer pPacketData;
+
+        public NET_ACCESSCTLCARD_FINGERPRINT_PACKET() {
+            this.dwSize = size();
+        }
+    }
+
+    /**
+     * 指纹数据扩展,可用于下发和获取信息
+     */
+    @Structure.FieldOrder({"nLength", "nCount", "pPacketData", "nPacketLen", "nRealPacketLen", "nDuressIndex",
+            "byReverseed"})
+    class NET_ACCESSCTLCARD_FINGERPRINT_PACKET_EX extends Structure {
+        /**
+         * 单个数据包长度,单位字节
+         */
+        public int nLength;
+        /**
+         * 包个数
+         */
+        public int nCount;
+        /**
+         * 所有指纹数据包, 用户申请内存,大小至少为nLength * nCount
+         */
+        public Pointer pPacketData;
+        /**
+         * pPacketData 指向内存区的大小,用户填写
+         */
+        public int nPacketLen;
+        /**
+         * 返回给用户实际指纹总大小
+         */
+        public int nRealPacketLen;
+        /**
+         * 胁迫指纹序号,范围1~nCount
+         */
+        public int nDuressIndex;
+        /**
+         * 保留大小
+         */
+        public byte[] byReverseed = new byte[1020];
+    }
+
+    /**
+     * 人脸模版最大个数
+     */
+    int MAX_FACE_DATA_NUM = 20;
+    /**
+     * 人脸模版数据最大长度
+     */
+    int MAX_FACE_DATA_LEN = 2048;
+    /**
+     * 反潜路径个数
+     */
+    int MAX_REPEATENTERROUTE_NUM = 12;
+    /**
+     * 最大门数量
+     */
+    int MAX_ACCESSDOOR_NUM = 128;
+    /**
+     * 最大楼层数量
+     */
+    int MAX_ACCESS_FLOOR_NUM = 64;
+
+    /**
+     * 门禁卡记录集信息
+     */
+    @Structure.FieldOrder({"dwSize", "nRecNo", "stuCreateTime", "szCardNo", "szUserID", "emStatus", "emType", "szPsw",
+            "nDoorNum", "sznDoors", "nTimeSectionNum", "sznTimeSectionNo", "nUserTime", "stuValidStartTime",
+            "stuValidEndTime", "bIsValid", "stuFingerPrintInfo", "bFirstEnter", "szCardName", "szVTOPosition",
+            "bHandicap", "bEnableExtended", "stuFingerPrintInfoEx", "nFaceDataNum", "szFaceData", "szDynamicCheckCode",
+            "nRepeatEnterRouteNum", "arRepeatEnterRoute", "nRepeatEnterRouteTimeout", "bNewDoor", "nNewDoorNum",
+            "nNewDoors", "nNewTimeSectionNum", "nNewTimeSectionNo", "szCitizenIDNo", "nSpecialDaysScheduleNum",
+            "arSpecialDaysSchedule", "nUserType", "nFloorNum", "szFloorNo"
+    })
+    class NET_RECORDSET_ACCESS_CTL_CARD extends Structure {
+        public int dwSize;
+        /**
+         * 记录集编号,只读
+         */
+        public int nRecNo;
+        /**
+         * 创建时间
+         */
+        public NET_TIME stuCreateTime;
+        /**
+         * 卡号
+         */
+        public byte[] szCardNo = new byte[DH_MAX_CARDNO_LEN];
+        /**
+         * 用户ID, 设备暂不支持
+         */
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
         /**
-         * 赋值为结构体大小,即sizeof(NET_IN_OPERATE_FACERECONGNITIONDB)
+         * 卡状态
+         *
+         * @see NET_ACCESSCTLCARD_STATE
          */
-        public int dwSize;
+        public int emStatus;
         /**
-         * 操作类型
-         * <p>EM_OPERATE_FACERECONGNITIONDB_TYPE</p>
+         * 卡类型
+         *
+         * @see NET_ACCESSCTLCARD_TYPE
          */
-        public int emOperateType;
+        public int emType;
         /**
-         * 人员信息
+         * 卡密码
          */
-        public FACERECOGNITION_PERSON_INFO stPersonInfo;
+        public byte[] szPsw = new byte[DH_MAX_CARDPWD_LEN];
         /**
-         * 缓冲地址
+         * 有效的门数目
          */
-        public Pointer pBuffer;
+        public int nDoorNum;
         /**
-         * 缓冲数据长度
+         * 有权限的门序号,即CFG_CMD_ACCESS_EVENT配置的数组下标
          */
-        public int nBufferLen;
-
-        public NET_IN_OPERATE_FACERECONGNITIONDB() {
-            this.dwSize = this.size();
-        }
-
-        @Override
-        protected List<String> getFieldOrder() {
-            return Collections.unmodifiableList(Arrays.asList("dwSize", "emOperateType", "nBufferLen", "pBuffer",
-                    "stPersonInfo"));
-        }
-    }
-
-    /**
-     * 人员信息
-     */
-    class FACERECOGNITION_PERSON_INFO extends Structure {
+        public int[] sznDoors = new int[DH_MAX_DOOR_NUM];
         /**
-         * 姓名
-         *
-         * @deprecated
+         * 有效的的开门时间段数目
          */
-        public byte[] szPersonName = new byte[DH_MAX_NAME_LEN];
+        public int nTimeSectionNum;
         /**
-         * 出生年,作为查询条件时,此参数填0,则表示此参数无效
+         * 开门时间段索引,即CFG_ACCESS_TIMESCHEDULE_INFO的数组下标
          */
-        public short wYear;
+        public int[] sznTimeSectionNo = new int[DH_MAX_TIMESECTION_NUM];
         /**
-         * 出生月,作为查询条件时,此参数填0,则表示此参数无效
+         * 使用次数,仅当来宾卡时有效
          */
-        public byte byMonth;
+        public int nUserTime;
         /**
-         * 出生日,作为查询条件时,此参数填0,则表示此参数无效
+         * 开始有效期, 设备暂不支持时分秒
          */
-        public byte byDay;
+        public NET_TIME stuValidStartTime;
         /**
-         * 人员唯一标示(身份证号码,工号,或其他编号)
+         * 结束有效期, 设备暂不支持时分秒
          */
-        public byte[] szID = new byte[DH_MAX_PERSON_ID_LEN];
+        public NET_TIME stuValidEndTime;
         /**
-         * 人员重要等级,1~10,数值越高越重要,作为查询条件时,此参数填0,则表示此参数无效
+         * 是否有效,TRUE有效;FALSE无效
          */
-        public byte bImportantRank;
+        public boolean bIsValid;
         /**
-         * 性别,1-男,2-女,作为查询条件时,此参数填0,则表示此参数无效
+         * 下发指纹数据信息,仅为兼容性保留,请使用 stuFingerPrintInfoEx
          */
-        public byte bySex;
+        public NET_ACCESSCTLCARD_FINGERPRINT_PACKET stuFingerPrintInfo;
         /**
-         * 图片张数
+         * 是否拥有首卡权限
          */
-        public short wFacePicNum;
+        public boolean bFirstEnter;
         /**
-         * 当前人员对应的图片信息
+         * 卡命名
          */
-        public DH_PIC_INFO[] szFacePicInfo = (DH_PIC_INFO[]) new DH_PIC_INFO().toArray(DH_MAX_PERSON_IMAGE_NUM);
+        public byte[] szCardName = new byte[DH_MAX_CARDNAME_LEN];
         /**
-         * 人员类型
-         *
-         * @see PersonType
+         * 门口机关联位置
          */
-        public byte byType;
+        public byte[] szVTOPosition = new byte[DH_COMMON_STRING_64];
         /**
-         * 证件类型
-         *
-         * @see CertificateType
+         * 是否为残疾人卡
          */
-        public byte byIDType;
+        public boolean bHandicap;
         /**
-         * 字节对齐
+         * 启用成员 stuFingerPrintInfoEx
          */
-        public byte[] bReserved1 = new byte[2];
+        public boolean bEnableExtended;
         /**
-         * 省份
+         * 指纹数据信息
          */
-        public byte[] szProvince = new byte[DH_MAX_PROVINCE_NAME_LEN];
+        public NET_ACCESSCTLCARD_FINGERPRINT_PACKET_EX stuFingerPrintInfoEx;
         /**
-         * 城市
+         * 人脸数据个数不超过20
          */
-        public byte[] szCity = new byte[DH_MAX_CITY_NAME_LEN];
+        public int nFaceDataNum;
         /**
-         * 姓名(因存在姓名过长,16字节无法存放问题,故增加此参数)
+         * 人脸模版数据
          */
-        public byte[] szPersonNameEx = new byte[DH_MAX_PERSON_NAME_LEN];
+        public byte[] szFaceData = new byte[MAX_FACE_DATA_NUM * MAX_FACE_DATA_LEN];
         /**
-         * 保留字段
+         * 动态校验码
+         * <p>
+         * VTO等设备会保存此校验码,以后每次刷卡都以一定的算法生成新校验码并写入IC卡中,同时更新VTO设备的校验码,只有卡号和此校验码同时验证通过时才可开门。
+         * 缺点:目前方案只支持一卡刷一个设备。
+         * </p>
          */
-        public byte[] bReserved = new byte[60];
-
-        @Override
-        protected List<String> getFieldOrder() {
-            return Collections.unmodifiableList(Arrays.asList("bImportantRank", "bReserved", "bReserved1",
-                    "byDay", "byIDType", "byMonth", "bySex", "byType", "szCity", "szFacePicInfo", "szID",
-                    "szPersonName", "szPersonNameEx", "szProvince", "wFacePicNum", "wYear"));
-        }
-    }
-
-    /**
-     * 图片文件信息
-     */
-    class DH_PIC_INFO extends Structure {
+        public byte[] szDynamicCheckCode = new byte[MAX_COMMON_STRING_16];
         /**
-         * 文件在二进制数据块中的偏移位置, 单位:字节
+         * 反潜路径个数
          */
-        public int dwOffSet;
+        public int nRepeatEnterRouteNum;
         /**
-         * 文件大小, 单位:字节
+         * 反潜路径
          */
-        public int dwFileLenth;
+        public int[] arRepeatEnterRoute = new int[MAX_REPEATENTERROUTE_NUM];
         /**
-         * 图片宽度, 单位:像素
+         * 反潜超时时间
          */
-        public short wWidth;
+        public int nRepeatEnterRouteTimeout;
         /**
-         * 图片高度, 单位:像素
+         * 是否启动新开门授权字段,TRUE表示使用nNewDoorNum和nNewDoors字段下发开门权限
          */
-        public short wHeight;
+        public boolean bNewDoor;
         /**
-         * 保留字节
+         * 有效的门数目
+         */
+        public int nNewDoorNum;
+        /**
+         * 有权限的门序号,即CFG_CMD_ACCESS_EVENT配置的数组下标
+         */
+        public int[] nNewDoors = new int[MAX_ACCESSDOOR_NUM];
+        /**
+         * 有效的的开门时间段数目
+         */
+        public int nNewTimeSectionNum;
+        /**
+         * 开门时间段索引,即CFG_ACCESS_TIMESCHEDULE_INFO的数组下标
+         */
+        public int[] nNewTimeSectionNo = new int[MAX_ACCESSDOOR_NUM];
+        /**
+         * 身份证号码
+         */
+        public byte[] szCitizenIDNo = new byte[MAX_COMMON_STRING_32];
+        /**
+         * 假日计划表示数量
+         */
+        public int nSpecialDaysScheduleNum;
+        /**
+         * 假日计划标识
+         */
+        public int[] arSpecialDaysSchedule = new int[MAX_ACCESSDOOR_NUM];
+        /**
+         * 用户类型, 0 普通用户, 1 黑名单用户
+         */
+        public int nUserType;
+        /**
+         * 有效的楼层数量
+         */
+        public int nFloorNum;
+        /**
+         * 楼层号
          */
-        public byte[] bReserved = new byte[7];
+        public byte[] szFloorNo = new byte[MAX_ACCESS_FLOOR_NUM * DH_COMMON_STRING_4];
 
-        @Override
-        protected List<String> getFieldOrder() {
-            return Collections.unmodifiableList(Arrays.asList("bReserved", "dwFileLenth", "dwOffSet", "wHeight", "wWidth"));
+        public NET_RECORDSET_ACCESS_CTL_CARD() {
+            this.dwSize = size();
         }
     }
 
     /**
-     * CLIENT_OperateFaceRecognitionDB接口输出参数
+     * CLIENT_FindRecord接口输入参数
      */
-    class NET_OUT_OPERATE_FACERECONGNITIONDB extends Structure {
+    @Structure.FieldOrder({"dwSize", "emType", "pQueryCondition"})
+    class NET_IN_FIND_RECORD_PARAM extends Structure {
         public int dwSize;
+        /**
+         * 待查询记录类型
+         *
+         * @see EM_NET_RECORD_TYPE
+         */
+        public int emType;
+        /**
+         * 查询类型对应的查询条件
+         * 由用户申请内存,根据查询记录类型,找到查询条件对应的结构体,进而确定内存大小
+         */
+        public Pointer pQueryCondition;
 
-        public NET_OUT_OPERATE_FACERECONGNITIONDB() {
-            this.dwSize = this.size();
-        }
-
-        @Override
-        protected List<String> getFieldOrder() {
-            return Collections.unmodifiableList(Arrays.asList("dwSize"));
+        public NET_IN_FIND_RECORD_PARAM() {
+            this.dwSize = size();
         }
     }
 
     /**
-     * CLIENT_DoFindFaceRecognition 接口输入参数
+     * LIENT_FindRecord接口输出参数
      */
-    class NET_IN_DOFIND_FACERECONGNITION extends Structure {
+    @Structure.FieldOrder({"dwSize", "lFindeHandle"})
+    class NET_OUT_FIND_RECORD_PARAM extends Structure {
         public int dwSize;
         /**
-         * 查询句柄
-         */
-        public LLong lFindHandle;
-        /**
-         * 查询起始序号
+         * 查询记录句柄,唯一标识某次查询
          */
-        public int nBeginNum;
-        /**
-         * 当前想查询的记录条数
-         */
-        public int nCount;
+        public LLong lFindeHandle;
 
-        public NET_IN_DOFIND_FACERECONGNITION() {
-            this.dwSize = this.size();
+        public NET_OUT_FIND_RECORD_PARAM() {
+            this.dwSize = size();
         }
     }
 
     /**
-     * CLIENT_DoFindFaceRecognition接口输出参数
+     * 按查询条件查询记录,pInParam与pOutParam内存由用户申请释放
+     *
+     * @param lLoginID  登录句柄
+     * @param pInParam  输入参数
+     * @param pOutParam 输出参数
+     * @param waittime  等待时间
+     * @return
+     * @see NET_IN_FIND_RECORD_PARAM
+     * @see NET_OUT_FIND_RECORD_PARAM
+     */
+    boolean CLIENT_FindRecord(NativeLong lLoginID, NET_IN_FIND_RECORD_PARAM pInParam,
+                              NET_OUT_FIND_RECORD_PARAM pOutParam, int waittime);
+
+
+    /**
+     * CLIENT_FindNextRecord接口输入参数
      */
-    class NET_OUT_DOFIND_FACERECONGNITION extends Structure {
+    @Structure.FieldOrder({"dwSize", "lFindeHandle", "nFileCount"})
+    class NET_IN_FIND_NEXT_RECORD_PARAM extends Structure {
         public int dwSize;
         /**
-         * 实际返回的候选信息结构体个数
-         */
-        public int nCadidateNum;
-        /**
-         * 候选信息数组
-         */
-        public CANDIDATE_INFO[] stCadidateInfo = (CANDIDATE_INFO[]) new CANDIDATE_INFO().toArray(MAX_FIND_COUNT);
-        /**
-         * 缓冲地址
+         * 查询句柄,由CLIENT_FindRecord输出
          */
-        public Pointer pBuffer;
+        public LLong lFindeHandle;
         /**
-         * 缓冲数据长度
+         * 当前想查询的记录条数
          */
-        public int nBufferLen;
+        public int nFileCount;
 
-        public NET_OUT_DOFIND_FACERECONGNITION() {
-            this.dwSize = this.size();
+        public NET_IN_FIND_NEXT_RECORD_PARAM() {
+            this.dwSize = size();
         }
     }
 
     /**
-     * 候选人员信息
+     * CLIENT_FindNextRecord接口输出参数
      */
-    class CANDIDATE_INFO extends Structure {
-        /**
-         * 人员信息
-         */
-        public FACERECOGNITION_PERSON_INFO stPersonInfo;
-        /**
-         * 和查询图片的相似度,百分比表示,1~100
-         */
-        public byte bySimilarity;
+    @Structure.FieldOrder({"dwSize", "pRecordList", "nMaxRecordNum", "nRetRecordNum"})
+    class NET_OUT_FIND_NEXT_RECORD_PARAM extends Structure {
+        public int dwSize;
         /**
-         * 人员所属数据库范围
+         * 记录列表,用户分配内存,根据NET_IN_FIND_RECORD_PARAM中的查询类型EM_NET_RECORD_TYPE,确定对应结构体,进入确定内存大小
          *
-         * @see FaceDbType
-         */
-        public byte byRange;
-        public byte[] byReserved1 = new byte[2];
-        /**
-         * 当byRange为历史数据库时有效,表示查询人员出现的时间
+         * @see EM_NET_RECORD_TYPE
          */
-        public NET_TIME stTime;
+        public Pointer pRecordList;
         /**
-         * 当byRange为历史数据库时有效,表示查询人员出现的地点
+         * 最大查询列表记录数
          */
-        public byte[] szAddress = new byte[MAX_PATH];
+        public int nMaxRecordNum;
         /**
-         * 保留字节
+         * 查询到的记录条数,当查询到的条数小于想查询的条数时,查询结束
          */
-        public byte[] byReserved = new byte[128];
+        public int nRetRecordNum;
+
+        public NET_OUT_FIND_NEXT_RECORD_PARAM() {
+            this.dwSize = size();
+        }
     }
 
     /**
-     * 时间
+     * 查找记录:nFilecount:需要查询的条数, 返回值为媒体文件条数 返回值<nFilecount则相应时间段内的文件查询完毕,pInParam与pOutParam内存由用户申请释放
+     *
+     * @param pInParam  输入参数
+     * @param pOutParam 输出参数
+     * @param waittime  等待时间
+     * @return
+     * @see NET_IN_FIND_NEXT_RECORD_PARAM
+     * @see NET_OUT_FIND_NEXT_RECORD_PARAM
      */
-    class NET_TIME extends Structure {
-        /**
-         * 年
-         */
-        public int dwYear;
-        /**
-         * 月
-         */
-        public int dwMonth;
-        /**
-         * 日
-         */
-        public int dwDay;
-        /**
-         * 时
-         */
-        public int dwHour;
-        /**
-         * 分
-         */
-        public int dwMinute;
+    int CLIENT_FindNextRecord(NET_IN_FIND_NEXT_RECORD_PARAM pInParam,
+                              NET_OUT_FIND_NEXT_RECORD_PARAM pOutParam, int waittime);
+
+    /**
+     * CLIENT_QueryRecordCount接口输入参数
+     */
+    @Structure.FieldOrder({"dwSize", "lFindeHandle"})
+    class NET_IN_QUEYT_RECORD_COUNT_PARAM extends Structure {
+        public int dwSize;
         /**
-         * 秒
+         * 查询句柄
          */
-        public int dwSecond;
+        public LLong lFindeHandle;
 
-        public NET_TIME() {
-            this.dwYear = 0;
-            this.dwMonth = 0;
-            this.dwDay = 0;
-            this.dwHour = 0;
-            this.dwMinute = 0;
-            this.dwSecond = 0;
+        public NET_IN_QUEYT_RECORD_COUNT_PARAM() {
+            this.dwSize = size();
         }
+    }
 
-        public void setTime(int year, int month, int day, int hour, int minute, int second) {
-            this.dwYear = year;
-            this.dwMonth = month;
-            this.dwDay = day;
-            this.dwHour = hour;
-            this.dwMinute = minute;
-            this.dwSecond = second;
-        }
+    /**
+     * CLIENT_QueryRecordCount接口输出参数
+     */
+    @Structure.FieldOrder({"dwSize", "nRecordCount"})
+    class NET_OUT_QUEYT_RECORD_COUNT_PARAM extends Structure {
+        public int dwSize;
+        /**
+         * 设备返回的记录条数
+         */
+        public int nRecordCount;
 
-        public NET_TIME(NET_TIME other) {
-            this.dwYear = other.dwYear;
-            this.dwMonth = other.dwMonth;
-            this.dwDay = other.dwDay;
-            this.dwHour = other.dwHour;
-            this.dwMinute = other.dwMinute;
-            this.dwSecond = other.dwSecond;
+        public NET_OUT_QUEYT_RECORD_COUNT_PARAM() {
+            this.dwSize = size();
         }
+    }
 
-        public String toStringTime() {
-            return String.format("%02d/%02d/%02d %02d:%02d:%02d", dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond);
-        }
+    /**
+     * 查找记录条数
+     *
+     * @param pInParam  输入参数
+     * @param pOutParam 输出参数
+     * @param waittime  等待时间
+     * @return
+     * @see NET_IN_QUEYT_RECORD_COUNT_PARAM
+     * @see NET_OUT_QUEYT_RECORD_COUNT_PARAM
+     */
+    boolean CLIENT_QueryRecordCount(NET_IN_QUEYT_RECORD_COUNT_PARAM pInParam,
+                                    NET_OUT_QUEYT_RECORD_COUNT_PARAM pOutParam, int waittime);
 
-        @Override
-        public String toString() {
-            return String.format("%02d%02d%02d%02d%02d%02d", dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond);
-        }
-    }
+    /**
+     * 结束记录查找
+     *
+     * @param lFindHandle 查询句柄
+     * @return
+     */
+    boolean CLIENT_FindRecordClose(NativeLong lFindHandle);
+
+    /*******************人脸采集*******************/
 
     /**
-     * CLIENT_StartFindFaceRecognition接口输入参数
+     * CLIENT_AttachPersonInfoCollect 入参
      */
-    class NET_IN_STARTFIND_FACERECONGNITION extends Structure {
+    @Structure.FieldOrder({"dwSize", "dwWaitTime", "cbNotifyPersonInfo", "dwUser"})
+    class NET_IN_ATTACH_PERSONINFOCOLLECT extends Structure {
         public int dwSize;
         /**
-         * 人员信息查询条件是否有效,取值0或1
-         */
-        public int bPersonEnable;
-        /**
-         * 人员信息查询条件
+         * 接口超时等待时间
          */
-        public FACERECOGNITION_PERSON_INFO stPerson;
+        public int dwWaitTime;
         /**
-         * 人脸匹配选项
+         * 回调函数
          */
-        public NET_FACE_MATCH_OPTIONS stMatchOptions;
+        public fNotifyPersonInfo cbNotifyPersonInfo;
         /**
-         * 查询过滤条件
+         * 用户自定义参数
          */
-        public NET_FACE_FILTER_CONDTION stFilterInfo;
-        /**
-         * 缓冲地址
-         */
-        public Pointer pBuffer;
-        /**
-         * 缓冲数据长度
-         */
-        public int nBufferLen;
+        public LLong dwUser;
 
-        public NET_IN_STARTFIND_FACERECONGNITION() {
-            this.dwSize = this.size();
+        public NET_IN_ATTACH_PERSONINFOCOLLECT() {
+            this.dwSize = size();
         }
     }
 
     /**
-     * 人脸匹配选项
+     * 指纹信息
      */
-    class NET_FACE_MATCH_OPTIONS extends Structure {
-        public int dwSize;
+    @Structure.FieldOrder({"nIndex", "szFingerprintData", "bReserved"})
+    class NET_CB_FINGERPRINT_INFO extends Structure {
         /**
-         * 人员重要等级 1~10,数值越高越重要,(查询重要等级大于等于此等级的人员)
+         * 指纹索引号,从左手小指依次到右手小指为0到9
          */
-        public int nMatchImportant;
+        public int nIndex;
         /**
-         * 人脸比对模式
-         *
-         * @see FaceCompareMode
+         * 指纹数据,经过Base64后的字符串
          */
-        public int emMode;
+        public byte[] szFingerprintData = new byte[DH_COMMON_STRING_2048];
+        public byte[] bReserved = new byte[256];
+    }
+
+    /**
+     * 回调函数中人脸信息
+     */
+    @Structure.FieldOrder({"nSID", "nPicLength", "szUserID", "nRetFaceDataNum", "szFaceData", "szPassword",
+            "szCardNo", "szCardName", "nFingerPrintNum", "stuFingerPrintInfo", "bReserved"})
+    class NET_CB_PERSON_INFO extends Structure {
         /**
-         * 人脸区域个数
+         * 服务器订阅ID号
          */
-        public int nAreaNum;
+        public int nSID;
         /**
-         * 人脸区域组合, emMode为NET_FACE_COMPARE_MODE_AREA时有效, 数组元素取FaceArea中的值
-         *
-         * @see FaceAreaType
+         * 采集的人员图片长度
          */
-        public int[] szAreas = new int[MAX_FACE_AREA_NUM];
+        public int nPicLength;
         /**
-         * 识别精度(取值1~10,随着值增大,检测精度提高,检测速度下降。最小值为1 表示检测速度优先,最大值为10表示检测精度优先。 暂时只对人脸检测有效)
+         * 用户ID
          */
-        public int nAccuracy;
+        public byte[] szUserID = new byte[DH_MAX_USERID_LEN];
         /**
-         * 相似度(必须大于该相识度才报告;百分比表示,1~100)
+         * 返回的人脸模版数据个数
          */
-        public int nSimilarity;
+        public int nRetFaceDataNum;
         /**
-         * 报告的最大候选个数(根据相似度进行排序,取相似度最大的候选人数报告)
+         * 人脸数据
          */
-        public int nMaxCandidate;
-
-        public NET_FACE_MATCH_OPTIONS() {
-            this.dwSize = this.size();
-        }
-    }
-
-    /**
-     * 查询过滤条件
-     */
-    class NET_FACE_FILTER_CONDTION extends Structure {
-        public int dwSize;
+        public byte[] szFaceData = new byte[MAX_FACE_DATA_NUM * MAX_FACE_DATA_LEN];
         /**
-         * 开始时间
+         * 卡密码
          */
-        public NET_TIME stStartTime;
+        public byte[] szPassword = new byte[DH_COMMON_STRING_64];
         /**
-         * 结束时间
+         * 卡号
          */
-        public NET_TIME stEndTime;
+        public byte[] szCardNo = new byte[DH_MAX_CARDNO_LEN];
         /**
-         * 地点,支持模糊匹配
+         * 卡命名
          */
-        public byte[] szMachineAddress = new byte[MAX_PATH];
+        public byte[] szCardName = new byte[DH_COMMON_STRING_32];
         /**
-         * 实际数据库个数
+         * 返回指纹个数
          */
-        public int nRangeNum;
+        public int nFingerPrintNum;
         /**
-         * 待查询数据库类型
-         *
-         * @see FaceDbType
+         * 指纹信息
          */
-        public byte[] szRange = new byte[MAX_FACE_DB_NUM];
+        public NET_CB_FINGERPRINT_INFO[] stuFingerPrintInfo = new NET_CB_FINGERPRINT_INFO[MAX_FINGERPRINT_NUM];
+        public byte[] bReserved = new byte[2048];
+    }
+
+    /**
+     * 人脸信息采集回调函数
+     */
+    interface fNotifyPersonInfo extends StdCallLibrary.StdCallCallback {
         /**
-         * 待查询人脸类型
+         * 执行回调函数
          *
-         * @see FaceRecognitionFaceType
+         * @param lLoginID
+         * @param lPersonHandle
+         * @param pstuPersonInfo
+         * @param pBuffer
+         * @param dwBufSize
+         * @param dwUser
+         * @param reserved
          */
-        public int emFaceType;
+        void invoke(NativeLong lLoginID, NativeLong lPersonHandle, NET_CB_PERSON_INFO pstuPersonInfo,
+                    String pBuffer, int dwBufSize, NativeLong dwUser, Pointer reserved);
+    }
 
-        public NET_FACE_FILTER_CONDTION() {
-            this.dwSize = this.size();
+    /**
+     * CLIENT_AttachPersonInfoCollect 出参
+     */
+    @Structure.FieldOrder("dwSize")
+    class NET_OUT_ATTACH_PERSONINFOCOLLECT extends Structure {
+        public int dwSize;
+
+        public NET_OUT_ATTACH_PERSONINFOCOLLECT() {
+            this.dwSize = size();
         }
     }
 
     /**
-     * CLIENT_StartFindFaceRecognition接口输出参数
+     * 订阅人脸信息采集
+     *
+     * @param lLoginID     登录句柄
+     * @param pstuInParam  输入参数,带有回调函数等信息
+     * @param pstuOutParam 输出参数
+     * @return 订阅句柄,用于detach操作
+     */
+    NativeLong CLIENT_AttachPersonInfoCollect(NativeLong lLoginID, NET_IN_ATTACH_PERSONINFOCOLLECT pstuInParam,
+                                              NET_OUT_ATTACH_PERSONINFOCOLLECT pstuOutParam);
+
+    /**
+     * CLIENT_DetachPersonInfoColloect 入参
      */
-    class NET_OUT_STARTFIND_FACERECONGNITION extends Structure {
+    @Structure.FieldOrder({"dwSize", "dwWaitTime", "lPersonHandle"})
+    class NET_IN_DETACH_PERSONINFOCOLLECT extends Structure {
         public int dwSize;
         /**
-         * 返回的符合查询条件的记录个数
+         * 接口超时等待时间
          */
-        public int nTotalCount;
+        public int dwWaitTime;
         /**
-         * 查询句柄
+         * CLIENT_AttachPersonInfoCollect 返回的句柄
          */
-        public LLong lFindHandle;
+        public NativeLong lPersonHandle;
 
-        public NET_OUT_STARTFIND_FACERECONGNITION() {
-            this.dwSize = this.size();
+        public NET_IN_DETACH_PERSONINFOCOLLECT() {
+            this.dwSize = size();
         }
     }
 
     /**
-     * CLIENT_DetectFace接口输入参数
+     * CLIENT_DetachPersonInfoColloect 出参
      */
-    class NET_IN_DETECT_FACE extends Structure {
+    @Structure.FieldOrder("dwSize")
+    class NET_OUT_DETACH_PERSONINFOCOLLECT extends Structure {
         public int dwSize;
-        /**
-         * 大图信息
-         */
-        public DH_PIC_INFO stPicInfo;
-        /**
-         * 缓冲地址
-         */
-        public Pointer pBuffer;
-        /**
-         * 缓冲数据长度
-         */
-        public int nBufferLen;
 
-        public NET_IN_DETECT_FACE() {
-            this.dwSize = this.size();
+        public NET_OUT_DETACH_PERSONINFOCOLLECT() {
+            this.dwSize = size();
         }
     }
 
     /**
-     * CLIENT_DetectFace接口输出参数
+     * 取消订阅人脸信息采集
+     *
+     * @param pstuInParam  取消订阅输入参数,其中lPersonHandle为CLIENT_AttachPersonInfoCollect返回的句柄
+     * @param pstuOutParam
+     * @return TRUE 成功FALSE 失败
      */
-    class NET_OUT_DETECT_FACE extends Structure {
-        public int dwSize;
+    boolean CLIENT_DetachPersonInfoColloect(NET_IN_DETACH_PERSONINFOCOLLECT pstuInParam,
+                                            NET_OUT_DETACH_PERSONINFOCOLLECT pstuOutParam);
+
+    /*******************门禁卡管理*******************/
+
+    /**
+     * 批量下发门禁控制卡
+     *
+     * @param lLoginID     登录句柄
+     * @param nInsertCount 下发卡片数量,不大于 20
+     * @param pInsertCards 需要下发的卡片信息,指向用户分配并填充的 NET_RECORDSET_ACCESS_CTL_CARD 结构体缓存,个数为 nInsertCount
+     * @param pRecNo       下发后的记录编号,与 pInsertCards 一一对应,-1 表示该项插入失败,指向用户分配的 int 缓存,个数为 nInsertCount
+     * @param reserved
+     * @param nWaitTime    等待时间
+     * @return
+     * @see NET_RECORDSET_ACCESS_CTL_CARD
+     */
+    boolean CLIENT_InsertAccessControlCards(NativeLong lLoginID, int nInsertCount,
+                                            NET_RECORDSET_ACCESS_CTL_CARD[] pInsertCards, int[] pRecNo,
+                                            Pointer reserved, int nWaitTime);
+
+    /*******************设备管理*******************/
+    /**
+     * 获取前端设备的当前工作状态
+     *
+     * @param lLoginID CLIENT_Login或者CLIENT_LoginEx的返回值
+     * @param nType    查询信息类型
+     * @param pBuf     输出参数,用于接收查询返回的数据的缓存。根据查询类型的不同,返回数据的数据结构也不同
+     * @param nBufLen  缓存长度,单位字节
+     * @param pRetLen  输出参数,实际返回的数据长度,单位字节
+     * @param waittime 查询状态等待时间,默认1000ms
+     * @return 成功返回TRUE,失败返回FALSE
+     * @see DeviceStateType
+     */
+    boolean CLIENT_QueryDevState(NativeLong lLoginID, int nType, Pointer pBuf, int nBufLen, IntByReference pRetLen,
+                                 int waittime);
+
+    /**
+     * 门禁状态类型
+     */
+    class EM_NET_DOOR_STATUS_TYPE {
+        public static final int EM_NET_DOOR_STATUS_UNKNOWN = 0;
         /**
-         * 检测出的人脸图片信息,由用户申请空间
+         * 门打开
          */
-        public Pointer pPicInfo;
+        public static final int EM_NET_DOOR_STATUS_OPEN = 1;
         /**
-         * 最大人脸图片信息个数
+         * 门关闭
          */
-        public int nMaxPicNum;
+        public static final int EM_NET_DOOR_STATUS_CLOSE = 2;
         /**
-         * 实际返回的人脸图片个数
+         * 门异常打开
          */
-        public int nRetPicNum;
+        public static final int EM_NET_DOOR_STATUS_BREAK = 3;
+    }
+
+    /**
+     * 门禁状态信息(CLIENT_QueryDevState 接口输入参数)
+     */
+    @Structure.FieldOrder({"dwSize", "nChannel", "emStateType"})
+    class NET_DOOR_STATUS_INFO extends Structure {
+        public int dwSize;
         /**
-         * 缓冲地址,由用户申请空间,存放检测出的人脸图片数据
+         * 门禁通道号
          */
-        public Pointer pBuffer;
+        public int nChannel;
         /**
-         * 缓冲数据长度
+         * 门禁状态信息
+         *
+         * @see EM_NET_DOOR_STATUS_TYPE
          */
-        public int nBufferLen;
+        public int emStateType;
 
-        public NET_OUT_DETECT_FACE() {
-            this.dwSize = this.size();
+        public NET_DOOR_STATUS_INFO() {
+            this.dwSize = size();
         }
-    }
 
-    /*******************回调*******************/
+        @Override
+        public String toString() {
+            return "NET_DOOR_STATUS_INFO{" +
+                    "nChannel=" + nChannel +
+                    ", emStateType=" + emStateType +
+                    '}';
+        }
+    }
 
     /**
-     * 断线回调
+     * 门锁控制模式
      */
-    interface fDisConnect extends StdCallCallback {
+    class NET_DOORWORK_MODE {
+        public static final int NET_DOORWORK_MODE_UNKNOWN = 0;
         /**
-         * @param lLoginID CLIENT_LoginEx2的返回值
-         * @param pchDVRIP 设备IP
-         * @param nDVRPort 设备端口
-         * @param dwUser   用户数据
+         * 正常模式
          */
-        void invoke(NativeLong lLoginID, String pchDVRIP, int nDVRPort, NativeLong dwUser);
+        public static final int NET_DOORWORK_MODE_NORMAL = 1;
+        /**
+         * 闭锁
+         */
+        public static final int NET_DOORWORK_MODE_SHUTLOCK = 2;
+        /**
+         * 停用
+         */
+        public static final int NET_DOORWORK_MODE_UNUSED = 3;
+        /**
+         * 持续打开
+         */
+        public static final int NET_DOORWORK_MODE_OPENDOORCONTINUE = 4;
     }
 
     /**
-     * 断线后重连回调
+     * 获取门锁控制模式,对应命令 DH_DEVSTATE_GET_ACCESSCONTROLMODE
      */
-    interface fHaveReConnect extends StdCallCallback {
+    @Structure.FieldOrder({"dwSize", "nChannel", "emControlMode"})
+    class NET_GET_DOORWORK_MODE extends Structure {
+        public int dwSize;
         /**
-         * @param lLoginID CLIENT_LoginEx2的返回值
-         * @param pchDVRIP 设备IP
-         * @param nDVRPort 设备端口
-         * @param dwUser   用户数据
+         * 门禁通道号
          */
-        void invoke(NativeLong lLoginID, String pchDVRIP, int nDVRPort, NativeLong dwUser);
+        public int nChannel;
+        /**
+         * 门锁控制模式
+         *
+         * @see NET_DOORWORK_MODE
+         */
+        public int emControlMode;
+
+        public NET_GET_DOORWORK_MODE() {
+            this.dwSize = size();
+        }
     }
 
-    /*******************用户管理*******************/
-    /**
-     * 设置用户信息
-     *
-     * @param lLoginID     登陆句柄,CLIENT_Login的返回值
-     * @param nOperateType 操作类型
-     * @param opParam      设置用户信息的输入缓冲,具体见上面nOperateType说明
-     * @param subParam     设置用户信息的辅助输入缓冲,当设置类型为修改信息的时候,此处应传进来部分原始用户信息,具体见上面nOperateType说明
-     * @param waittime     等待时间
-     * @return
-     * @see UserOperateType
-     */
-    boolean CLIENT_OperateUserInfoEx(NativeLong lLoginID, int nOperateType, Pointer opParam, Pointer subParam, int waittime);
-}
+}

+ 0 - 19
src/main/java/com/usoftchina/ss/dahua/lib/PersonType.java

@@ -1,19 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 人员类型
- *
- * @author yingp
- * @date 2019/2/15
- */
-public class PersonType {
-    public static final int PERSON_TYPE_UNKNOWN = 0;
-    /**
-     * 普通人员
-     */
-    public static final int PERSON_TYPE_NORMAL = 1;
-    /**
-     * 嫌疑人员
-     */
-    public static final int PERSON_TYPE_SUSPICION = 2;
-}

+ 18 - 0
src/main/java/com/usoftchina/ss/dahua/lib/SdkException.java

@@ -0,0 +1,18 @@
+package com.usoftchina.ss.dahua.lib;
+
+/**
+ * @author yingp
+ * @date 2019/3/4
+ */
+public class SdkException extends RuntimeException{
+    private final ErrorCode error;
+
+    public SdkException(ErrorCode error) {
+        super(error.getMessage());
+        this.error = error;
+    }
+
+    public ErrorCode getError() {
+        return error;
+    }
+}

+ 0 - 45
src/main/java/com/usoftchina/ss/dahua/lib/UserOperateType.java

@@ -1,45 +0,0 @@
-package com.usoftchina.ss.dahua.lib;
-
-/**
- * 操作类型
- *
- * @author yingp
- * @date 2019/2/27
- */
-public class UserOperateType {
-    /**
-     * 增加用户组
-     * <p>USER_GROUP_INFO_EX</p>
-     */
-    public static final int USER_GROUP_ADD = 0;
-    /**
-     * 删除用户组
-     * <p>USER_GROUP_INFO_EX</p>
-     */
-    public static final int USER_GROUP_DELETE = 1;
-    /**
-     * 修改用户组
-     * <p>USER_GROUP_INFO_EX</p>
-     */
-    public static final int USER_GROUP_MODIFY = 2;
-    /**
-     * 增加用户
-     * <p>USER_INFO_EX</p>
-     */
-    public static final int USER_ADD = 3;
-    /**
-     * 删除用户
-     * <p>USER_INFO_EX</p>
-     */
-    public static final int USER_DELETE = 4;
-    /**
-     * 修改用户
-     * <p>USER_INFO_EX</p>
-     */
-    public static final int USER_MODIFY = 5;
-    /**
-     * 修改用户密码
-     * <p>USER_INFO_EX</p>
-     */
-    public static final int USER_MODIFY_PASSWORD = 6;
-}

BIN
src/main/resources/H264Parser.dll


BIN
src/main/resources/HWDec.dll


BIN
src/main/resources/HevcParser.dll


BIN
src/main/resources/StreamSvr.dll


BIN
src/main/resources/avnetsdk.dll


BIN
src/main/resources/dhconfigsdk.dll


BIN
src/main/resources/dhconfigsdk.lib


BIN
src/main/resources/dhnetsdk.lib


BIN
src/main/resources/dhplay.dll


BIN
src/main/resources/fisheye.dll


BIN
src/main/resources/linux-amd64/libInfra.so


BIN
src/main/resources/linux-amd64/libNetFramework.so


BIN
src/main/resources/linux-amd64/libStream.so


BIN
src/main/resources/linux-amd64/libStreamSvr.so


BIN
src/main/resources/linux-amd64/libavnetsdk.so


BIN
src/main/resources/linux-amd64/libdhconfigsdk.so


BIN
src/main/resources/linux-amd64/libdhnetsdk.so


+ 49 - 1
src/main/resources/message_zh_CN.properties

@@ -253,4 +253,52 @@ NET_ERROR_SERIALIZE_ERROR=\u6570\u636e\u5e8f\u5217\u5316\u9519\u8bef
 NET_ERROR_DESERIALIZE_ERROR=\u6570\u636e\u53cd\u5e8f\u5217\u5316\u9519\u8bef
 NET_ERROR_LOWRATEWPAN_ID_EXISTED=\u8be5\u65e0\u7ebfID\u5df2\u5b58\u5728
 NET_ERROR_LOWRATEWPAN_ID_LIMIT=\u65e0\u7ebfID\u6570\u91cf\u5df2\u8d85\u9650
-NET_ERROR_LOWRATEWPAN_ID_ABNORMAL=\u65e0\u7ebf\u5f02\u5e38\u6dfb\u52a0
+NET_ERROR_LOWRATEWPAN_ID_ABNORMAL=\u65e0\u7ebf\u5f02\u5e38\u6dfb\u52a0
+
+
+NET_EM_FAILCODE_NOERROR=\u6ca1\u6709\u9519\u8bef
+NET_EM_FAILCODE_UNKNOWN=\u672a\u77e5\u9519\u8bef
+NET_EM_FAILCODE_INVALID_PARAM=\u53c2\u6570\u9519\u8bef
+NET_EM_FAILCODE_INVALID_PASSWORD=\u65e0\u6548\u5bc6\u7801
+NET_EM_FAILCODE_INVALID_FP=\u65e0\u6548\u6307\u7eb9\u6570\u636e
+NET_EM_FAILCODE_INVALID_FACE=\u65e0\u6548\u4eba\u8138\u6570\u636e
+NET_EM_FAILCODE_INVALID_CARD=\u65e0\u6548\u5361\u6570\u636e
+NET_EM_FAILCODE_INVALID_USER=\u65e0\u6548\u4eba\u6570\u636e
+NET_EM_FAILCODE_FAILED_GET_SUBSERVICE=\u5b50\u670d\u52a1\u83b7\u53d6\u5931\u8d25
+NET_EM_FAILCODE_FAILED_GET_METHOD=\u83b7\u53d6\u7ec4\u4ef6\u7684\u65b9\u6cd5\u96c6\u5931\u8d25
+NET_EM_FAILCODE_FAILED_GET_SUBCAPS=\u83b7\u53d6\u8d44\u6e90\u5b9e\u4f53\u80fd\u529b\u96c6\u5931\u8d25
+NET_EM_FAILCODE_ERROR_INSERT_LIMIT=\u5df2\u8fbe\u63d2\u5165\u4e0a\u9650
+NET_EM_FAILCODE_ERROR_MAX_INSERT_RATE=\u5df2\u8fbe\u6700\u5927\u63d2\u5165\u901f\u5ea6
+NET_EM_FAILCODE_FAILED_ERASE_FP=\u6e05\u9664\u6307\u7eb9\u6570\u636e\u5931\u8d25
+NET_EM_FAILCODE_FAILED_ERASE_FACE=\u6e05\u9664\u4eba\u8138\u6570\u636e\u5931\u8d25
+NET_EM_FAILCODE_FAILED_ERASE_CARD=\u6e05\u9664\u5361\u6570\u636e\u5931\u8d25
+NET_EM_FAILCODE_NO_RECORD=\u6ca1\u6709\u8bb0\u5f55
+NET_EM_FAILCODE_NOMORE_RECORD=\u67e5\u627e\u5230\u6700\u540e\uff0c\u6ca1\u6709\u66f4\u591a\u8bb0\u5f55
+NET_EM_FAILCODE_RECORD_ALREADY_EXISTS=\u4e0b\u53d1\u5361\u6216\u6307\u7eb9\u65f6\uff0c\u6570\u636e\u91cd\u590d
+NET_EM_FAILCODE_MAX_FP_PERUSER=\u8d85\u8fc7\u4e2a\u4eba\u6700\u5927\u6307\u7eb9\u8bb0\u5f55\u6570
+NET_EM_FAILCODE_MAX_CARD_PERUSER=\u8d85\u8fc7\u4e2a\u4eba\u6700\u5927\u5361\u7247\u8bb0\u5f55\u6570
+
+EM_IMPORT_FACEDB_UNKNOWN=\u672a\u77e5
+EM_IMPORT_FACEDB_ONGING=\u5bfc\u5165\u4e2d
+EM_IMPORT_FACEDB_END=\u5bfc\u5165\u7ed3\u675f, \u5f00\u59cb\u751f\u6210\u6570\u636e\u5e93
+EM_IMPORT_FACEDB_BUSY=\u7cfb\u7edf\u5fd9\uff0c\u5df2\u7ecf\u6709\u5bfc\u5165\u4efb\u52a1
+EM_IMPORT_FACEDB_DATAERROR=\u6570\u636e\u5305\u68c0\u9a8c\u5931\u8d25
+EM_IMPORT_FACEDB_INVALID=\u6570\u636e\u5305\u975e\u6cd5
+EM_IMPORT_FACEDB_SYNC_SUCCESS=\u540c\u6b65\u6210\u529f, \u6570\u636e\u5e93\u5df2\u751f\u6210
+EM_IMPORT_FACEDB_SYNC_FALIED=\u540c\u6b65\u5931\u8d25, \u6570\u636e\u5e93\u65e0\u6cd5\u751f\u6210
+EM_IMPORT_FACEDB_DBFULL=\u6570\u636e\u5e93\u5df2\u6ee1\u65e0\u6cd5\u5bfc\u5165
+EM_IMPORT_FACEDB_SDFULL=\u5b58\u50a8\u7a7a\u95f4\u6ee1\u65e0\u6cd5\u5bfc\u5165
+EM_IMPORT_FACEDB_CIPHER_ERROR=\u5bfc\u5165\u538b\u7f29\u5305\u5bc6\u7801\u4e0d\u5bf9
+
+
+EM_EXPORT_FACEDB_REQUEST_SUCCESS=\u4eba\u8138\u5e93\u5bfc\u51fa\u8bf7\u6c42\u6210\u529f
+EM_EXPORT_FACEDB_NO_AUTHORITY=\u65e0\u6743\u9650
+EM_EXPORT_FACEDB_NO_THIS_FILE=\u6587\u4ef6\u4e0d\u5b58\u5728
+EM_EXPORT_FACEDB_EXPORT_END=\u5bfc\u51fa\u7ed3\u675f
+EM_EXPORT_FACEDB_EXPORTING=\u5bfc\u51fa\u4e2d
+EM_EXPORT_FACEDB_FILE_READY=\u6587\u4ef6\u51c6\u5907\u5b8c\u6210
+EM_EXPORT_FACEDB_FILE_FAILED=\u6587\u4ef6\u51c6\u5907\u5931\u8d25
+EM_EXPORT_FACEDB_WAIT_FILE=\u4eba\u8138\u5e93\u5bfc\u51fa\u8bf7\u6c42\u6210\u529f, \u9700\u8981\u7b49\u5f85\u8bbe\u5907\u51c6\u5907\u6570\u636e
+EM_EXPORT_FACEDB_SYSTEM_BUSY=\u7cfb\u7edf\u5fd9, \u6682\u65f6\u65e0\u6cd5\u5bfc\u51fa\u6570\u636e
+EM_EXPORT_FACEDB_NO_PASSWORD=\u4eba\u8138\u5e93\u6570\u636e\u672a\u5b9a\u4e49\u5bc6\u7801, \u4e0d\u5141\u8bb8\u5bfc\u51fa
+

BIN
src/main/resources/swscale.dll


BIN
src/main/resources/win32-x86-64/HWDec.dll


+ 0 - 0
src/main/resources/Infra.dll → src/main/resources/win32-x86-64/Infra.dll


+ 0 - 0
src/main/resources/IvsDrawer.dll → src/main/resources/win32-x86-64/IvsDrawer.dll


+ 0 - 0
src/main/resources/Json.dll → src/main/resources/win32-x86-64/Json.dll


BIN
src/main/resources/win32-x86-64/MCL_FPTZ.dll


+ 0 - 0
src/main/resources/NetFramework.dll → src/main/resources/win32-x86-64/NetFramework.dll


+ 0 - 0
src/main/resources/Stream.dll → src/main/resources/win32-x86-64/Stream.dll


BIN
src/main/resources/win32-x86-64/StreamSvr.dll


BIN
src/main/resources/win32-x86-64/VTHStack.dll


+ 0 - 0
src/main/resources/aacdec.dll → src/main/resources/win32-x86-64/aacdec.dll


+ 0 - 0
src/main/resources/adpcmdec.dll → src/main/resources/win32-x86-64/adpcmdec.dll


+ 0 - 0
src/main/resources/amrdec.dll → src/main/resources/win32-x86-64/amrdec.dll


BIN
src/main/resources/win32-x86-64/armenc64.dll


BIN
src/main/resources/win32-x86-64/avnetsdk.dll


BIN
src/main/resources/win32-x86-64/dhconfigsdk.dll


BIN
src/main/resources/win32-x86-64/dhconfigsdk.lib


BIN
src/main/resources/dhnetsdk.dll → src/main/resources/win32-x86-64/dhnetsdk.dll


BIN
src/main/resources/win32-x86-64/dhnetsdk.lib


BIN
src/main/resources/win32-x86-64/dhplay.dll


BIN
src/main/resources/win32-x86-64/fisheye.dll


+ 0 - 0
src/main/resources/g7221dec.dll → src/main/resources/win32-x86-64/g7221dec.dll


+ 0 - 0
src/main/resources/g729dec.dll → src/main/resources/win32-x86-64/g729dec.dll


BIN
src/main/resources/h264dec.dll → src/main/resources/win32-x86-64/h264dec.dll


+ 0 - 0
src/main/resources/h26ldec.dll → src/main/resources/win32-x86-64/h26ldec.dll


+ 0 - 0
src/main/resources/hevcdec.dll → src/main/resources/win32-x86-64/hevcdec.dll


+ 0 - 0
src/main/resources/mjpegdec.dll → src/main/resources/win32-x86-64/mjpegdec.dll


+ 0 - 0
src/main/resources/mp2dec.dll → src/main/resources/win32-x86-64/mp2dec.dll


+ 0 - 0
src/main/resources/mp3dec.dll → src/main/resources/win32-x86-64/mp3dec.dll


BIN
src/main/resources/mpeg4dec.dll → src/main/resources/win32-x86-64/mpeg4dec.dll


+ 0 - 0
src/main/resources/postproc.dll → src/main/resources/win32-x86-64/postproc.dll


+ 0 - 0
src/main/resources/svac_dec.dll → src/main/resources/win32-x86-64/svac_dec.dll


BIN
src/main/resources/win32-x86-64/swscale.dll


+ 7 - 7
src/test/java/com/usoftchina/ss/dahua/Main.java

@@ -1,7 +1,6 @@
 package com.usoftchina.ss.dahua;
 
-import com.usoftchina.ss.dahua.lib.FaceRecognitionService;
-import com.usoftchina.ss.dahua.lib.INetSdk;
+import com.usoftchina.ss.dahua.lib.*;
 
 /**
  * @author yingp
@@ -10,13 +9,14 @@ import com.usoftchina.ss.dahua.lib.INetSdk;
 public class Main {
     public static void main(String[] args) throws Exception {
         INetSdk sdk = new INetSdk();
-//        System.out.println(sdk.getVersion());
         sdk.init();
-        FaceRecognitionService faceRecognitionService = new FaceRecognitionService(sdk);
+        EventService eventService = new EventService(sdk);
         try {
-            sdk.login("10.1.80.208", 37777, "admin", "A12345678");
-            System.out.println(faceRecognitionService.add("42900419901021409X", "应鹏",
-                    FaceRecognitionService.Sex.MALE));
+            boolean logon = sdk.login("10.1.80.208", 37777, "admin", "A12345678");
+            if (logon) {
+                eventService.startListen();
+                System.in.read();
+            }
         } finally {
             try {
                 sdk.logout();