作者 GitiJun 2017.09.12 09:56:27 写了58篇文章,回复33人, 托管与非托管 样例参考 阅读:2244· 评论:0· 喜欢:1 ## 在使用 CPP 相关动态库时,有很多需要注意的地方,特别记录,备忘。 ``` #if (defined(_WIN32)) //windows #define NET_DVR_API extern "C" __declspec(dllimport) typedef unsigned __int64 UINT64; typedef signed __int64 INT64; #elif defined(__linux__) || defined(__APPLE__) //linux #define BOOL int typedef unsigned int DWORD; typedef unsigned short WORD; typedef unsigned short USHORT; typedef short SHORT; typedef int LONG; typedef unsigned char BYTE; typedef unsigned int UINT; typedef void* LPVOID; typedef void* HANDLE; typedef unsigned int* LPDWORD; typedef unsigned long long UINT64; typedef signed long long INT64; #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef NULL #define NULL 0 #endif typedef struct tagInitInfo { int uWidth; int uHeight; }INITINFO; ``` ## 一种方式 C++ 非托管代码 C# 托管代码 ======================================================== //校时结构参数 [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_TIME { public uint dwYear; public uint dwMonth; public uint dwDay; public uint dwHour; public uint dwMinute; public uint dwSecond; } //校时结构参数 typedef struct { DWORD dwYear; //年 DWORD dwMonth; //月 DWORD dwDay; //日 DWORD dwHour; //时 DWORD dwMinute; //分 DWORD dwSecond; //秒 }NET_DVR_TIME, *LPNET_DVR_TIME; ======================================================== //时间参数 [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_TIME_V30 { public ushort wYear; public byte byMonth; public byte byDay; public byte byHour; public byte byMinute; public byte bySecond; public byte byRes; public ushort wMilliSec; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.I1)] public byte[] byRes1; } typedef struct tagNET_DVR_TIME_V30 { WORD wYear; BYTE byMonth; BYTE byDay; BYTE byHour; BYTE byMinute; BYTE bySecond; BYTE byRes; WORD wMilliSec; BYTE byRes1[2]; }NET_DVR_TIME_V30, *LPNET_DVR_TIME_V30; ======================================================== [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_HANDLEEXCEPTION_V41 { public uint dwHandleType;/*处理方式,处理方式的"或"结果*/ /*0x00: 无响应*/ /*0x01: 监视器上警告*/ /*0x02: 声音警告*/ /*0x04: 上传中心*/ /*0x08: 触发报警输出*/ /*0x10: 触发JPRG抓图并上传Email*/ /*0x20: 无线声光报警器联动*/ /*0x40: 联动电子地图(目前只有PCNVR支持)*/ /*0x200: 抓图并上传FTP*/ public uint dwMaxRelAlarmOutChanNum; //触发的报警输出通道数(只读)最大支持数 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_ALARMOUT_V40, ArraySubType = UnmanagedType.U4)] public uint[] dwRelAlarmOut; //触发报警通道 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 64, ArraySubType = UnmanagedType.I1)] public byte[] byRes; //保留 } typedef struct tagNET_DVR_HANDLEEXCEPTION_V41 { DWORD dwHandleType; //异常处理,异常处理方式的"或"结果 /*0x00: 无响应*/ /*0x01: 监视器上警告*/ /*0x02: 声音警告*/ /*0x04: 上传中心*/ /*0x08: 触发报警输出*/ /*0x10: 触发JPRG抓图并上传Email*/ /*0x20: 无线声光报警器联动*/ /*0x40: 联动电子地图(目前只有PCNVR支持)*/ /*0x200: 抓图并上传FTP*/ /*0x400: 虚交侦测 联动 聚焦模式(提供可配置项,原先设备自动完成)IPC5.1.0*/ /*0x800: PTZ联动跟踪(球机跟踪目标)*/ DWORD dwMaxRelAlarmOutChanNum ; //触发的报警输出通道数(只读)最大支持数 DWORD dwRelAlarmOut[MAX_ALARMOUT_V40]; //触发报警通道 BYTE byRes[64]; //保留 }NET_DVR_HANDLEEXCEPTION_V41, *LPNET_DVR_HANDLEEXCEPTION_V41; ======================================================== /*网络数据结构(子结构)(9000扩展)*/ [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_ETHERNET_V30 { public NET_DVR_IPADDR struDVRIP;//DVR IP地址 public NET_DVR_IPADDR struDVRIPMask;//DVR IP地址掩码 public uint dwNetInterface;//网络接口:1-10MBase-T;2-10MBase-T全双工;3-100MBase-TX;4-100M全双工;5-10M/100M/1000M自适应;6-1000M全双工 public ushort wDVRPort;//端口号 public ushort wMTU;//增加MTU设置,默认1500。 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MACADDR_LEN, ArraySubType = UnmanagedType.I1)] public byte[] byMACAddr;// 物理地址 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.I1)] public byte[] byRes; } /* 网络数据结构(子结构)(9000扩展) */ typedef struct { NET_DVR_IPADDR struDVRIP; //DVR IP地址 NET_DVR_IPADDR struDVRIPMask; //DVR IP地址掩码 DWORD dwNetInterface; //网络接口1-10MBase-T 2-10MBase-T全双工 3-100MBase-TX 4-100M全双工 5-10M/100M自适应 WORD wDVRPort; //端口号 WORD wMTU; //增加MTU设置,默认1500。 BYTE byMACAddr[MACADDR_LEN]; // 物理地址 BYTE byRes[2]; //保留 }NET_DVR_ETHERNET_V30, *LPNET_DVR_ETHERNET_V30; ======================================================== /*IP地址*/ [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct NET_DVR_IPADDR { /// char[16] [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)] public string sIpV4; /// BYTE[128] [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 128, ArraySubType = UnmanagedType.I1)] public byte[] byRes; public void Init() { byRes = new byte[128]; } } /* IP地址 */ typedef struct { char sIpV4[16]; /* IPv4地址 */ BYTE byIPv6[128]; /* 保留 */ }NET_DVR_IPADDR, *LPNET_DVR_IPADDR; ======================================================== //pppoe结构 [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct NET_DVR_PPPOECFG { public uint dwPPPOE;//0-不启用,1-启用 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] public byte[] sPPPoEUser;//PPPoE用户名 [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = PASSWD_LEN)] public string sPPPoEPassword;// PPPoE密码 public NET_DVR_IPADDR struPPPoEIP;//PPPoE IP地址 } //pppoe结构 typedef struct { DWORD dwPPPOE; //0-不启用,1-启用 BYTE sPPPoEUser[NAME_LEN]; //PPPoE用户名 char sPPPoEPassword[PASSWD_LEN]; // PPPoE密码 NET_DVR_IPADDR struPPPoEIP; //PPPoE IP地址 }NET_DVR_PPPOECFG, *LPNET_DVR_PPPOECFG; ======================================================== //网络配置结构(9000扩展) [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_NETCFG_V30 { public uint dwSize; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_ETHERNET, ArraySubType = UnmanagedType.Struct)] public NET_DVR_ETHERNET_V30[] struEtherNet;//以太网口 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.Struct)] public NET_DVR_IPADDR[] struRes1;/*保留*/ public NET_DVR_IPADDR struAlarmHostIpAddr;/* 报警主机IP地址 */ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.I1)] public byte[] byRes2; public ushort wAlarmHostIpPort; public byte byUseDhcp; public byte byRes3; public NET_DVR_IPADDR struDnsServer1IpAddr;/* 域名服务器1的IP地址 */ public NET_DVR_IPADDR struDnsServer2IpAddr;/* 域名服务器2的IP地址 */ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DOMAIN_NAME, ArraySubType = UnmanagedType.I1)] public byte[] byIpResolver; public ushort wIpResolverPort; public ushort wHttpPortNo; public NET_DVR_IPADDR struMulticastIpAddr;/* 多播组地址 */ public NET_DVR_IPADDR struGatewayIpAddr;/* 网关地址 */ public NET_DVR_PPPOECFG struPPPoE; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 64, ArraySubType = UnmanagedType.I1)] public byte[] byRes; } //网络配置结构(9000扩展) typedef struct { DWORD dwSize; NET_DVR_ETHERNET_V30 struEtherNet[MAX_ETHERNET]; //以太网口 NET_DVR_IPADDR struRes1[2]; /*保留*/ NET_DVR_IPADDR struAlarmHostIpAddr; /* 报警主机IP地址 */ BYTE byRes2[4]; /* 保留 */ WORD wAlarmHostIpPort; /* 报警主机端口号 */ BYTE byUseDhcp; /* 是否启用DHCP 0xff-无效 0-不启用 1-启用*/ BYTE byIPv6Mode; //IPv6分配方式,0-路由公告,1-手动设置,2-启用DHCP分配 NET_DVR_IPADDR struDnsServer1IpAddr; /* 域名服务器1的IP地址 */ NET_DVR_IPADDR struDnsServer2IpAddr; /* 域名服务器2的IP地址 */ BYTE byIpResolver[MAX_DOMAIN_NAME]; /* IP解析服务器域名或IP地址 */ WORD wIpResolverPort; /* IP解析服务器端口号 */ WORD wHttpPortNo; /* HTTP端口号 */ NET_DVR_IPADDR struMulticastIpAddr; /* 多播组地址 */ NET_DVR_IPADDR struGatewayIpAddr; /* 网关地址 */ NET_DVR_PPPOECFG struPPPoE; BYTE byEnablePrivateMulticastDiscovery; //私有多播搜索,0~默认,1~启用,2-禁用 BYTE byEnableOnvifMulticastDiscovery; //Onvif多播搜索,0~默认,1~启用,2-禁用 BYTE byEnableDNS; //DNS自动使能, 0-保留,1-打开,2-关闭 BYTE byRes[61]; } NET_DVR_NETCFG_V30, *LPNET_DVR_NETCFG_V30; ======================================================== //多网卡网络配置结构 [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_NETCFG_MULTI { public uint dwSize; public byte byDefaultRoute; public byte byNetworkCardNum; public byte byWorkMode; //0-普通多网卡模式,1-内外网隔离模式 public byte byRes; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_NETWORK_CARD, ArraySubType = UnmanagedType.Struct)] public NET_DVR_ETHERNET_MULTI[] struEtherNet;//以太网口 public NET_DVR_IPADDR struManageHost1IpAddr; public NET_DVR_IPADDR struManageHost2IpAddr; public NET_DVR_IPADDR struAlarmHostIpAddr; public ushort wManageHost1Port; public ushort wManageHost2Port; public ushort wAlarmHostIpPort; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DOMAIN_NAME, ArraySubType = UnmanagedType.I1)] public byte[] byIpResolver; public ushort wIpResolverPort; public ushort wDvrPort; public ushort wHttpPortNo; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I1)] public byte[] byRes2; public NET_DVR_IPADDR struMulticastIpAddr;/* 多播组地址 */ public NET_DVR_PPPOECFG struPPPoE; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 24, ArraySubType = UnmanagedType.I1)] public byte[] byRes3; } //多网卡网络配置结构 typedef struct { DWORD dwSize; BYTE byDefaultRoute; //默认路由,0表示struEtherNet[0],1表示struEtherNet[1] BYTE byNetworkCardNum; //设备实际可配置的网卡数目 BYTE byWorkMode; //0-普通多网卡模式,1-内外网隔离模式 BYTE byRes; //保留 NET_DVR_ETHERNET_MULTI struEtherNet[MAX_NETWORK_CARD]; //以太网口 NET_DVR_IPADDR struManageHost1IpAddr; /* 主管理主机IP地址 */ NET_DVR_IPADDR struManageHost2IpAddr; /* 辅管理主机IP地址 */ NET_DVR_IPADDR struAlarmHostIpAddr; /* 报警主机IP地址 */ WORD wManageHost1Port; /* 主管理主机端口号 */ WORD wManageHost2Port; /* 辅管理主机端口号 */ WORD wAlarmHostIpPort; /* 报警主机端口号 */ BYTE byIpResolver[MAX_DOMAIN_NAME]; /* IP解析服务器域名或IP地址 */ WORD wIpResolverPort; /* IP解析服务器端口号 */ WORD wDvrPort; //通讯端口 默认8000 WORD wHttpPortNo; /* HTTP端口号 */ WORD wDvrPort2; //通讯端口2 BYTE byRes2[4]; NET_DVR_IPADDR struMulticastIpAddr; /* 多播组地址 */ NET_DVR_PPPOECFG struPPPoE; BYTE byRes3[24]; }NET_DVR_NETCFG_MULTI, *LPNET_DVR_NETCFG_MULTI; ======================================================== //通道图象结构 //移动侦测(子结构)(按组方式扩展) [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct NET_DVR_RECORDCHAN { public uint dwMaxRecordChanNum; //设备支持的最大关联录像通道数-只读 public uint dwCurRecordChanNum; //当前实际已配置的关联录像通道数 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.U4)] public uint dwRelRecordChan; /* 实际触发录像通道,按值表示,采用紧凑型排列,从下标0 - MAX_CHANNUM_V30-1有效,如果中间遇到0xffffffff,则后续无效*/ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 64, ArraySubType = UnmanagedType.I1)] public byte[] byRes; //保留 } //通道图象结构 //移动侦测(子结构)(按组方式扩展) typedef struct { DWORD dwMaxRecordChanNum; //设备支持的最大关联录像通道数-只读 DWORD dwCurRecordChanNum; //当前实际已配置的关联录像通道数 DWORD dwRelRecordChan[MAX_CHANNUM_V30]; /* 实际触发录像通道,按值表示,采用紧凑型排列,从下标0 - MAX_CHANNUM_V30-1有效,如果中间遇到0xffffffff,则后续无效*/ BYTE byRes[64]; //保留 }NET_DVR_RECORDCHAN, *LPNET_DVR_RECORDCHAN; ======================================================== //时间段录像参数配置(子结构) [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct NET_DVR_RECORDSCHED { public NET_DVR_SCHEDTIME struRecordTime; public byte byRecordType;//0:定时录像,1:移动侦测,2:报警录像,3:动测|报警,4:动测&报警, 5:命令触发, 6: 智能录像 [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 3)] public string reservedData; } //时间段录像参数配置(子结构) typedef struct { NET_DVR_SCHEDTIME struRecordTime; BYTE byRecordType; //0:定时录像,1:移动侦测,2:报警录像,3:动测|报警,4:动测&报警, 5:命令触发, 6: 智能录像,10-PIR报警,11-无线报警,12-呼救报警,13-所有报警,14-智能交通事件,15越界侦测,16区域入侵侦测,17音频异常侦测 char reservedData[3]; }NET_DVR_RECORDSCHED, *LPNET_DVR_RECORDSCHED; ======================================================== //报警输入参数配置(256路NVR扩展) [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_ALARMINCFG_V40 { public uint dwSize; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] public byte[] sAlarmInName; /* 名称 */ public byte byAlarmType; //报警器类型,0:常开,1:常闭 public byte byAlarmInHandle; /* 是否处理 0-不处理 1-处理*/ public byte byChannel; // 报警输入触发智能识别通道 public byte byRes1; //保留 public uint dwHandleType; //异常处理,异常处理方式的"或"结果 /*0x00: 无响应*/ /*0x01: 监视器上警告*/ /*0x02: 声音警告*/ /*0x04: 上传中心*/ /*0x08: 触发报警输出*/ /*0x10: 触发JPRG抓图并上传Email*/ /*0x20: 无线声光报警器联动*/ /*0x40: 联动电子地图(目前只有PCNVR支持)*/ /*0x200: 抓图并上传FTP*/ public uint dwMaxRelAlarmOutChanNum ; //触发的报警输出通道数(只读)最大支持数量 public uint dwRelAlarmOutChanNum; //触发的报警输出通道数 实际支持数 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_ALARMOUT_V40, ArraySubType = UnmanagedType.U4)] public uint[] dwRelAlarmOut; //触发报警通道 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DAYS * MAX_TIMESEGMENT_V30, ArraySubType = UnmanagedType.Struct)] public NET_DVR_SCHEDTIME[] struAlarmTime;//布防时间 /*触发的录像通道*/ public uint dwMaxRecordChanNum; //设备支持的最大关联录像通道数-只读 public uint dwCurRecordChanNum; //当前实际已配置的关联录像通道数 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.U4)] public uint[] dwRelRecordChan; /* 实际触发录像通道,按值表示,采用紧凑型排列,从下标0 - dwCurRecordChanNum -1有效,如果中间遇到0xffffffff,则后续无效*/ public uint dwMaxEnablePtzCtrlNun; //最大可启用的云台控制总数(只读) public uint dwEnablePresetChanNum; //当前已启用预置点的数目 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.Struct)] public NET_DVR_PRESETCHAN_INFO[] struPresetChanInfo; //启用的预置点信息 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 516, ArraySubType = UnmanagedType.I1)] public byte[] byRes2; /*保留*/ public uint dwEnableCruiseChanNum; //当前已启用巡航的通道数目 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.Struct)] public NET_DVR_CRUISECHAN_INFO[] struCruiseChanInfo; //启用巡航功能通道的信息 public uint dwEnablePtzTrackChanNum; //当前已启用巡航的通道数目 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V40, ArraySubType = UnmanagedType.Struct)] public NET_DVR_PTZTRACKCHAN_INFO[] struPtzTrackInfo; //调用云台轨迹的通道信息 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256, ArraySubType = UnmanagedType.I1)] public byte[] byRes; } //报警输入参数配置(256路NVR扩展) typedef struct tagNET_DVR_ALARMINCFG_V40 { DWORD dwSize; BYTE sAlarmInName[NAME_LEN]; /* 名称 */ BYTE byAlarmType; //报警器类型,0:常开,1:常闭 BYTE byAlarmInHandle; /* 是否处理 0-不处理 1-处理*/ BYTE byChannel; // 报警输入触发智能识别通道 BYTE byInputType; //输入类型 0-开关量方式 1-信号量方式 DWORD dwHandleType; //异常处理,异常处理方式的"或"结果 /*0x00: 无响应*/ /*0x01: 监视器上警告*/ /*0x02: 声音警告*/ /*0x04: 上传中心*/ /*0x08: 触发报警输出*/ /*0x10: 触发JPRG抓图并上传Email*/ /*0x20: 无线声光报警器联动*/ /*0x40: 联动电子地图(目前只有PCNVR支持)*/ /*0x200: 抓图并上传FTP*/ /*0x1000:抓图上传到云*/ DWORD dwMaxRelAlarmOutChanNum ; //触发的报警输出通道数(只读)最大支持数量 DWORD dwRelAlarmOutChanNum; //触发的报警输出通道数 实际支持数 DWORD dwRelAlarmOut[MAX_ALARMOUT_V40]; //触发报警通道 NET_DVR_SCHEDTIME struAlarmTime[MAX_DAYS][MAX_TIMESEGMENT_V30];//布防时间 /*触发的录像通道*/ DWORD dwMaxRecordChanNum; //设备支持的最大关联录像通道数-只读 DWORD dwCurRecordChanNum; //当前实际已配置的关联录像通道数 DWORD dwRelRecordChan[MAX_CHANNUM_V40]; /* 实际触发录像通道,按值表示,采用紧凑型排列,从下标0 - dwCurRecordChanNum -1有效,如果中间遇到0xffffffff,则后续无效*/ DWORD dwMaxEnablePtzCtrlNun; //最大可启用的云台控制总数(只读) DWORD dwEnablePresetChanNum; //当前已启用预置点的数目 NET_DVR_PRESETCHAN_INFO struPresetChanInfo[MAX_CHANNUM_V40]; //启用的预置点信息 BYTE byRes2[516]; /*保留*/ DWORD dwEnableCruiseChanNum; //当前已启用巡航的通道数目 NET_DVR_CRUISECHAN_INFO struCruiseChanInfo[MAX_CHANNUM_V40]; //启用巡航功能通道的信息 DWORD dwEnablePtzTrackChanNum; //当前已启用巡航的通道数目 NET_DVR_PTZTRACKCHAN_INFO struPtzTrackInfo[MAX_CHANNUM_V40]; //调用云台轨迹的通道信息 BYTE byRes[256]; }NET_DVR_ALARMINCFG_V40, *LPNET_DVR_ALARMINCFG_V40; ======================================================== [StructLayout(LayoutKind.Explicit)] public struct UNION_ALARMINFO_FIXED { [FieldOffset(0)] [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 128, ArraySubType = UnmanagedType.I1)] public byte[] byUnionLen; [FieldOffset(0)] public STRUCT_IO_ALARM struIOAlarm;// 报警类型dwAlarmType为0时有效 [FieldOffset(0)] public STRUCT_ALARM_CHANNEL struAlarmChannel; // dwAlarmType为2,3,6,9,10或13时有效 [FieldOffset(0)] public STRUCT_ALARM_HD struAlarmHardDisk; // dwAlarmType为1,4,5时有效 } ======================================================== [StructLayoutAttribute(LayoutKind.Sequential)] public struct STRUCT_IO_ALARM { public uint dwAlarmInputNo; //发生报警的报警输入通道号,一次只有一个 public uint dwTrigerAlarmOutNum; /*触发的报警输出个数,用于后面计算变长数据部分中所有触发的报警输出通道号,四字节表示一个*/ public uint dwTrigerRecordChanNum; /*触发的录像通道个数,用于后面计算变长数据部分中所有触发的录像通道号,四字节表示一个*/ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 116, ArraySubType = UnmanagedType.I1)] public byte[] byRes; } ======================================================== [StructLayoutAttribute(LayoutKind.Sequential)] public struct STRUCT_ALARM_CHANNEL { public uint dwAlarmChanNum; /*发生报警通道数据个数,用于后面计算变长数据部分中所有发生的报警通道号,四字节表示一个*/ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 124, ArraySubType = UnmanagedType.I1)] public byte[] byRes; } ======================================================== [StructLayoutAttribute(LayoutKind.Sequential)] public struct STRUCT_ALARM_HD { public uint dwAlarmHardDiskNum; /*发生报警的硬盘数据长度,用于后面计算变长数据部分中所有发生报警的硬盘号,四节表示一个*/ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 124, ArraySubType = UnmanagedType.I1)] public byte[] byRes; } ======================================================== //上传报警信息(9000扩展) [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_ALARMINFO_V30 { public uint dwAlarmType;/*0-信号量报警,1-硬盘满,2-信号丢失,3-移动侦测,4-硬盘未格式化,5-读写硬盘出错,6-遮挡报警,7-制式不匹配, 8-非法访问, 0xa-GPS定位信息(车载定制)*/ public uint dwAlarmInputNumber;/*报警输入端口*/ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_ALARMOUT_V30, ArraySubType = UnmanagedType.I1)] public byte[] byAlarmOutputNumber;/*触发的输出端口,为1表示对应输出*/ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.I1)] public byte[] byAlarmRelateChannel;/*触发的录像通道,为1表示对应录像, dwAlarmRelateChannel[0]对应第1个通道*/ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_CHANNUM_V30, ArraySubType = UnmanagedType.I1)] public byte[] byChannel;/*dwAlarmType为2或3,6时,表示哪个通道,dwChannel[0]对应第1个通道*/ [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DISKNUM_V30, ArraySubType = UnmanagedType.I1)] public byte[] byDiskNumber;/*dwAlarmType为1,4,5时,表示哪个硬盘, dwDiskNumber[0]对应第1个硬盘*/ public void Init() { dwAlarmType = 0; dwAlarmInputNumber = 0; byAlarmRelateChannel = new byte[MAX_CHANNUM_V30]; byChannel = new byte[MAX_CHANNUM_V30]; byAlarmOutputNumber = new byte[MAX_ALARMOUT_V30]; byDiskNumber = new byte[MAX_DISKNUM_V30]; for (int i = 0; i < MAX_CHANNUM_V30; i++) { byAlarmRelateChannel[i] = Convert.ToByte(0); byChannel[i] = Convert.ToByte(0); } for (int i = 0; i < MAX_ALARMOUT_V30; i++) { byAlarmOutputNumber[i] = Convert.ToByte(0); } for (int i = 0; i < MAX_DISKNUM_V30; i++) { byDiskNumber[i] = Convert.ToByte(0); } } public void Reset() { dwAlarmType = 0; dwAlarmInputNumber = 0; for (int i = 0; i < MAX_CHANNUM_V30; i++) { byAlarmRelateChannel[i] = Convert.ToByte(0); byChannel[i] = Convert.ToByte(0); } for (int i = 0; i < MAX_ALARMOUT_V30; i++) { byAlarmOutputNumber[i] = Convert.ToByte(0); } for (int i = 0; i < MAX_DISKNUM_V30; i++) { byDiskNumber[i] = Convert.ToByte(0); } } } //上传报警信息(9000扩展) typedef struct { DWORD dwAlarmType;/*0-信号量报警,1-硬盘满,2-信号丢失,3-移动侦测,4-硬盘未格式化,5-读写硬盘出错,6-遮挡报警,7-制式不匹配, 8-非法访问, 9-视频信号异常, 10-录像异常,11- 智能场景变化,12-阵列异常,13-前端/录像分辨率不匹配,14-申请解码资源失败,15-智能侦测, 16-POE供电异常报警,17-闪光灯异常, 18-磁盘满负荷异常报警,19-音频丢失,20-开启录像,21-关闭录像,22-车辆检测算法异常,23-脉冲报警,24-人脸库硬盘异常,25-人脸库变更,26-人脸库图片变更*/ DWORD dwAlarmInputNumber;/*报警输入端口*/ BYTE byAlarmOutputNumber[MAX_ALARMOUT_V30];/*触发的输出端口,为1表示对应输出*/ BYTE byAlarmRelateChannel[MAX_CHANNUM_V30];/*触发的录像通道,为1表示对应录像, dwAlarmRelateChannel[0]对应第1个通道*/ BYTE byChannel[MAX_CHANNUM_V30];/*dwAlarmType为2或3,6,9,10,14,19时,表示哪个通道,dwChannel[0]对应第1个通道*/ BYTE byDiskNumber[MAX_DISKNUM_V30];/*dwAlarmType为1,4,5时,表示哪个硬盘, dwDiskNumber[0]对应第1个硬盘*/ #ifdef SDK_CHEZAI NET_DVR_ADDIT_POSITION GPS_pos; /* GPS定位信息 */ #endif }NET_DVR_ALARMINFO_V30, *LPNET_DVR_ALARMINFO_V30; ======================================================== [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_IPSERVER_STREAM { public byte byEnable; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)] public byte[] byRes; public NET_DVR_IPADDR struIPServer; public ushort wPort; public ushort wDvrNameLen; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] public byte[] byDVRName; public ushort wDVRSerialLen; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.U2)] public ushort[] byRes1; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)] public byte[] byDVRSerialNumber; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] public byte[] byUserName; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = PASSWD_LEN, ArraySubType = UnmanagedType.I1)] public byte[] byPassWord; public byte byChannel; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 11, ArraySubType = UnmanagedType.I1)] public byte[] byRes2; public void Init() { byRes = new byte[3]; byDVRName = new byte[NAME_LEN]; byRes1 = new ushort[2]; byDVRSerialNumber = new byte[SERIALNO_LEN]; byUserName = new byte[NAME_LEN]; byPassWord = new byte[PASSWD_LEN]; byRes2 = new byte[11]; } } typedef struct tagNET_DVR_IPSERVER_STREAM { BYTE byEnable; // 是否在线 BYTE byRes[3]; // 保留字节 NET_DVR_IPADDR struIPServer; //IPServer 地址 WORD wPort; //IPServer 端口 WORD wDvrNameLen; // DVR 名称长度 BYTE byDVRName[NAME_LEN]; // DVR名称 WORD wDVRSerialLen; // 序列号长度 WORD byRes1[2]; // 保留字节 BYTE byDVRSerialNumber[SERIALNO_LEN]; // DVR序列号长度 BYTE byUserName[NAME_LEN]; // DVR 登陆用户名 BYTE byPassWord[PASSWD_LEN]; // DVR登陆密码 BYTE byChannel; // DVR 通道 BYTE byRes2[11]; // 保留字节 }NET_DVR_IPSERVER_STREAM, *LPNET_DVR_IPSERVER_STREAM; ======================================================== /* 控制网络文件回放 */ [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct NET_DVR_PLAYREMOTEFILE { public uint dwSize; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 16)] public string sDecoderIP;/* DVR IP地址 */ public ushort wDecoderPort;/* 端口号 */ public ushort wLoadMode;/* 回放下载模式 1-按名字 2-按时间 */ [StructLayoutAttribute(LayoutKind.Explicit)] public struct mode_size { [FieldOffsetAttribute(0)] [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 100, ArraySubType = UnmanagedType.I1)] public byte[] byFile;/* 回放的文件名 */ [FieldOffsetAttribute(0)] public bytime bytime; } } /* 控制网络文件回放 */ typedef struct { DWORD dwSize; char sDecoderIP[16]; /* DVR IP地址 */ WORD wDecoderPort; /* 端口号 */ WORD wLoadMode; /* 回放下载模式 1-按名字 2-按时间 */ union { BYTE byFile[100]; /* 回放的文件名 */ struct { DWORD dwChannel; BYTE sUserName[NAME_LEN]; /*请求视频用户名*/ BYTE sPassword[PASSWD_LEN]; /* 密码 */ NET_DVR_TIME struStartTime; /* 按时间回放的开始时间 */ NET_DVR_TIME struStopTime; /* 按时间回放的结束时间 */ }bytime; }mode_size; }NET_DVR_PLAYREMOTEFILE, *LPNET_DVR_PLAYREMOTEFILE; ======================================================== //简化的规则信息, 包含规则的基本信息 [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_VCA_RULE_INFO { public byte byRuleID;//规则ID,0-7 public byte byRes;//保留 public ushort wEventTypeEx; //行为事件类型扩展,用于代替字段dwEventType,参考VCA_RULE_EVENT_TYPE_EX [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)] public byte[] byRuleName;//规则名称 public VCA_EVENT_TYPE dwEventType;//警戒事件类型 public NET_VCA_EVENT_UNION uEventParam;//事件参数 } //简化的规则信息, 包含规则的基本信息 typedef struct tagNET_VCA_RULE_INFO { BYTE byRuleID; //规则ID,0-7 BYTE byRes; //保留 WORD wEventTypeEx; //行为事件类型扩展,用于代替字段dwEventType,参考VCA_RULE_EVENT_TYPE_EX BYTE byRuleName[NAME_LEN]; //规则名称 VCA_EVENT_TYPE dwEventType; //行为事件类型,保留是为了兼容,后续建议使wEventTypeEx获取事件类型 NET_VCA_EVENT_UNION uEventParam;//事件参数 }NET_VCA_RULE_INFO, *LPNET_VCA_RULE_INFO; ======================================================== //行为分析事件类型 public enum VCA_EVENT_TYPE : uint { VCA_TRAVERSE_PLANE = 0x1, //穿越警戒面 VCA_ENTER_AREA = 0x2, //目标进入区域,支持区域规则 VCA_EXIT_AREA = 0x4, //目标离开区域,支持区域规则 VCA_INTRUSION = 0x8, //周界入侵,支持区域规则 VCA_LOITER = 0x10, //徘徊,支持区域规则 VCA_LEFT_TAKE = 0x20, //物品遗留拿取,支持区域规则 VCA_PARKING = 0x40, //停车,支持区域规则 VCA_RUN = 0x80, //快速移动,支持区域规则 VCA_HIGH_DENSITY = 0x100, //区域内人员聚集,支持区域规则 VCA_VIOLENT_MOTION = 0x200, //剧烈运动检测 VCA_REACH_HIGHT = 0x400, //攀高检测 VCA_GET_UP = 0x800, //起身检测 VCA_LEFT = 0x1000, //物品遗留 VCA_TAKE = 0x2000, //物品拿取 VCA_LEAVE_POSITION = 0x4000, //离岗 VCA_TRAIL = 0x8000, //尾随 VCA_KEY_PERSON_GET_UP = 0x10000, //重点人员起身检测 VCA_FALL_DOWN = 0x80000, //倒地检测 VCA_AUDIO_ABNORMAL = 0x100000, //声强突变检测 VCA_ADV_REACH_HEIGHT = 0x200000, //折线攀高 VCA_TOILET_TARRY = 0x400000, //如厕超时 VCA_YARD_TARRY = 0x800000, //放风场滞留 VCA_ADV_TRAVERSE_PLANE = 0x1000000, //折线警戒面 VCA_HUMAN_ENTER = 0x10000000, //人靠近ATM 只在ATM_PANEL模式下支持 VCA_OVER_TIME = 0x20000000, //操作超时 只在ATM_PANEL模式下支持 VCA_STICK_UP = 0x40000000, //贴纸条,支持区域规则 VCA_INSTALL_SCANNER = 0x80000000 //安装读卡器,支持区域规则 } //行为分析事件类型 typedef enum _VCA_EVENT_TYPE_ { VCA_TRAVERSE_PLANE = 0x1, //穿越警戒面 VCA_ENTER_AREA = 0x2, //目标进入区域,支持区域规则 VCA_EXIT_AREA = 0x4, //目标离开区域,支持区域规则 VCA_INTRUSION = 0x8, //周界入侵,支持区域规则 VCA_LOITER = 0x10, //徘徊,支持区域规则 VCA_LEFT_TAKE = 0x20, //物品遗留拿取,支持区域规则 VCA_PARKING = 0x40, //停车,支持区域规则 VCA_RUN = 0x80, //快速移动,支持区域规则 VCA_HIGH_DENSITY = 0x100, //区域内人员聚集,支持区域规则 VCA_VIOLENT_MOTION = 0x200, //剧烈运动检测 VCA_REACH_HIGHT = 0x400, //攀高检测 VCA_GET_UP = 0x800, //起身检测 VCA_LEFT = 0x1000, //物品遗留 VCA_TAKE = 0x2000, //物品拿取 VCA_LEAVE_POSITION = 0x4000, //离岗 VCA_TRAIL = 0x8000, //尾随 VCA_KEY_PERSON_GET_UP = 0x10000, //重点人员起身检测 VCA_STANDUP = 0x20000, //起立 VCA_FALL_DOWN = 0x80000, //倒地检测 VCA_AUDIO_ABNORMAL = 0x100000, //声强突变检测 VCA_ADV_REACH_HEIGHT = 0x200000, //折线攀高 VCA_TOILET_TARRY = 0x400000, //如厕超时 VCA_YARD_TARRY = 0x800000, //放风场滞留 VCA_ADV_TRAVERSE_PLANE = 0x1000000, //折线警戒面 VCA_LECTURE = 0x2000000, //授课 VCA_ANSWER = 0x4000000, //回答问题 VCA_HUMAN_ENTER = 0x10000000, //人靠近ATM 只在ATM_PANEL模式下支持 VCA_OVER_TIME = 0x20000000, //操作超时 只在ATM_PANEL模式下支持 VCA_STICK_UP = 0x40000000, //贴纸条,支持区域规则 VCA_INSTALL_SCANNER = 0x80000000 //安装读卡器,支持区域规则 }VCA_EVENT_TYPE; ======================================================== ======================================================== ======================================================== ======================================================== ======================================================== ======================================================== //NET_DVR_SetDVRMessage的扩展 #ifdef _WIN32 NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessage(UINT nMessage,HWND hWnd); NET_DVR_API BOOL __stdcall NET_DVR_SetExceptionCallBack_V30(UINT nMessage, HWND hWnd, void (CALLBACK* fExceptionCallBack)(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser), void *pUser); #elif defined(__linux__) || defined(__APPLE__) NET_DVR_API BOOL __stdcall NET_DVR_SetExceptionCallBack_V30(UINT reserved1, void* reserved2, void (CALLBACK* fExceptionCallBack)(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser), void *pUser); /*Linux专有 */ #if defined(__linux__) NET_DVR_API BOOL NET_DVR_DrawAreaInit(INITINFO InitInfo, DWORD iUseSDL = 1); NET_DVR_API BOOL NET_DVR_DrawAreaRelease(); #endif #endif [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRMessage(uint nMessage, IntPtr hWnd); /********************************************************* Function: EXCEPYIONCALLBACK Desc: (回调函数) Input: Output: Return: **********************************************************/ public delegate void EXCEPYIONCALLBACK(uint dwType, int lUserID, int lHandle, IntPtr pUser); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetExceptionCallBack_V30(uint nMessage, IntPtr hWnd, EXCEPYIONCALLBACK fExceptionCallBack, IntPtr pUser); ======================================================== public delegate void MSGCallBack(int lCommand, ref NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, IntPtr pUser); ======================================================== NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessCallBack(BOOL (CALLBACK *fMessCallBack)(LONG lCommand,char *sDVRIP,char *pBuf,DWORD dwBufLen)); NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessCallBack_EX(BOOL (CALLBACK *fMessCallBack_EX)(LONG lCommand,LONG lUserID,char *pBuf,DWORD dwBufLen)); NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessCallBack_NEW(BOOL (CALLBACK *fMessCallBack_NEW)(LONG lCommand,char *sDVRIP,char *pBuf,DWORD dwBufLen, WORD dwLinkDVRPort)); NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack(BOOL (CALLBACK *fMessageCallBack)(LONG lCommand,char *sDVRIP,char *pBuf,DWORD dwBufLen, DWORD dwUser), DWORD dwUser); typedef void (CALLBACK *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser); NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, void* pUser); typedef BOOL (CALLBACK *MSGCallBack_V31)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser); NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V31(MSGCallBack_V31 fMessageCallBack, void* pUser); NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V50(int iIndex, MSGCallBack fMessageCallBack, void* pUser); public delegate int MESSCALLBACK(int lCommand, string sDVRIP, string pBuf, uint dwBufLen); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRMessCallBack(MESSCALLBACK fMessCallBack); public delegate int MESSCALLBACKEX(int iCommand, int iUserID, string pBuf, uint dwBufLen); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRMessCallBack_EX(MESSCALLBACKEX fMessCallBack_EX); public delegate int MESSCALLBACKNEW(int lCommand, string sDVRIP, string pBuf, uint dwBufLen, ushort dwLinkDVRPort); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRMessCallBack_NEW(MESSCALLBACKNEW fMessCallBack_NEW); public delegate int MESSAGECALLBACK(int lCommand, System.IntPtr sDVRIP, System.IntPtr pBuf, uint dwBufLen, uint dwUser); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRMessageCallBack(MESSAGECALLBACK fMessageCallBack, uint dwUser); public delegate void MSGCallBack(int lCommand, ref NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, IntPtr pUser); ======================================================== NET_DVR_API LONG __stdcall NET_DVR_Login_V30(char *sDVRIP, WORD wDVRPort, char *sUserName, char *sPassword, LPNET_DVR_DEVICEINFO_V30 lpDeviceInfo); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern Int32 NET_DVR_Login_V30(string sDVRIP, Int32 wDVRPort, string sUserName, string sPassword, ref NET_DVR_DEVICEINFO_V30 lpDeviceInfo); //NET_DVR_Login_V30()参数结构 [StructLayoutAttribute(LayoutKind.Sequential)] public struct NET_DVR_DEVICEINFO_V30 { [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = SERIALNO_LEN, ArraySubType = UnmanagedType.I1)] public byte[] sSerialNumber; //序列号 public byte byAlarmInPortNum; //报警输入个数 public byte byAlarmOutPortNum; //报警输出个数 public byte byDiskNum; //硬盘个数 public byte byDVRType; //设备类型, 1:DVR 2:ATM DVR 3:DVS ...... public byte byChanNum; //模拟通道个数 public byte byStartChan; //起始通道号,例如DVS-1,DVR - 1 public byte byAudioChanNum; //语音通道数 public byte byIPChanNum; //最大数字通道个数,低位 public byte byZeroChanNum; //零通道编码个数 //2010-01-16 public byte byMainProto; //主码流传输协议类型 0-private, 1-rtsp,2-同时支持private和rtsp public byte bySubProto; //子码流传输协议类型0-private, 1-rtsp,2-同时支持private和rtsp public byte bySupport; //能力,位与结果为0表示不支持,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 bySupport1; // 能力集扩充,位与结果为0表示不支持,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 bySupport2; /*能力,位与结果为0表示不支持,非0表示支持 bySupport2 & 0x1, 表示解码器是否支持通过URL取流解码 bySupport2 & 0x2, 表示支持FTPV40 bySupport2 & 0x4, 表示支持ANR bySupport2 & 0x8, 表示支持CCD的通道参数配置 bySupport2 & 0x10, 表示支持布防报警回传信息(仅支持抓拍机报警 新老报警结构) bySupport2 & 0x20, 表示是否支持单独获取设备状态子项 bySupport2 & 0x40, 表示是否是码流加密设备*/ public ushort wDevType; //设备型号 public byte bySupport3; //能力集扩展,位与结果为0表示不支持,1表示支持 //bySupport3 & 0x1, 表示是否多码流 // bySupport3 & 0x4 表示支持按组配置, 具体包含 通道图像参数、报警输入参数、IP报警输入、输出接入参数、 // 用户参数、设备工作状态、JPEG抓图、定时和时间抓图、硬盘盘组管理 //bySupport3 & 0x8为1 表示支持使用TCP预览、UDP预览、多播预览中的"延时预览"字段来请求延时预览(后续都将使用这种方式请求延时预览)。而当bySupport3 & 0x8为0时,将使用 "私有延时预览"协议。 //bySupport3 & 0x10 表示支持"获取报警主机主要状态(V40)"。 //bySupport3 & 0x20 表示是否支持通过DDNS域名解析取流 public byte byMultiStreamProto;//是否支持多码流,按位表示,0-不支持,1-支持,bit1-码流3,bit2-码流4,bit7-主码流,bit-8子码流 public byte byStartDChan; //起始数字通道号,0表示无效 public byte byStartDTalkChan; //起始数字对讲通道号,区别于模拟对讲通道号,0表示无效 public byte byHighDChanNum; //数字通道个数,高位 public byte bySupport4; public byte byLanguageType;// 支持语种能力,按位表示,每一位0-不支持,1-支持 // byLanguageType 等于0 表示 老设备 // byLanguageType & 0x1表示支持中文 // byLanguageType & 0x2表示支持英文 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 9, ArraySubType = UnmanagedType.I1)] public byte[] byRes2; //保留 } ======================================================== NET_DVR_API BOOL __stdcall NET_DVR_SetRealDataCallBack(LONG lRealHandle,void(CALLBACK *fRealDataCallBack) (LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,DWORD dwUser),DWORD dwUser); public delegate void SETREALDATACALLBACK(int lRealHandle, uint dwDataType, IntPtr pBuffer, uint dwBufSize, uint dwUser); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_SetRealDataCallBack(int lRealHandle, SETREALDATACALLBACK fRealDataCallBack, uint dwUser); ======================================================== #ifndef __HDC_defined #define __HDC_defined #if defined(__linux__) typedef struct __DC { void* surface; //SDL Surface HWND hWnd; //HDC window handle }DC; typedef DC* HDC; #else typedef void* HDC; #endif #endif NET_DVR_API BOOL __stdcall NET_DVR_RigisterDrawFun(LONG lRealHandle,void (CALLBACK* fDrawFun)(LONG lRealHandle,HDC hDc,DWORD dwUser),DWORD dwUser); public delegate void DRAWFUN(int lRealHandle, IntPtr hDc, uint dwUser); [DllImport(@"..\bin\HCNetSDK.dll")] public static extern bool NET_DVR_RigisterDrawFun(int lRealHandle, DRAWFUN fDrawFun, uint dwUser); //注册画图回调 m_fMotionDraw = new CHCNetSDK.DRAWFUN(MotionDrawCallBack); CHCNetSDK.NET_DVR_RigisterDrawFun(m_lMotionPlayHandle, m_fMotionDraw, 0); public void MotionDrawCallBack(int lRealHandle, IntPtr hDc, uint dwUser) { Marshal.PtrToStructure(hDc,); } ======================================================== typedef void(CALLBACK *fRemoteConfigCallback)(DWORD dwType, void* lpBuffer, DWORD dwBufLen, void* pUserData); NET_DVR_API LONG __stdcall NET_DVR_StartRemoteConfig(LONG lUserID, DWORD dwCommand, LPVOID lpInBuffer, DWORD dwInBufferLen, fRemoteConfigCallback cbStateCallback, LPVOID pUserData); NET_DVR_API BOOL __stdcall NET_DVR_StopRemoteConfig(LONG lHandle); NET_DVR_API LONG __stdcall NET_DVR_GetNextRemoteConfig(LONG lHandle, void* lpOutBuff, DWORD dwOutBuffSize); NET_DVR_API BOOL __stdcall NET_DVR_GetRemoteConfigState(LONG lHandle, void *pState); NET_DVR_API BOOL __stdcall NET_DVR_SendRemoteConfig(LONG lHandle, DWORD dwDataType, char *pSendBuf, DWORD dwBufSize); #region RemoteConfig [StructLayoutAttribute(LayoutKind.Sequential)] public struct tagNET_DVR_PDC_QUERY_COND { public uint dwSize; public uint dwChannel; //通道号 public NET_DVR_TIME_EX struStartTime; //开始时间 public NET_DVR_TIME_EX struEndTime; //结束时间 public byte byReportType; //0-无效值,1-日报表,2-周报表,3-月报表,4-年报表 public byte byEnableProgramStatistics; //是否按节目统计,0-否,1-是 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2, ArraySubType = UnmanagedType.I1)] public byte[] byRes1; public uint dwPlayScheduleNo; //按节目统计时关联的日程号 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 120, ArraySubType = UnmanagedType.I1)] public byte[] byRes; } [StructLayoutAttribute(LayoutKind.Sequential)] public struct tagNET_DVR_PROGRAM_INFO { public uint dwProgramNo; //节目编号 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 32, ArraySubType = UnmanagedType.I1)] public byte[] sProgramName; [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = UnmanagedType.I1)] public byte[] byRes; } [StructLayoutAttribute(LayoutKind.Sequential)] public struct tagNET_DVR_PDC_RESULT { public uint dwSize; public NET_DVR_TIME_EX struStartTime;/*开始时间*/ public NET_DVR_TIME_EX struEndTime;/*结束时间*/ public uint dwEnterNum; //进入人数 public uint dwLeaveNum; //离开人数 public tagNET_DVR_PROGRAM_INFO struProgramInfo; //节目信息 public uint dwPeoplePassing; //经过人数 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 200, ArraySubType = UnmanagedType.I1)] public byte[] byRes; //保留字节 } public const int NET_DVR_GET_PDC_RESULT = 5089; public delegate void RemoteConfigCallback(uint dwType, IntPtr lpBuffer, uint dwBufLen, IntPtr pUserData); [DllImport(@"..\bin\HCNetSDK.dll")] // (LONG lUserID, DWORD dwCommand, LPVOID lpInBuffer, DWORD dwInBufferLen, fRemoteConfigCallback cbStateCallback, LPVOID pUserData); public static extern int NET_DVR_StartRemoteConfig(Int32 lUserID, uint dwCommand, IntPtr lpInBuffer, uint dwInBufferLen, RemoteConfigCallback cbStateCallback, IntPtr pUserData); [DllImport(@"..\bin\HCNetSDK.dll")] // (LONG lHandle); public static extern bool NET_DVR_StopRemoteConfig(Int32 lHandle); [DllImport(@"..\bin\HCNetSDK.dll")] // (LONG lHandle, void* lpOutBuff, DWORD dwOutBuffSize); public static extern int NET_DVR_GetNextRemoteConfig(Int32 lHandle, IntPtr lpOutBuff, uint dwOutBuffSize); [DllImport(@"..\bin\HCNetSDK.dll")] // (LONG lHandle, void* pState); public static extern bool NET_DVR_GetRemoteConfigState(Int32 lUserID, IntPtr pState); [DllImport(@"..\bin\HCNetSDK.dll")] // (LONG lHandle, DWORD dwDataType, char* pSendBuf, DWORD dwBufSize); public static extern bool NET_DVR_SendRemoteConfig(Int32 lUserID, uint dwDataType, byte[] pSendBuf, uint dwBufSize); /* typedef void (CALLBACK* fRemoteConfigCallback) (DWORD dwType, void* lpBuffer, DWORD dwBufLen, void* pUserData); NET_DVR_API LONG __stdcall NET_DVR_StartRemoteConfig(LONG lUserID, DWORD dwCommand, LPVOID lpInBuffer, DWORD dwInBufferLen, fRemoteConfigCallback cbStateCallback, LPVOID pUserData); NET_DVR_API BOOL __stdcall NET_DVR_StopRemoteConfig(LONG lHandle); NET_DVR_API LONG __stdcall NET_DVR_GetNextRemoteConfig(LONG lHandle, void* lpOutBuff, DWORD dwOutBuffSize); NET_DVR_API BOOL __stdcall NET_DVR_GetRemoteConfigState(LONG lHandle, void* pState); NET_DVR_API BOOL __stdcall NET_DVR_SendRemoteConfig(LONG lHandle, DWORD dwDataType, char* pSendBuf, DWORD dwBufSize); */ #endregion private void button1_Click(object sender, EventArgs e) { int m_struQueryCond_Len = Marshal.SizeOf(m_struQueryCond); m_struQueryCond = new CHCNetSDK.tagNET_DVR_PDC_QUERY_COND(); m_struQueryCond.struStartTime.wYear = m_struQueryCond.struEndTime.wYear = (ushort)2017; m_struQueryCond.struStartTime.byMonth = m_struQueryCond.struEndTime.byMonth = (byte)9; m_struQueryCond.struStartTime.byDay = m_struQueryCond.struEndTime.byDay = (byte)4; m_struQueryCond.struStartTime.byHour = m_struQueryCond.struEndTime.byHour = (byte)17; m_struQueryCond.struStartTime.byMinute = m_struQueryCond.struEndTime.byMinute = (byte)33; m_struQueryCond.struStartTime.bySecond = m_struQueryCond.struEndTime.bySecond = (byte)0; m_struQueryCond.dwSize = (uint)m_struQueryCond_Len; m_struQueryCond.dwChannel = (uint)m_lChannel; m_struQueryCond.byReportType = 0x2; m_struQueryCond.byEnableProgramStatistics = 0x0; m_struQueryCond.dwPlayScheduleNo = 0x0; IntPtr ptrQueryCond = Marshal.AllocHGlobal(m_struQueryCond_Len); Marshal.StructureToPtr(m_struQueryCond, ptrQueryCond, false); int handleDVR = CHCNetSDK.NET_DVR_StartRemoteConfig(m_lUserID, CHCNetSDK.NET_DVR_GET_PDC_RESULT, ptrQueryCond, (UInt32)m_struQueryCond_Len, null, IntPtr.Zero); iLastErr = CHCNetSDK.NET_DVR_GetLastError(); System.Threading.Thread.Sleep(100); m_lChannel = 0; StringBuilder retInfo = new StringBuilder(); int week = (int)DateTime.Now.DayOfWeek; week = week == 0 ? 7 : week; for (int i= 0;i < 7;i++) { m_struQueryCond.dwChannel = (uint)(m_lChannel++); m_struQueryResult = new CHCNetSDK.tagNET_DVR_PDC_RESULT(); int m_struQueryResult_Len = Marshal.SizeOf(m_struQueryResult); IntPtr ptrQueryResult = Marshal.AllocHGlobal(m_struQueryResult_Len); Marshal.StructureToPtr(m_struQueryResult, ptrQueryResult, false); int iRetGetNextRemoteConfig = CHCNetSDK.NET_DVR_GetNextRemoteConfig(handleDVR, ptrQueryResult, (UInt32)m_struQueryResult_Len); iLastErr = CHCNetSDK.NET_DVR_GetLastError(); m_struQueryResult = (CHCNetSDK.tagNET_DVR_PDC_RESULT)Marshal.PtrToStructure(ptrQueryResult, typeof(CHCNetSDK.tagNET_DVR_PDC_RESULT)); string info = string.Format("In=[{0}],Out=[{1}] Ret={2}", m_struQueryResult.dwEnterNum, m_struQueryResult.dwLeaveNum, iRetGetNextRemoteConfig); retInfo.Append(info); retInfo.AppendLine(); } MessageBox.Show(retInfo.ToString()); } ======================================================== ======================================================== ======================================================== ======================================================== ======================================================== ======================================================== ======================================================== ======================================================== ======================================================== ======================================================== 赞 | 1 赏 标签:none