有没高手用海康视频的视频服务器做视频监控的?我用的是 HCNetSDK.dll ,因为他的动态链接库是用C++开发的,要在C#使用,要先进行转换!
在透明通道部分说如果要把232串口作为透明通道使用,必须先在232串口的配置信息中将工作模式选择为透明通道
SDK设置的原函数是:BOOL NET_DVR_SetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel,
LPVOID lpInBuffer,DWORD dwInBufferSize)
设置硬盘录像机的参数
参数说明
lUserID:NET_DVR_Login ()的返回值
dwCommand:参数类型 (dwCommand=103的时候,是设置RS232串口)
lChannel:通道号,如果不是通道参数,lChannel 不用,置为0即可
lpInBuffer:存放输入参数的缓冲区(设置RS232参数的结构)
dwInBufferSize:缓冲区的大小
返回值:TRUE 表示成功,FALSE 表示失败。 我是按下面的方式把它转为C#的 [DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_SetDVRConfig(int IUserID, uint dwCommand, int IChannel,System.UInt32 lpInBuffer, uint dwInBufferSize);问题是第三个参数,lpInBuffer应该指的是对应的设置232串口对应结构的指针!!但C#里不知道怎么取结构的地址?我的代码: //PPCFG(Rs232结构的一个参数)
HC.SDK.NET_DVR_PPPCFG PPPCFG = new HC.SDK.NET_DVR_PPPCFG();
PPPCFG .byDataEncrypt =(byte) 0;
PPPCFG.byPPPMode = (byte)1;
PPPCFG.byRedial = (byte)0;
PPPCFG.byRedialMode = (byte)0;
PPPCFG.dwMTU = (uint)0;
PPPCFG.sLocalIP = "192.168.1.250";
PPPCFG.sLocalIPMask = "0.0.0.0";
PPPCFG.sUsername = StringToByte (Program .MySetting .UserName );
PPPCFG.sPassword = StringToByte(Program.MySetting.PassWord);
PPPCFG.sRemoteIP = Program.MySetting.ServerIP;
PPPCFG.sTelephoneNumber = "12345678";
//设置Rs232的结构
HC.SDK.NET_DVR_RS232CFG Rs232 = new HC.SDK.NET_DVR_RS232CFG();
Rs232.byDataBit = (byte)3;
Rs232.byFlowcontrol = (byte)0;
Rs232.byParity = (byte)0;
Rs232.byStopBit = (byte)0;
Rs232.dwBaudRate = (uint)14;
Rs232.dwSize = (uint)24;
Rs232.dwWorkMode = (uint)2;
Rs232.struPPPConfig = PPPCFG;
HC.SDK.HCNetSDK.NET_DVR_SetDVRConfig(Login, 113, 0, Rs232, (uint)100);
问题是NET_DVR_SetDVRConfig(Login, 113, 0, Rs232, (uint)100)的第三和第四个参数分别如何设置发帖最多只能给100分,明天再追加100分!!
在透明通道部分说如果要把232串口作为透明通道使用,必须先在232串口的配置信息中将工作模式选择为透明通道
SDK设置的原函数是:BOOL NET_DVR_SetDVRConfig(LONG lUserID, DWORD dwCommand,LONG lChannel,
LPVOID lpInBuffer,DWORD dwInBufferSize)
设置硬盘录像机的参数
参数说明
lUserID:NET_DVR_Login ()的返回值
dwCommand:参数类型 (dwCommand=103的时候,是设置RS232串口)
lChannel:通道号,如果不是通道参数,lChannel 不用,置为0即可
lpInBuffer:存放输入参数的缓冲区(设置RS232参数的结构)
dwInBufferSize:缓冲区的大小
返回值:TRUE 表示成功,FALSE 表示失败。 我是按下面的方式把它转为C#的 [DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_SetDVRConfig(int IUserID, uint dwCommand, int IChannel,System.UInt32 lpInBuffer, uint dwInBufferSize);问题是第三个参数,lpInBuffer应该指的是对应的设置232串口对应结构的指针!!但C#里不知道怎么取结构的地址?我的代码: //PPCFG(Rs232结构的一个参数)
HC.SDK.NET_DVR_PPPCFG PPPCFG = new HC.SDK.NET_DVR_PPPCFG();
PPPCFG .byDataEncrypt =(byte) 0;
PPPCFG.byPPPMode = (byte)1;
PPPCFG.byRedial = (byte)0;
PPPCFG.byRedialMode = (byte)0;
PPPCFG.dwMTU = (uint)0;
PPPCFG.sLocalIP = "192.168.1.250";
PPPCFG.sLocalIPMask = "0.0.0.0";
PPPCFG.sUsername = StringToByte (Program .MySetting .UserName );
PPPCFG.sPassword = StringToByte(Program.MySetting.PassWord);
PPPCFG.sRemoteIP = Program.MySetting.ServerIP;
PPPCFG.sTelephoneNumber = "12345678";
//设置Rs232的结构
HC.SDK.NET_DVR_RS232CFG Rs232 = new HC.SDK.NET_DVR_RS232CFG();
Rs232.byDataBit = (byte)3;
Rs232.byFlowcontrol = (byte)0;
Rs232.byParity = (byte)0;
Rs232.byStopBit = (byte)0;
Rs232.dwBaudRate = (uint)14;
Rs232.dwSize = (uint)24;
Rs232.dwWorkMode = (uint)2;
Rs232.struPPPConfig = PPPCFG;
HC.SDK.HCNetSDK.NET_DVR_SetDVRConfig(Login, 113, 0, Rs232, (uint)100);
问题是NET_DVR_SetDVRConfig(Login, 113, 0, Rs232, (uint)100)的第三和第四个参数分别如何设置发帖最多只能给100分,明天再追加100分!!
解决方案 »
- SkinSoft.OSSkin.dll 有没有VS2010能用的。
- 这是什么原因???????
- 引用excel com 发布的问题
- DropDownList怎么条件显示xml
- 求教c#思路
- [**** winform 如何遍历 application 中已经分配内存资源的form (也就是被 new() 过的 )*****]
- 请问那位知道对Serv-U编程的接口函数,我想用自己的程序添加一个用户并指定该用户的目录。能完成添加用户,用Windows自带的FTP也行。
- 请问用C#开发的控件如何在VB6或VC6中使用?
- 如果判断一个值是否在某个范围之内?
- C#中TCP/IP协议的服务器和客户端,怎么获得客户端的真实IP??
- Graphics绘图
- 定制控件问题??
[DllImport("HCNetSDK.dll")] public static extern bool NET_DVR_SetDVRConfig(int IUserID, uint dwCommand, IntPtr IChannel, System.UInt32 lpInBuffer, uint dwInBufferSize);
GCHandle gch = GCHandle.Alloc(Rs232);
HC.SDK.HCNetSDK.NET_DVR_SetDVRConfig(Login, 113, 0, GCHandle.ToIntPtr(gch), (uint)100);
gch.Free();
/// <summary>
/// 客户端的参数结构
/// 说明:如果将m_bUserCheck置为FALSE,则把用户名和密码作为空指针发送到服务器。
/// 虽然用户名和密码的内容不能超过50字节,但是用户名和密码缓冲区长度必须大于等于50,
/// 因为内部操作的时候直接从用户名或密码缓冲区拷贝50字节到发送缓冲区里。
/// </summary>
public struct CLIENT_VIDEOINFO:Int32
{
/// <summary>
/// 对应服务端的的通道号
/// </summary>
public byte m_bRemoteChannel;
/// <summary>
/// 网络连接方式
/// </summary>
public byte m_bSendMode;
/// <summary>
/// 图像格式,0为服务端主通道的图像 ;1为服务端子通道的图像
/// </summary>
public byte m_nImgFormat; // =0 main channel ; = 1 sub channel
/// <summary>
/// 服务端的IP地址
/// </summary>
public string m_sIPAddress;
/// <summary>
/// 用户名
/// </summary>
public string m_sUserName;
/// <summary>
/// 密码
/// </summary>
public string m_sUserPassword;
/// <summary>
/// 是否需要发送用户名和密码
/// </summary>
public bool m_bUserCheck;
/// <summary>
/// 显示区域
/// </summary>
public System.IntPtr m_hShowVideo;
};
下面是使用:
/// <summary>
/// 启动客户端。
/// </summary>
/// <param name="pClientInfo">客户端的参数结构</param>
/// <param name="callBack">来读取数据流回调函数</param>
/// <returns>
/// 返回-1表示失败,其他值表示成功。作为后续操作的参数。
/// 注 :MP4_ClientStart返回成功,并不表示已经成功连接服务端。
/// 您需要通过MP4_ClientGetState函数去获得网络连接的状态
/// </returns>
[DllImport("HikClient.dll")]
public static extern int MP4_ClientStart(ref CLIENT_VIDEOINFO pClientInfo, ReadDataCallBack callBack);去年做的一个小项目中用到了海康的DS400卡
{
...
}
错误:接口列表中的类型“UInt32”不是接口
Sorry,枚举才可以这样使用,不必加后面的了!
=====================================
WORD ushort
DWORD uint
UCHAR int/byte 大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte
UCHAR* string/IntPtr
unsigned char* Intptr
char* string
LPCTSTR string
LPTSTR [MarshalAs(UnmanagedType.LPTStr)] string
long int
ulong uint
Handle IntPtr
HWND IntPtr
void* IntPtr
int int
int* ref int
*int IntPtr
unsigned int uint
COLORREF uint
这个数据类型对照可能会用到
/// 客户端的参数结构
/// 说明:如果将m_bUserCheck置为FALSE,则把用户名和密码作为空指针发送到服务器。
/// 虽然用户名和密码的内容不能超过50字节,但是用户名和密码缓冲区长度必须大于等于50,
/// 因为内部操作的时候直接从用户名或密码缓冲区拷贝50字节到发送缓冲区里。
/// </summary>
public struct CLIENT_VIDEOINFO
{
/// <summary>
/// 对应服务端的的通道号
/// </summary>
public byte m_bRemoteChannel;
/// <summary>
/// 网络连接方式
/// </summary>
public byte m_bSendMode;
/// <summary>
/// 图像格式,0为服务端主通道的图像 ;1为服务端子通道的图像
/// </summary>
public byte m_nImgFormat; // =0 main channel ; = 1 sub channel
/// <summary>
/// 服务端的IP地址
/// </summary>
public string m_sIPAddress;
/// <summary>
/// 用户名
/// </summary>
public string m_sUserName;
/// <summary>
/// 密码
/// </summary>
public string m_sUserPassword;
/// <summary>
/// 是否需要发送用户名和密码
/// </summary>
public bool m_bUserCheck;
/// <summary>
/// 显示区域
/// </summary>
public System.IntPtr m_hShowVideo;
};
/// <summary>
/// 启动客户端。
/// </summary>
/// <param name="pClientInfo">客户端的参数结构</param>
/// <param name="callBack">来读取数据流回调函数</param>
/// <returns>
/// 返回-1表示失败,其他值表示成功。作为后续操作的参数。
/// 注 :MP4_ClientStart返回成功,并不表示已经成功连接服务端。
/// 您需要通过MP4_ClientGetState函数去获得网络连接的状态
/// </returns>
[DllImport("HikClient.dll")]
public static extern int MP4_ClientStart(ref CLIENT_VIDEOINFO pClientInfo, ReadDataCallBack callBack);
这样既可,也就是某楼所说的,结构体前面加上ref既可!
不过谢谢啦~!!