c#调用硬件提供的二次开发函数方法

        对于调用硬件提供的二次开发函数,有人认为我把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

猜你喜欢

转载自blog.csdn.net/cuiweibin5/article/details/47025145