using System.Runtime.InteropServices; using static EC.Util.CameraSDK.YuShiOriSDK; namespace EC.Util.CameraSDK; public class YuShiSDK : ICameraSDK { #region Fields private IntPtr LoginId { get; set; } = IntPtr.Zero; private IntPtr RealplayHandle { get; set; } = IntPtr.Zero; private int Channel { get; } = 1; #endregion Fields public YuShiSDK(CameraInfo cameraInfo) : base(cameraInfo) { } #region Base Method public override bool Init() { bool ret = ConnectSuccess(); if (ret) return true; YuShiOriSDK.NETDEV_DEVICE_LOGIN_INFO_S loginInfo = new(); loginInfo.szIPAddr = CameraInfo.Ip; loginInfo.dwPort = CameraInfo.Port; loginInfo.szUserName = CameraInfo.UserName; loginInfo.szPassword = CameraInfo.Password; YuShiOriSDK.NETDEV_SELOG_INFO_S logInfo = new(); LoginId = YuShiOriSDK.NETDEV_Login_V30(ref loginInfo, ref logInfo); ret = ConnectSuccess(); if (!ret) BuildException(); //别删 NETDEV_QueryVideoChlDetailList,否则 NETDEV_PTZPreset_Other 教做人 int pdwChlCount = 16; IntPtr pstVideoChlList = Marshal.AllocHGlobal(pdwChlCount * Marshal.SizeOf(typeof(NETDEV_VIDEO_CHL_DETAIL_INFO_S))); YuShiOriSDK.NETDEV_QueryVideoChlDetailList(LoginId, ref pdwChlCount, pstVideoChlList); return ret; } public override bool Destory() { bool ret = ConnectSuccess(); if (!ret) return true; ret = YuShiOriSDK.NETDEV_Logout(LoginId); if (ret) LoginId = IntPtr.Zero; else BuildException(); return ret; } public override bool ConnectSuccess() { return LoginId != IntPtr.Zero; } internal override void BuildException() { int errCode = YuShiOriSDK.NETDEV_GetLastError(); if (errCode == 0) return; throw CameraException.New(CameraInfo, errCode); } #endregion Base Method #region Ptz Method public override PtzInfo GetPtzInfo() { bool ret = ConnectSuccess(); if (!ret) return PtzInfo.Default; YuShiOriSDK.NETDEV_PTZ_STATUS_S entity = new(); ret = YuShiOriSDK.NETDEV_PTZGetStatus(LoginId, Channel, ref entity); if (!ret) { BuildException(); return PtzInfo.Default; } return PtzInfo.New(entity.fPanTiltX, entity.fPanTiltY, entity.fZoomX); } public override bool TryGetPtzInfo(out PtzInfo ptzInfo) { bool ret = ConnectSuccess(); if (!ret) { ptzInfo = PtzInfo.Default; return false; } YuShiOriSDK.NETDEV_PTZ_STATUS_S entity = new(); ret = YuShiOriSDK.NETDEV_PTZGetStatus(LoginId, Channel, ref entity); if (!ret) { BuildException(); ptzInfo = PtzInfo.Default; return false; } ptzInfo = PtzInfo.New(entity.fPanTiltX, entity.fPanTiltY, entity.fZoomX); return true; } public override bool PtzMove(int cmd, int stop, int speed) { if (!ConnectSuccess()) return false; if (stop == 1) cmd = YuShiOriSDK.ALLSTOP; int retNum = YuShiOriSDK.NETDEV_PTZControl_Other(LoginId, Channel, cmd, speed); bool ret = retNum == YuShiOriSDK.TRUE; if (!ret) BuildException(); return ret; } public override bool PtzPreset(int cmd, int presetId) { if (!ConnectSuccess()) return false; NETDEV_PTZ_ALLPRESETS_S ptzPresets = new(); int retNum = YuShiOriSDK.NETDEV_GetPTZPresetList(LoginId, Channel, ref ptzPresets); bool ret = retNum == YuShiOriSDK.TRUE; Console.WriteLine($"NETDEV_GetPTZPresetList:{retNum}, handle:{LoginId}, ptzPresets.dwSize:{ptzPresets.dwSize}"); if (!ret) BuildException(); retNum = YuShiOriSDK.NETDEV_PTZPreset_Other(LoginId, Channel, cmd, new byte[32], presetId); ret = retNum == YuShiOriSDK.TRUE; if (!ret) BuildException(); return ret; } #endregion Ptz Method #region Video Method public override void StartPlay(IntPtr hwnd) { if (!ConnectSuccess() || IsPlaying()) return; YuShiOriSDK.NETDEV_PREVIEWINFO_S stPreviewInfo = new() { hPlayWnd = hwnd, dwChannelID = Channel, dwStreamType = 0, // YuShiOriSDK.NETDEV_LIVE_STREAM_INDEX_E dwLinkMode = 1, // YuShiOriSDK.NETDEV_PROTOCAL_E dwFluency = 0, // YuShiOriSDK.NETDEV_PICTURE_FLUENCY_E }; RealplayHandle = YuShiOriSDK.NETDEV_RealPlay(LoginId, ref stPreviewInfo, IntPtr.Zero, IntPtr.Zero); if (RealplayHandle == IntPtr.Zero) BuildException(); } public override void StopPlay() { if (!IsPlaying()) return; int ret = YuShiOriSDK.NETDEV_StopRealPlay(RealplayHandle); RealplayHandle = IntPtr.Zero; if (ret == YuShiOriSDK.FALSE) BuildException(); } public override bool IsPlaying() { return RealplayHandle != IntPtr.Zero; } #endregion Video Method }