You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
10 KiB

#define Win
using System.Runtime.InteropServices;
namespace EC.Util.CameraSDK;
public static class YuShiOriSDK
{
#region Lib Attr
#if Win
public const string LibSdkPath = @"./libs/yushi/NetDEVSDK.dll";
#else
public const string LibSdkPath = @"./libs/yushi/libNetDEVSDK.so";
#endif
private const bool Debug = false;
#endregion Lib Attr
static YuShiOriSDK()
{
GlobalInit();
}
#region Global
public static bool InitSuccess { get; private set; }
public static bool GlobalInit()
{
if (InitSuccess) return true;
bool ret = NETDEV_Init();
InitSuccess = ret;
if (!ret) throw new Exception("YuShiOriSDK global init failure.");
return ret;
}
public static bool GlobalDestory()
{
if (!InitSuccess) return true;
bool ret = NETDEV_Cleanup();
if (ret) InitSuccess = false;
return ret;
}
#endregion Global
#region SDK Const
public const int TRUE = 1;
public const int FALSE = 0;
public const int PtzSpeedMin = 1;
public const int PtzSpeedMax = 9;
/* Common length */
public const int NETDEV_LEN_32 = 32;
public const int NETDEV_LEN_64 = 64;
public const int NETDEV_LEN_128 = 128;
public const int NETDEV_LEN_132 = 132;
public const int NETDEV_LEN_260 = 260;
/* NETDEV_PTZ_E */
public const int IRISCLOSE_STOP = 0x0101; /* Iris close stop */
public const int IRISCLOSE = 0x0102; /* Iris close */
public const int IRISOPEN_STOP = 0x0103; /* Iris open stop */
public const int IRISOPEN = 0x0104; /* Iris open */
public const int FOCUSNEAR_STOP = 0x0201; /* Focus near stop */
public const int FOCUSNEAR = 0x0202; /* Focus near */
public const int FOCUSFAR_STOP = 0x0203; /* Focus far stop */
public const int FOCUSFAR = 0x0204; /* Focus far */
public const int ZOOMTELE_STOP = 0x0301; /* Zoom in stop */
public const int ZOOMTELE = 0x0302; /* Zoom in */
public const int ZOOMWIDE_STOP = 0x0303; /* Zoom out stop */
public const int ZOOMWIDE = 0x0304; /* Zoom out */
public const int TILTUP = 0x0402; /* Tilt up */
public const int TILTDOWN = 0x0404; /* Tilt down */
public const int PANRIGHT = 0x0502; /* Pan right */
public const int PANLEFT = 0x0504; /* Pan left */
public const int LEFTUP = 0x0702; /* Move up left */
public const int LEFTDOWN = 0x0704; /* Move down left */
public const int RIGHTUP = 0x0802; /* Move up right */
public const int RIGHTDOWN = 0x0804; /* Move down right */
public const int ALLSTOP = 0x0901; /* All-stop command word */
public const int FOCUS_AND_IRIS_STOP = 0x0907; /* Focus & Iris-stop command word */
public const int MOVE_STOP = 0x0908; /* move stop command word */
public const int ZOOM_STOP = 0x0909; /* zoom stop command word */
/* NETDEV_PTZ_PRESETCMD_E */
public const int PRESET_SET = 0; /* Set preset */
public const int PRESET_CLE = 1; /* Clear preset */
public const int PRESET_GOTO = 2; /* Go to preset */
/* Maximum number of presets */
public const int NETDEV_MAX_PRESET_NUM = 255;
public enum NETDEV_LIVE_STREAM_INDEX_E : int
{
NETDEV_LIVE_STREAM_INDEX_MAIN = 0, /* Main stream */
NETDEV_LIVE_STREAM_INDEX_SUB = 1, /* Sub stream */
NETDEV_LIVE_STREAM_INDEX_THIRD = 2, /* Third stream */
NETDEV_LIVE_STREAM_INDEX_INVALID
}
public enum NETDEV_PROTOCAL_E : int
{
NETDEV_TRANSPROTOCAL_RTPUDP = 0, /* UDP */
NETDEV_TRANSPROTOCAL_RTPTCP = 1 /* TCP */
}
public enum NETDEV_PICTURE_FLUENCY_E
{
NETDEV_PICTURE_REAL = 0, /* Real-time first */
NETDEV_PICTURE_FLUENCY = 1, /* Fluency first */
NETDEV_PICTURE_BALANCE_NEW = 3, /* Balance */
NETDEV_PICTURE_RTMP_FLUENCY = 4, /* RTMP fluency first */
NETDEV_PICTURE_FLUENCY_INVALID = 0xff /* Invalid value */
}
#endregion SDK Const
#region SDK Struct
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_DEVICE_LOGIN_INFO_S
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NETDEV_LEN_260)]
public string szIPAddr; /* IP地址/域名 */
public int dwPort; /* 端口号 */
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NETDEV_LEN_132)]
public string szUserName; /* 用户名 */
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NETDEV_LEN_128)]
public string szPassword; /* 密码 */
public int dwLoginProto; /* 登录协议, 参见NETDEV_LOGIN_PROTO_E */
public int dwDeviceType; /* 设备类型, 参见NETDEV_DEVICE_TYPE_E */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte[] byRes; /* Reserved */
};
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_SELOG_INFO_S
{
public int dwSELogCount;
public int dwSELogTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] byRes;
};
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_VIDEO_CHL_DETAIL_INFO_S
{
public int dwChannelID;
public int bPtzSupported; /* Whether ptz is supported */
public int enStatus; /* Channel status */
public int dwStreamNum; /* Number of streams */
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NETDEV_LEN_64)]
public string szChnName; /* Device serial number */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] szReserve;
}
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_PTZ_STATUS_S
{
public float fPanTiltX; /* 绝对水平坐标 Absolute horizontal coordinates*/
public float fPanTiltY; /* 绝对竖直坐标 Absolute vertical coordinates*/
public float fZoomX; /* 绝对聚焦倍数 Absolute multiples*/
public int enPanTiltStatus;/* 云台状态 PTZ Status*/
public int enZoomStatus; /* 聚焦状态 Focus Status*/
};
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_PREVIEWINFO_S
{
public int dwChannelID; /* ID Channel ID */
public int dwStreamType; /* #NETDEV_LIVE_STREAM_INDEX_E Stream type, see enumeration #NETDEV_LIVE_STREAM_INDEX_E */
public int dwLinkMode; /* #NETDEV_PROTOCAL_E Transport protocol, see enumeration #NETDEV_PROTOCAL_E */
public IntPtr hPlayWnd; /* Play window handle */
public int dwFluency; /* #NETDEV_PICTURE_FLUENCY_E image play fluency*/
public int dwStreamMode; /* #NETDEV_STREAM_MODE_E start stream mode see #NETDEV_STREAM_MODE_E*/
public int dwLiveMode; /* #NETDEV_PULL_STREAM_MODE_E Rev. Flow pattern */
public int dwDisTributeCloud; /* #NETDEV_DISTRIBUTE_CLOUD_SRV_E distribution */
public int dwallowDistribution; /* allow or no distribution*/
public int dwTransType; /* 传输类型,参见枚举# NETDEV_TRANS_TYPE_E */
public int dwStreamProtocol; /* 起流协议,参见枚举# NETDEV_START_STREAM_PROT_E */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 236)]
public byte[] szReserve; /* Reserved */
}
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_PTZ_ALLPRESETS_S
{
public Int32 dwSize; /* Total number of presets */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NETDEV_MAX_PRESET_NUM)]
public NETDEV_PTZ_PRESET_S[] astPreset; /* Structure of preset information */
}
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_PTZ_PRESET_S
{
public Int32 dwPresetID; /* ID Preset ID */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NETDEV_LEN_32)]
public byte[] szPresetName; /** Preset name */
}
#endregion SDK Struct
#region Common Method
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool NETDEV_Init();
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool NETDEV_Cleanup();
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_GetLastError();
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr NETDEV_Login_V30(ref NETDEV_DEVICE_LOGIN_INFO_S pstDevLoginInfo, ref NETDEV_SELOG_INFO_S pstSELogInfo);
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool NETDEV_Logout(IntPtr lpUserID);
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_QueryVideoChlDetailList(IntPtr lpUserID, ref int pdwChlCount, IntPtr pstVideoChlList);
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool NETDEV_PTZGetStatus(IntPtr lpUserID, int dwChannelID, ref NETDEV_PTZ_STATUS_S pstPTZStaus);
//public boolean NETDEV_GetDevConfig(Pointer lpUserID, int dwChannelID, int dwCommand, Pointer lpOutBuffer, int dwOutBufferSize, IntByReference pdwBytesReturned);
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_PTZControl_Other(IntPtr lpUserID, int dwChannelID, int dwPTZCommand, int dwSpeed);
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_PTZPreset_Other(IntPtr lpUserID, int dwChannelID, int dwPTZPresetCmd, byte[] szPresetName, int dwPresetID);
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr NETDEV_RealPlay(IntPtr lpUserID, ref NETDEV_PREVIEWINFO_S pstPreviewInfo, IntPtr cbPlayDataCallBack, IntPtr lpUserData);
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_StopRealPlay(IntPtr lpRealHandle);
[DllImport(LibSdkPath, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 NETDEV_GetPTZPresetList(IntPtr lpUserID, Int32 dwChannelID, ref NETDEV_PTZ_ALLPRESETS_S lpOutBuffer);
#endregion Common Method
}