From 49207386ea4a3d663628347eef443af9c7cc7f39 Mon Sep 17 00:00:00 2001 From: aijinhui <aijinhui> Date: 星期二, 17 十月 2023 17:20:46 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java | 375 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 360 insertions(+), 15 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java index b984262..b7aadfb 100644 --- a/ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java @@ -1,6 +1,9 @@ package com.ruoyi.device.dhsdk.service.impl; 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.spring.SpringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; @@ -10,27 +13,39 @@ import com.ruoyi.device.dhsdk.common.Res; import com.ruoyi.device.dhsdk.lib.NetSDKLib; import com.ruoyi.device.dhsdk.lib.NetSDKLib.LLong; -import com.ruoyi.device.dhsdk.lib.ToolKits; -import com.ruoyi.device.dhsdk.lib.enumeration.EM_NEW_QUERY_SYSTEM_INFO; +import com.ruoyi.device.dhsdk.lib.structure.CFG_VIDEO_IN_FOCUS; +import com.ruoyi.device.dhsdk.lib.structure.CFG_VIDEO_IN_FOCUS_UNIT; +import com.ruoyi.device.dhsdk.module.CapturePictureModule; import com.ruoyi.device.dhsdk.module.ConfigModule; import com.ruoyi.device.dhsdk.module.LoginModule; -import com.ruoyi.device.dhsdk.module.PtzControlModule; +import com.ruoyi.device.dhsdk.module.RealPlayModule; import com.ruoyi.device.dhsdk.service.IDhClientService; import com.ruoyi.device.hiksdk.common.GlobalVariable; import com.ruoyi.device.hiksdk.sdk.HCNetSDK; +import com.ruoyi.utils.gis.GisUtil; +import com.ruoyi.utils.minio.MinioUtil; import com.sun.jna.Pointer; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.text.DecimalFormat; import java.util.*; import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_DEVSTATE_ONLINE; import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_DEVSTATE_PTZ_LOCATION; +import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL; +import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL; import static com.ruoyi.device.dhsdk.lib.ToolKits.getErrorCodePrint; -import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.*; +import static com.ruoyi.device.dhsdk.module.LoginModule.netsdk; +import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.NET_DVR_SET_PTZPOS; + /** * @ClassName DhSdkServiceImpl @@ -46,6 +61,8 @@ private IArdCamerasService ardCamerasService; @Resource private IArdChannelService ardChannelService; + @Value("${minio.endpoint}") + private String minioEndPoint; private Vector<String> chnlist = new Vector<String>(); // 璁惧鏂嚎閫氱煡鍥炶皟 @@ -53,7 +70,11 @@ // 缃戠粶杩炴帴鎭㈠ private static HaveReConnect haveReConnect = new HaveReConnect(); - + /** + * 鐧诲綍鎵�鏈夌浉鏈� + * 鍒樿嫃涔� + * 2023/10/17 8:28:13 + */ @Override public void loginAll() { try { @@ -70,11 +91,21 @@ } } + /** + * sdk鍒濆鍖� + * 鍒樿嫃涔� + * 2023/10/17 8:28:13 + */ @Override public Boolean init() { return LoginModule.init(disConnect, haveReConnect); // 鎵撳紑宸ョ▼锛屽垵濮嬪寲 } + /** + * 鐧诲綍 + * 鍒樿嫃涔� + * 2023/10/17 8:28:13 + */ @Override @Async public Boolean login(ArdCameras camera) { @@ -114,6 +145,11 @@ return true; } + /** + * 娉ㄩ攢 + * 鍒樿嫃涔� + * 2023/10/17 8:28:13 + */ @Override public Boolean logout(String cameraId) { if (!GlobalVariable.loginMap.containsKey(cameraId)) { @@ -123,6 +159,11 @@ return LoginModule.logout(loginId); } + /** + * 鏄惁鍦ㄧ嚎妫�娴� + * 鍒樿嫃涔� + * 2023/10/17 8:28:13 + */ @Override public boolean isOnLine(CameraCmd cmd) { try { @@ -143,6 +184,11 @@ return true; } + /** + * 浜戝彴鎺у埗 + * 鍒樿嫃涔� + * 2023/10/17 8:28:13 + */ @Override public boolean pTZControl(CameraCmd cmd) { String cameraId = cmd.getCameraId(); @@ -176,7 +222,7 @@ dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL; break; case 5: - dwPTZCommand = HCNetSDK.RUN_SEQ; + dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_LOOP_CONTROL; break; case 6: dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL; @@ -211,14 +257,22 @@ case 15: dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL; break; + case 16: + dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LAMP_CONTROL; + break; } - boolean bool = LoginModule.netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop); + boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop); if (!bool) { log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint()); } return bool; } + /** + * 鑾峰彇PTZ鍊� + * 鍒樿嫃涔� + * 2023/10/17 8:28:13 + */ @Override public Map<String, Object> getPtz(CameraCmd cmd) { Map<String, Object> ptzMap = new HashMap<>(); @@ -240,6 +294,7 @@ } return ptzMap; } + /** * @鎻忚堪 璁剧疆ptz淇℃伅 * @鍙傛暟 [userId, channelNum] @@ -257,12 +312,15 @@ if (!GlobalVariable.loginMap.containsKey(cameraId)) { return false; } - LLong loginId = (LLong)GlobalVariable.loginMap.get(cameraId); + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); try { - int p = (int)(ptz.get("p") * 10); - int t = (int)(ptz.get("t") * 10); + int p = (int) (ptz.get("p") * 10); + int t = (int) (ptz.get("t") * 10); int z = ptz.get("z").intValue(); - boolean bool = LoginModule.netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0 ); + if (z == 0) { + z = 1; + } + boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0); if (!bool) { log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint()); } @@ -289,7 +347,7 @@ if (!GlobalVariable.loginMap.containsKey(cameraId)) { return false; } - LLong loginId = (LLong)GlobalVariable.loginMap.get(cameraId); + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); boolean bool = NetSDKLib.NETSDK_INSTANCE.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RESETZERO, 0, 0, 0, 0); if (!bool) { log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint()); @@ -297,21 +355,308 @@ return bool; } + /** + * @鎻忚堪 鎴浘 瀛樻湇鍔″櫒 + * @鍙傛暟 [cameraId, channelNum] + * @杩斿洖鍊� java.lang.String + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/2/2 14:59 + * @淇敼浜哄拰鍏跺畠淇℃伅 + */ + @Override + @SdkOperate + public String picCutCate(CameraCmd cmd) { + String cameraId = cmd.getCameraId(); + Integer chanNo = cmd.getChanNo(); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return ""; + } + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); + String bucketName = "pic"; + String picUrl = ""; + String bucketObject = "/capture/" + IdUtils.simpleUUID() + ".jpeg"; + fCaptureReceiveCB m_CaptureReceiveCB = new fCaptureReceiveCB(minioEndPoint, bucketName, bucketObject); + CapturePictureModule.setSnapRevCallBack(m_CaptureReceiveCB); + boolean b = CapturePictureModule.remoteCapturePicture(loginId, chanNo - 1); + if (b) { + picUrl = minioEndPoint + "/" + bucketName + bucketObject; + } + return picUrl; + } - // 璁惧鏂嚎鍥炶皟: 閫氳繃 CLIENT_Init 璁剧疆璇ュ洖璋冨嚱鏁帮紝褰撹澶囧嚭鐜版柇绾挎椂锛孲DK浼氳皟鐢ㄨ鍑芥暟 + /** + * @鎻忚堪 鐭椂褰曞儚 + * @鍙傛暟 [userId, channelNum, enable] + * @杩斿洖鍊� void + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/1/20 11:18 + * @淇敼浜哄拰鍏跺畠淇℃伅 + */ + @Override + public String record(CameraCmd cmd) { + try { + String url = ""; + String cameraId = cmd.getCameraId(); + Integer chanNo = cmd.getChanNo(); + String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4"); + boolean enable = cmd.isEnable(); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return ""; + } + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); + + if (enable) { + LLong lRealHandle = new LLong(0); + if (!GlobalVariable.previewMap.containsKey(cameraId)) { + lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo, 0); + if (lRealHandle.longValue() <= 0) { + log.error("鍙栨祦澶辫触" + getErrorCodePrint()); + return ""; + } + log.debug("鍙栨祦鎴愬姛"); + GlobalVariable.previewMap.put(cameraId, lRealHandle.intValue()); + } + if (!netsdk.CLIENT_SaveRealData(lRealHandle, path)) { + log.error("淇濆瓨瑙嗛鏂囦欢鍒颁复鏃舵枃浠跺す澶辫触 閿欒鐮佷负: " + getErrorCodePrint()); + return ""; + } + log.debug("褰曞儚寮�濮�"); + } else { + if (GlobalVariable.previewMap.containsKey(cameraId)) { + LLong lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId)); + boolean b = netsdk.CLIENT_StopSaveRealData(lRealHandle); + GlobalVariable.previewMap.remove(cameraId); + } + log.debug("褰曞儚鍋滄"); + } + return url; + } catch (Exception ex) { + log.error("褰曞儚寮傚父" + ex.getMessage()); + return ""; + } + } + + @Override + public boolean recordStart(CameraCmd cmd) { + try { + String cameraId = cmd.getCameraId(); + Integer chanNo = cmd.getChanNo(); + String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4"); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return false; + } + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); + LLong lRealHandle; + if (GlobalVariable.previewMap.containsKey(cameraId)) { + lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId)); + netsdk.CLIENT_StopRealPlayEx(lRealHandle); + GlobalVariable.previewMap.remove(cameraId); + log.debug("鍋滄褰撳墠褰曞儚"); + } + lRealHandle = RealPlayModule.startRealPlay1(loginId, chanNo - 1, path); + if (lRealHandle.longValue() <= 0) { + log.error("鍙栨祦澶辫触" + getErrorCodePrint()); + } + log.debug("鍙栨祦鎴愬姛"); + GlobalVariable.previewMap.put(cameraId, lRealHandle.intValue()); + GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName()); + //if (!netsdk.CLIENT_SaveRealData(lRealHandle, path)) { + // log.error("淇濆瓨瑙嗛鏂囦欢鍒颁复鏃舵枃浠跺す澶辫触 閿欒鐮佷负: " +getErrorCodePrint()); + // return false; + //} + log.debug("褰曞儚寮�濮�"); + return true; + } catch (Exception ex) { + log.error("寮�濮嬪綍鍍忓紓甯�" + ex.getMessage()); + return false; + } + } + + @Override + public String recordStopToMinio(CameraCmd cmd) { + String url = ""; + try { + String cameraId = cmd.getCameraId(); + String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4"); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return ""; + } + LLong lRealHandle; + if (GlobalVariable.previewMap.containsKey(cameraId)) { + lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId)); + netsdk.CLIENT_StopRealPlayEx(lRealHandle); + GlobalVariable.previewMap.remove(cameraId); + log.debug("鍋滄褰撳墠褰曞儚"); + } + //瀛樺叆minio + String BucketName = cmd.getRecordBucketName(); + String ObjectName = cmd.getRecordObjectName() + ".mp4"; + FileInputStream stream = new FileInputStream(path); + boolean b = MinioUtil.uploadObject(BucketName, ObjectName, stream, stream.available(), "video/MP4"); + if (b) { + url = MinioUtil.getBucketObjectUrl(BucketName, ObjectName); + log.debug("涓婁紶鏂囦欢鎴愬姛!" + url); + } + return url; + } catch (Exception ex) { + log.error("褰曞儚寮傚父" + ex.getMessage()); + return ""; + } + } + + /** + * 寮曞鐩爣浣嶇疆 + * 鍒樿嫃涔� + * 2023/10/17 8:27:48 + */ + @Override + public boolean guideTargetPosition(CameraCmd cmd) { + String cameraId = cmd.getCameraId(); + Integer chanNo = cmd.getChanNo(); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return false; + } + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); + try { + ArdCameras cameras = ardCamerasService.selectArdCamerasById(cameraId); + double[] cameraPositon = new double[]{cameras.getLongitude(), cameras.getLatitude(), cameras.getAltitude()}; + double[] targetPositions = cmd.getTargetPosition(); + double[] cameraPTZ = GisUtil.getCameraPTZ(cameraPositon, targetPositions, 20, 150); + int p = (int) (cameraPTZ[0] * 10); + int t = (int) (cameraPTZ[1] * 10); + int z = (int) (cameraPTZ[2]); + boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0); + if (!bool) { + log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint()); + } + return bool; + } catch (Exception ex) { + log.error("寮曞寮傚父:" + ex.getMessage()); + return false; + } + } + + //杞嚦棰勭疆鐐� + @Override + public boolean gotoPreset(CameraCmd cmd) { + String cameraId = cmd.getCameraId(); + Integer chanNo = cmd.getChanNo(); + Integer PresetIndex = cmd.getPresetIndex(); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return false; + } + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); + try { + + boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NET_PTZ_POINT_MOVE_CONTROL, 0, PresetIndex, 0, 0); + if (!bool) { + log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint()); + } + return bool; + } catch (Exception ex) { + log.error("杞嚦棰勭疆鐐瑰紓甯�:" + ex.getMessage()); + return false; + } + } + + @Override + //璁剧疆棰勭疆浣� + public boolean setPreset(CameraCmd cmd) { + String cameraId = cmd.getCameraId(); + Integer chanNo = cmd.getChanNo(); + Integer PresetIndex = cmd.getPresetIndex(); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return false; + } + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); + try { + + boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NET_PTZ_POINT_SET_CONTROL, 0, PresetIndex, 0, 0); + if (!bool) { + log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint()); + } + return bool; + } catch (Exception ex) { + log.error("璁剧疆棰勭疆鐐瑰紓甯�:" + ex.getMessage()); + return false; + } + } + + //鍒囨崲鑱氱劍妯″紡 + @Override + public boolean controlFocusMode(CameraCmd cmd) { + String cameraId = cmd.getCameraId(); + Integer chanNo = cmd.getChanNo(); + boolean enable = cmd.isEnable(); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return false; + } + LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId); + try { + CFG_VIDEO_IN_FOCUS cfg_video_in_focus = new CFG_VIDEO_IN_FOCUS(); + CFG_VIDEO_IN_FOCUS_UNIT[] stVideoInFocusUnit = new CFG_VIDEO_IN_FOCUS_UNIT[32]; + if (enable) { + stVideoInFocusUnit[0].nMode = 4;//鎵嬪姩鑱氱劍 + } else { + stVideoInFocusUnit[0].nMode = 2;//鎵嬪姩鑱氱劍 + } + cfg_video_in_focus.nChannelIndex = chanNo - 1; + cfg_video_in_focus.stVideoInFocusUnit = stVideoInFocusUnit; + boolean bool = ConfigModule.SetDevConfig(loginId, chanNo - 1, NetSDKLib.CFG_CMD_VIDEOIN_FOCUS, cfg_video_in_focus); + if (!bool) { + log.error("鎺у埗澶辫触,璇风◢鍚庨噸璇�" + getErrorCodePrint()); + } + return bool; + } catch (Exception ex) { + log.error("鍒囨崲鑱氱劍妯″紡寮傚父:" + ex.getMessage()); + return false; + } + } + + // 璁惧鏂嚎鍥炶皟: 褰撹澶囧嚭鐜版柇绾挎椂锛孲DK浼氳皟鐢ㄨ鍑芥暟 private static class DisConnect implements NetSDKLib.fDisConnect { public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort); } } - // 缃戠粶杩炴帴鎭㈠锛岃澶囬噸杩炴垚鍔熷洖璋� - // 閫氳繃 CLIENT_SetAutoReconnect 璁剧疆璇ュ洖璋冨嚱鏁帮紝褰撳凡鏂嚎鐨勮澶囬噸杩炴垚鍔熸椂锛孲DK浼氳皟鐢ㄨ鍑芥暟 + // 缃戠粶杩炴帴鎭㈠鍥炶皟:璁惧閲嶈繛鎴愬姛鍥炶皟锛屽綋宸叉柇绾跨殑璁惧閲嶈繛鎴愬姛鏃讹紝SDK浼氳皟鐢ㄨ鍑芥暟 private static class HaveReConnect implements NetSDKLib.fHaveReConnect { @Override public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } + + // 鎶撳浘鎺ユ敹鍥炶皟:褰撴姄鍥炬垚鍔燂紝sdk浼氳皟鐢ㄨ鍑芥暟 + public static class fCaptureReceiveCB implements NetSDKLib.fSnapRev { + private String minioEndPoint; + private String ObjectName; + private String bucketName; + + public fCaptureReceiveCB(String minioEndPoint, String bucketName, String ObjectName) { + this.minioEndPoint = minioEndPoint; + this.bucketName = bucketName; + this.ObjectName = ObjectName; + } + + public void invoke(LLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, int CmdSerial, Pointer dwUser) { + if (pBuf != null && RevLen > 0) { + byte[] buf = pBuf.getByteArray(0, RevLen); + //瀛樺偍鍒癿inio + InputStream input = new ByteArrayInputStream(buf); + + try { + boolean b = MinioUtil.uploadObject(bucketName, ObjectName, input, input.available(), MimeTypeUtils.IMAGE_JPEG); + if (b) { + String url = minioEndPoint + "/" + bucketName + ObjectName; + log.debug("涓婁紶鏂囦欢鎴愬姛!" + url); + } + } catch (IOException ex) { + log.error("涓婁紶鏂囦欢寮傚父锛�" + ex.getMessage()); + } + } + } + } } \ No newline at end of file -- Gitblit v1.9.3