前言
从上篇文章(10月4日)到本篇文章截止到今天(10月22日)一直在做这个SDK翻译工作,耗时2周半,代码超过1万行,约有三分之二的行数是注释。由于工作忙也只能一天抽出那么半个小时一个小时来整理,所以对关注此系列文章的朋友说句:“抱歉,让大家久等了”。
临时决定本系列使用WPF来做例子(买了一本WPF没读 - - #,所以......),藉此学习下WPF,也进一步熟悉.Net Framework 3.5,落伍的“老兵”奋起追击下相对于“老兵”而言的新技术 :)
其实这篇文章在10月22日就写好了,但是想和视频预览文章一起发布,比较麻烦的是我这边朋友的DVR一直不稳定,一直拖延到今天还是不行,所以还是把本文先发了。因此寻求能提供DVR设备的厂家或者提供DVR远程访问地址的朋友,以支持此系列能顺利的完成,在这里先谢谢了!我的联系方式:13811821337、[email protected]
提醒
欢迎转载,但请保留
博客园(www.cnblogs.com)、
农民伯伯(over140.cnblogs.com)的出处,谢谢合作:)
系列
1.
C# 海康DVR客户端开发系列(1)——准备
2.
C# 海康DVR客户端开发系列(2)—— 封装API
更新
本文会随着后续实践文章有相应的改动,请及时更新!
2010-12-21 HCNetSDK2010-12-21.rar
主要更新了SerialDataCallBack委托的pRecvDataBuffer参数数据类型,由string改为byte[],这里感谢实践后指出,欢迎大家积极反馈!
2009-10-31
HCNetSDK2009-10-31.rar
主要更新了大部分结构体中byte[]初始大小指定,加上了[MarshalAs(UnmanagedType.ByValArray, SizeConst = HCNetSDK.SERIALNO_LEN)]类似的标记。
2009-10-24
HCNetSDK.cs
正文
一、代码截图
VS
二、 部分代码
由于代码过长(超过1W行),这里就不贴全部了,大家直接在更新下面下载最新的SDK即可。
///
设置码流速度
///
</summary>
public
const
int
NET_DVR_SETSPEED
=
24
;
///
<summary>
///
保持与设备的心跳(如果回调阻塞,建议2秒发送一次)
///
</summary>
public
const
int
NET_DVR_KEEPALIVE
=
25
;
//
远程按键定义如下:
/*
key value send to CONFIG program
*/
public
const
int
KEY_CODE_1
=
1
;
public
const
int
KEY_CODE_2
=
2
;
public
const
int
KEY_CODE_3
=
3
;
public
const
int
KEY_CODE_4
=
4
;
public
const
int
KEY_CODE_5
=
5
;
public
const
int
KEY_CODE_6
=
6
;
public
const
int
KEY_CODE_7
=
7
;
public
const
int
KEY_CODE_8
=
8
;
public
const
int
KEY_CODE_9
=
9
;
public
const
int
KEY_CODE_0
=
10
;
public
const
int
KEY_CODE_POWER
=
11
;
public
const
int
KEY_CODE_MENU
=
12
;
public
const
int
KEY_CODE_ENTER
=
13
;
public
const
int
KEY_CODE_CANCEL
=
14
;
public
const
int
KEY_CODE_UP
=
15
;
public
const
int
KEY_CODE_DOWN
=
16
;
public
const
int
KEY_CODE_LEFT
=
17
;
public
const
int
KEY_CODE_RIGHT
=
18
;
public
const
int
KEY_CODE_EDIT
=
19
;
public
const
int
KEY_CODE_ADD
=
20
;
public
const
int
KEY_CODE_MINUS
=
21
;
public
const
int
KEY_CODE_PLAY
=
22
;
public
const
int
KEY_CODE_REC
=
23
;
public
const
int
KEY_CODE_PAN
=
24
;
public
const
int
KEY_CODE_M
=
25
;
public
const
int
KEY_CODE_A
=
26
;
public
const
int
KEY_CODE_F1
=
27
;
public
const
int
KEY_CODE_F2
=
28
;
/*
for PTZ control
*/
public
const
int
KEY_PTZ_UP_START
=
KEY_CODE_UP;
public
const
int
KEY_PTZ_UP_STOP
=
32
;
public
const
int
KEY_PTZ_DOWN_START
=
KEY_CODE_DOWN;
public
const
int
KEY_PTZ_DOWN_STOP
=
33
;
public
const
int
KEY_PTZ_LEFT_START
=
KEY_CODE_LEFT;
public
const
int
KEY_PTZ_LEFT_STOP
=
34
;
public
const
int
KEY_PTZ_RIGHT_START
=
KEY_CODE_RIGHT;
public
const
int
KEY_PTZ_RIGHT_STOP
=
35
;
///
<summary>
///
光圈+
///
</summary>
public
const
int
KEY_PTZ_AP1_START
=
KEY_CODE_EDIT;
/*
光圈+
*/
public
const
int
KEY_PTZ_AP1_STOP
=
36
;
///
<summary>
///
光圈-
///
</summary>
public
const
int
KEY_PTZ_AP2_START
=
KEY_CODE_PAN;
/*
光圈-
*/
public
const
int
KEY_PTZ_AP2_STOP
=
37
;
///
<summary>
///
聚焦+
///
</summary>
public
const
int
KEY_PTZ_FOCUS1_START
=
KEY_CODE_A;
/*
聚焦+
*/
public
const
int
KEY_PTZ_FOCUS1_STOP
=
38
;
///
<summary>
///
聚焦-
///
</summary>
public
const
int
KEY_PTZ_FOCUS2_START
=
KEY_CODE_M;
/*
聚焦-
*/
public
const
int
KEY_PTZ_FOCUS2_STOP
=
39
;
///
<summary>
///
变倍+
///
</summary>
public
const
int
KEY_PTZ_B1_START
=
40
;
/*
变倍+
*/
public
const
int
KEY_PTZ_B1_STOP
=
41
;
///
<summary>
///
变倍-
///
</summary>
public
const
int
KEY_PTZ_B2_START
=
42
;
/*
变倍-
*/
public
const
int
KEY_PTZ_B2_STOP
=
43
;
//
9000新增
public
const
int
KEY_CODE_11
=
44
;
public
const
int
KEY_CODE_12
=
45
;
public
const
int
KEY_CODE_13
=
46
;
public
const
int
KEY_CODE_14
=
47
;
public
const
int
KEY_CODE_15
=
48
;
public
const
int
KEY_CODE_16
=
49
;
///
<summary>
///
获取网络应用参数 EMAIL
///
</summary>
public
const
int
NET_DVR_GET_EMAILCFG
=
228
;
//
///
<summary>
///
设置网络应用参数 EMAIL
///
</summary>
public
const
int
NET_DVR_SET_EMAILCFG
=
229
;
//
//
对应NET_DVR_EMAILCFG结构
//
public
const
int
NET_DVR_GET_ALLHDCFG
=
300
;
//
#region
DS9000新增命令(_V30)
//
设备编码类型配置(NET_DVR_COMPRESSION_AUDIO结构)
///
<summary>
///
获取设备语音对讲编码参数
///
</summary>
public
const
int
NET_DVR_GET_COMPRESSCFG_AUD
=
1058
;
//
///
<summary>
///
设置设备语音对讲编码参数
///
</summary>
public
const
int
NET_DVR_SET_COMPRESSCFG_AUD
=
1059
;
//
#endregion
///
<summary>
///
预览异常
///
</summary>
public
const
int
NET_DVR_REALPLAYEXCEPTION
=
111
;
//
///
<summary>
///
预览时连接断开
///
</summary>
public
const
int
NET_DVR_REALPLAYNETCLOSE
=
112
;
//
///
<summary>
///
预览5s没有收到数据
///
</summary>
public
const
int
NET_DVR_REALPLAY5SNODATA
=
113
;
//
///
<summary>
///
预览重连
///
</summary>
public
const
int
NET_DVR_REALPLAYRECONNECT
=
114
;
//
///
<summary>
///
回放数据播放完毕
///
</summary>
public
const
int
NET_DVR_PLAYBACKOVER
=
101
;
//
///
<summary>
///
回放异常
///
</summary>
public
const
int
NET_DVR_PLAYBACKEXCEPTION
=
102
;
//
///
<summary>
///
回放时候连接断开
///
</summary>
public
const
int
NET_DVR_PLAYBACKNETCLOSE
=
103
;
//
///
<summary>
///
回放5s没有收到数据
///
</summary>
public
const
int
NET_DVR_PLAYBACK5SNODATA
=
104
;
#region
DS-6001D/F
///
<summary>
///
DS-6001D Decoder
///
NET_DVR_DECODERINFO, *LPNET_DVR_DECODERINFO;
///
</summary>
public
struct
NET_DVR_DECODERINFO
{
///
<summary>
///
解码设备连接的服务器IP
///
public byte byEncoderIP[16];
///
</summary>
public
byte
[] byEncoderIP;
///
<summary>
///
解码设备连接的服务器的用户名
///
public byte byEncoderUser[16];
///
</summary>
public
byte
[] byEncoderUser;
///
<summary>
///
解码设备连接的服务器的密码
///
public byte byEncoderPasswd[16];
///
</summary>
public
byte
[] byEncoderPasswd;
///
<summary>
///
解码设备连接服务器的连接模式
///
</summary>
public
byte
bySendMode;
///
<summary>
///
解码设备连接的服务器的通道号
///
</summary>
public
byte
byEncoderChannel;
///
<summary>
///
解码设备连接的服务器的端口号
///
</summary>
public
ushort
wEncoderPort;
///
<summary>
///
保留
///
public byte reservedData[4];
///
</summary>
public
byte
[] reservedData;
}
///
<summary>
///
NET_DVR_DECODERSTATE, *LPNET_DVR_DECODERSTATE;
///
</summary>
public
struct
NET_DVR_DECODERSTATE
{
///
<summary>
///
解码设备连接的服务器IP
///
public byte byEncoderIP[16];
///
</summary>
public
byte
[] byEncoderIP;
///
<summary>
///
解码设备连接的服务器的用户名
///
public byte byEncoderUser[16];
///
</summary>
public
byte
[] byEncoderUser;
///
<summary>
///
解码设备连接的服务器的密码
///
public byte byEncoderPasswd[16];
///
</summary>
public
byte
[] byEncoderPasswd;
///
<summary>
///
解码设备连接的服务器的通道号
///
</summary>
public
byte
byEncoderChannel;
///
<summary>
///
解码设备连接的服务器的连接模式
///
</summary>
public
byte
bySendMode;
///
<summary>
///
解码设备连接的服务器的端口号
///
</summary>
public
ushort
wEncoderPort;
///
<summary>
///
解码设备连接服务器的状态
///
</summary>
public
uint
dwConnectState;
///
<summary>
///
保留
///
public byte reservedData[4];
///
</summary>
public
byte
[] reservedData;
}
#region
解码设备控制码定义
public
const
int
NET_DEC_STARTDEC
=
1
;
public
const
int
NET_DEC_STOPDEC
=
2
;
public
const
int
NET_DEC_STOPCYCLE
=
3
;
public
const
int
NET_DEC_CONTINUECYCLE
=
4
;
#endregion
#endregion
///
<summary>
///
Email
///
NET_DVR_EMAILPARA, *LPNET_DVR_EMAILPARA;
///
</summary>
public
struct
NET_DVR_EMAILPARA
{
///
<summary>
///
邮件账号
///
public byte sUsername[64];
///
</summary>
public
string
sUsername;
///
<summary>
///
邮件密码
///
public byte sPassword[64];
///
</summary>
public
string
sPassword;
///
<summary>
///
public byte sSmtpServer[64];
///
</summary>
public
string
sSmtpServer;
///
<summary>
///
public byte sPop3Server[64];
///
</summary>
public
string
sPop3Server;
///
<summary>
///
邮件地址
///
public byte sMailAddr[64];
///
</summary>
public
string
sMailAddr;
///
<summary>
///
上传报警/异常等的email
///
public byte sEventMailAddr1[64];
///
</summary>
public
byte
[] sEventMailAddr1;
///
<summary>
///
public byte sEventMailAddr2[64];
///
</summary>
public
byte
[] sEventMailAddr2;
///
<summary>
///
public byte res[16];
///
</summary>
public
byte
[] res;
}
///
<summary>
///
NET_DVR_NETCFG_OTHER, *LPNET_DVR_NETCFG_OTHER;
///
</summary>
public
struct
NET_DVR_NETCFG_OTHER
{
public
uint
dwSize;
///
<summary>
///
char sFirstDNSIP[16];
///
</summary>
public
string
sFirstDNSIP;
///
<summary>
///
char sSecondDNSIP[16];
///
</summary>
public
string
sSecondDNSIP;
///
<summary>
///
char sRes[32];
///
</summary>
public
string
sRes;
}
///
<summary>
///
连接的通道配置 2007-11-05
///
NET_DVR_MATRIX_DECCHANINFO, *LPNET_DVR_MATRIX_DECCHANINFO;
///
</summary>
public
struct
NET_DVR_MATRIX_DECCHANINFO
{
///
<summary>
///
是否启用 0-否 1-启用
///
</summary>
public
uint
dwEnable;
///
<summary>
///
轮循解码通道信息
///
</summary>
public
NET_DVR_MATRIX_DECINFO struDecChanInfo;
}
///
<summary>
///
压缩参数?
///
NET_DVR_COMPRESSIONCFG_NEW, *LPNET_DVR_COMPRESSIONCFG_NEW;
///
</summary>
public
struct
NET_DVR_COMPRESSIONCFG_NEW
{
public
uint
dwSize;
///
<summary>
///
定时录像
///
</summary>
public
NET_DVR_COMPRESSION_INFO_EX struLowCompression;
///
<summary>
///
事件触发录像
///
</summary>
public
NET_DVR_COMPRESSION_INFO_EX struEventCompression;
}
///
<summary>
///
抓图模式
///
</summary>
public
enum
CAPTURE_MODE
{
///
<summary>
///
BMP模式
///
</summary>
BMP_MODE
=
0
,
//
///
<summary>
///
JPEG模式
///
</summary>
JPEG_MODE
=
1
//
}
///
<summary>
///
实时声音模式
///
</summary>
public
enum
REALSOUND_MODE
{
///
<summary>
///
独占模式
///
</summary>
MONOPOLIZE_MODE
=
1
,
///
<summary>
///
共享模式
///
</summary>
SHARE_MODE
=
2
}
///
<summary>
///
录象文件参数(带卡号)
///
NET_DVR_FINDDATA_CARD, *LPNET_DVR_FINDDATA_CARD;
///
</summary>
public
struct
NET_DVR_FINDDATA_CARD
{
///
<summary>
///
文件名
///
char sFileName[100];
///
</summary>
public
string
sFileName;
///
<summary>
///
文件的开始时间
///
</summary>
public
NET_DVR_TIME struStartTime;
///
<summary>
///
文件的结束时间
///
</summary>
public
NET_DVR_TIME struStopTime;
///
<summary>
///
文件的大小
///
</summary>
public
uint
dwFileSize;
///
<summary>
///
卡号?
///
char sCardNum[32];
///
</summary>
public
char
sCardNum;
}
///
<summary>
///
设置重新连接间隔
///
NET_DVR_API BOOL __stdcall NET_DVR_SetReconnect(DWORD dwInterval = 30000, BOOL bEnableRecon = TRUE);
///
</summary>
///
<param name="dwInterval"></param>
///
<param name="bEnableRecon"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_SetReconnect(
uint
dwInterval,
bool
bEnableRecon);
///
<summary>
///
通过IPSever获取设备动态IP地址[Ex]
///
NET_DVR_API BOOL __stdcall NET_DVR_GetDVRIPByResolveSvr_EX(char *sServerIP, WORD wServerPort, unsigned char *sDVRName, WORD wDVRNameLen, BYTE *sDVRSerialNumber, WORD wDVRSerialLen, char* sGetIP, DWORD *dwPort);
///
</summary>
///
<param name="sServerIP"></param>
///
<param name="wServerPort"></param>
///
<param name="sDVRName"></param>
///
<param name="wDVRNameLen"></param>
///
<param name="sDVRSerialNumber"></param>
///
<param name="wDVRSerialLen"></param>
///
<param name="sGetIP"></param>
///
<param name="dwPort"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_GetDVRIPByResolveSvr_EX(
string
sServerIP,
ushort
wServerPort,
string
sDVRName,
ushort
wDVRNameLen,
string
sDVRSerialNumber,
ushort
wDVRSerialLen, StringBuilder sGetIP,
ref
uint
dwPort);
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_PTZControlWithSpeed_EX(LONG lRealHandle, DWORD dwPTZCommand, DWORD dwStop, DWORD dwSpeed);
///
</summary>
///
<param name="lRealHandle"></param>
///
<param name="dwPTZCommand"></param>
///
<param name="dwStop"></param>
///
<param name="dwSpeed"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_PTZControlWithSpeed_EX(
int
lRealHandle,
uint
dwPTZCommand,
uint
dwStop,
uint
dwSpeed);
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_PTZMltTrack(LONG lRealHandle,DWORD dwPTZTrackCmd, DWORD dwTrackIndex);
///
</summary>
///
<param name="lRealHandle"></param>
///
<param name="dwPTZTrackCmd"></param>
///
<param name="dwTrackIndex"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_PTZMltTrack(
int
lRealHandle,
uint
dwPTZTrackCmd,
uint
dwTrackIndex);
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_PTZMltTrack_Other(LONG lUserID,LONG lChannel,DWORD dwPTZTrackCmd, DWORD dwTrackIndex);
///
</summary>
///
<param name="lUserID"></param>
///
<param name="lChannel"></param>
///
<param name="dwPTZTrackCmd"></param>
///
<param name="dwTrackIndex"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_PTZMltTrack_Other(
int
lUserID,
int
lChannel,
uint
dwPTZTrackCmd,
uint
dwTrackIndex);
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_PTZMltTrack_EX(LONG lRealHandle,DWORD dwPTZTrackCmd, DWORD dwTrackIndex);
///
</summary>
///
<param name="lRealHandle"></param>
///
<param name="dwPTZTrackCmd"></param>
///
<param name="dwTrackIndex"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_PTZMltTrack_EX(
int
lRealHandle,
uint
dwPTZTrackCmd,
uint
dwTrackIndex);
///
<summary>
///
NET_DVR_API LONG __stdcall NET_DVR_FindNextFile_Card(LONG lFindHandle, LPNET_DVR_FINDDATA_CARD lpFindData);
///
</summary>
///
<param name="lFindHandle"></param>
///
<param name="lpFindData"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
int
NET_DVR_FindNextFile_Card(
int
lFindHandle, NET_DVR_FINDDATA_CARD lpFindData);
///
<summary>
///
NET_DVR_API LONG __stdcall NET_DVR_FindFile_Card(LONG lUserID, LONG lChannel, DWORD dwFileType, LPNET_DVR_TIME lpStartTime, LPNET_DVR_TIME lpStopTime);
///
</summary>
///
<param name="lUserID"></param>
///
<param name="lChannel"></param>
///
<param name="dwFileType"></param>
///
<param name="lpStartTime"></param>
///
<param name="lpStopTime"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
int
NET_DVR_FindFile_Card(
int
lUserID,
int
lChannel,
uint
dwFileType, NET_DVR_TIME lpStartTime, NET_DVR_TIME lpStopTime);
///
<summary>
///
NET_DVR_API int __stdcall NET_DVR_GetPlayBackPos(LONG lPlayHandle);
///
</summary>
///
<param name="lPlayHandle"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
int
NET_DVR_GetPlayBackPos(
int
lPlayHandle);
//
解码设备DS-6001D/DS-6001F
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_StartDecode(LONG lUserID, LONG lChannel, LPNET_DVR_DECODERINFO lpDecoderinfo);
///
</summary>
///
<param name="lUserID"></param>
///
<param name="lChannel"></param>
///
<param name="lpDecoderinfo"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_StartDecode(
int
lUserID,
int
lChannel, NET_DVR_DECODERINFO lpDecoderinfo);
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_StopDecode(LONG lUserID, LONG lChannel);
///
</summary>
///
<param name="lUserID"></param>
///
<param name="lChannel"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_StopDecode(
int
lUserID,
int
lChannel);
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_GetDecoderState(LONG lUserID, LONG lChannel, LPNET_DVR_DECODERSTATE lpDecoderState);
///
</summary>
///
<param name="lUserID"></param>
///
<param name="lChannel"></param>
///
<param name="lpDecoderState"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_GetDecoderState(
int
lUserID,
int
lChannel, NET_DVR_DECODERSTATE lpDecoderState);
///
<summary>
///
保存参数
///
NET_DVR_API BOOL __stdcall NET_DVR_SaveConfig(LONG lUserID);
///
</summary>
///
<param name="lUserID"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_SaveConfig(
int
lUserID);
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_SetVideoEffect(LONG lUserID, LONG lChannel, DWORD dwBrightValue, DWORD dwContrastValue, DWORD dwSaturationValue, DWORD dwHueValue);
///
</summary>
///
<param name="lUserID"></param>
///
<param name="lChannel"></param>
///
<param name="dwBrightValue"></param>
///
<param name="dwContrastValue"></param>
///
<param name="dwSaturationValue"></param>
///
<param name="dwHueValue"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_SetVideoEffect(
int
lUserID,
int
lChannel,
uint
dwBrightValue,
uint
dwContrastValue,
uint
dwSaturationValue,
uint
dwHueValue);
///
<summary>
///
NET_DVR_API BOOL __stdcall NET_DVR_GetVideoEffect(LONG lUserID, LONG lChannel, DWORD *pBrightValue, DWORD *pContrastValue, DWORD *pSaturationValue, DWORD *pHueValue);
///
</summary>
///
<param name="lUserID"></param>
///
<param name="lChannel"></param>
///
<param name="pBrightValue"></param>
///
<param name="pContrastValue"></param>
///
<param name="pSaturationValue"></param>
///
<param name="pHueValue"></param>
///
<returns></returns>
[DllImport(
"
HCNetSDK.dll
"
)]
public
static
extern
bool
NET_DVR_GetVideoEffect(
int
lUserID,
int
lChannel,
out
uint
pBrightValue,
out
uint
pContrastValue,
out
uint
pSaturationValue,
out
uint
pHueValue);
三、下章预告
实现最基本的连接服务器并预览图像的功能。
结束语
首先我必须强调本章的翻译是一个体力活!本章可能会再随后的文章不断的更新,主要是数据类型对应可能有问题,这里也是凭经验来进行对应了,也欢迎有朋友尽早的向我提交勘误,我好及时的更新文章。