‘liusuyi’
2023-06-13 6b68dddf393b885698d48760c8e1972d574e30c4
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -16,6 +16,7 @@
import com.ruoyi.device.hiksdk.util.hikSdkUtil.GisUtil;
import com.ruoyi.device.hiksdk.util.hikSdkUtil.HCNetSDK;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.device.hiksdk.util.hikSdkUtil.LoginResultCallBack;
import com.ruoyi.device.hiksdk.util.minio.MinioUtils;
import com.ruoyi.system.mapper.SysUserMapper;
import com.sun.jna.Native;
@@ -98,15 +99,14 @@
    }
    /**
     * @描述 注册登录
     * @描述 注册登录 只支持同步登陆,且官方不建议直接在此接口下写耗时操作
     * @参数 [dvrLogin]
     * @返回值 java.lang.Integer
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    @Override
    public ArdCameras login(ArdCameras camera) {
    public ArdCameras login1(ArdCameras camera) {
        // 初始化
        if (!hCNetSDK.NET_DVR_Init()) {
            log.error("SDK初始化失败");
@@ -114,9 +114,9 @@
        //打印海康sdk日志
        if (Platform.isWindows()) {
            String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator;
            hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, false);
            hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true);
        } else {
            hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", false);
            hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true);
        }
        String m_sDeviceIP = camera.getIp();
        String m_sUsername = camera.getUsername();
@@ -144,6 +144,60 @@
    }
    /**
     * @描述 注册登录 集成于NET_DVR_Login_V30,支持同步和异步登录
     * @参数 [dvrLogin]
     * @返回值 java.lang.Integer
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    @Override
    public void login(ArdCameras camera) {
        // 初始化
        if (!hCNetSDK.NET_DVR_Init()) {
            log.error("SDK初始化失败");
        }
        //打印海康sdk日志
        if (Platform.isWindows()) {
            String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator;
            hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true);
        } else {
            hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true);
        }
        String m_sDeviceIP = camera.getIp();
        String m_sUsername = camera.getUsername();
        String m_sPassword = camera.getPassword();
        short m_sPort = camera.getPort().shortValue();
        //设置连接时间与重连时间
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        hCNetSDK.NET_DVR_SetReconnect(100000, true);
        //设备信息, 输出参数
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
        // 注册设备-登录参数,包括设备地址、登录用户、密码等
        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
        m_strLoginInfo.wPort = m_sPort;
        m_strLoginInfo.byVerifyMode = 0;
        m_strLoginInfo.byLoginMode=0;
        //是否异步登录:0- 否,1- 是  windowsSDK里是true和false
        m_strLoginInfo.bUseAsynLogin = true;
        //异步登录回调
        m_strLoginInfo.cbLoginResult = new LoginResultCallBack(camera);
        m_strLoginInfo.write();
        int i = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (i < 0) {
            int errorCode = hCNetSDK.NET_DVR_GetLastError();
            log.info("登录异常:" + errorCode);
        }
    }
    /**
     * @描述 登录所有相机
     * @参数 []
     * @返回值 void
@@ -152,32 +206,12 @@
     * @修改人和其它信息
     */
    @Override
    @Async("loginExecutor")
    public void loginAll() {
        try {
            log.debug("加载lib完成!");
            List<ArdCameras> ardCameras = ardCamerasMapper.selectArdCamerasList(new ArdCameras());
            List<ArdCameras> ardCameras = ardCamerasMapper.selectArdCamerasListNoDataScope(new ArdCameras());
            for (ArdCameras camera : ardCameras) {
                camera = login(camera);
                if (camera.getLoginId() >= 0) {
                    log.info("相机" + camera.getIp() + ":" + camera.getPort() + "登录成功:" + camera.getLoginId());
                    ardCamerasMapper.updateArdCameras(camera);
                } else {
                    log.info("相机" + camera.getIp() + ":" + camera.getPort() + "登录失败:" + camera.getLoginId());
                }
//                if (!globalVariable.loginMap.containsKey(camera.getId())) {
//                    camera = login(camera);
//                    if (camera.getLoginId() >= 0) {
//                        log.info("相机" + camera.getIp() + ":" + camera.getPort() + "登录成功:" + camera.getLoginId());
//                        globalVariable.loginMap.put(camera.getId(), camera.getLoginId());
//                        ardCamerasService.updateArdCameras(camera);
//                    } else {
//                        log.info("相机" + camera.getIp() + ":" + camera.getPort() + "登录失败:" + camera.getLoginId());
//                    }
//                } else {
//                    Integer userid = globalVariable.loginMap.get(camera.getId());
//                    log.info("当前相机:" + camera.getId() + "已登录,ID:" + userid);
//                }
                login(camera);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
@@ -233,7 +267,7 @@
     */
    @Override
    @SdkOperate
    public boolean PTZControlWithSpeed(CameraCmd cmd) {
    public boolean pTZControlWithSpeed(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        boolean enable = cmd.isEnable();
        Integer channelNum = cmd.getChannelNum();
@@ -1310,7 +1344,7 @@
            netDvrIFrame.byStreamType = 0;
            netDvrIFrame.dwSize = netDvrIFrame.size();
            netDvrIFrame.write();
            if(!hCNetSDK.NET_DVR_RemoteControl(userId,3402,netDvrIFrame.getPointer(),netDvrIFrame.dwSize)){
            if (!hCNetSDK.NET_DVR_RemoteControl(userId, 3402, netDvrIFrame.getPointer(), netDvrIFrame.dwSize)) {
                log.error("强制I帧 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
            }
            //预览参数
@@ -1333,7 +1367,7 @@
                    }
                    log.info("取流成功");
                    String path= FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
                    String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
                    recordInfo info = new recordInfo();
                    info.setLRealHandle(lRealHandle);
                    info.setRecordPath(path);
@@ -1352,7 +1386,7 @@
                }
                hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
                log.info("录像停止");
                if(cmd.isUploadMinio()) {
                if (cmd.isUploadMinio()) {
                    //存入minio
                    String BucketName = cmd.getRecordBucketName();
                    String ObjectName = cmd.getRecordObjectName();