| | |
| | | |
| | | import com.ruoyi.common.annotation.SdkOperate; |
| | | import com.ruoyi.common.utils.file.FileUtils; |
| | | import com.ruoyi.common.utils.file.MimeTypeUtils; |
| | | import com.ruoyi.common.utils.uuid.IdUtils; |
| | | import com.ruoyi.device.camera.domain.CameraCmd; |
| | | import com.ruoyi.device.camera.mapper.ArdCamerasMapper; |
| | | import com.ruoyi.device.camera.service.IArdCamerasService; |
| | | import com.ruoyi.device.channel.domain.ArdChannel; |
| | | import com.ruoyi.device.hiksdk.common.GlobalVariable; |
| | | import com.ruoyi.device.camera.domain.ArdCameras; |
| | | import com.ruoyi.device.hiksdk.config.MinioClientSingleton; |
| | | 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.storage.minio.utils.MinioUtils; |
| | | import com.sun.jna.Native; |
| | | import com.sun.jna.NativeLong; |
| | | import com.sun.jna.Platform; |
| | | import com.sun.jna.Pointer; |
| | | import com.sun.jna.ptr.IntByReference; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | import sun.misc.BASE64Encoder; |
| | | |
| | | import java.util.Base64; |
| | | import javax.annotation.Resource; |
| | | import java.io.*; |
| | | import java.math.BigDecimal; |
| | |
| | | @Service |
| | | public class HikClientServiceImpl implements IHikClientService { |
| | | |
| | | @Value("${minio.endpoint}") |
| | | private static String endpoint; |
| | | @Resource |
| | | IArdCamerasService ardCamerasService; |
| | | private IArdCamerasService ardCamerasService; |
| | | @Resource |
| | | private MinioUtils minioUtil; |
| | | |
| | | private static HCNetSDK hCNetSDK; |
| | | |
| | |
| | | } |
| | | //打印海康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 { |
| | |
| | | GlobalVariable.loginMap.remove(camera.getId()); |
| | | GlobalVariable.loginMap.put(camera.getId(), lUserID); |
| | | camera.setLoginId(lUserID); |
| | | camera.setChannel((int) m_strDeviceInfo.byStartChan); |
| | | camera.setStartDChan((int) m_strDeviceInfo.byStartChan); |
| | | return camera; |
| | | } |
| | | |
| | |
| | | int i = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); |
| | | if (i < 0) { |
| | | int errorCode = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("登录异常:" + errorCode); |
| | | log.error("登录异常:" + errorCode); |
| | | } |
| | | } |
| | | |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_PTZControlWithSpeed_Other(userId, channelNum, dwPTZCommand, dwStop, speed); |
| | | if (!bool) { |
| | | int errorCode = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("控制失败,请稍后重试" + errorCode); |
| | | log.error("控制失败,请稍后重试" + errorCode); |
| | | } |
| | | return bool; |
| | | } |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_FOCUSMODECFG, channelNum, point, focusmodeCfg.size(), ibrBytesReturned); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置聚焦值失败,请稍后重试" + code); |
| | | log.error("设置聚焦值失败,请稍后重试" + code); |
| | | } |
| | | return bool; |
| | | } |
| | |
| | | return map; |
| | | } else { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("获取聚焦值失败,请稍后重试" + code); |
| | | log.debug("获取聚焦值失败,请稍后重试" + code); |
| | | return new HashMap<>(); |
| | | } |
| | | } |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_PTZPreset_Other(userId, channelNum, SET_PRESET, PresetIndex); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("预置点设置失败,请稍后重试" + code); |
| | | log.error("预置点设置失败,请稍后重试" + code); |
| | | } |
| | | return bool; |
| | | } |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_PTZPreset_Other(userId, channelNum, GOTO_PRESET, PresetIndex); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("预置点设置失败,请稍后重试" + code); |
| | | log.error("预置点设置失败,请稍后重试" + code); |
| | | } |
| | | return bool; |
| | | } |
| | |
| | | } |
| | | } else { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | System.out.println("控制失败,请稍后重试" + code); |
| | | log.error("控制失败,请稍后重试" + code); |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error(ex.getMessage()); |
| | |
| | | return ptzMap; |
| | | } else { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("控制失败,请稍后重试" + code); |
| | | log.error("控制失败,请稍后重试" + code); |
| | | return new HashMap<>(); |
| | | } |
| | | |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_PTZPOS, channelNum, point, m_ptzPosCurrent.size()); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置ptz失败,请稍后重试" + code); |
| | | log.error("设置ptz失败,请稍后重试" + code); |
| | | } |
| | | return bool; |
| | | } catch (Exception ex) { |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_PTZPOS, channelNum, point, m_ptzPosCurrent.size()); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置ptz失败,请稍后重试" + code); |
| | | log.error("设置ptz失败,请稍后重试" + code); |
| | | } |
| | | return bool; |
| | | } catch (Exception ex) { |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_PTZLOCKCFG, channelNum, point, netDvrPtzLockcfg.size(), ibrBytesReturned); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("获取ptz锁定信息失败,请稍后重试" + code); |
| | | log.error("获取ptz锁定信息失败,请稍后重试" + code); |
| | | return -1; |
| | | } else { |
| | | netDvrPtzLockcfg.read(); |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_PTZSCOPE, channelNum, point, m_ptzPosCurrent.size(), ibrBytesReturned); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置ptz失败,请稍后重试" + code); |
| | | log.error("设置ptz失败,请稍后重试" + code); |
| | | return new HashMap<>(); |
| | | } else { |
| | | m_ptzPosCurrent.read(); |
| | |
| | | log.error("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struCameraParam.read(); |
| | | log.info("是否开启透雾:" + struCameraParam.struDefogCfg.byMode); |
| | | log.debug("是否开启透雾:" + struCameraParam.struDefogCfg.byMode); |
| | | |
| | | NET_DVR_DEFOGCFG defogcfg = new NET_DVR_DEFOGCFG(); |
| | | if (enable) { |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_CCDPARAMCFG_EX, channelNum, point, struCameraParam.size()); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置透雾失败,请稍后重试" + code); |
| | | log.error("设置透雾失败,请稍后重试" + code); |
| | | } |
| | | log.info("设置透雾成功"); |
| | | log.debug("设置透雾成功"); |
| | | return bool; |
| | | } |
| | | |
| | |
| | | log.error("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struDayNigh.read(); |
| | | log.info("是否开启夜视:" + struDayNigh.struDayNight.byDayNightFilterType); |
| | | log.debug("是否开启夜视:" + struDayNigh.struDayNight.byDayNightFilterType); |
| | | |
| | | NET_DVR_DAYNIGHT daynight = new NET_DVR_DAYNIGHT(); |
| | | if (enable) { |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_CCDPARAMCFG_EX, channelNum, point, struDayNigh.size()); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置夜视失败,请稍后重试" + code); |
| | | log.error("设置夜视失败,请稍后重试" + code); |
| | | } |
| | | log.info("设置夜视成功"); |
| | | log.debug("设置夜视成功"); |
| | | return bool; |
| | | } |
| | | |
| | |
| | | IntByReference ibrBytesReturned = new IntByReference(0); |
| | | boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_FOCUSMODECFG, channelNum, point, struFocusMode.size(), ibrBytesReturned); |
| | | if (!b_GetCameraParam) { |
| | | System.out.println("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | log.error("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struFocusMode.read(); |
| | | log.info("当前聚焦模式:" + struFocusMode.byFocusMode); |
| | | log.debug("当前聚焦模式:" + struFocusMode.byFocusMode); |
| | | |
| | | if (enable) { |
| | | struFocusMode.byFocusMode = 1;//手动聚焦 |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_FOCUSMODECFG, channelNum, point, struFocusMode.size()); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置聚焦模式失败,请稍后重试" + code); |
| | | log.error("设置聚焦模式失败,请稍后重试" + code); |
| | | } |
| | | log.info("设置聚焦模式成功"); |
| | | log.debug("设置聚焦模式成功"); |
| | | return bool; |
| | | } |
| | | |
| | |
| | | IntByReference ibrBytesReturned = new IntByReference(0); |
| | | boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_FOCUSMODECFG, channelNum, point, struFocusMode.size(), ibrBytesReturned); |
| | | if (!b_GetCameraParam) { |
| | | System.out.println("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | log.error("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struFocusMode.read(); |
| | | log.info("当前聚焦模式:" + struFocusMode.byFocusMode); |
| | | log.debug("当前聚焦模式:" + struFocusMode.byFocusMode); |
| | | return String.valueOf(struFocusMode.byFocusMode); |
| | | } |
| | | |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_PTZControl_Other(userId, channelNum, HEATER_PWRON, dwStop); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置云台加热失败,请稍后重试" + code); |
| | | log.error("设置云台加热失败,请稍后重试" + code); |
| | | } |
| | | log.info("设置云台加热成功"); |
| | | log.debug("设置云台加热成功"); |
| | | return bool; |
| | | } |
| | | |
| | |
| | | log.error("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); |
| | | } |
| | | struDeicing.read(); |
| | | log.info("是否开启除冰:" + struDeicing.byEnableDeicing); |
| | | log.debug("是否开启除冰:" + struDeicing.byEnableDeicing); |
| | | |
| | | if (enable) { |
| | | struDeicing.byEnableDeicing = 1;//开启 |
| | |
| | | boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_DEVSERVER_CFG, channelNum, point, struDeicing.size()); |
| | | if (!bool) { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("设置镜头除冰失败,请稍后重试" + code); |
| | | log.error("设置镜头除冰失败,请稍后重试" + code); |
| | | } |
| | | log.info("设置镜头除冰成功"); |
| | | log.debug("设置镜头除冰成功"); |
| | | return bool; |
| | | } |
| | | |
| | |
| | | ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024); |
| | | // 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中 |
| | | boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, channelNum, jpeg, jpegBuffer, 1024 * 1024, a); |
| | | log.info("-----------这里开始图片存入内存----------" + is); |
| | | log.debug("-----------这里开始图片存入内存----------" + is); |
| | | |
| | | BASE64Encoder encoder = new BASE64Encoder(); |
| | | String png_base64 = encoder.encodeBuffer(jpegBuffer);//转换成base64串 |
| | | Base64.Encoder decoder = Base64.getEncoder(); |
| | | // BASE64Encoder encoder = new BASE64Encoder(); |
| | | String png_base64 = decoder.encodeToString(jpegBuffer.array());//转换成base64串 |
| | | png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n |
| | | log.info("-----------处理完成截图数据----------"); |
| | | log.debug("-----------处理完成截图数据----------"); |
| | | return png_base64; |
| | | } |
| | | |
| | |
| | | //设置图片大小 |
| | | ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024); |
| | | // 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中 |
| | | log.info("-----------这里开始封装 NET_DVR_CaptureJPEGPicture_NEW---------"); |
| | | log.debug("-----------这里开始封装 NET_DVR_CaptureJPEGPicture_NEW---------"); |
| | | boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, channelNum, jpeg, jpegBuffer, 1024 * 1024, a); |
| | | log.info("-----------这里开始图片存入内存----------" + is); |
| | | log.debug("-----------这里开始图片存入内存----------" + is); |
| | | if (is) { |
| | | log.info("hksdk(抓图)-结果状态值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError()); |
| | | log.debug("hksdk(抓图)-结果状态值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError()); |
| | | byte[] array = jpegBuffer.array(); |
| | | //存储到minio |
| | | String BucketName = "pic"; |
| | | String uuid = UUID.randomUUID().toString().replace("-", ""); |
| | | String time = new SimpleDateFormat("yyyyMMdd").format(new Date()); |
| | | String ObjectName = time + "/" + uuid + ".jpeg"; |
| | | String ContentType = "image/JPEG"; |
| | | String ObjectName = "capture/" + IdUtils.simpleUUID() + ".jpeg"; |
| | | InputStream input = new ByteArrayInputStream(array); |
| | | String url = ""; |
| | | try { |
| | | boolean b = MinioUtils.uploadObject(BucketName, ObjectName, input, input.available(), ContentType); |
| | | boolean b = minioUtil.uploadObject(BucketName, ObjectName, input, input.available(), MimeTypeUtils.IMAGE_JPEG); |
| | | if (b) { |
| | | url = MinioUtils.getBucketObjectUrl(BucketName, ObjectName); |
| | | log.info("上传文件成功!" + url); |
| | | url = minioUtil.getBucketObjectUrl(BucketName, ObjectName); |
| | | log.debug("上传文件成功!" + url); |
| | | } |
| | | } catch (IOException ex) { |
| | | log.error("上传文件异常:" + ex.getMessage()); |
| | |
| | | return url; |
| | | } else { |
| | | int code = hCNetSDK.NET_DVR_GetLastError(); |
| | | log.info("抓图失败,请稍后重试" + code); |
| | | log.error("抓图失败,请稍后重试" + code); |
| | | return ""; |
| | | } |
| | | } |
| | |
| | | log.error("取流失败" + hCNetSDK.NET_DVR_GetLastError()); |
| | | return ""; |
| | | } |
| | | log.info("取流成功"); |
| | | log.debug("取流成功"); |
| | | GlobalVariable.previewMap.put(cameraId, lRealHandle); |
| | | } |
| | | if (!hCNetSDK.NET_DVR_SaveRealData_V30(GlobalVariable.previewMap.get(cameraId), 2, path)) { |
| | | log.error("保存视频文件到临时文件夹失败 错误码为: " + hCNetSDK.NET_DVR_GetLastError()); |
| | | return ""; |
| | | } |
| | | log.info("录像开始"); |
| | | log.debug("录像开始"); |
| | | } else { |
| | | if (GlobalVariable.previewMap.containsKey(cameraId)) { |
| | | Integer lRealHandle = GlobalVariable.previewMap.get(cameraId); |
| | | hCNetSDK.NET_DVR_StopRealPlay(lRealHandle); |
| | | GlobalVariable.previewMap.remove(cameraId); |
| | | } |
| | | log.info("录像停止"); |
| | | log.debug("录像停止"); |
| | | } |
| | | return url; |
| | | } catch (Exception ex) { |
| | |
| | | log.debug("录像停止"); |
| | | //存入minio |
| | | String BucketName = cmd.getRecordBucketName(); |
| | | String ObjectName = cmd.getRecordObjectName(); |
| | | String ContentType = "video/MP4"; |
| | | String ObjectName = cmd.getRecordObjectName()+".mp4"; |
| | | FileInputStream stream = new FileInputStream(path); |
| | | String time = new SimpleDateFormat("yyyyMMdd").format(new Date()); |
| | | String recordName = cameraId + "/" + time + "/" + ObjectName + ".mp4"; |
| | | boolean b = MinioUtils.uploadObject(BucketName, recordName, stream, stream.available(), ContentType); |
| | | boolean b = minioUtil.uploadObject(BucketName, ObjectName, stream, stream.available(), "video/MP4"); |
| | | if (b) { |
| | | url = MinioClientSingleton.domainUrl + "/" + BucketName + "/" + recordName; |
| | | url = minioUtil.getBucketObjectUrl(BucketName, ObjectName); |
| | | log.debug("上传文件成功!" + url); |
| | | } |
| | | return url; |
| | |
| | | log.error("录像停止异常" + ex.getMessage()); |
| | | } |
| | | } |
| | | |
| | | //获取IP通道 |
| | | @Override |
| | | public List<ArdChannel> getCameraChannelList(ArdCameras camera) { |
| | | /*获取通道*/ |
| | | List<ArdChannel> channelList = new ArrayList<>(); |
| | | try { |
| | | Integer chanNum = camera.getChanNum(); |
| | | Integer startDChan = camera.getStartDChan(); |
| | | if (chanNum > 0) { |
| | | // 获取通道号 |
| | | for (int iChannum = 0; iChannum < chanNum; iChannum++) { |
| | | ArdChannel ardChannel = new ArdChannel(); |
| | | int channum = iChannum + startDChan+1; |
| | | HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40(); |
| | | strPicCfg.dwSize = strPicCfg.size(); |
| | | strPicCfg.write(); |
| | | Pointer pStrPicCfg = strPicCfg.getPointer(); |
| | | NativeLong lChannel = new NativeLong(channum); |
| | | IntByReference pInt = new IntByReference(0); |
| | | boolean b_GetPicCfg = hCNetSDK.NET_DVR_GetDVRConfig(camera.getLoginId(), HCNetSDK.NET_DVR_GET_PICCFG_V40, lChannel.intValue(), |
| | | pStrPicCfg, strPicCfg.size(), pInt); |
| | | if (b_GetPicCfg) { |
| | | strPicCfg.read(); |
| | | String channelName = new String(strPicCfg.sChanName, "GBK").trim(); |
| | | ardChannel.setName(channelName); |
| | | } |
| | | ardChannel.setDeviceId(camera.getId()); |
| | | ardChannel.setChanNo(iChannum + 1); |
| | | channelList.add(ardChannel); |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error("获取相机通道异常:" + ex.getMessage()); |
| | | } |
| | | return channelList; |
| | | } |
| | | } |