namespace SHH.CameraSdk;
///
/// 海康 HCNetSDK.dll 原生方法封装(静态部分类)
/// 功能:包含设备登录、预览、PTZ控制、异常回调等核心 SDK 接口定义
/// 注意:所有 API 均直接映射海康原生 DLL 函数,参数顺序与类型需严格匹配官方文档
///
public static partial class HikNativeMethods
{
#region --- 基础配置 (Basic Configuration) ---
///
/// HCNetSDK.dll 动态库路径
/// 说明:确保项目中该路径与实际文件位置一致,否则会导致 DllImport 调用失败
///
private const string DllName = "Drivers\\Hikvision\\HCNetSDK.dll";
#endregion
#region --- 结构体定义 (Structures) ---
///
/// 设备信息结构体 (NET_DEVICEINFO_V30)
/// 功能:存储设备序列号、通道数、协议类型、能力集等核心信息
/// 注:登录设备成功后通过 NET_DVR_Login_V30 接口返回
///
[StructLayout(LayoutKind.Sequential)]
public struct NET_DEVICEINFO_V30
{
/// 设备序列号(长度48字节)
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
public byte[] sSerialNumber;
/// 报警输入个数
public byte byAlarmInPortNum;
/// 报警输出个数
public byte byAlarmOutPortNum;
/// 硬盘个数
public byte byDiskNum;
/// 设备类型:1-DVR,2-ATM DVR,3-DVS 等
public byte byDVRType;
/// 模拟通道个数
public byte byChanNum;
/// 起始通道号(目前从1开始)
public byte byStartChan;
/// 语音通道数
public byte byAudioChanNum;
/// 最大数字通道个数(低8位)
public byte byIPChanNum;
/// 零通道编码个数
public byte byZeroChanNum;
/// 主码流传输协议类型:0-私有协议,1-RTSP,2-同时支持两者
public byte byMainProto;
/// 子码流传输协议类型:0-私有协议,1-RTSP,2-同时支持两者
public byte bySubProto;
/// 基础能力集(位掩码),位与结果为1表示支持对应功能
///
/// bySupport & 0x1: 支持智能搜索
/// bySupport & 0x2: 支持备份
/// bySupport & 0x4: 支持压缩参数能力获取
/// bySupport & 0x8: 支持多网卡
/// bySupport & 0x10: 支持远程SADP
/// bySupport & 0x20: 支持Raid卡功能
/// bySupport & 0x40: 支持IPSAN目录查找
/// bySupport & 0x80: 支持RTP over RTSP
///
public byte bySupport;
/// 能力集扩充(位掩码),位与结果为1表示支持对应功能
///
/// bySupport1 & 0x1: 支持SNMP v30
/// bySupport1 & 0x2: 支持区分回放和下载
/// bySupport1 & 0x4: 支持布防优先级
/// bySupport1 & 0x8: 智能设备支持布防时间段扩展
/// bySupport1 & 0x10: 支持多磁盘数(超过33个)
/// bySupport1 & 0x20: 支持RTSP over HTTP
/// bySupport1 & 0x80: 支持车牌新报警信息(2012-9-28),且支持NET_DVR_IPPARACFG_V40结构体
///
public byte bySupport1;
/// 能力集扩充(位掩码),位与结果为1表示支持对应功能
///
/// bySupport2 & 0x1: 解码器支持通过URL取流解码
/// bySupport2 & 0x2: 支持FTP V40
/// bySupport2 & 0x4: 支持ANR
/// bySupport2 & 0x8: 支持CCD的通道参数配置
/// bySupport2 & 0x10: 支持布防报警回传信息(仅抓拍机报警,新老报警结构)
/// bySupport2 & 0x20: 支持单独获取设备状态子项
/// bySupport2 & 0x40: 是码流加密设备
///
public byte bySupport2;
/// 设备型号
public ushort wDevType;
/// 能力集扩充(位掩码),位与结果为1表示支持对应功能
///
/// bySupport3 & 0x1: 支持多码流
/// bySupport3 & 0x4: 支持按组配置(通道图像参数、报警输入参数等)
/// bySupport3 & 0x8: 支持TCP/UDP/多播预览的延时预览字段
/// bySupport3 & 0x10: 支持获取报警主机主要状态(V40)
/// bySupport3 & 0x20: 支持通过DDNS域名解析取流
///
public byte bySupport3;
/// 多码流支持标识(按位表示)
/// 0-不支持,1-支持;bit1-码流3,bit2-码流4,bit7-主码流,bit8-子码流
public byte byMultiStreamProto;
/// 起始数字通道号(0表示无效)
public byte byStartDChan;
/// 起始数字对讲通道号(0表示无效)
public byte byStartDTalkChan;
/// 数字通道个数(高8位)
public byte byHighDChanNum;
/// 能力集扩充(位掩码),位与结果为1表示支持对应功能
public byte bySupport4;
/// 支持语种能力(按位表示)
///
/// byLanguageType = 0: 老设备
/// byLanguageType & 0x1: 支持中文
/// byLanguageType & 0x2: 支持英文
///
public byte byLanguageType;
/// 音频输入通道数
public byte byVoiceInChanNum;
/// 音频输入起始通道号
public byte byStartVoiceInChanNo;
/// 保留字段(必须置0)
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] byRes3;
/// AES算法加密/解密能力
public byte byMirrorCap;
/// 起始数字通道号(扩展)
public ushort wStartIPChanNo;
/// 保留字段(必须置0)
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 9)]
public byte[] byRes;
}
///
/// 预览参数结构体 (NET_DVR_PREVIEWINFO)
/// 功能:配置实时预览的通道、码流类型、连接方式等参数
/// 注:用于 NET_DVR_RealPlay_V40 接口的输入参数
///
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NET_DVR_PREVIEWINFO
{
/// 通道号(模拟通道从1开始)
public Int32 lChannel;
/// 码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推
public uint dwStreamType;
/// 连接方式:0-TCP,1-UDP,2-多播,3-RTP,4-RTP/RTSP,5-RTSP/HTTP
public uint dwLinkMode;
/// 播放窗口句柄
/// IntPtr.Zero 表示不让 SDK 直接渲染,仅获取原始流数据
public IntPtr hPlayWnd;
/// 取流模式:0-非阻塞,1-阻塞(阻塞模式超时5秒返回)
/// 阻塞模式不适合轮询取流操作
public bool bBlocked;
/// 是否启用回放录像:0-不启用,1-启用
public bool bPassbackRecord;
/// 预览模式:0-正常预览,1-延迟预览
public byte byPreviewMode;
/// 流ID(lChannel为0xffffffff时启用,长度32字节)
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = STREAM_ID_LEN, ArraySubType = UnmanagedType.I1)]
public byte[] byStreamID;
/// 应用层协议类型:0-私有协议,1-RTSP协议
public byte byProtoType;
/// 保留字段(必须置0)
public byte byRes1;
/// 码流编解码类型:0-通用编码数据,1-热成像原始数据(含温度加密信息)
public byte byVideoCodingType;
/// 播放库最大缓冲帧数(范围1-50,0表示默认1帧)
public uint dwDisplayBufNum;
/// NPQ模式:0-直连,1-过流媒体
public byte byNPQMode;
/// 保留字段(必须置0)
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 215, ArraySubType = UnmanagedType.I1)]
public byte[] byRes;
}
///
/// 时间结构体 (NET_DVR_TIME)
/// [Fix Bug P: 结构体炸弹] 修复结构体对齐问题,避免栈内存覆盖导致随机崩溃
///
///
/// 原问题:ushort/byte 混合定义导致结构体总大小不足16字节,SDK写入时覆盖栈变量
/// 修复方案:使用 Pack=4 对齐,成员类型统一为 uint(4字节),与 C++ DWORD 匹配
///
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct NET_DVR_TIME
{
public uint dwYear; // 年份
public uint dwMonth; // 月份(1-12)
public uint dwDay; // 日期(1-31)
public uint dwHour; // 小时(0-23)
public uint dwMinute; // 分钟(0-59)
public uint dwSecond; // 秒(0-59)
}
#endregion
#region --- 常量定义 (Constants) ---
/// 流ID长度(32字节)
public const int STREAM_ID_LEN = 32;
/// 数据类型常量:系统头数据
public const int NET_DVR_SYSHEAD = 1;
/// 数据类型常量:视频流数据(H.264/H.265)
public const int NET_DVR_STREAMDATA = 2;
/// 数据类型常量:音频数据
public const int NET_DVR_AUDIOSTREAMDATA = 3;
/// 命令常量:获取时间配置
public const uint NET_DVR_GET_TIMECFG = 118;
#endregion
#region --- PTZ 控制相关 (PTZ Control) ---
/// PTZ命令常量:镜头控制
public const uint ZOOM_IN = 11; // 焦距变大(拉近)
public const uint ZOOM_OUT = 12; // 焦距变小(拉远)
public const uint FOCUS_NEAR = 13; // 焦点前调
public const uint FOCUS_FAR = 14; // 焦点后调
public const uint IRIS_OPEN = 15; // 光圈扩大
public const uint IRIS_CLOSE = 16; // 光圈缩小
/// PTZ命令常量:方向控制
public const uint TILT_UP = 21; // 云台上仰
public const uint TILT_DOWN = 22; // 云台下俯
public const uint PAN_LEFT = 23; // 云台左转
public const uint PAN_RIGHT = 24; // 云台右转
public const uint UP_LEFT = 25; // 上左移动
public const uint UP_RIGHT = 26; // 上右移动
public const uint DOWN_LEFT = 27; // 下左移动
public const uint DOWN_RIGHT = 28; // 下右移动
public const uint PAN_AUTO = 29; // 自动扫描
/// PTZ命令常量:辅助功能
public const uint LIGHT_PWRON = 2; // 接通灯光电源
public const uint WIPER_PWRON = 3; // 接通雨刷开关
#endregion
#region --- 异常回调相关 (Exception Callback) ---
/// 异常类型常量
public const int EXCEPTION_EXCHANGE = 0x8000; // 用户交互时异常
public const int EXCEPTION_AUDIOEXCHANGE = 0x8001; // 语音对讲异常
public const int EXCEPTION_ALARM = 0x8002; // 报警异常
public const int EXCEPTION_PREVIEW = 0x8003; // 网络预览异常
public const int EXCEPTION_SERIAL = 0x8004; // 透明通道异常
public const int EXCEPTION_RECONNECT = 0x8005; // 预览时重连成功
///
/// 异常消息回调委托
/// 功能:SDK 发生异常时触发,返回异常类型、用户ID、相关句柄等信息
///
/// 异常类型(对应 EXCEPTION_XXX 常量)
/// 用户ID(NET_DVR_Login_V30 返回值)
/// 异常关联句柄(预览句柄/报警句柄等)
/// 用户自定义数据指针
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void EXCEPTION_CALLBACK(uint dwType, int lUserID, int lHandle, IntPtr pUser);
#endregion
#region --- 预览回调相关 (Preview Callback) ---
///
/// 预览数据回调委托
/// 功能:实时预览时触发,返回原始流数据(系统头/视频流/音频流)
///
/// 预览句柄(NET_DVR_RealPlay_V40 返回值)
/// 数据类型(对应 NET_DVR_XXX 数据类型常量)
/// 数据缓冲区指针
/// 缓冲区大小(字节)
/// 用户自定义数据指针
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void REALDATACALLBACK(Int32 lRealHandle, UInt32 dwDataType, IntPtr pBuffer, UInt32 dwBufSize, IntPtr pUser);
#endregion
#region --- SDK 基础接口 (Basic SDK Interfaces) ---
///
/// 初始化 SDK
/// 功能:调用所有其他 SDK 接口的前提,必须先初始化再使用
///
/// 初始化成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_Init();
///
/// 释放 SDK 资源
/// 功能:程序退出前调用,释放 SDK 占用的非托管资源(网络连接、内存等)
///
/// 释放成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_Cleanup();
///
/// 获取最后一次操作的错误码
/// 功能:API 调用失败后,通过此接口获取具体错误原因
///
/// 错误码(需结合海康官方文档查询含义)
[DllImport(DllName)]
public static extern uint NET_DVR_GetLastError();
///
/// 设置网络连接超时时间和连接尝试次数
///
/// 超时时间(毫秒),推荐 3000ms
/// 连接尝试次数,推荐 1 次
/// 设置成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_SetConnectTime(uint dwWaitTime, uint dwTryTimes);
///
/// 设置自动重连功能
///
/// 重连间隔(毫秒),推荐 10000ms
/// 是否启用重连:0-禁用,1-启用
/// 设置成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_SetReconnect(uint dwInterval, bool bEnableRecon);
#endregion
#region --- 设备登录/登出接口 (Device Login/Logout) ---
///
/// 用户注册设备(登录)
/// 功能:建立与设备的连接,获取用户ID(后续接口调用的核心标识)
///
/// 设备IP地址
/// 设备端口号(海康默认8000)
/// 登录用户名(默认 admin)
/// 登录密码
/// 输出参数:设备信息结构体
/// 登录成功返回用户ID(非负整数),失败返回 -1
[DllImport(DllName)]
public static extern int NET_DVR_Login_V30(string sDVRIP, Int32 wDVRPort, string sUserName, string sPassword, ref NET_DEVICEINFO_V30 lpDeviceInfo);
///
/// 用户注销(登出)
/// 功能:断开与设备的连接,释放用户ID关联的资源
///
/// 用户ID(NET_DVR_Login_V30 返回值)
/// 登出成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_Logout(int lUserID);
#endregion
#region --- 预览控制接口 (Preview Control) ---
///
/// 实时预览(V40版本,支持回调)
/// 功能:启动设备实时取流,通过回调获取原始流数据
///
/// 用户ID(NET_DVR_Login_V30 返回值)
/// 预览参数结构体
/// 流数据回调函数
/// 用户自定义数据指针
/// 预览成功返回预览句柄(非负整数),失败返回 -1
[DllImport(DllName)]
public static extern int NET_DVR_RealPlay_V40(int lUserID, ref NET_DVR_PREVIEWINFO lpPreviewInfo, REALDATACALLBACK fRealDataCallBack_V30, IntPtr pUser);
///
/// 停止预览
/// 功能:停止实时取流,释放预览句柄关联的资源
///
/// 预览句柄(NET_DVR_RealPlay_V40 返回值)
/// 停止成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_StopRealPlay(int lRealHandle);
///
/// 强制生成I帧
/// 功能:主动触发设备发送I帧,优化视频流解码延时
///
/// 用户ID
/// 通道号
/// 操作成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_MakeKeyFrame(int lUserID, int lChannel);
#endregion
#region --- PTZ 控制接口 (PTZ Control Interfaces) ---
///
/// 云台控制(带速度)
/// 功能:控制云台旋转、镜头缩放、光圈调节等操作
///
/// 用户ID
/// 通道号
/// PTZ控制命令(对应 PTZ 命令常量)
/// 启停标识:0-开始,1-停止
/// 控制速度(1-7,数值越大速度越快)
/// 操作成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_PTZControlWithSpeed_Other(int lUserID, int lChannel, uint dwPTZCommand, uint dwStop, uint dwSpeed);
#endregion
#region --- 异常回调接口 (Exception Callback Interfaces) ---
///
/// 设置连接超时时间和重连策略(兼容旧版本)
///
/// 重连间隔(毫秒),建议 3000
/// 是否启用重连:1-启用,0-禁用
/// 设置成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_SetReconnect(uint dwInterval, int bEnableRecon);
///
/// 注册异常、重连等消息的回调函数
/// 功能:绑定异常回调委托,接收 SDK 层面的异常通知
///
/// 消息类型(0 表示所有消息)
/// 窗口句柄(可为 IntPtr.Zero)
/// 异常回调函数委托
/// 用户自定义数据指针
/// 注册成功返回 true,失败返回 false
[DllImport(DllName)]
public static extern bool NET_DVR_SetExceptionCallBack_V30(uint nMessage, IntPtr hWnd, EXCEPTION_CALLBACK fExceptionCallBack, IntPtr pUser);
#endregion
#region --- 通用配置接口 (General Configuration Interfaces) ---
///
/// 获取设备配置
/// 功能:通用接口,根据命令号获取设备特定配置(如时间配置、通道参数等)
///
/// 用户ID
/// 配置命令号(如 NET_DVR_GET_TIMECFG)
/// 通道号(-1 表示设备级配置)
/// 输出缓冲区指针(存储配置数据)
/// 输出缓冲区大小(字节)
/// 输出参数:实际返回的数据大小(字节)
/// 获取成功返回 true,失败返回 false
[DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
public static extern bool NET_DVR_GetDVRConfig(
int lUserID,
uint dwCommand,
int lChannel,
IntPtr lpOutBuffer,
uint dwOutBufferSize,
ref uint lpBytesReturned);
#endregion
}