对于调用硬件提供的二次开发函数,有人认为我把c++或C语言提供的二次开发接口翻译一下,然后我就能调用产生我需要的效果。说的也对,这样确实能得到你想要得结果,但是你把整个模块写完后,你会发现,来个新的硬件你又该怎么办,把原来的推倒重新来吗。对于软件设计来说这种方法来说是不可取的。如何解决这个问题,我们必须提供可以满足一定规则的结构。在做c#程序开发的时候,我们可以参考JAVA里很多优秀的架构。从中获取到优秀的思想。例如我们可以从JAVA框架里的SSH框架里学到一些东西,我用这种框架的思想来做调用硬件的二次开发函数。是不是可以。我该怎么做。(也许我理解的有问题,大家可以共同探讨)
第一步:简单的活,那就是把c++或C语言提供的二次开发接口翻一下HikPlatformSDK.cs
部分代码如下:
public class HikPlatformSDK
{
/** @fn HikPt_Init()
* @brief 初始化SDK
* @param void
* @return bool 成功返回true,否则返回false
*/
[DllImport("lib\\HikPlatformSDK.dll", CharSet = CharSet.Ansi)]
public static extern bool HikPt_Init();
/** @fn HikPt_Uninit()
* @brief 反初始化SDK
* @param void
* @return bool 成功返回true,否则返回false
*/
[DllImport("lib\\HikPlatformSDK.dll", CharSet = CharSet.Ansi)]
public static extern bool HikPt_Uninit();
}
第二步:我们拿到多个厂家提供的SDK,我们进行比较,是否能找到统一性,或者我们可以让公司c++活c开的在厂家提供的SDK的基础上封装一下,封装成定义的格式。然后我们可以做统一的接口的定义,例如:
public interface ISDKplugin
{
//初始化SDK
void SdkInit();
//反初始化SDK
void UnSdkInit();
//获取错误码
object GetLastError();
//登录SDK
object SdkLogin(Dictionary<object, object> parmars);
}
带参数的二次开发函数,我们都可以用OBJECT来用(可以看看基础知识)。
第三步:提供不同厂家的SDK调用方法
public class HikAdapter : ISDKplugin
{
//调用设备的SDK
#region ISDKplugin 成员
public void SdkInit()
{
try
{
HikPlatformSDK.HikPt_Init();
}
catch (Exception exp)
{
LogHelper.GetInstance().Error("SdkInit方法:" + exp.Message.ToString());
}
}
public void UnSdkInit()
{
try
{
HikPlatformSDK.HikPt_Uninit();
}
catch (Exception exp)
{
LogHelper.GetInstance().Error("UnSdkInit方法:" + exp.Message.ToString());
}
}
public object GetLastError()
{
object o = null;
try
{
o = HikPlatformSDK.HikPt_GetLastError();
}
catch (Exception exp)
{
LogHelper.GetInstance().Error("GetLastError方法:" + exp.Message.ToString());
}
return o;
}
public object SdkLogin(Dictionary<object, object> parmars)
{
object o = null;
try
{
VideoMeeting.HIK.HikPlatformSDK.HikLoginInfo pLoginInfo = new HikPlatformSDK.HikLoginInfo();
if (parmars.Count > 0)
{
foreach (var item in parmars)
{
if (item.ToString().Contains("ref"))
{
pLoginInfo = (VideoMeeting.HIK.HikPlatformSDK.HikLoginInfo)item.Value;
break;
}
}
}
o = HikPlatformSDK.HikPt_Login(ref pLoginInfo);
}
catch (Exception exp)
{
LogHelper.GetInstance().Error("SdkLogin方法:" + exp.Message.ToString());
}
return o;
}
}
上面的关于调用厂家的SDK就完毕,下面我们要做的就是匹配的问题。
第四步:提供程序里统计调用的接口
public interface Iplugin
{
//初始化SDK
void SdkInit();
//反初始化SDK
void UnSdkInit();
//获取错误码
object GetLastError();
//登录SDK
object SdkLogin(Dictionary<object, object> parmars);
}
第五步;通过配置我们可以决定我们调用那个硬件提供的二次开发函数,至于代码选择调用那个可以写,选择没有做,可以添加
public class AdapterImpl : Iplugin
{
private ISDKplugin sdk = null;
private string sdktype = "";
public AdapterImpl()
{
//类型选择
sdktype= ConfigurationManager.AppSettings["SdkType"].ToString();
switch (sdktype)
{
case "Hik":
sdk = new HIKMonitor.SDKAdapter.HikAdapter();
break;
}
}
#region Iplugin 成员
public void SdkInit()
{
try
{
this.sdk.SdkInit();
}
catch(Exception exp)
{
LogHelper.GetInstance().Error("SdkInit方法:"+exp.Message.ToString());
}
}
public void UnSdkInit()
{
try
{
this.sdk.UnSdkInit();
}
catch (Exception exp)
{
LogHelper.GetInstance().Error("UnSdkInit方法:" + exp.Message.ToString());
}
}
public object GetLastError()
{
object o = null;
try
{
o=this.sdk.GetLastError();
}
catch (Exception exp)
{
LogHelper.GetInstance().Error("GetLastError方法:" + exp.Message.ToString());
}
return o;
}
public object SdkLogin(Dictionary<object, object> parmars)
{
object o = null;
try
{
o = this.sdk.SdkLogin(parmars);
}
catch (Exception exp)
{
LogHelper.GetInstance().Error("SdkLogin方法:" + exp.Message.ToString());
}
return o;
}
public object SdkLogout()
{
object o = null;
try
{
o = this.sdk.SdkLogout();
}
catch (Exception exp)
{
LogHelper.GetInstance().Error("SdkLogout方法:" + exp.Message.ToString());
}
return o;
}
}
第六步:程序的调用
Dictionary<object, object> list = new Dictionary<object, object>();
list.Add("ref HikPlatformSDK.HikLoginInfo", logininfo);
object obj= Helper.Helper.adapter.SdkLogin(list);
MessageBox.Show(obj.ToString());
我说的估计有点不太明白,我把代码上传,大家开一下,然后可以讨论不同的方式。
http://download.csdn.net/detail/cuiweibin5/8927057