Просмотр исходного кода

//增加门禁开锁功能 2023-12-11

donggaosheng лет назад: 2
Родитель
Сommit
1003db22b1
37 измененных файлов с 1458 добавлено и 1 удалено
  1. 27 1
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteDutyService.java
  2. 15 0
      zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteDutyFailback.java
  3. 37 0
      zd-modules/zd-base/src/main/java/com/zd/base/app/controller/LabBoardApi.java
  4. 16 0
      zd-modules/zd-modules-laboratory/pom.xml
  5. 93 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/config/AccessControlConfig.java
  6. 7 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabHardwareController.java
  7. 11 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubjectAccessRecordController.java
  8. 27 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java
  9. 8 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabHardwareMapper.java
  10. 8 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabHardwareService.java
  11. 11 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabSubjectAccessRecordService.java
  12. 124 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/accesscontrol/AccessControlService.java
  13. 5 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabHardwareServiceImpl.java
  14. 15 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectAccessRecordServiceImpl.java
  15. 126 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/door/lib/DynamicParseUtil.java
  16. 190 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/door/lib/LibraryLoad.java
  17. 492 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/door/lib/NetSDKLibs.java
  18. 214 0
      zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/door/lib/Utils.java
  19. 23 0
      zd-modules/zd-modules-laboratory/src/main/resources/dynamic-lib-load.xml
  20. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/libs/INetSDK.jar
  21. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/libs/jna.jar
  22. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/linux64/libStreamConvertor.so
  23. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/linux64/libavnetsdk.so
  24. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/linux64/libdhconfigsdk.so
  25. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/linux64/libdhnetsdk.so
  26. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/linux64/libjninetsdk.so
  27. 7 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabHardwareMapper.xml
  28. 2 0
      zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSubjectAccessRecordMapper.xml
  29. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/ImageAlg.dll
  30. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/Infra.dll
  31. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/IvsDrawer.dll
  32. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/StreamConvertor.dll
  33. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/avnetsdk.dll
  34. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/dhconfigsdk.dll
  35. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/dhnetsdk.dll
  36. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/dhplay.dll
  37. BIN
      zd-modules/zd-modules-laboratory/src/main/resources/win64/jninetsdk.dll

+ 27 - 1
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/RemoteDutyService.java

@@ -133,6 +133,27 @@ public interface RemoteDutyService {
 
 
     /**
+     * 查询实验室下的门禁
+     * @param labId
+     * @return
+     */
+    @RequestMapping("/hardware/queryHardBySubjectId")
+    ResultData queryHardBySubjectId(@RequestParam("labId") Long labId);
+
+
+    /**
+     * 打开门禁
+     * @param m_strIp
+     * @param m_nPort
+     * @param m_strUser
+     * @param m_strPassword
+     * @return
+     */
+    @PostMapping("/device/remote/openAccessControl")
+    ResultData openAccessControl(@RequestParam("m_strIp") String m_strIp, @RequestParam("m_nPort") int m_nPort,@RequestParam("m_strUser") String m_strUser,@RequestParam("m_strPassword") String m_strPassword);
+
+
+    /**
      * 电子信息牌获取准入人员的指纹信息列表
      *
      * @param labId
@@ -234,5 +255,10 @@ public interface RemoteDutyService {
     @PostMapping("/XxpInspection/isSignInspection")
     ResultData isSignInspection(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId);
 
-
+    /**
+     * 添加记录
+     * @return
+     */
+    @PostMapping("/record/addAccessControl")
+    ResultData addLabSubjectAccessRecord(@RequestBody Map map);
 }

+ 15 - 0
zd-api/zd-laboratory-api/src/main/java/com/zd/laboratory/api/feign/fallback/RemoteDutyFailback.java

@@ -88,6 +88,16 @@ public class RemoteDutyFailback implements FallbackFactory<RemoteDutyService> {
             }
 
             @Override
+            public ResultData queryHardBySubjectId(Long labId) {
+                return ResultData.fail("未查到实验室配置的门禁信息:" + cause.getMessage());
+            }
+
+            @Override
+            public ResultData openAccessControl(String m_strIp, int m_nPort, String m_strUser, String m_strPassword) {
+                return ResultData.fail("门禁打开失败:" + cause.getMessage());
+            }
+
+            @Override
             public ResultData securityFingerList(Long labId) {
                 return ResultData.fail("电子信息牌获取准入人员的指纹信息列表:" + cause.getMessage());
             }
@@ -141,6 +151,11 @@ public class RemoteDutyFailback implements FallbackFactory<RemoteDutyService> {
             public ResultData isSignInspection(Long labId, Long userId) {
                 return ResultData.fail("Ai检测判断是否已签到:" + cause.getMessage());
             }
+
+            @Override
+            public ResultData addLabSubjectAccessRecord(Map map) {
+                return ResultData.fail("添加记录失败:" + cause.getMessage());
+            }
         };
     }
 }

+ 37 - 0
zd-modules/zd-base/src/main/java/com/zd/base/app/controller/LabBoardApi.java

@@ -393,6 +393,43 @@ public class LabBoardApi {
 
 
     /**
+     * 打开门禁
+     * @param labId
+     * @return
+     */
+    @ApiOperation(value = "打开门禁")
+    @GetMapping(value = "/openAccessControl")
+    public ResultData openAccessControl(@RequestParam("labId") Long labId,@RequestParam("userId") Long userId) {
+        ResultData resultData=remoteDutyService.queryHardBySubjectId(labId);
+        if(resultData==null || resultData.getCode()!=HttpStatus.SUCCESS){
+            return ResultData.fail("未查到实验室配置的门禁信息,请联系管理员");
+        }
+        Object resultObj=resultData.getData();
+        if(null==resultObj){
+            return ResultData.fail("未查到实验室配置的门禁信息,请联系管理员");
+        }
+        List<Map<String,Object>> list= (List<Map<String, Object>>) resultData.getData();
+        String harUser=String.valueOf(list.get(0).get("harUser"));
+        String harPsw=String.valueOf(list.get(0).get("harPsw"));
+        String ipAddress=String.valueOf(list.get(0).get("ipAddress"));
+        int port=Integer.valueOf(list.get(0).get("port").toString());
+        Long deptId=Long.valueOf(list.get(0).get("deptId").toString());
+        ResultData r=remoteDutyService.openAccessControl(ipAddress,port,harUser,harPsw);
+        if(r.getCode()==200){
+            Map map=new HashMap();
+            map.put("joinUserId",userId);
+            map.put("subjectId",labId);
+            map.put("deptId",deptId);
+            ResultData r1= remoteDutyService.addLabSubjectAccessRecord(map);
+            if(r1.getCode()==200){
+                logger.info("进入记录添加完成");
+                return ResultData.success();
+            }
+        }
+        return ResultData.fail();
+    }
+
+    /**
      * 电子信息牌获取准入人员的指纹信息列表
      * @param labId
      * @return

+ 16 - 0
zd-modules/zd-modules-laboratory/pom.xml

@@ -60,6 +60,22 @@
             </exclusions>
         </dependency>
 
+        <dependency>
+            <groupId>inetsdk</groupId>
+            <artifactId>com.zd.inetsdk</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${pom.basedir}/src/main/resources/libs/INetSDK.jar</systemPath>
+        </dependency>
+
+        <dependency>
+            <groupId>jna</groupId>
+            <artifactId>com.zd.jna</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${pom.basedir}/src/main/resources/libs/jna.jar</systemPath>
+        </dependency>
+
         <!--mqtt客户端链接服务-->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 93 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/config/AccessControlConfig.java

@@ -0,0 +1,93 @@
+package com.zd.laboratory.config;
+
+import com.sun.jna.Pointer;
+import com.zd.common.core.redis.RedisService;
+import com.zd.common.core.utils.SpringUtils;
+import com.zd.laboratory.utils.door.lib.NetSDKLibs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author donggaosheng
+ * @Date 2023-12-01
+ * @description 门禁配置类
+ **/
+@Configuration
+public class AccessControlConfig {
+    static NetSDKLibs netsdkApi = NetSDKLibs.NETSDK_INSTANCE;
+
+    @Bean
+    public NetSDKLibs InitAccessControl(){
+         // 初始化SDK库,必须调用
+        netsdkApi.CLIENT_Init(DisConnectCallback.getInstance(), null);
+
+        // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作
+        // 此操作为可选操作,但建议用户进行设置
+        netsdkApi.CLIENT_SetAutoReconnect(HaveReConnectCallback.getInstance(), null);
+
+        // 设置登录超时时间和尝试次数,可选
+        int waitTime = 5000; // 登录请求响应超时时间设置为5S
+        int tryTimes = 3; // 登录时尝试建立链接3次
+        netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes);
+
+        // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime
+        // 接口设置的登录设备超时时间和尝试次数意义相同,可选
+        NetSDKLibs.NET_PARAM netParam = new NetSDKLibs.NET_PARAM();
+        netParam.nConnectTime = 10000; // 登录时尝试建立链接的超时时间
+        netParam.nGetDevInfoTime = 5000;
+        netsdkApi.CLIENT_SetNetworkParam(netParam);
+        return netsdkApi;
+    }
+
+    // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
+    public static class DisConnectCallback implements NetSDKLibs.fDisConnect {
+
+        private final static RedisService redisService = SpringUtils.getBean(RedisService.class);
+
+        private final static Logger logger = LoggerFactory.getLogger(DisConnectCallback.class);
+
+
+        private DisConnectCallback() {
+        }
+
+        private static class CallBackHolder {
+            private static final DisConnectCallback cb = new DisConnectCallback();
+        }
+
+        public static final DisConnectCallback getInstance() {
+            return CallBackHolder.cb;
+        }
+
+        public void invoke(NetSDKLibs.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
+            redisService.setCacheObject("access_control_status",0);
+            logger.info("Device[{}] Port[{}] Disconnect!\n", pchDVRIP, nDVRPort);
+        }
+    }
+
+    // 网络连接恢复,设备重连成功回调
+    // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
+    public static class HaveReConnectCallback implements NetSDKLibs.fHaveReConnect {
+
+        private final static RedisService redisService = SpringUtils.getBean(RedisService.class);
+
+        private final Logger logger = LoggerFactory.getLogger(HaveReConnectCallback.class);
+
+        private HaveReConnectCallback() {
+        }
+
+        private static class CallBackHolder {
+            private static final HaveReConnectCallback cb = new HaveReConnectCallback();
+        }
+
+        public static final HaveReConnectCallback getInstance() {
+            return CallBackHolder.cb;
+        }
+
+        public void invoke(NetSDKLibs.LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
+            redisService.setCacheObject("access_control_status",1);
+            logger.info("ReConnect Device[{}[ Port[{}]\n", pchDVRIP, nDVRPort);
+        }
+    }
+}

+ 7 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabHardwareController.java

@@ -241,6 +241,13 @@ public class LabHardwareController extends BaseController {
         return ResultData.success(labHardwareService.selectLabHardwareList(labHardware));
     }
 
