|  | @@ -1,255 +0,0 @@
 | 
	
		
			
				|  |  | -package com.supervision.web.peopleGateManage.Service.impl;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import com.sun.jna.Native;
 | 
	
		
			
				|  |  | -import com.supervision.web.ConnectSDK.peopleDoor.Commom.osSelect;
 | 
	
		
			
				|  |  | -import com.supervision.web.ConnectSDK.peopleDoor.NetSDKDemo.HCNetSDK;
 | 
	
		
			
				|  |  | -import com.supervision.web.ConnectSDK.util.HikSDKManager;
 | 
	
		
			
				|  |  | -import com.supervision.web.ConnectSDK.util.SdkType;
 | 
	
		
			
				|  |  | -import org.slf4j.Logger;
 | 
	
		
			
				|  |  | -import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | -import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import javax.annotation.PostConstruct;
 | 
	
		
			
				|  |  | -import javax.annotation.PreDestroy;
 | 
	
		
			
				|  |  | -import java.io.UnsupportedEncodingException;
 | 
	
		
			
				|  |  | -import java.util.Map;
 | 
	
		
			
				|  |  | -import java.util.concurrent.ConcurrentHashMap;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -@Service
 | 
	
		
			
				|  |  | -public class HikvisionPeopleAcsServiceImpl {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private static final Logger logger = org.slf4j.LoggerFactory.getLogger(HikvisionPeopleAcsServiceImpl.class);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private HCNetSDK hCNetSDK = null;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private HikSDKManager hikSDKManager;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 获取门禁 SDK
 | 
	
		
			
				|  |  | -    HCNetSDK peopleDoorSDK = (HCNetSDK) hikSDKManager.getSDK(SdkType.PEOPLE_DOOR);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // 用户名 -> userID 映射,多用户支持
 | 
	
		
			
				|  |  | -    private final Map<String, Integer> userLoginMap = new ConcurrentHashMap<>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private boolean sdkInitialized = false;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private int iCharEncodeType = 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 用户登录设备
 | 
	
		
			
				|  |  | -     * 调用SDK登录设备
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    public Map<String, Object> beginloginDevice(String username, String ip, short port, String user, String psw,
 | 
	
		
			
				|  |  | -                                                String caseId)
 | 
	
		
			
				|  |  | -            throws UnsupportedEncodingException, InterruptedException {
 | 
	
		
			
				|  |  | -        Map<String, Object> res = new java.util.HashMap<>();
 | 
	
		
			
				|  |  | -        if (!sdkInitialized) {
 | 
	
		
			
				|  |  | -            res.put("message", "SDK未初始化");
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 重复登录处理
 | 
	
		
			
				|  |  | -        if (userLoginMap.containsKey(username)) {
 | 
	
		
			
				|  |  | -            logger.info("用户 {} 已登录,先登出原 session", username);
 | 
	
		
			
				|  |  | -            logout(username);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 设备登录
 | 
	
		
			
				|  |  | -        // lUserID = loginDevice("10.10.138.203", (short) 8000, "admin", "hik12345");    //登陆设备
 | 
	
		
			
				|  |  | -        int userID = loginDevice(ip, port, user, psw);
 | 
	
		
			
				|  |  | -        if (userID < 0) {
 | 
	
		
			
				|  |  | -            res.put("message", "登录设备失败");
 | 
	
		
			
				|  |  | -            return res;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 保存用户登录句柄
 | 
	
		
			
				|  |  | -        userLoginMap.put(username, userID);
 | 
	
		
			
				|  |  | -        logger.info("用户 {} 登录成功, userID={}", username, userID);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 根据caseId 执行操作
 | 
	
		
			
				|  |  | -        handleCase(userID, caseId);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        res.put("message", "操作成功,用户已登录");
 | 
	
		
			
				|  |  | -        res.put("userID", userID);
 | 
	
		
			
				|  |  | -        return res;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 用户登出设备
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    public void logout(String username) {
 | 
	
		
			
				|  |  | -        Integer userID = userLoginMap.remove(username);
 | 
	
		
			
				|  |  | -        if (userID != null && userID >= 0) {
 | 
	
		
			
				|  |  | -            hCNetSDK.NET_DVR_Logout(userID);
 | 
	
		
			
				|  |  | -            logger.info("用户 {} 已登出, userID={}", username, userID);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 登录设备,支持 V40 和 V30 版本,功能一致。
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param ip   设备IP地址
 | 
	
		
			
				|  |  | -     * @param port SDK端口,默认为设备的8000端口
 | 
	
		
			
				|  |  | -     * @param user 设备用户名
 | 
	
		
			
				|  |  | -     * @param psw  设备密码
 | 
	
		
			
				|  |  | -     * @return 登录成功返回用户ID,失败返回-1
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    public int loginDevice(String ip, short port, String user, String psw) {
 | 
	
		
			
				|  |  | -        // SDK 已经全局初始化,不需要再次 NET_DVR_Init
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 创建设备登录信息和设备信息对象
 | 
	
		
			
				|  |  | -        HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
 | 
	
		
			
				|  |  | -        HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 填充 loginInf
 | 
	
		
			
				|  |  | -        // 设置设备IP地址
 | 
	
		
			
				|  |  | -        byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
 | 
	
		
			
				|  |  | -        byte[] ipBytes = ip.getBytes();
 | 
	
		
			
				|  |  | -        System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length));
 | 
	
		
			
				|  |  | -        loginInfo.sDeviceAddress = deviceAddress;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 设置用户名和密码
 | 
	
		
			
				|  |  | -        byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
 | 
	
		
			
				|  |  | -        byte[] password = psw.getBytes();
 | 
	
		
			
				|  |  | -        System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length));
 | 
	
		
			
				|  |  | -        System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length));
 | 
	
		
			
				|  |  | -        loginInfo.sUserName = userName;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 设置端口和登录模式
 | 
	
		
			
				|  |  | -        loginInfo.wPort = port;
 | 
	
		
			
				|  |  | -        loginInfo.bUseAsynLogin = false; // 同步登录
 | 
	
		
			
				|  |  | -        loginInfo.byLoginMode = 0; // 使用SDK私有协议
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 执行登录操作
 | 
	
		
			
				|  |  | -        int userID = hCNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo); // 用户注册即登录设备,调用NET_DVR_Login_V40接口,每一台设备只需要登录一次。
 | 
	
		
			
				|  |  | -        if (userID == -1) {
 | 
	
		
			
				|  |  | -            logger.error("登录失败,错误码为: " + hCNetSDK.NET_DVR_GetLastError());
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            deviceInfo.read();
 | 
	
		
			
				|  |  | -            // 获取设备字符编码格式
 | 
	
		
			
				|  |  | -            iCharEncodeType = deviceInfo.byCharEncodeType;
 | 
	
		
			
				|  |  | -            logger.info("{} 设备登录成功,userID={}", ip, userID);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return userID; // 返回登录结果
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 根据caseId 执行操作
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    private void handleCase(int userID, String caseId) throws UnsupportedEncodingException, InterruptedException {
 | 
	
		
			
				|  |  | -        switch (caseId.toLowerCase()) {
 | 
	
		
			
				|  |  | -//            case "11": {
 | 
	
		
			
				|  |  | -//                logger.info("[Module]获取门禁主机参数");
 | 
	
		
			
				|  |  | -//                ACSManage.getAcsCfg(userID);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "12": {
 | 
	
		
			
				|  |  | -//                logger.info("[Module]设置门禁主机参数");
 | 
	
		
			
				|  |  | -//                ACSManage.setAcsCfg(userID);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "13": {
 | 
	
		
			
				|  |  | -//                logger.info("[Module]获取门禁主机工作状态");
 | 
	
		
			
				|  |  | -//                ACSManage.getAcsStatus(userID);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "14": {
 | 
	
		
			
				|  |  | -//                logger.info("[Module]远程控门");
 | 
	
		
			
				|  |  | -//                ACSManage.remoteControlGate(userID, 1, 1);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "21": {
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]下发人员示例代码");
 | 
	
		
			
				|  |  | -//                UserManage.addUserInfo(userID, "12345");
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "22": {
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]查询人员示例代码");
 | 
	
		
			
				|  |  | -//                UserManage.searchUserInfo(userID);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "23": {
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]删除人员代码");
 | 
	
		
			
				|  |  | -//                //支持按人员和全部删除
 | 
	
		
			
				|  |  | -//                UserManage.deleteUserInfo(userID);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "24": {
 | 
	
		
			
				|  |  | -//                //人员下发默认1号计划模板:全天24小时有权限,自定义设置计划模板建议从2号模板开始
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]设置计划模板代码");
 | 
	
		
			
				|  |  | -//                UserManage.setCardTemplate(userID, 2);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "31": {
 | 
	
		
			
				|  |  | -//                //先下发人员,人员工号上绑定卡号
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]下发卡号代码");
 | 
	
		
			
				|  |  | -//                CardManage.addCardInfo(userID, "test001", "12345");
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "32": {
 | 
	
		
			
				|  |  | -//                //按照人员工号查看绑定的卡号
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]查询卡号代码");
 | 
	
		
			
				|  |  | -//                CardManage.searchCardInfo(userID, "test001");
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "33": {
 | 
	
		
			
				|  |  | -//                //按照人员工号删除绑定的卡号
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]删除卡号代码");
 | 
	
		
			
				|  |  | -//                CardManage.deleteCardInfo(userID, "12345");
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "41": {
 | 
	
		
			
				|  |  | -//                //先下发人员,人员工号上绑定人脸图片
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]二进制方式下发人脸代码");
 | 
	
		
			
				|  |  | -//                FaceManage.addFaceByBinary(userID, "test001");
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "42": {
 | 
	
		
			
				|  |  | -//                //先下发人员,人员工号上绑定人脸图片
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]URL方式下发人脸代码");
 | 
	
		
			
				|  |  | -//                FaceManage.addFaceByUrl(userID, "test001");
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "43": {
 | 
	
		
			
				|  |  | -//                //根据人员工号查询人脸图片
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]查询人脸代码");
 | 
	
		
			
				|  |  | -//                FaceManage.searchFaceInfo(userID, "test001");
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "44": {
 | 
	
		
			
				|  |  | -//                //根据人员工号删除人脸图片
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]删除人脸代码");
 | 
	
		
			
				|  |  | -//                FaceManage.deleteFaceInfo(userID, "test001");
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "45": {
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]采集人脸代码");
 | 
	
		
			
				|  |  | -//                FaceManage.captureFaceInfo(userID);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            case "56": {
 | 
	
		
			
				|  |  | -//                logger.info("\n[Module]门禁历史事件查询代码");
 | 
	
		
			
				|  |  | -//                EventSearch.searchAllEvent(userID);
 | 
	
		
			
				|  |  | -//                break;
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -//            default: {
 | 
	
		
			
				|  |  | -//                logger.info("\n未知的指令操作!请重新输入!\n");
 | 
	
		
			
				|  |  | -//            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 获取用户登录句柄
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    public Integer getUserID(String username) {
 | 
	
		
			
				|  |  | -        return userLoginMap.get(username);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 |