+
+    @ApiOperation(value = "查询实验室下的门禁")
+    @GetMapping("/queryHardBySubjectId")
+    public ResultData<List<Map<String,Object>>> queryHardBySubjectId(Long subjectId){
+        return ResultData.success(labHardwareService.selectLabHardwareListBySubjectId(subjectId));
+    }
+
     /***
      * 根据实验室id查询该实验室下的硬件信息
      * @return

+ 11 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/LabSubjectAccessRecordController.java

@@ -90,6 +90,17 @@ public class LabSubjectAccessRecordController extends BaseController {
         return ResultData.result(labSubjectAccessRecordService.insertLabSubjectAccessRecord(labSubjectAccessRecord));
     }
 
+
+    /**
+     * 新增实验室进出记录
+     */
+    @Log(title = "实验室进出记录", businessType = BusinessType.INSERT)
+    @PostMapping("/addAccessControl")
+    public ResultData addAccessControl(@RequestBody LabSubjectAccessRecord labSubjectAccessRecord) {
+        return ResultData.result(labSubjectAccessRecordService.insertLabSubjectAccessControlRecord(labSubjectAccessRecord));
+    }
+
+
     @GetMapping("/addRecords")
     public ResultData addRecord(@RequestParam Map map){
            return labSubjectAccessRecordService.addRecord(map);

+ 27 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/controller/device/DeviceRemoteController.java

@@ -5,6 +5,7 @@ import com.zd.common.core.utils.ReUtil;
 import com.zd.laboratory.api.entity.CabinetLock;
 import com.zd.laboratory.api.entity.CabinetV2Lock;
 import com.zd.laboratory.netty.NettyPushMsgService;
+import com.zd.laboratory.service.accesscontrol.AccessControlService;
 import com.zd.laboratory.socket.service.SocketService;
 import com.zd.laboratory.utils.CRCCHECK;
 import com.zd.model.domain.ResultData;
@@ -31,11 +32,37 @@ public class DeviceRemoteController {
     private SocketService socketService;
     @Autowired
     private RedisService redisService;
+    @Autowired
+    private AccessControlService accessControlService;
 
     @Value("${sys.lockTimer:30}")
     private Integer lockTimer;
 
 
+    @PostMapping("/openAccessControl")
+    public ResultData openAccessControl(String m_strIp,int m_nPort,String m_strUser,String m_strPassword){
+        boolean loginIsTrue=accessControlService.loginDevice(m_strIp,m_nPort,m_strUser,m_strPassword);
+        if(!loginIsTrue){
+            return ResultData.fail("设备登录失败!");
+        }
+        boolean openIsTrue= accessControlService.openDoor();
+        if(!openIsTrue){
+            return ResultData.fail("开门失败!");
+        }
+        return ResultData.success("开门成功");
+    }
+
+    @PostMapping("/accessControlStatus")
+    public ResultData accessControlStatus(String m_strIp,int m_nPort,String m_strUser,String m_strPassword){
+        boolean loginIsTrue=accessControlService.loginDevice(m_strIp,m_nPort,m_strUser,m_strPassword);
+        if(!loginIsTrue){
+            return ResultData.fail("设备登录失败!");
+        }
+        accessControlService.queryDoorStatus();
+        return ResultData.success("zhuantai");
+    }
+
+
     @PostMapping("/cabinetLock")
     public ResultData cabinetLock(@RequestBody @Valid CabinetLock cabinetLock){
         socketService.sendWriteHelmCommand(

+ 8 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/mapper/LabHardwareMapper.java

@@ -70,6 +70,14 @@ public interface LabHardwareMapper {
 
 
     /**
+     * 查询门禁的信息
+     * @param subjectId
+     * @return
+     */
+    List<Map<String, Object>> selectLabHardwareListBySubjectId(@Param("subjectId") Long subjectId);
+
+
+    /**
      * 查询硬件列表
      * @param labHardware 硬件
      * @return 硬件集合

+ 8 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabHardwareService.java

@@ -48,6 +48,14 @@ public interface ILabHardwareService {
 
 
     /**
+     * 查询门禁的信息
+     * @param subjectId
+     * @return
+     */
+    List<Map<String,Object>> selectLabHardwareListBySubjectId(Long subjectId);
+
+
+    /**
      * 查询硬件列表根据NUM或者继电器编码
      */
     List<LabHardware> selectLabHardwareStatusByRelay(LabHardware labHardware);

+ 11 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/ILabSubjectAccessRecordService.java

@@ -62,6 +62,17 @@ public interface ILabSubjectAccessRecordService {
      */
     public long insertLabSubjectAccessRecord(LabSubjectAccessRecord labSubjectAccessRecord);
 
+
+
+    /**
+     * 新增实验室进出记录
+     *
+     * @param labSubjectAccessRecord 实验室进出记录
+     * @return 结果
+     */
+    public long insertLabSubjectAccessControlRecord(LabSubjectAccessRecord labSubjectAccessRecord);
+
+
     /**
      * 修改实验室进出记录
      *

+ 124 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/accesscontrol/AccessControlService.java

@@ -0,0 +1,124 @@
+package com.zd.laboratory.service.accesscontrol;
+
+import com.sun.jna.ptr.IntByReference;
+import com.zd.laboratory.utils.door.lib.NetSDKLibs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+
+/**
+ * @Author donggaosheng
+ * @Date 2023-12-01
+ * @description
+ **/
+@Service
+public class AccessControlService {
+
+    @Autowired
+    private NetSDKLibs netSDKLibs;
+
+    private final Logger logger = LoggerFactory.getLogger(AccessControlService.class);
+
+    private static ThreadLocal<NetSDKLibs.NET_DEVICEINFO_Ex> deviceinfo = new ThreadLocal<>();
+
+    private static ThreadLocal<NetSDKLibs.LLong> loginHandle = new ThreadLocal<>();
+
+    private static ThreadLocal<NetSDKLibs.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY> pstInParamThread = new ThreadLocal<>();
+
+    private static ThreadLocal<NetSDKLibs.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY> pstOutParamThread = new ThreadLocal<>();
+
+    private static ThreadLocal<NetSDKLibs.NET_CTRL_ACCESS_OPEN> openThreadLocal = new ThreadLocal<>();
+
+    private static ThreadLocal<NetSDKLibs.NET_DOOR_STATUS_INFO> doorStatusThread = new ThreadLocal<>();
+
+    private final static NetSDKLibs.NET_DEVICEINFO_Ex netDeviceinfoEx=new NetSDKLibs.NET_DEVICEINFO_Ex();
+
+    private final static NetSDKLibs.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY netInLoginWithHighlevelSecurity = new NetSDKLibs.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY();
+
+    private final static NetSDKLibs.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY netOutLoginWithHighlevelSecurity = new NetSDKLibs.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
+
+    private final static NetSDKLibs.NET_CTRL_ACCESS_OPEN netCtrlAccessOpen = new NetSDKLibs.NET_CTRL_ACCESS_OPEN();
+
+    private final static NetSDKLibs.NET_DOOR_STATUS_INFO netDoorStatusInfo = new NetSDKLibs.NET_DOOR_STATUS_INFO();
+
+
+    public boolean loginDevice(String m_strIp,int m_nPort,String m_strUser,String m_strPassword) {
+        deviceinfo.set(netDeviceinfoEx);
+        pstInParamThread.set(netInLoginWithHighlevelSecurity);
+        pstOutParamThread.set(netOutLoginWithHighlevelSecurity);
+        boolean isTrue;
+        NetSDKLibs.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam = pstInParamThread.get();
+        pstInParam.nPort = m_nPort;
+        pstInParam.szIP = m_strIp.getBytes();
+        pstInParam.szPassword = m_strPassword.getBytes();
+        pstInParam.szUserName = m_strUser.getBytes();
+        //出参
+        NetSDKLibs.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = pstOutParamThread.get();
+        pstOutParam.stuDeviceInfo = deviceinfo.get();
+        loginHandle.set(netSDKLibs.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam));
+        if (loginHandle.get().longValue() != 0) {
+            isTrue=true;
+            logger.info("Login Device[{}] Port[{}]Success!\n", m_strIp, m_nPort);
+        } else {
+            isTrue=false;
+            logger.info("Login Device[{}] Port[{}]Fail.Last Error[{}]\n", m_strIp, m_nPort, netSDKLibs.CLIENT_GetLastError());
+        }
+        return isTrue;
+    }
+
+
+
+    // 获取当前时间
+    public String getDate() {
+        SimpleDateFormat simpleDate = new SimpleDateFormat(
+                "yyyy-MM-dd HH:mm:ss");
+        String date = simpleDate.format(new java.util.Date()).replace(" ", "_")
+                .replace(":", "-");
+
+        return date;
+    }
+
+    /**
+     * 开门
+     */
+    public boolean openDoor() {
+        openThreadLocal.set(netCtrlAccessOpen);
+        boolean isTrue;
+        NetSDKLibs.NET_CTRL_ACCESS_OPEN open = openThreadLocal.get();
+        open.nChannelID = 0;
+        open.write();
+        boolean openSuccess = netSDKLibs.CLIENT_ControlDeviceEx(loginHandle.get(), NetSDKLibs.CtrlType.CTRLTYPE_CTRL_ACCESS_OPEN, open.getPointer(), null, 5000);
+        open.read();
+        if (!openSuccess) {
+            isTrue=false;
+            logger.info("open error: 0x" + Long.toHexString(netSDKLibs.CLIENT_GetLastError()));
+        } else {
+            isTrue=true;
+            logger.info("开门成功");
+        }
+        return isTrue;
+    }
+
+    /**
+     * 查询门(开、关)状态
+     */
+    public void queryDoorStatus() {
+        doorStatusThread.set(netDoorStatusInfo);
+        int cmd = NetSDKLibs.NET_DEVSTATE_DOOR_STATE;
+        NetSDKLibs.NET_DOOR_STATUS_INFO doorStatus=doorStatusThread.get();
+        IntByReference retLenByReference = new IntByReference(0);
+        doorStatus.write();
+        boolean bRet = netSDKLibs.CLIENT_QueryDevState(loginHandle.get(), cmd, doorStatus.getPointer(), doorStatus.size(), retLenByReference, 3000);
+        doorStatus.read();
+        if (!bRet) {
+            logger.info("Failed to queryDoorStatus. Error Code 0x" + Integer.toHexString(netSDKLibs.CLIENT_GetLastError()));
+            return;
+        }
+        String stateType[] = {"未知", "门打开", "门关闭", "门异常打开"};
+        logger.info("doorStatus -> Channel: " + doorStatus.nChannel + " type: " + stateType[doorStatus.emStateType]);
+        logger.info("doorStatus -> Channel: " + doorStatus.nChannel + " type: " + doorStatus.emStateType);
+    }
+}

+ 5 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabHardwareServiceImpl.java

@@ -186,6 +186,11 @@ public class LabHardwareServiceImpl implements ILabHardwareService {
     }
 
     @Override
+    public List<Map<String,Object>> selectLabHardwareListBySubjectId(Long subjectId) {
+        return labHardwareMapper.selectLabHardwareListBySubjectId(subjectId);
+    }
+
+    @Override
     public List<LabHardware> selectLabHardwareStatusByRelay(LabHardware labHardware) {
         return labHardwareMapper.selectLabHardwareStatusByRelay(labHardware);
     }

+ 15 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/service/impl/LabSubjectAccessRecordServiceImpl.java

@@ -153,6 +153,21 @@ public class LabSubjectAccessRecordServiceImpl implements ILabSubjectAccessRecor
     }
 
     /**
+     * 新增实验室进出记录
+     *
+     * @param labSubjectAccessRecord 实验室进出记录
+     * @return 结果
+     */
+    @Override
+    public long insertLabSubjectAccessControlRecord(LabSubjectAccessRecord labSubjectAccessRecord) {
+        labSubjectAccessRecord.setAccessStatus(1L);
+        labSubjectAccessRecord.setCreateTime(DateUtils.getNowDate());
+        labSubjectAccessRecord.setInTime(DateUtils.getNowDate());
+        labSubjectAccessRecord.setInitFlag(false);
+        return labSubjectAccessRecordMapper.insertLabSubjectAccessRecord(labSubjectAccessRecord);
+    }
+
+    /**
      * 修改实验室进出记录
      *
      * @param labSubjectAccessRecord 实验室进出记录

+ 126 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/door/lib/DynamicParseUtil.java

@@ -0,0 +1,126 @@
+package com.zd.laboratory.utils.door.lib;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @Author donggaosheng
+ * @Date 2023-12-01
+ * @description
+ **/
+public class DynamicParseUtil {
+  private DynamicLibParseHandler handler;
+  private SAXParserFactory saxParserFactory;
+  private SAXParser saxParser;
+
+  /**
+   * 适配各系统动态库名称大小写不同,以及lib前缀造成的找不到库的问题
+   *
+   * @param currentSystem 当前系统:win64,win32,linux64,linux32,mac64
+   * @param libName 动态库名称
+   * @return
+   */
+  public String compareLibName(String currentSystem, String libName) {
+    String dynamicLibName = libName;
+    List<String> libs = handler.getLibsBySystem(currentSystem);
+    if (currentSystem.toLowerCase().contains("win")) {
+      return findLibs(libs, libName);
+    }
+    if (libName.startsWith("lib")) {
+      dynamicLibName = libName.substring(3);
+    }
+    return findLibs(libs, dynamicLibName);
+  }
+
+  private String findLibs(List<String> libs, String libName) {
+    for (String lib : libs) {
+      if (libName.equalsIgnoreCase(lib)) {
+        return lib;
+      }
+    }
+    return "";
+  }
+
+  public List<String> getLibsSystem(String system) {
+    return handler.getLibsBySystem(system);
+  }
+
+  private DynamicParseUtil() throws ParserConfigurationException {
+    // 获取SAX分析器的工厂实例,专门负责创建SAXParser分析器
+    saxParserFactory = SAXParserFactory.newInstance();
+    // 获取SAXParser分析器的实例
+    try {
+      saxParser = saxParserFactory.newSAXParser();
+      handler = new DynamicLibParseHandler();
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  public DynamicParseUtil(InputStream inputSteam)
+      throws ParserConfigurationException, IOException, SAXException {
+    this();
+    saxParser.parse(inputSteam, handler);
+  }
+
+  /** xml解析handler */
+  private class DynamicLibParseHandler extends DefaultHandler {
+    private HashMap<String, List<String>> dynamics = new HashMap<String, List<String>>();
+    private List<String> systems =
+        Arrays.asList("win64", "win32", "linux64", "linux32", "mac64", "linuxARM");
+    private String currentDynamicSystem;
+    private List<String> libs;
+
+    public List<String> getLibsBySystem(String system) {
+      return dynamics.get(system);
+    }
+
+    @Override
+    public void startDocument() throws SAXException {
+      super.startDocument();
+    }
+
+    @Override
+    public void startElement(String uri, String localName, String qName, Attributes attributes)
+        throws SAXException {
+      super.startElement(uri, localName, qName, attributes);
+      if (systems.contains(qName)) {
+        currentDynamicSystem = qName;
+        if (libs == null) {
+          libs = new ArrayList<String>();
+        }
+      }
+    }
+
+    @Override
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+      super.endElement(uri, localName, qName);
+      if (systems.contains(qName)) {
+        // 保存到hashmap中
+        dynamics.put(currentDynamicSystem, libs);
+        // 清除libs
+        libs = null;
+      }
+    }
+
+    @Override
+    public void characters(char[] ch, int start, int length) throws SAXException {
+      super.characters(ch, start, length);
+      String lib = new String(ch, start, length);
+      if (!lib.trim().isEmpty()) {
+        libs.add(lib);
+      }
+    }
+  }
+}

+ 190 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/door/lib/LibraryLoad.java

@@ -0,0 +1,190 @@
+package com.zd.laboratory.utils.door.lib;
+
+import java.io.*;
+
+/**
+ * @Author donggaosheng
+ * @Date 2023-12-01
+ * @description
+ **/
+public class LibraryLoad {
+  private static final String ARCH_WINDOWS = "win";
+  private static final String ARCH_LINUX = "linux";
+  private static final String ARCH_MAC = "mac";
+  private static final int PREFIX_64 = 64;
+  private static final int PREFIX_32 = 32;
+  private static final String PREFIX_ARM = "ARM";
+  private static final String EXTERNAL_WIN = ".dll";
+  private static final String EXTERNAL_LINUX = ".so";
+  private static final String EXTERNAL_MAC = ".dylib";
+  private static DynamicParseUtil dynamicParseUtil;
+  /** 当前读取的目录 */
+  private static String currentFold;
+  /** 动态库需要写入的目录 */
+  private static String EXTRACT_PATH = System.getProperty("java.io.tmpdir");
+
+  private static boolean written = false;
+
+  /**
+   * 设置动态库写入的路径,适用于需要自定义加载路径的用户
+   *
+   * @param path 动态库写入的文件夹,从该文件夹下加载sdk的动态库
+   */
+  public static void setExtractPath(String path) {
+    EXTRACT_PATH = path;
+  }
+
+  public static String getExtractPath() {
+	return EXTRACT_PATH;
+
+	  }
+  /** 动态库路径 */
+  private static String INNER_PATH;
+
+  // private static final String EXTERNAL_MAC = ".so";
+
+  private static String extractNetSDKLib(String libName) {
+    return extractLibrary(libName);
+  }
+
+  public static String getLoadLibrary(String libraryName) {
+    currentFold = getLibraryFold();
+    if (dynamicParseUtil == null) {
+      try {
+        dynamicParseUtil =
+            new DynamicParseUtil(
+                LibraryLoad.class.getClassLoader().getResourceAsStream("dynamic-lib-load.xml"));
+        if (!written) {
+          for (String libName : dynamicParseUtil.getLibsSystem(currentFold)) {
+            extractLibrary(libName);
+          }
+          written = true;
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+    String fullName = getLibraryName(libraryName);
+    String path = EXTRACT_PATH;
+    if (!(EXTRACT_PATH.endsWith("/") || EXTRACT_PATH.endsWith("\\"))) {
+      path = EXTRACT_PATH + "/";
+    }
+    System.out.println("load library: " + path + fullName);
+    return path + fullName;
+  }
+
+  /**
+   * 将jar包里的动态库写入到系统缓存目录,使用绝对路径加载动态库
+   *
+   * @param libName
+   * @return
+   */
+  private static String extractLibrary(String libName) {
+    return extractLibrary("", libName);
+  }
+
+  /**
+   * 相对路径文件夹
+   *
+   * @param relativePath 相对路径
+   * @param libName 动态库路径
+   * @return
+   */
+  private static String extractLibrary(String relativePath, String libName) {
+    if (libName.trim().equals("")) {
+      return "";
+    }
+    String libFullName = getLibraryName(libName);
+    String dir = getLibraryFold();
+    if (!(relativePath.endsWith("/") || relativePath.endsWith("\\"))) {
+      relativePath = relativePath + "/";
+    }
+    String fileName = relativePath + dir + "/" + libFullName;
+    InputStream in = LibraryLoad.class.getResourceAsStream(fileName);
+    BufferedInputStream reader;
+    FileOutputStream writer;
+    File extractedLibFile = null;
+    try {
+      if (in == null) {
+        in = new FileInputStream(fileName);
+        if (in == null) {
+          return "";
+        }
+      }
+      String nativeTempDir = EXTRACT_PATH;
+      if (!(nativeTempDir.endsWith("/") || nativeTempDir.endsWith("\\"))) {
+        nativeTempDir = nativeTempDir + "/";
+      }
+      extractedLibFile = new File(nativeTempDir + libFullName);
+      reader = new BufferedInputStream(in);
+      writer = new FileOutputStream(extractedLibFile);
+      byte[] buffer = new byte[1024];
+      while (true) {
+        int len = reader.read(buffer);
+        if (len == 0 || len == -1) break;
+        writer.write(buffer, 0, len);
+      }
+      reader.close();
+      writer.close();
+      in.close();
+    } catch (Exception e) {
+      System.out.println(
+          "dynamic file[ "
+              + fileName
+              + " ] not found in project.please ensure you need this library.");
+    }
+    return extractedLibFile != null ? extractedLibFile.getAbsolutePath() : "";
+  }
+
+  /**
+   * 获取动态库完整名称
+   *
+   * @param libName
+   * @return
+   */
+  private static String getLibraryName(String libName) {
+    String dir = currentFold;
+    String libPrefix = "";
+    String libExtension = EXTERNAL_WIN;
+
+    if (!dir.contains("win")) {
+      libPrefix = "lib";
+      if (dir.contains("linux")) {
+        libExtension = EXTERNAL_LINUX;
+      } else {
+        // libExtension=".dylib";
+        libExtension = EXTERNAL_MAC;
+      }
+    }
+    libName = dynamicParseUtil.compareLibName(currentFold, libName);
+    // 动态库以lib开头,则不添加lib前缀
+    // 以lib开头的库则不添加lib前缀
+    return (libName.startsWith("lib") ? "" : libPrefix) + libName + libExtension;
+  }
+
+  // 获取系统对应的动态库文件夹
+  private static String getLibraryFold() {
+    String osType;
+    String osName = System.getProperty("os.name");
+    if (osName.toLowerCase().startsWith("linux")) {
+      osType = ARCH_LINUX;
+    } else if (osName.toLowerCase().startsWith("mac")
+        || osName.toLowerCase().startsWith("darwin")) {
+      osType = ARCH_MAC;
+    } else if (osName.toLowerCase().startsWith("windows")) {
+      osType = ARCH_WINDOWS;
+    } else {
+      osType = "";
+    }
+    String arch = System.getProperty("os.arch");
+    arch = arch.toLowerCase().trim();
+    if ("i386".equals(arch) || "i686".equals(arch)||"x86".equals(arch)) {
+      arch = PREFIX_32 + "";
+    } else if ("x86_64".equals(arch) || "amd64".equals(arch)) {
+      arch = PREFIX_64 + "";
+    } else if (arch.startsWith("arm")) {
+      arch = PREFIX_ARM + "";
+    }
+    return osType + arch;
+  }
+}

+ 492 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/door/lib/NetSDKLibs.java

@@ -0,0 +1,492 @@
+package com.zd.laboratory.utils.door.lib;
+
+import com.sun.jna.*;
+import com.sun.jna.ptr.IntByReference;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author donggaosheng
+ * @Date 2023-11-29
+ * @description
+ **/
+public interface NetSDKLibs extends Library {
+    NetSDKLibs NETSDK_INSTANCE = Native.load(LibraryLoad.getLoadLibrary("dhnetsdk"), NetSDKLibs.class);
+
+    NetSDKLibs CONFIG_INSTANCE = Native.load(LibraryLoad.getLoadLibrary("dhconfigsdk"), NetSDKLibs.class);
+
+    //NetSDKLib CONFIG_JNI = (NetSDKLib)Native.loadLibrary(util.getLoadLibrary("JNI1.dll"), INetSDK.class);
+    class LLong extends IntegerType {
+        private static final long serialVersionUID = 1L;
+
+        /** Size of a native long, in bytes. */
+        public static int size;
+        static {
+            size = Native.LONG_SIZE;
+            if (Utils.getOsPrefix().equalsIgnoreCase("linux-amd64")
+                    || Utils.getOsPrefix().equalsIgnoreCase("win32-amd64")
+                    || Utils.getOsPrefix().equalsIgnoreCase("mac-64")) {
+                size = 8;
+            } else if (Utils.getOsPrefix().equalsIgnoreCase("linux-i386")
+                    || Utils.getOsPrefix().equalsIgnoreCase("win32-x86")) {
+                size = 4;
+            }
+        }
+
+        /** Create a zero-valued LLong. */
+        public LLong() {
+            this(0);
+        }
+
+        /** Create a LLong with the given value. */
+        public LLong(long value) {
+            super(size, value);
+        }
+    }
+    public static class SdkStructure extends Structure {
+        @Override
+        protected  List<String> getFieldOrder(){
+            List<String> fieldOrderList = new ArrayList<String>();
+            for (Class<?> cls = getClass();
+                 !cls.equals(SdkStructure.class);
+                 cls = cls.getSuperclass()) {
+                Field[] fields = cls.getDeclaredFields();
+                int modifiers;
+                for (Field field : fields) {
+                    modifiers = field.getModifiers();
+                    if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
+                        continue;
+                    }
+                    fieldOrderList.add(field.getName());
+                }
+            }
+            //            System.out.println(fieldOrderList);
+
+            return fieldOrderList;
+        }
+
+        @Override
+        public int fieldOffset(String name){
+            return super.fieldOffset(name);
+        }
+    }
+
+    /************************************************************************
+     ** 常量定义
+     ***********************************************************************/
+    public static final int NET_SERIALNO_LEN                      = 48;             // 设备序列号字符长度
+
+    public static final int NET_DEVSTATE_DOOR_STATE            = 0x0159;           // 查询门禁状态(对应NET_DOOR_STATUS_INFO)
+
+    public static final int MAX_LOG_PATH_LEN                    = 260;  // 日志路径名最大长度
+
+    public static final int MAX_COMMON_STRING_32             	= 32;   // 通用字符串长度32
+
+    // 设备信息扩展///////////////////////////////////////////////////
+    public static class NET_DEVICEINFO_Ex extends SdkStructure {
+        public byte[]     sSerialNumber = new byte[NET_SERIALNO_LEN];    // 序列号
+        public int        byAlarmInPortNum;                              // DVR报警输入个数
+        public int        byAlarmOutPortNum;                             // DVR报警输出个数
+        public int        byDiskNum;                                     // DVR硬盘个数
+        public int        byDVRType;                                     // DVR类型,见枚举NET_DEVICE_TYPE
+        public int        byChanNum;                                     // DVR通道个数
+        public byte       byLimitLoginTime;                              // 在线超时时间,为0表示不限制登陆,非0表示限制的分钟数
+        public byte       byLeftLogTimes;                                // 当登陆失败原因为密码错误时,通过此参数通知用户,剩余登陆次数,为0时表示此参数无效
+        public byte[]     bReserved = new byte[2];                       // 保留字节,字节对齐
+        public int        byLockLeftTime;                                // 当登陆失败,用户解锁剩余时间(秒数), -1表示设备未设置该参数
+        public byte[]     Reserved = new byte[24];                       // 保留
+    }
+
+    // 控制类型,对应CLIENT_ControlDevice接口
+    public static class CtrlType extends NetSDKLibs.SdkStructure
+    {
+        public static final int CTRLTYPE_CTRL_REBOOT = 0;//重启设备
+        public static final int CTRLTYPE_CTRL_SHUTDOWN = CTRLTYPE_CTRL_REBOOT+1; //关闭设备
+        public static final int CTRLTYPE_CTRL_DISK = CTRLTYPE_CTRL_SHUTDOWN+1; //硬盘管理
+        public static final int CTRLTYPE_KEYBOARD_POWER =3;//网络键盘
+        public static final int CTRLTYPE_KEYBOARD_ENTER = CTRLTYPE_KEYBOARD_POWER+1;
+        public static final int CTRLTYPE_KEYBOARD_ESC = CTRLTYPE_KEYBOARD_ENTER+1;
+        public static final int CTRLTYPE_KEYBOARD_UP = CTRLTYPE_KEYBOARD_ESC+1;
+        public static final int CTRLTYPE_KEYBOARD_DOWN = CTRLTYPE_KEYBOARD_UP+1;
+        public static final int CTRLTYPE_KEYBOARD_LEFT = CTRLTYPE_KEYBOARD_DOWN+1;
+        public static final int CTRLTYPE_KEYBOARD_RIGHT = CTRLTYPE_KEYBOARD_LEFT+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN0 = CTRLTYPE_KEYBOARD_RIGHT+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN1 = CTRLTYPE_KEYBOARD_BTN0+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN2 = CTRLTYPE_KEYBOARD_BTN1+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN3 = CTRLTYPE_KEYBOARD_BTN2+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN4 = CTRLTYPE_KEYBOARD_BTN3+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN5 = CTRLTYPE_KEYBOARD_BTN4+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN6 = CTRLTYPE_KEYBOARD_BTN5+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN7 = CTRLTYPE_KEYBOARD_BTN6+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN8 = CTRLTYPE_KEYBOARD_BTN7+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN9 = CTRLTYPE_KEYBOARD_BTN8+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN10 = CTRLTYPE_KEYBOARD_BTN9+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN11 = CTRLTYPE_KEYBOARD_BTN10+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN12 = CTRLTYPE_KEYBOARD_BTN11+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN13 = CTRLTYPE_KEYBOARD_BTN12+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN14 = CTRLTYPE_KEYBOARD_BTN13+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN15 = CTRLTYPE_KEYBOARD_BTN14+1;
+        public static final int CTRLTYPE_KEYBOARD_BTN16 = CTRLTYPE_KEYBOARD_BTN15+1;
+        public static final int CTRLTYPE_KEYBOARD_SPLIT = CTRLTYPE_KEYBOARD_BTN16+1;
+        public static final int CTRLTYPE_KEYBOARD_ONE = CTRLTYPE_KEYBOARD_SPLIT+1;
+        public static final int CTRLTYPE_KEYBOARD_NINE = CTRLTYPE_KEYBOARD_ONE+1;
+        public static final int CTRLTYPE_KEYBOARD_ADDR = CTRLTYPE_KEYBOARD_NINE+1;
+        public static final int CTRLTYPE_KEYBOARD_INFO = CTRLTYPE_KEYBOARD_ADDR+1;
+        public static final int CTRLTYPE_KEYBOARD_REC = CTRLTYPE_KEYBOARD_INFO+1;
+        public static final int CTRLTYPE_KEYBOARD_FN1 = CTRLTYPE_KEYBOARD_REC+1;
+        public static final int CTRLTYPE_KEYBOARD_FN2 = CTRLTYPE_KEYBOARD_FN1+1;
+        public static final int CTRLTYPE_KEYBOARD_PLAY = CTRLTYPE_KEYBOARD_FN2+1;
+        public static final int CTRLTYPE_KEYBOARD_STOP = CTRLTYPE_KEYBOARD_PLAY+1;
+        public static final int CTRLTYPE_KEYBOARD_SLOW = CTRLTYPE_KEYBOARD_STOP+1;
+        public static final int CTRLTYPE_KEYBOARD_FAST = CTRLTYPE_KEYBOARD_SLOW+1;
+        public static final int CTRLTYPE_KEYBOARD_PREW = CTRLTYPE_KEYBOARD_FAST+1;
+        public static final int CTRLTYPE_KEYBOARD_NEXT = CTRLTYPE_KEYBOARD_PREW+1;
+        public static final int CTRLTYPE_KEYBOARD_JMPDOWN = CTRLTYPE_KEYBOARD_NEXT+1;
+        public static final int CTRLTYPE_KEYBOARD_JMPUP = CTRLTYPE_KEYBOARD_JMPDOWN+1;
+        public static final int CTRLTYPE_KEYBOARD_10PLUS = CTRLTYPE_KEYBOARD_JMPUP+1;
+        public static final int CTRLTYPE_KEYBOARD_SHIFT = CTRLTYPE_KEYBOARD_10PLUS+1;
+        public static final int CTRLTYPE_KEYBOARD_BACK = CTRLTYPE_KEYBOARD_SHIFT+1;
+        public static final int CTRLTYPE_KEYBOARD_LOGIN = CTRLTYPE_KEYBOARD_BACK+1;						// 新网络键盘功能
+        public static final int CTRLTYPE_KEYBOARD_CHNNEL = CTRLTYPE_KEYBOARD_LOGIN+1;					// 切换视频通道
+        public static final int CTRLTYPE_TRIGGER_ALARM_IN =100;											// 触发报警输入
+        public static final int CTRLTYPE_TRIGGER_ALARM_OUT = CTRLTYPE_TRIGGER_ALARM_IN+1; 				// 触发报警输出
+        public static final int CTRLTYPE_CTRL_MATRIX = CTRLTYPE_TRIGGER_ALARM_OUT+1; 					// 矩阵控制
+        public static final int CTRLTYPE_CTRL_SDCARD = CTRLTYPE_CTRL_MATRIX+1; 							// SD卡控制(IPC产品)参数同硬盘控制
+        public static final int CTRLTYPE_BURNING_START = CTRLTYPE_CTRL_SDCARD+1; 						// 刻录机控制,开始刻录
+        public static final int CTRLTYPE_BURNING_STOP = CTRLTYPE_BURNING_START+1; 						// 刻录机控制,结束刻录
+        public static final int CTRLTYPE_BURNING_ADDPWD = CTRLTYPE_BURNING_STOP+1; 						// 刻录机控制,叠加密码(以'\0'为结尾的字符串,最大长度8位)
+        public static final int CTRLTYPE_BURNING_ADDHEAD = CTRLTYPE_BURNING_ADDPWD+1; 					// 刻录机控制,叠加片头(以'\0'为结尾的字符串,最大长度1024字节,支持分行,行分隔符'\n')
+        public static final int CTRLTYPE_BURNING_ADDSIGN = CTRLTYPE_BURNING_ADDHEAD+1; 					// 刻录机控制,叠加打点到刻录信息(参数无)
+        public static final int CTRLTYPE_BURNING_ADDCURSTOMINFO = CTRLTYPE_BURNING_ADDSIGN+1; 			// 刻录机控制,自定义叠加(以'\0'为结尾的字符串,最大长度1024字节,支持分行,行分隔符'\n')
+        public static final int CTRLTYPE_CTRL_RESTOREDEFAULT = CTRLTYPE_BURNING_ADDCURSTOMINFO+1; 		// 恢复设备的默认设置
+        public static final int CTRLTYPE_CTRL_CAPTURE_START = CTRLTYPE_CTRL_RESTOREDEFAULT+1; 			// 触发设备抓图
+        public static final int CTRLTYPE_CTRL_CLEARLOG = CTRLTYPE_CTRL_CAPTURE_START+1; 				// 清除日志
+        public static final int CTRLTYPE_TRIGGER_ALARM_WIRELESS =200;									// 触发无线报警(IPC产品)
+        public static final int CTRLTYPE_MARK_IMPORTANT_RECORD = CTRLTYPE_TRIGGER_ALARM_WIRELESS+1; 	// 标识重要录像文件
+        public static final int CTRLTYPE_CTRL_DISK_SUBAREA = CTRLTYPE_MARK_IMPORTANT_RECORD+1; 			// 网络硬盘分区
+        public static final int CTRLTYPE_BURNING_ATTACH = CTRLTYPE_CTRL_DISK_SUBAREA+1; 				// 刻录机控制,附件刻录.
+        public static final int CTRLTYPE_BURNING_PAUSE = CTRLTYPE_BURNING_ATTACH+1; 					// 刻录暂停
+        public static final int CTRLTYPE_BURNING_CONTINUE = CTRLTYPE_BURNING_PAUSE+1; 					// 刻录继续
+        public static final int CTRLTYPE_BURNING_POSTPONE = CTRLTYPE_BURNING_CONTINUE+1; 				// 刻录顺延
+        public static final int CTRLTYPE_CTRL_OEMCTRL = CTRLTYPE_BURNING_POSTPONE+1; 					// 报停控制
+        public static final int CTRLTYPE_BACKUP_START = CTRLTYPE_CTRL_OEMCTRL+1; 						// 设备备份开始
+        public static final int CTRLTYPE_BACKUP_STOP = CTRLTYPE_BACKUP_START+1; 						// 设备备份停止
+        public static final int CTRLTYPE_VIHICLE_WIFI_ADD = CTRLTYPE_BACKUP_STOP+1; 					// 车载手动增加WIFI配置
+        public static final int CTRLTYPE_VIHICLE_WIFI_DEC = CTRLTYPE_VIHICLE_WIFI_ADD+1; 				// 车载手动删除WIFI配置
+        public static final int CTRLTYPE_BUZZER_START = CTRLTYPE_VIHICLE_WIFI_DEC+1; 					// 蜂鸣器控制开始
+        public static final int CTRLTYPE_BUZZER_STOP = CTRLTYPE_BUZZER_START+1; 						// 蜂鸣器控制结束
+        public static final int CTRLTYPE_REJECT_USER = CTRLTYPE_BUZZER_STOP+1; 							// 剔除用户
+        public static final int CTRLTYPE_SHIELD_USER = CTRLTYPE_REJECT_USER+1; 							// 屏蔽用户
+        public static final int CTRLTYPE_RAINBRUSH = CTRLTYPE_SHIELD_USER+1; 							// 智能交通,雨刷控制
+        public static final int CTRLTYPE_MANUAL_SNAP = CTRLTYPE_RAINBRUSH+1; 							// 智能交通,手动抓拍(对应结构体MANUAL_SNAP_PARAMETER)
+        public static final int CTRLTYPE_MANUAL_NTP_TIMEADJUST = CTRLTYPE_MANUAL_SNAP+1; 				// 手动NTP校时
+        public static final int CTRLTYPE_NAVIGATION_SMS = CTRLTYPE_MANUAL_NTP_TIMEADJUST+1; 			// 导航信息和短消息
+        public static final int CTRLTYPE_CTRL_ROUTE_CROSSING = CTRLTYPE_NAVIGATION_SMS+1; 				// 路线点位信息
+        public static final int CTRLTYPE_BACKUP_FORMAT = CTRLTYPE_CTRL_ROUTE_CROSSING+1; 				// 格式化备份设备
+        public static final int CTRLTYPE_DEVICE_LOCALPREVIEW_SLIPT = CTRLTYPE_BACKUP_FORMAT+1; 			// 控制设备端本地预览分割(对应结构体DEVICE_LOCALPREVIEW_SLIPT_PARAMETER)
+        public static final int CTRLTYPE_CTRL_INIT_RAID = CTRLTYPE_DEVICE_LOCALPREVIEW_SLIPT+1; 		// RAID初始化
+        public static final int CTRLTYPE_CTRL_RAID = CTRLTYPE_CTRL_INIT_RAID+1; 						// RAID操作
+        public static final int CTRLTYPE_CTRL_SAPREDISK = CTRLTYPE_CTRL_RAID+1; 						// 热备盘操作
+        public static final int CTRLTYPE_WIFI_CONNECT = CTRLTYPE_CTRL_SAPREDISK+1; 						// 手动发起WIFI连接(对应结构体WIFI_CONNECT)
+        public static final int CTRLTYPE_WIFI_DISCONNECT = CTRLTYPE_WIFI_CONNECT+1; 					// 手动断开WIFI连接(对应结构体WIFI_CONNECT)
+        public static final int CTRLTYPE_CTRL_ARMED = CTRLTYPE_WIFI_DISCONNECT+1; 						// 布撤防操作
+        public static final int CTRLTYPE_CTRL_IP_MODIFY = CTRLTYPE_CTRL_ARMED+1; 						// 修改前端IP(对应结构体 NET_CTRL_IPMODIFY_PARAM)
+        public static final int CTRLTYPE_CTRL_WIFI_BY_WPS = CTRLTYPE_CTRL_IP_MODIFY+1; 					// wps连接wifi(对应结构体NET_CTRL_CONNECT_WIFI_BYWPS)
+        public static final int CTRLTYPE_CTRL_FORMAT_PATITION = CTRLTYPE_CTRL_WIFI_BY_WPS+1; 			// 格式化分区(对应结构体NET_FORMAT_PATITION)
+        public static final int CTRLTYPE_CTRL_EJECT_STORAGE = CTRLTYPE_CTRL_FORMAT_PATITION+1; 			// 手动卸载设备(对应结构体NET_EJECT_STORAGE_DEVICE)
+        public static final int CTRLTYPE_CTRL_LOAD_STORAGE = CTRLTYPE_CTRL_EJECT_STORAGE+1; 			// 手动装载设备(对应结构体NET_LOAD_STORAGE_DEVICE)
+        public static final int CTRLTYPE_CTRL_CLOSE_BURNER = CTRLTYPE_CTRL_LOAD_STORAGE+1; 				// 关闭刻录机光驱门(对应结构体NET_CTRL_BURNERDOOR)一般需要等6
+        public static final int CTRLTYPE_CTRL_EJECT_BURNER = CTRLTYPE_CTRL_CLOSE_BURNER+1; 				// 弹出刻录机光驱门(对应结构体NET_CTRL_BURNERDOOR)一般需要等4秒
+        public static final int CTRLTYPE_CTRL_CLEAR_ALARM = CTRLTYPE_CTRL_EJECT_BURNER+1; 				// 消警(对应结构体NET_CTRL_CLEAR_ALARM)
+        public static final int CTRLTYPE_CTRL_MONITORWALL_TVINFO = CTRLTYPE_CTRL_CLEAR_ALARM+1; 		// 电视墙信息显示(对应结构体NET_CTRL_MONITORWALL_TVINFO)
+        public static final int CTRLTYPE_CTRL_START_VIDEO_ANALYSE = CTRLTYPE_CTRL_MONITORWALL_TVINFO+1; // 开始视频智能分析(对应结构体NET_CTRL_START_VIDEO_ANALYSE)
+        public static final int CTRLTYPE_CTRL_STOP_VIDEO_ANALYSE = CTRLTYPE_CTRL_START_VIDEO_ANALYSE+1; // 停止视频智能分析(对应结构体NET_CTRL_STOP_VIDEO_ANALYSE)
+        public static final int CTRLTYPE_CTRL_UPGRADE_DEVICE = CTRLTYPE_CTRL_STOP_VIDEO_ANALYSE+1; 		// 控制启动设备升级,由设备独立完成升级过程,不需要传输升级文件
+        public static final int CTRLTYPE_CTRL_MULTIPLAYBACK_CHANNALES = CTRLTYPE_CTRL_UPGRADE_DEVICE+1; // 切换多通道预览回放的通道(对应结构体NET_CTRL_MULTIPLAYBACK_CHANNALES)
+        public static final int CTRLTYPE_CTRL_SEQPOWER_OPEN = CTRLTYPE_CTRL_MULTIPLAYBACK_CHANNALES+1;  // 电源时序器打开开关量输出口(对应NET_CTRL_SEQPOWER_PARAM)
+        public static final int CTRLTYPE_CTRL_SEQPOWER_CLOSE = CTRLTYPE_CTRL_SEQPOWER_OPEN+1; 			// 电源时序器关闭开关量输出口(对应NET_CTRL_SEQPOWER_PARAM)
+        public static final int CTRLTYPE_CTRL_SEQPOWER_OPEN_ALL = CTRLTYPE_CTRL_SEQPOWER_CLOSE+1; 		// 电源时序器打开开关量输出口组(对应NET_CTRL_SEQPOWER_PARAM)
+        public static final int CTRLTYPE_CTRL_SEQPOWER_CLOSE_ALL = CTRLTYPE_CTRL_SEQPOWER_OPEN_ALL+1;   // 电源时序器关闭开关量输出口组(对应NET_CTRL_SEQPOWER_PARAM)
+        public static final int CTRLTYPE_CTRL_PROJECTOR_RISE = CTRLTYPE_CTRL_SEQPOWER_CLOSE_ALL+1; 		// 投影仪上升(对应NET_CTRL_PROJECTOR_PARAM)
+        public static final int CTRLTYPE_CTRL_PROJECTOR_FALL = CTRLTYPE_CTRL_PROJECTOR_RISE+1; 			// 投影仪下降(对应NET_CTRL_PROJECTOR_PARAM)
+        public static final int CTRLTYPE_CTRL_PROJECTOR_STOP = CTRLTYPE_CTRL_PROJECTOR_FALL+1; 			// 投影仪停止(对应NET_CTRL_PROJECTOR_PARAM)
+        public static final int CTRLTYPE_CTRL_INFRARED_KEY = CTRLTYPE_CTRL_PROJECTOR_STOP+1; 			// 红外按键(对应NET_CTRL_INFRARED_KEY_PARAM)
+        public static final int CTRLTYPE_CTRL_START_PLAYAUDIO = CTRLTYPE_CTRL_INFRARED_KEY+1; 			// 设备开始播放音频文件(对应结构体NET_CTRL_START_PLAYAUDIO)
+        public static final int CTRLTYPE_CTRL_STOP_PLAYAUDIO = CTRLTYPE_CTRL_START_PLAYAUDIO+1; 		// 设备停止播放音频文件
+        public static final int CTRLTYPE_CTRL_START_ALARMBELL = CTRLTYPE_CTRL_STOP_PLAYAUDIO+1; 		// 开启警号(对应结构体 NET_CTRL_ALARMBELL )
+        public static final int CTRLTYPE_CTRL_STOP_ALARMBELL = CTRLTYPE_CTRL_START_ALARMBELL+1; 		// 关闭警号(对应结构体 NET_CTRL_ALARMBELL )
+        public static final int CTRLTYPE_CTRL_ACCESS_OPEN = CTRLTYPE_CTRL_STOP_ALARMBELL+1; 			// 门禁控制-开门(对应结构体 NET_CTRL_ACCESS_OPEN)
+        public static final int CTRLTYPE_CTRL_SET_BYPASS = CTRLTYPE_CTRL_ACCESS_OPEN+1; 				// 设置旁路功能(对应结构体NET_CTRL_SET_BYPASS)
+        public static final int CTRLTYPE_CTRL_RECORDSET_INSERT = CTRLTYPE_CTRL_SET_BYPASS+1; 			// 添加记录,获得记录集编号(对应NET_CTRL_RECORDSET_INSERT_PARAM)
+        public static final int CTRLTYPE_CTRL_RECORDSET_UPDATE = CTRLTYPE_CTRL_RECORDSET_INSERT+1; 		// 更新某记录集编号的记录(对应 NET_CTRL_RECORDSET_PARAM)
+        public static final int CTRLTYPE_CTRL_RECORDSET_REMOVE = CTRLTYPE_CTRL_RECORDSET_UPDATE+1;	    // 根据记录集编号删除某记录(对应 NET_CTRL_RECORDSET_PARAM)
+        public static final int CTRLTYPE_CTRL_RECORDSET_CLEAR = CTRLTYPE_CTRL_RECORDSET_REMOVE+1; 		// 清除所有记录集信息(对应NET_CTRL_RECORDSET_PARAM)
+        public static final int CTRLTYPE_CTRL_ACCESS_CLOSE = CTRLTYPE_CTRL_RECORDSET_CLEAR+1; 			// 门禁控制-关门(对应结构体NET_CTRL_ACCESS_CLOSE)
+        public static final int CTRLTYPE_CTRL_ALARM_SUBSYSTEM_ACTIVE_SET = CTRLTYPE_CTRL_ACCESS_CLOSE+1;// 报警子系统激活设置(对应结构体NET_CTRL_ALARM_SUBSYSTEM_SETACTIVE)
+        public static final int CTRLTYPE_CTRL_FORBID_OPEN_STROBE = CTRLTYPE_CTRL_ALARM_SUBSYSTEM_ACTIVE_SET+1; // 禁止设备端开闸(对应结构体NET_CTRL_FORBID_OPEN_STROBE)
+        public static final int CTRLTYPE_CTRL_OPEN_STROBE = CTRLTYPE_CTRL_FORBID_OPEN_STROBE+1; 		// 开启道闸(对应结构体 NET_CTRL_OPEN_STROBE)
+        public static final int CTRLTYPE_CTRL_TALKING_REFUSE = CTRLTYPE_CTRL_OPEN_STROBE+1; 			// 对讲拒绝接听(对应结构体NET_CTRL_TALKING_REFUSE)
+        public static final int CTRLTYPE_CTRL_ARMED_EX = CTRLTYPE_CTRL_TALKING_REFUSE+1; 				// 布撤防操作(对应结构体CTRL_ARM_DISARM_PARAM_EX),对CTRL_ARM_DISARM_PARAM升级,建议用这个
+        public static final int CTRLTYPE_CTRL_NET_KEYBOARD =400;										// 网络键盘控制(对应结构体NET_CTRL_NET_KEYBOARD)
+        public static final int CTRLTYPE_CTRL_AIRCONDITION_OPEN = CTRLTYPE_CTRL_NET_KEYBOARD+1; 		// 打开空调(对应结构体NET_CTRL_OPEN_AIRCONDITION)
+        public static final int CTRLTYPE_CTRL_AIRCONDITION_CLOSE = CTRLTYPE_CTRL_AIRCONDITION_OPEN+1; 	// 关闭空调(对应结构体NET_CTRL_CLOSE_AIRCONDITION)
+        public static final int CTRLTYPE_CTRL_AIRCONDITION_SET_TEMPERATURE = CTRLTYPE_CTRL_AIRCONDITION_CLOSE+1; // 设定空调温度(对应结构体NET_CTRL_SET_TEMPERATURE)
+        public static final int CTRLTYPE_CTRL_AIRCONDITION_ADJUST_TEMPERATURE = CTRLTYPE_CTRL_AIRCONDITION_SET_TEMPERATURE+1; // 调节空调温度(对应结构体NET_CTRL_ADJUST_TEMPERATURE)
+        public static final int CTRLTYPE_CTRL_AIRCONDITION_SETMODE = CTRLTYPE_CTRL_AIRCONDITION_ADJUST_TEMPERATURE+1; 		  // 设置空调工作模式(对应结构体NET_CTRL_ADJUST_TEMPERATURE)
+        public static final int CTRLTYPE_CTRL_AIRCONDITION_SETWINDMODE = CTRLTYPE_CTRL_AIRCONDITION_SETMODE+1;   // 设置空调送风模式(对应结构体NET_CTRL_AIRCONDITION_SETMODE)
+        public static final int CTRLTYPE_CTRL_RESTOREDEFAULT_EX  = CTRLTYPE_CTRL_AIRCONDITION_SETWINDMODE+1;	 // 恢复设备的默认设置新协议(对应结构体 NET_CTRL_RESTORE_DEFAULT )
+        // 恢复配置优先使用该枚举,如果接口失败,
+        // 且CLIENT_GetLastError返回NET_UNSUPPORTED,再尝试使用NET_CTRL_RESTOREDEFAULT恢复配置
+        public static final int CTRLTYPE_CTRL_NOTIFY_EVENT = CTRLTYPE_CTRL_RESTOREDEFAULT_EX+1; 	   // 向设备发送事件(对应结构体NET_NOTIFY_EVENT_DATA)
+        public static final int CTRLTYPE_CTRL_SILENT_ALARM_SET = CTRLTYPE_CTRL_NOTIFY_EVENT+1; 		   // 无声报警设置
+        public static final int CTRLTYPE_CTRL_START_PLAYAUDIOEX = CTRLTYPE_CTRL_SILENT_ALARM_SET+1;    // 设备开始语音播报(对应结构体NET_CTRL_START_PLAYAUDIOEX)
+        public static final int CTRLTYPE_CTRL_STOP_PLAYAUDIOEX = CTRLTYPE_CTRL_START_PLAYAUDIOEX+1;    // 设备停止语音播报
+        public static final int CTRLTYPE_CTRL_CLOSE_STROBE = CTRLTYPE_CTRL_STOP_PLAYAUDIOEX+1;         // 关闭道闸(对应结构体 NET_CTRL_CLOSE_STROBE)
+        public static final int CTRLTYPE_CTRL_SET_ORDER_STATE = CTRLTYPE_CTRL_CLOSE_STROBE+1; 		   // 设置车位预定状态(对应结构体NET_CTRL_SET_ORDER_STATE)
+        public static final int CTRLTYPE_CTRL_RECORDSET_INSERTEX = CTRLTYPE_CTRL_SET_ORDER_STATE+1;    // 添加记录,获得记录集编号(对应 NET_CTRL_RECORDSET_INSERT_PARAM )
+        public static final int CTRLTYPE_CTRL_RECORDSET_UPDATEEX = CTRLTYPE_CTRL_RECORDSET_INSERTEX+1; // 更新某记录集编号的记录(对应NET_CTRL_RECORDSET_PARAM)
+        public static final int CTRLTYPE_CTRL_CAPTURE_FINGER_PRINT = CTRLTYPE_CTRL_RECORDSET_UPDATEEX+1; // 指纹采集(对应结构体NET_CTRL_CAPTURE_FINGER_PRINT)
+        public static final int CTRLTYPE_CTRL_ECK_LED_SET = CTRLTYPE_CTRL_CAPTURE_FINGER_PRINT+1; 	   // 停车场出入口控制器LED设置(对应结构体NET_CTRL_ECK_LED_SET_PARAM)
+        public static final int CTRLTYPE_CTRL_ECK_IC_CARD_IMPORT = CTRLTYPE_CTRL_ECK_LED_SET+1; 	   // 智能停车系统出入口机IC卡信息导入(对应结构体NET_CTRL_ECK_IC_CARD_IMPORT_PARAM)
+        public static final int CTRLTYPE_CTRL_ECK_SYNC_IC_CARD = CTRLTYPE_CTRL_ECK_IC_CARD_IMPORT+1;   // 智能停车系统出入口机IC卡信息同步指令,收到此指令后,设备删除原有IC卡信息(对应结构体NET_CTRL_ECK_SYNC_IC_CARD_PARAM)
+        public static final int CTRLTYPE_CTRL_LOWRATEWPAN_REMOVE = CTRLTYPE_CTRL_ECK_SYNC_IC_CARD+1;   // 删除指定无线设备(对应结构体NET_CTRL_LOWRATEWPAN_REMOVE)
+        public static final int CTRLTYPE_CTRL_LOWRATEWPAN_MODIFY = CTRLTYPE_CTRL_LOWRATEWPAN_REMOVE+1; // 修改无线设备信息(对应结构体NET_CTRL_LOWRATEWPAN_MODIFY)
+        public static final int CTRLTYPE_CTRL_ECK_SET_PARK_INFO = CTRLTYPE_CTRL_LOWRATEWPAN_MODIFY+1;  // 智能停车系统出入口机设置车位信息(对应结构体NET_CTRL_ECK_SET_PARK_INFO_PARAM)
+        public static final int CTRLTYPE_CTRL_VTP_DISCONNECT = CTRLTYPE_CTRL_ECK_SET_PARK_INFO+1; 	   // 挂断视频电话(对应结构体NET_CTRL_VTP_DISCONNECT)
+        public static final int CTRLTYPE_CTRL_UPDATE_FILES = CTRLTYPE_CTRL_VTP_DISCONNECT+1; 		   // 远程投放多媒体文件更新(对应结构体NET_CTRL_UPDATE_FILES)
+        public static final int CTRLTYPE_CTRL_MATRIX_SAVE_SWITCH = CTRLTYPE_CTRL_UPDATE_FILES+1; 	   // 保存上下位矩阵输出关系(对应结构体NET_CTRL_MATRIX_SAVE_SWITCH)
+        public static final int CTRLTYPE_CTRL_MATRIX_RESTORE_SWITCH = CTRLTYPE_CTRL_MATRIX_SAVE_SWITCH+1; // 恢复上下位矩阵输出关系(对应结构体NET_CTRL_MATRIX_RESTORE_SWITCH)
+        public static final int CTRLTYPE_CTRL_VTP_DIVERTACK = CTRLTYPE_CTRL_MATRIX_RESTORE_SWITCH+1;   // 呼叫转发响应(对应结构体NET_CTRL_VTP_DIVERTACK)
+        public static final int CTRLTYPE_CTRL_RAINBRUSH_MOVEONCE = CTRLTYPE_CTRL_VTP_DIVERTACK+1;      // 雨刷来回刷一次,雨刷模式配置为手动模式时有效(对应结构体NET_CTRL_RAINBRUSH_MOVEONCE)
+        public static final int CTRLTYPE_CTRL_RAINBRUSH_MOVECONTINUOUSLY = CTRLTYPE_CTRL_RAINBRUSH_MOVEONCE+1; 		   // 雨刷来回循环刷,雨刷模式配置为手动模式时有效(对应结构体NET_CTRL_RAINBRUSH_MOVECONTINUOUSLY)
+        public static final int CTRLTYPE_CTRL_RAINBRUSH_STOPMOVE = CTRLTYPE_CTRL_RAINBRUSH_MOVECONTINUOUSLY+1; 		   // 雨刷停止刷,雨刷模式配置为手动模式时有效(对应结构体NET_CTRL_RAINBRUSH_STOPMOVE)
+        public static final int CTRLTYPE_CTRL_ALARM_ACK = CTRLTYPE_CTRL_RAINBRUSH_STOPMOVE+1; 		   				   // 报警事件确认(对应结构体NET_CTRL_ALARM_ACK)
+        // NET_CTRL_ALARM_ACK 该操作切勿在报警回调接口中调用
+        public static final int CTRLTYPE_CTRL_RECORDSET_IMPORT = CTRLTYPE_CTRL_ALARM_ACK + 1; 		   				   // 批量导入记录集信息(对应 NET_CTRL_RECORDSET_PARAM )
+        public static final int CTRLTYPE_CTRL_DELIVERY_FILE = CTRLTYPE_CTRL_RECORDSET_IMPORT + 1; 	   				   // 向视频输出口投放视频和图片文件, 楼宇对讲使用,同一时间投放(对应 NET_CTRL_DELIVERY_FILE )
+        public static final int CTRLTYPE_CTRL_FORCE_BREAKING = CTRLTYPE_CTRL_DELIVERY_FILE + 1;                        // 强制产生违章类型(对应 NET_CTRL_FORCE_BREAKING)
+        public static final int CTRLTYPE_CTRL_RESTORE_EXCEPT = CTRLTYPE_CTRL_FORCE_BREAKING + 1;					   // 恢复除指定配置外的其他配置为默认。
+        public static final int CTRLTYPE_CTRL_SET_PARK_INFO = CTRLTYPE_CTRL_RESTORE_EXCEPT + 1;						   // 设置停车信息,平台设置给相机,内容用于点阵屏显示(对应结构体 NET_CTRL_SET_PARK_INFO)
+        public static final int CTRLTYPE_CTRL_CLEAR_SECTION_STAT = CTRLTYPE_CTRL_SET_PARK_INFO + 1;					   // 清除当前时间段内人数统计信息, 重新从0开始计算(对应结构体NET_CTRL_CLEAR_SECTION_STAT_INFO)
+        public static final int CTRLTYPE_CTRL_DELIVERY_FILE_BYCAR = CTRLTYPE_CTRL_CLEAR_SECTION_STAT + 1;              // 向视频输出口投放视频和图片文件, 车载使用,广告单独时间投放(对应NET_CTRL_DELIVERY_FILE_BYCAR)
+        public static final int CTRLTYPE_CTRL_ECK_GUIDINGPANEL_CONTENT = CTRLTYPE_CTRL_DELIVERY_FILE_BYCAR + 1;        // 设置诱导屏显示内容(对应结构体 NET_CTRL_ECK_GUIDINGPANEL_CONTENT)
+        public static final int CTRLTYPE_CTRL_SET_SAFE_LEVEL = CTRLTYPE_CTRL_ECK_GUIDINGPANEL_CONTENT + 1;		       // 设置门禁安全等级(对应结构体,pInBuf= NET_IN_SET_SAFE_LEVEL*, pOutBuf= NET_OUT_SET_SAFE_LEVEL * )
+        public static final int CTRLTYPE_CTRL_VTP_INVITEACK = CTRLTYPE_CTRL_SET_SAFE_LEVEL + 1;                        // 对讲请求回复(对应结构体 NET_CTRL_VTP_INVITEACK)
+        public static final int CTRLTYPE_CTRL_ACCESS_RESET_PASSWORD = CTRLTYPE_CTRL_VTP_INVITEACK + 1;                 // 门禁控制-重置密码(对应结构体 NET_CTRL_ACCESS_RESET_PASSWORD)
+
+        /**
+         *  以下命令只在 CLIENT_ControlDeviceEx 上有效
+         */
+        public static final int CTRLTYPE_CTRL_THERMO_GRAPHY_ENSHUTTER = 0x10000;										// 设置热成像快门启用/禁用,pInBuf= NET_IN_THERMO_EN_SHUTTER*, pOutBuf= NET_OUT_THERMO_EN_SHUTTER *
+        public static final int CTRLTYPE_CTRL_RADIOMETRY_SETOSDMARK = CTRLTYPE_CTRL_THERMO_GRAPHY_ENSHUTTER+1;          // 设置测温项的osd为高亮,pInBuf=NET_IN_RADIOMETRY_SETOSDMARK*,pOutBuf= NET_OUT_RADIOMETRY_SETOSDMARK *
+        public static final int CTRLTYPE_CTRL_AUDIO_REC_START_NAME = CTRLTYPE_CTRL_RADIOMETRY_SETOSDMARK+1; 		    // 开启音频录音并得到录音名,pInBuf = NET_IN_AUDIO_REC_MNG_NAME *, pOutBuf = NET_OUT_AUDIO_REC_MNG_NAME *
+        public static final int CTRLTYPE_CTRL_AUDIO_REC_STOP_NAME = CTRLTYPE_CTRL_AUDIO_REC_START_NAME+1; 				// 关闭音频录音并返回文件名称,pInBuf = NET_IN_AUDIO_REC_MNG_NAME *, pOutBuf = NET_OUT_AUDIO_REC_MNG_NAME *
+        public static final int CTRLTYPE_CTRL_SNAP_MNG_SNAP_SHOT = CTRLTYPE_CTRL_AUDIO_REC_STOP_NAME+1; 				// 即时抓图(又名手动抓图),pInBuf  =NET_IN_SNAP_MNG_SHOT *, pOutBuf = NET_OUT_SNAP_MNG_SHOT *
+        public static final int CTRLTYPE_CTRL_LOG_STOP = CTRLTYPE_CTRL_SNAP_MNG_SNAP_SHOT+1; 							// 强制同步缓存数据到数据库并关闭数据库,pInBuf = NET_IN_LOG_MNG_CTRL *, pOutBuf = NET_OUT_LOG_MNG_CTRL *
+        public static final int CTRLTYPE_CTRL_LOG_RESUME = CTRLTYPE_CTRL_LOG_STOP+1; 									// 恢复数据库,pInBuf = NET_IN_LOG_MNG_CTRL *, pOutBuf = NET_OUT_LOG_MNG_CTRL *
+
+        public static final int CTRLTYPE_CTRL_POS_ADD = CTRLTYPE_CTRL_LOG_RESUME + 1;	                               // 增加一个Pos设备, pInBuf = NET_IN_POS_ADD *, pOutBuf = NET_OUT_POS_ADD *
+        public static final int CTRLTYPE_CTRL_POS_REMOVE = CTRLTYPE_CTRL_POS_ADD + 1;                            // 删除一个Pos设备, pInBuf = NET_IN_POS_REMOVE *, pOutBuf = NET_OUT_POS_REMOVE *
+        public static final int CTRLTYPE_CTRL_POS_REMOVE_MULTI = CTRLTYPE_CTRL_POS_REMOVE + 1;                      // 批量删除Pos设备, pInBuf = NET_IN_POS_REMOVE_MULTI *, pOutBuf = NET_OUT_POS_REMOVE_MULTI *
+        public static final int CTRLTYPE_CTRL_POS_MODIFY = CTRLTYPE_CTRL_POS_REMOVE_MULTI + 1;                            // 修改一个Pos设备, pInBuf = NET_IN_POS_ADD *, pOutBuf = NET_OUT_POS_ADD *
+        public static final int CTRLTYPE_CTRL_SET_SOUND_ALARM = CTRLTYPE_CTRL_POS_MODIFY + 1;                       // 触发有声报警, pInBuf = NET_IN_SOUND_ALARM *, pOutBuf = NET_OUT_SOUND_ALARM *
+        public static final int CTRLTYPE_CTRL_AUDIO_MATRIX_SILENCE = CTRLTYPE_CTRL_SET_SOUND_ALARM + 1;				   // 音频举证一键静音控制(对应pInBuf = NET_IN_AUDIO_MATRIX_SILENCE, pOutBuf =  NET_OUT_AUDIO_MATRIX_SILENCE)
+        public static final int CTRLTYPE_CTRL_MANUAL_UPLOAD_PICTURE = CTRLTYPE_CTRL_AUDIO_MATRIX_SILENCE + 1;                 // 设置手动上传, pInBuf = NET_IN_MANUAL_UPLOAD_PICTURE *, pOutBUf = NET_OUT_MANUAL_UPLOAD_PICTURE *
+        public static final int CTRLTYPE_CTRL_REBOOT_NET_DECODING_DEV = CTRLTYPE_CTRL_MANUAL_UPLOAD_PICTURE + 1;               // 重启网络解码设备, pInBuf = NET_IN_REBOOT_NET_DECODING_DEV *, pOutBuf = NET_OUT_REBOOT_NET_DECODING_DEV *
+        public static final int CTRLTYPE_CTRL_SET_IC_SENDER = CTRLTYPE_CTRL_REBOOT_NET_DECODING_DEV + 1;						   // ParkingControl 设置发卡设备, pInBuf = NET_IN_SET_IC_SENDER *, pOutBuf = NET_OUT_SET_IC_SENDER *
+        public static final int CTRLTYPE_CTRL_SET_MEDIAKIND = CTRLTYPE_CTRL_SET_IC_SENDER + 1;                         // 设置监视码流组成,如仅音频,仅视频,音视频 pInBuf = NET_IN_SET_MEDIAKIND *, pOutBuf = NET_OUT_SET_MEDIAKIND *// 配合功能列表能力集使用, EN_ENCODE_CHN,2-监视支持音视频分开获取
+        public static final int CTRLTYPE_CTRL_LOWRATEWPAN_ADD = CTRLTYPE_CTRL_SET_MEDIAKIND + 1;                       // 增加无线设备信息(对应结构体 pInBuf = NET_CTRL_LOWRATEWPAN_ADD *, pOutBUf = NULL)
+        public static final int CTRLTYPE_CTRL_LOWRATEWPAN_REMOVEALL = CTRLTYPE_CTRL_LOWRATEWPAN_ADD + 1;                 // 删除所有的无线设备信息(对应结构体 pInBuf = NET_CTRL_LOWRATEWPAN_REMOVEALL *, pOutBUf = NULL)
+        public static final int CTRLTYPE_CTRL_SET_DOOR_WORK_MODE =  CTRLTYPE_CTRL_LOWRATEWPAN_REMOVEALL + 1;                   // 设置门锁工作模式(对应结构体 pInBuf = NET_IN_CTRL_ACCESS_SET_DOOR_WORK_MODE *, pOutBUf = NULL)
+        public static final int CTRLTYPE_CTRL_TEST_MAIL = CTRLTYPE_CTRL_SET_DOOR_WORK_MODE + 1;                             // 测试邮件 pInBuf = NET_IN_TEST_MAIL *, pOutBUf = NET_OUT_TEST_MAIL *
+        public static final int CTRLTYPE_CTRL_CONTROL_SMART_SWITCH = CTRLTYPE_CTRL_TEST_MAIL + 1;                  // 控制智能开关 pInBuf = NET_IN_CONTROL_SMART_SWITCH *, pOutBUf = NET_OUT_CONTROL_SMART_SWITCH *
+        public static final int CTRLTYPE_CTRL_LOWRATEWPAN_SETWORKMODE = CTRLTYPE_CTRL_CONTROL_SMART_SWITCH + 1;          	   // 设置探测器的工作模式(对应结构体pInBuf = NET_IN_CTRL_LOWRATEWPAN_SETWORKMODE *, pOutBUf = NULL)
+        public static final int CTRLTYPE_CTRL_COAXIAL_CONTROL_IO = CTRLTYPE_CTRL_LOWRATEWPAN_SETWORKMODE + 1;					   // 发送同轴IO控制命令(对应结构体pInBuf = NET_IN_CONTROL_COAXIAL_CONTROL_IO*, pOutBUf = NET_OUT_CONTROL_COAXIAL_CONTROL_IO*)
+        public static final int CTRLTYPE_CTRL_START_REMOTELOWRATEWPAN_ALARMBELL = CTRLTYPE_CTRL_COAXIAL_CONTROL_IO + 1;		// 开启无线警号 (对应结构体pInBuf = NET_IN_START_REMOTELOWRATEWPAN_ALARMBELL*, pOutBUf = NET_OUT_START_REMOTELOWRATEWPAN_ALARMBELL*)
+        public static final int CTRLTYPE_CTRL_STOP_REMOTELOWRATEWPAN_ALARMBELL = CTRLTYPE_CTRL_START_REMOTELOWRATEWPAN_ALARMBELL + 1;		// 关闭无线警号 (对应结构体pInBuf = NET_IN_STOP_REMOTELOWRATEWPAN_ALARMBELL*, pOutBUf = NET_OUT_STOP_REMOTELOWRATEWPAN_ALARMBELL*)
+        public static final int CTRLTYPE_CTRL_THERMO_DO_FFC = CTRLTYPE_CTRL_STOP_REMOTELOWRATEWPAN_ALARMBELL + 1;							// 热成像FFC校准(对应结构体 pInBuf = NET_IN_THERMO_DO_FFC *,pOutBuf = NET_OUT_THERMO_DO_FFC *)
+        public static final int CTRLTYPE_CTRL_THERMO_FIX_FOCUS = CTRLTYPE_CTRL_THERMO_DO_FFC + 1;						// 热成像双目定焦调(对应结构体 pInBuf = NET_IN_THERMO_FIX_FOCUS *,pOutBuf = NET_OUT_THERMO_FIX_FOCUS *)
+        public static final int CTRLTYPE_CTRL_SET_THIRD_CALLSTATUS = CTRLTYPE_CTRL_THERMO_FIX_FOCUS + 1;					// 设置对讲状态(对应结构体pInBuf = NET_IN_VTP_THIRDCALL_STATUS*, pOutBuf = NET_OUT_VTP_THIRDCALL_STATUS*)
+        public static final int CTRL_ACCESS_CLEAR_STATUS = CTRLTYPE_CTRL_SET_THIRD_CALLSTATUS + 1;	                    // 门禁定制-清除用户进出门状态 (对应结构体pInBuf = NET_IN_ACCESS_CLEAR_STATUS*, pOutBuf = NET_OUT_ACCESS_CLEAR_STATUS *)
+        public static final int CTRL_ACCESS_DEAL_RECORD = CTRL_ACCESS_CLEAR_STATUS + 1;                     // 门禁定制-查询/设置用户进出门记录 (对应结构体pInBuf = NET_IN_ACCESS_DEAL_RECORD*, pOutBuf = NET_OUT_ACCESS_DEAL_RECORD*)
+        public static final int CTRL_QUERY_DELIVERED_FILE = CTRL_ACCESS_DEAL_RECORD + 1;                   // 向视频输出口查询广告信息,楼宇对讲使用,(对应NET_CTRL_QUERY_DELIVERY_FILE)
+        public static final int CTRL_SET_PARK_CONTROL_INFO = CTRL_QUERY_DELIVERED_FILE + 1;					// 设置停车控制信息(点阵屏和语音播报的控制)(对应结构体pInBuf = NET_IN_SET_PARK_CONTROL_INFO*, pOutBuf = NET_OUT_SET_PARK_CONTROL_INFO*)
+    }
+
+    /************************************************************************
+     ** 接口
+     ***********************************************************************/
+    //  JNA直接调用方法定义,cbDisConnect 实际情况并不回调Java代码,仅为定义可以使用如下方式进行定义。 fDisConnect 回调
+    public boolean CLIENT_Init(Callback cbDisConnect, Pointer dwUser);
+
+    //  JNA直接调用方法定义,SDK退出清理
+    public void CLIENT_Cleanup();
+
+    //  JNA直接调用方法定义,设置断线重连成功回调函数,设置后SDK内部断线自动重连, fHaveReConnect 回调
+    public void CLIENT_SetAutoReconnect(Callback cbAutoConnect, Pointer dwUser);
+
+    // 设置连接设备超时时间和尝试次数
+    public void CLIENT_SetConnectTime(int nWaitTime, int nTryTimes);
+
+    // 设置登陆网络环境
+    public void CLIENT_SetNetworkParam(NetSDKLibs.NET_PARAM pNetParam);
+
+    // 打开日志功能
+    // pstLogPrintInfo指向LOG_SET_PRINT_INFO的指针
+    public boolean CLIENT_LogOpen(NetSDKLibs.LOG_SET_PRINT_INFO pstLogPrintInfo);
+
+    // 高安全级别登陆
+    public NetSDKLibs.LLong CLIENT_LoginWithHighLevelSecurity(NetSDKLibs.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam, NetSDKLibs.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam);
+
+
+    // CLIENT_LoginWithHighLevelSecurity 输入参数
+    public static class NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY extends NetSDKLibs.SdkStructure
+    {
+        public int						    dwSize;				            // 结构体大小
+        public byte[]						szIP=new byte[64];	            // IP
+        public int							nPort;				            // 端口
+        public byte[]						szUserName=new byte[64];		// 用户名
+        public byte[]						szPassword=new byte[64];		// 密码
+        public int		                    emSpecCap;			            // 登录模式
+        public byte[]						byReserved=new byte[4];		    // 字节对齐
+        public Pointer pCapParam;			            // 见 CLIENT_LoginEx 接口 pCapParam 与 nSpecCap 关系
+
+        public NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY()
+        {
+            this.dwSize = this.size();
+        }// 此结构体大小
+    };
+
+
+    // CLIENT_LoginWithHighLevelSecurity 输出参数
+    public static class NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY extends NetSDKLibs.SdkStructure
+    {
+        public int						    dwSize;				            // 结构体大小
+        public NetSDKLibs.NET_DEVICEINFO_Ex stuDeviceInfo;		            // 设备信息
+        public int							nError;				            // 错误码,见 CLIENT_Login 接口错误码
+        public byte[]						byReserved=new byte[132];	    // 预留字段
+
+        public NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY()
+        {
+            this.dwSize = this.size();
+        }// 此结构体大小
+    };
+
+    // SDK全局日志打印信息
+    public static class LOG_SET_PRINT_INFO extends NetSDKLibs.SdkStructure
+    {
+        public int 		dwSize;
+        public int 		bSetFilePath;//是否重设日志路径, BOOL类型,取值0或1
+        public byte[] 	szLogFilePath = new byte[MAX_LOG_PATH_LEN];//日志路径(默认"./sdk_log/sdk_log.log")
+        public int 		bSetFileSize;//是否重设日志文件大小, BOOL类型,取值0或1
+        public int 		nFileSize;//每个日志文件的大小(默认大小10240),单位:比特, 类型为unsigned int
+        public int 		bSetFileNum;//是否重设日志文件个数, BOOL类型,取值0或1
+        public int 		nFileNum;//绕接日志文件个数(默认大小10), 类型为unsigned int
+        public int 		bSetPrintStrategy;//是否重设日志打印输出策略, BOOL类型,取值0或1
+        public int 		nPrintStrategy;//日志输出策略,0:输出到文件(默认); 1:输出到窗口, 类型为unsigned int
+        public byte[]	byReserved=new byte[4];							// 字节对齐
+        public Pointer cbSDKLogCallBack;						// 日志回调,需要将sdk日志回调出来时设置,默认为NULL
+        public Pointer dwUser;									// 用户数据
+        public LOG_SET_PRINT_INFO()
+        {
+            this.dwSize = this.size();
+        }
+    }
+
+
+    // 设置登入时的相关参数
+    public static class NET_PARAM  extends NetSDKLibs.SdkStructure
+    {
+        public int                    nWaittime;                // 等待超时时间(毫秒为单位),为0默认5000ms
+        public int                    nConnectTime;            	// 连接超时时间(毫秒为单位),为0默认1500ms
+        public int                    nConnectTryNum;           // 连接尝试次数,为0默认1次
+        public int                    nSubConnectSpaceTime;    	// 子连接之间的等待时间(毫秒为单位),为0默认10ms
+        public int                    nGetDevInfoTime;        	// 获取设备信息超时时间,为0默认1000ms
+        public int                    nConnectBufSize;        	// 每个连接接收数据缓冲大小(字节为单位),为0默认250*1024
+        public int                    nGetConnInfoTime;         // 获取子连接信息超时时间(毫秒为单位),为0默认1000ms
+        public int                    nSearchRecordTime;      	// 按时间查询录像文件的超时时间(毫秒为单位),为0默认为3000ms
+        public int                    nsubDisconnetTime;      	// 检测子链接断线等待时间(毫秒为单位),为0默认为60000ms
+        public byte                   byNetType;                // 网络类型, 0-LAN, 1-WAN
+        public byte                   byPlaybackBufSize;      	// 回放数据接收缓冲大小(M为单位),为0默认为4M
+        public byte                   bDetectDisconnTime;       // 心跳检测断线时间(单位为秒),为0默认为60s,最小时间为2s
+        public byte                   bKeepLifeInterval;        // 心跳包发送间隔(单位为秒),为0默认为10s,最小间隔为2s
+        public int                    nPicBufSize;              // 实时图片接收缓冲大小(字节为单位),为0默认为2*1024*1024
+        public byte[]                 bReserved = new byte[4];  // 保留字段字段
+    }
+
+    // 门禁状态信息(CLIENT_QueryDevState 接口输入参数)
+    public static class NET_DOOR_STATUS_INFO extends SdkStructure
+    {
+        public int dwSize;
+        public int nChannel;//门禁通道号
+        public int emStateType;//门禁状态信息, 对应枚举EM_NET_DOOR_STATUS_TYPE
+
+        public NET_DOOR_STATUS_INFO() {
+            this.dwSize = this.size();
+        }
+    }
+
+    // 门禁关门CLIENT_ControlDevice接口的 CTRLTYPE_CTRL_ACCESS_CLOSE 命令参数
+    public static class NET_CTRL_ACCESS_CLOSE extends NetSDKLibs.SdkStructure
+    {
+        public int dwSize;
+        public int nChannelID;//通道号(0开始)
+
+        public NET_CTRL_ACCESS_CLOSE() {
+            this.dwSize = this.size();
+        }
+    }
+
+    // 设备控制扩展接口,兼容 CLIENT_ControlDevice (pInBuf, pOutBuf内存由用户申请释放)
+    // emType的取值为CtrlType中的值
+    public boolean CLIENT_ControlDeviceEx(LLong lLoginID, int emType, Pointer pInBuf, Pointer pOutBuf, int nWaitTime);
+
+
+    // 查询设备状态(pBuf内存由用户申请释放)
+    // pBuf指向char *,输出参数
+    // pRetLen指向int *;输出参数,实际返回的数据长度,单位字节
+    public boolean CLIENT_QueryDevState(LLong lLoginID, int nType, Pointer pBuf, int nBufLen, IntByReference pRetLen, int waittime);
+
+
+    // 返回函数执行失败代码
+    public int CLIENT_GetLastError();
+
+    /***********************************************************************
+     ** 回调
+     ***********************************************************************/
+    //JNA Callback方法定义,断线回调
+    public interface fDisConnect extends Callback {
+        public void invoke(NetSDKLibs.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser);
+    }
+
+    // 网络连接恢复回调函数原形
+    public interface fHaveReConnect extends Callback {
+        public void invoke(NetSDKLibs.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser);
+    }
+
+    // 门禁开门 CLIENT_ControlDevice接口的 CTRLTYPE_CTRL_ACCESS_OPEN 命令参数
+    public static class NET_CTRL_ACCESS_OPEN extends NetSDKLibs.SdkStructure {
+        public int          dwSize;
+        public int          nChannelID;            					  // 通道号(0开始)
+        public Pointer szTargetID;			    				  // 转发目标设备ID,为NULL表示不转发
+        public byte[]       szUserID = new byte[MAX_COMMON_STRING_32];//远程用户ID
+        public int			emOpenDoorType;                			  // 开门方式, 参考 EM_OPEN_DOOR_TYPE
+        /**
+         * EM_OPEN_DOOR_DIRECTION
+         */
+        public int		    emOpenDoorDirection;			// 开门方向
+        /**
+         * EM_REMOTE_CHECK_CODE
+         */
+        public int		    emRemoteCheckCode;				// 远程权限验证结果
+        public NET_CTRL_ACCESS_OPEN() {
+            this.dwSize = this.size();
+        }
+    }
+
+    //  JNA直接调用方法定义,向设备注销
+    public boolean CLIENT_Logout(LLong lLoginID);
+}

+ 214 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/utils/door/lib/Utils.java

@@ -0,0 +1,214 @@
+package com.zd.laboratory.utils.door.lib;
+
+import com.sun.jna.IntegerType;
+import com.sun.jna.Native;
+import com.sun.jna.Platform;
+import com.sun.jna.Structure;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * @Author donggaosheng
+ * @Date 2023-11-29
+ * @description
+ **/
+public class Utils {
+    public Utils() {
+
+    }
+
+    /**
+     * 获取系统对应的编码
+     *
+     */
+    public static String getPlatformEncode() {
+        String encode = "";
+        String osPrefix = getOsPrefix();
+        if (osPrefix.toLowerCase().startsWith("win32")) {
+            encode = "GBK";
+        } else if (osPrefix.toLowerCase().startsWith("linux")) {
+            encode = "UTF-8";
+        }else if(osPrefix.toLowerCase().startsWith("mac")){
+            encode="UTF-8";
+        }
+        if(encode.isEmpty()){
+            encode="UTF-8";
+        }
+        return encode;
+    }
+
+    // 获取操作平台信息
+    public static String getOsPrefix() {
+        String arch = System.getProperty("os.arch").toLowerCase();
+        final String name = System.getProperty("os.name");
+        String osPrefix;
+        switch (Platform.getOSType()) {
+            case Platform.WINDOWS: {
+                if ("i386".equals(arch))
+                    arch = "x86";
+                osPrefix = "win32-" + arch;
+            }
+            break;
+            case Platform.LINUX: {
+                if ("x86".equals(arch)) {
+                    arch = "i386";
+                } else if ("x86_64".equals(arch)) {
+                    arch = "amd64";
+                }
+                osPrefix = "linux-" + arch;
+            }
+            break;
+            case Platform.MAC: {
+                //mac系统的os.arch都是ppc(老版本的mac是powerpc,已经基本不用)看不出系统位数,使用下面的参数表示
+                arch = System.getProperty("sun.arch.data.model");
+                osPrefix = "mac-" + arch;
+            }
+            break;
+            default: {
+                osPrefix = name.toLowerCase();
+                if ("x86".equals(arch)) {
+                    arch = "i386";
+                }
+                if ("x86_64".equals(arch)) {
+                    arch = "amd64";
+                }
+                int space = osPrefix.indexOf(" ");
+                if (space != -1) {
+                    osPrefix = osPrefix.substring(0, space);
+                }
+                osPrefix += "-" + arch;
+            }
+            break;
+
+        }
+
+        return osPrefix;
+    }
+
+    public static String getOsName() {
+        String osName = "";
+        String osPrefix = getOsPrefix();
+        if (osPrefix.toLowerCase().startsWith("win32-x86")
+                || osPrefix.toLowerCase().startsWith("win32-amd64")) {
+            osName = "win";
+        } else if (osPrefix.toLowerCase().startsWith("linux-i386")
+                || osPrefix.toLowerCase().startsWith("linux-amd64")) {
+            osName = "linux";
+        } else if (osPrefix.toLowerCase().startsWith("mac-64")
+                || osPrefix.toLowerCase().startsWith("mac-32")) {
+            osName = "mac";
+        }
+
+        return osName;
+    }
+
+    // 获取加载库
+    public static String getLoadLibrary(String library) {
+        if (isChecking()) {
+            return null;
+        }
+
+        String loadLibrary = "";
+        String osPrefix = getOsPrefix();
+        if (osPrefix.toLowerCase().startsWith("win32-x86")) {
+            loadLibrary = "./libs/win32/";
+        } else if (osPrefix.toLowerCase().startsWith("win32-amd64")) {
+            loadLibrary = "./libs/win64/";
+        } else if (osPrefix.toLowerCase().startsWith("linux-i386")) {
+            loadLibrary = "";
+        } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
+            loadLibrary = "";
+        } else if (osPrefix.toLowerCase().startsWith("mac-64")) {
+            loadLibrary = "";
+        }
+//		else if(osPrefix.toLowerCase().startsWith("mac-32")) {
+//			loadLibrary = "";
+//		}  32位mac版本基本没人用了,暂时不用
+
+        System.out.printf("加载库[%s]\n", loadLibrary + library);
+        return loadLibrary + library;
+    }
+
+    private static boolean checking = false;
+
+    public static void setChecking() {
+        checking = true;
+    }
+
+    public static void clearChecking() {
+        checking = false;
+    }
+
+    public static boolean isChecking() {
+        return checking;
+    }
+
+    public static class LLong extends IntegerType {
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * Size of a native long, in bytes.
+         */
+        public static int size;
+
+        static {
+            size = Native.LONG_SIZE;
+            if (Utils.getOsPrefix().toLowerCase().equals("linux-amd64")
+                    || Utils.getOsPrefix().toLowerCase().equals("win32-amd64")
+                    || Utils.getOsPrefix().toLowerCase().equals("mac-64")) {
+                size = 8;
+            } else if (Utils.getOsPrefix().toLowerCase().equals("linux-i386")
+                    || Utils.getOsPrefix().toLowerCase().equals("win32-x86")) {
+                size = 4;
+            }
+        }
+
+        /**
+         * Create a zero-valued LLong.
+         */
+        public LLong() {
+            this(0);
+        }
+
+        /**
+         * Create a LLong with the given value.
+         */
+        public LLong(long value) {
+            super(size, value);
+        }
+    }
+
+    public static class SdkStructure extends Structure {
+        @Override
+        protected List<String> getFieldOrder() {
+            List<String> fieldOrderList = new ArrayList<String>();
+            for (Class<?> cls = getClass();
+                 !cls.equals(NetSDKLibs.SdkStructure.class);
+                 cls = cls.getSuperclass()) {
+                Field[] fields = cls.getDeclaredFields();
+                int modifiers;
+                for (Field field : fields) {
+                    modifiers = field.getModifiers();
+                    if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
+                        continue;
+                    }
+                    fieldOrderList.add(field.getName());
+                }
+            }
+            //            System.out.println(fieldOrderList);
+
+            return fieldOrderList;
+        }
+    }
+
+    // 获取当前时间
+    public static String getDate() {
+        SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return simpleDate.format(new java.util.Date())
+                .replace(" ", "_").replace(":", "-");
+    }
+
+}

+ 23 - 0
zd-modules/zd-modules-laboratory/src/main/resources/dynamic-lib-load.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<dynamic-lib>
+    <win64>
+        <lib>dhconfigsdk</lib>
+        <lib>dhnetsdk</lib>
+    </win64>
+    <win32>
+        <lib>dhconfigsdk</lib>
+        <lib>dhnetsdk</lib>
+    </win32>
+    <linux64>
+        <lib>dhnetsdk</lib>
+        <lib>dhconfigsdk</lib>
+    </linux64>
+    <linux32>
+        <lib>dhconfigsdk</lib>
+        <lib>dhnetsdk</lib>
+    </linux32>
+    <mac64>
+        <lib>dhnetsdk</lib>
+        <lib>dhconfigsdk</lib>
+    </mac64>
+</dynamic-lib>

BIN
zd-modules/zd-modules-laboratory/src/main/resources/libs/INetSDK.jar


BIN
zd-modules/zd-modules-laboratory/src/main/resources/libs/jna.jar


BIN
zd-modules/zd-modules-laboratory/src/main/resources/linux64/libStreamConvertor.so


BIN
zd-modules/zd-modules-laboratory/src/main/resources/linux64/libavnetsdk.so


BIN
zd-modules/zd-modules-laboratory/src/main/resources/linux64/libdhconfigsdk.so


BIN
zd-modules/zd-modules-laboratory/src/main/resources/linux64/libdhnetsdk.so


BIN
zd-modules/zd-modules-laboratory/src/main/resources/linux64/libjninetsdk.so


+ 7 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabHardwareMapper.xml

@@ -616,4 +616,11 @@
             limit 1
         </where>
     </select>
+    <select id="selectLabHardwareListBySubjectId" resultType="java.util.Map">
+           SELECT har_user harUser,har_psw harPsw,ip_address ipAddress,port,dept_id deptId FROM lab_hardware lh WHERE TYPE=11
+           <if test="subjectId != null">
+              and lh.subject_id = #{subjectId}
+           </if>
+           ORDER BY lh.id DESC
+    </select>
 </mapper>

+ 2 - 0
zd-modules/zd-modules-laboratory/src/main/resources/mapper/laboratory/LabSubjectAccessRecordMapper.xml

@@ -337,6 +337,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">update_time,</if>
             <if test="updateBy != null">update_by,</if>
             <if test="remark != null">remark,</if>
+            <if test="initFlag != null">init_flag,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="id != null">#{id},</if>
@@ -352,6 +353,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateTime != null">#{updateTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="initFlag != null">#{initFlag},</if>
          </trim>
     </insert>
 

BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/ImageAlg.dll


BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/Infra.dll


BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/IvsDrawer.dll


BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/StreamConvertor.dll


BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/avnetsdk.dll


BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/dhconfigsdk.dll


BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/dhnetsdk.dll


BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/dhplay.dll


BIN
zd-modules/zd-modules-laboratory/src/main/resources/win64/jninetsdk.dll