ibcadmin 发表于 2019-10-24 09:47:45

基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装

<p>近来,物联网的概念比较热门,一大批厂商抢着霸占物联网的高低,包括有华为物联网、阿里云物联网、腾讯物联网、AWS物联网等等,无法逐一列举,一样平常物联网包含设备侧开辟、平台侧开辟、应用侧开辟,三个部分构成了线上线下的完备连接,和我们通例的微信应用、钉钉应用等差别,物联网的终端是由各种各样的设备组合而成,这些设备通过各种差别的协议(如CoAP,LWM2M、MQTT)连接到IOT的平台,而且这些设备是低能耗的设备,可以实时的发送数据上来,也可以接受来自IOT平台下发的各种操纵指令。本篇漫笔重要介绍基于华为物联网IOT的应用开辟,实现对.net SDK的封装,方便后期举行应用集成使用。</p>
<h3>1、物联网的相关介绍</h3>
<p>物联网其实有点类似我们从前做的一些行业设备的接入,不外它相对比较通用化一些,可以连接各种各样的范例设备,而且更加安全、低能耗等,我们从前接入很多设备,大概必要走TCP/UDP协议,然后在配景服务器有一个对这些设备管理的一个Socket服务器,不外和物联网对比,这些都被彻底改造过了,以便顺应更多的 应用场景,更简化的开辟,以及支持更强盛的功能吧。</p>
<p>物联网现在可以针对一些传感器收罗一些特定的参数,如光感、温度、湿度、压力、电压、电流等通例的信息,也可以扩展实现语音、图像、视频等方面的收罗处理惩罚,如经典的聪明路灯应用场景。</p>
<p>下面是其中的一个应用的架构设计,重要就是针对这些设备管理,物联网还提供了很多美满的应用API接口,使得我们可以更加简化对设备的管理(不消架设Socket服务),更加方便的通过API获取相应的信息,节流更多的维护成本。</p>
<p><div align="center"></div></p>
<p> </p>
<p id="p-z2a-6k9-ugo" >物联网平台支持海量设备连接上云,设备与云端可以实现稳固可靠地双向通讯。</p>
<ul id="ul-vr1-2y4-tdb" >
<li id="li-svg-eg4-ebl" >提供设备端SDK、驱动、软件包等资助差别设备、网关轻松接入物联网云。</li>
<li id="li-nrq-3nv-3lx" >提供2G/ 3G /4G、NB-IoT、LoRa、WiFi等差别网络设备接入方案,管理企业异构网络设备接入管理痛点。</li>
<li id="li-gdp-yk2-khr" >提供MQTT、CoAP、HTTP/S等多种协议的设备端SDK,既满意长连接的实时性需求,也满意短连接的低功耗需求。</li>
<li id="li-jbj-i3x-7b7" >开源多种平台设备端代码,提供跨平台移植引导,赋能企业基于多种平台做设备接入。</li>
</ul>
<p>一样平常的物联网平台,都会包括产物管理、设备管理、设备组管理、规则引擎管理、消息推送和消息订阅、使命管理、设备升级等等,差别的物联网云平台有所差别。</p>
<p> </p>
<p>物联网的几个相关的协议:</p>
<p>MQTT(Message Queue Telemetry Transport)</p>
<p>MQTT是一个物联网传输协议,被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳固的网络情况中的物联网设备提供可靠的网络服务。</p>
<p>MQTTS指MQTT+SSL/TLS,在MQTTS中使用SSL/TLS协议举行加密传输。</p>
<p> </p>
<p>CoAP(Constrained Application Protocol)</p>
<p>受束缚的应用协议(CoAP)是一种软件协议,旨在使非常简朴的电子设备可以或许在互联网上举行交互式通讯。</p>
<p>CoAPS指CoAP over DTLS,在CoAPS中使用DTLS协议举行加密传输。</p>
<p> </p>
<p>LWM2M(lightweight Machine to Machine)</p>
<p>LWM2M是由OMA(Open Mobile Alliance)界说的物联网协议,重要使用在资源受限(包括存储、功耗等)的NB-IoT终端</p>
<p> </p>
<h3>2、应用侧开辟接口</h3>
<p>应用侧的开辟接口一样平常云平台都会提供差别平台的SDK,如阿里云开源提供Java SDK/C# SDK等;而华为则提供了Java、PHP等SDK,没有包含.net 的SDK。</p>
<p>阿里物联网云的应用侧API接口包括:</p>
<p><div align="center"></div></p>
<p> 华为物联网云的应用侧API接口包括:</p>
<p><div align="center"></div></p>
<p><div align="center"></div></p>
<p> </p>
<p> 本篇重要介绍最底子的物联网SDK的包装,以方便后续的应用开辟集成。本篇漫笔也重要是基于华为应用侧API的封装,使用C#语言实现对.net SDK的全部封装处理惩罚。</p>
<p> 针对上面的接口分类,我们界说差别的接口类来处理惩罚它们。</p>
<p><div align="center"></div></p>
<p>基本上全部API访问都先必要通过鉴权接口获取访问的token,鉴权接口界说如下所示。</p>
<p><div align="center"></div></p>
<p>而且华为的API接口,必要使用X509证书处理惩罚的,我们可以通过在官网下载对应的X509证书举行集成测试API。</p>
<p>为了实现对API举行的.net SDK封装,我们界说一些体系常见变量,方便在接口中使用。</p>
<p><div align="center"></div></p>
<p> </p>
<p> 根据鉴权返回的效果,我们界说一个对应的实体类来存储这些属性信息,如下所示。</p>

    /// <summary>
    /// 鉴权效果
    /// </summary>
    public class AuthenticationResult : BaseJsonResult
    {
      /// <summary>
      /// 申请权限范围,即accessToken所能访问物联网平台资源的范围,参数值固定为default。
      /// </summary>
      public string scope { get; set; }

      /// <summary>
      /// accessToken的范例,参数值固定为Bearer 。
      /// </summary>
      public string tokenType { get; set; }

      /// <summary>
      /// accessToken的有效时间,参数值固定为3600秒
      /// </summary>
      public int expiresIn { get; set; }

      /// <summary>
      /// 鉴权参数,访问物联网平台API接口的凭证。
      /// </summary>
      public string accessToken { get; set; }

      /// <summary>
      /// 鉴权参数,有效时间为1个月,用于“革新Token”接口。
      /// 当accessToken即将逾期时,可通过“革新Token”接口来获取新的accessToken。
      /// </summary>
      public string refreshToken { get; set; }
    }

<p>然后根据鉴权界说,我们实现对这个接口的封装处理惩罚。</p>

    /// <summary>
    /// IOT鉴权接口实现
    /// </summary>
    public class AuthenticationApi : IAuthenticationApi
    {
      /// <summary>
      /// 用户鉴权
      /// 应用服务器首次访问物联网平台的开放API时,需调用此接口完成接入认证;
      /// 应用服务器在物联网平台的认证逾期后,需调用此接口重新举行认证,才能继续访问物联网平台的开放API。
      /// </summary>
      public AuthenticationResult Authentication()
      {
            string postData = string.Format("appId={0}&secret={1}", Constants.AppId, Constants.Secret);
            var url = Constants.AppBaseUrl + "/iocm/app/sec/v1.1.0/login";//名称巨细写不能错

            HttpHelper helper = new HttpHelper();
            helper.ContentType = "application/x-www-form-urlencoded";
            helper.ClientCertificates = new X509CertificateCollection() { new X509Certificate2(Constants.CertFilePath, Constants.CertPassword) };

            string content = helper.GetHtml(url, postData, true);
            var result = JsonConvert.DeserializeObject<AuthenticationResult>(content);
            return result;
      }

<p>对于Token的革新操纵,封装也是类似操纵</p>

      /// <summary>
      /// 革新token。
      /// 应用服务器通过鉴权接口获取到的accessToken是有有效时间的,在accessToken快逾期时,
      /// 应用服务器通过调用此接口,获取新的accessToken。
      /// </summary>
      /// <param name="refreshToken">
      /// 革新token,用来获取一个新的accessToken。refreshToken在调用鉴权接口或革新token接口时获得。
      /// </param>
      /// <returns></returns>
      public AuthenticationResult RefreshToken(string refreshToken)
      {
            string postData = new
            {
                appId = Constants.AppId,
                secret = Constants.Secret,
                refreshToken = refreshToken
            }.ToJson();
            var url = Constants.AppBaseUrl + "/iocm/app/sec/v1.1.0/refreshToken";//名称巨细写不能错

            var result = WeJsonHelper<AuthenticationResult>.ConvertJson(url, postData);
            return result;
      }

<p>上面有些是为了方便操纵,界说了一些公用类库,以淘汰代码的重复。</p>
<p>一样平常除了鉴权外的全部的API,它们处理惩罚方式都类似的,都是以 application/json 格式举行交互,使用POST、PUT、GET、Delete操纵方式实现对数据的处理惩罚。</p>
<p>而且它们都必要有固定的哀求头信息,我们以设备注册为例举行介绍。</p>
<p><div align="center"></div></p>
<p> </p>
<p>一样平常我们可以通过一个函数封装,对接口的头部哀求信息举行设置,如下所示。</p>

      /// <summary>
      /// 通用获取头部信息
      /// </summary>
      /// <param name="accessToken">接口访问口令</param>
      /// <returns></returns>
      protected NameValueCollection GetHeader(string accessToken)
      {
            var header = new NameValueCollection();
            header.Add(Constants.HEADER_APP_KEY, Constants.AppId);
            header.Add(Constants.HEADER_APP_AUTH, string.Format("Bearer {0}", accessToken));
            return header;
      }

<p>然后在界说哀求的JSON和返回的JSON对应的实体类对象,封装对应的API接口即可。</p>
<p>比方,我们注册设备的接口封装如下所示。</p>

    /// <summary>
    /// 设备管理接口实现
    /// </summary>
    public class DeviceApi : BaseCommon, IDeviceApi
    {
      /// <summary>
      /// 注册设备(验证码方式)。
      /// 在设备接入物联网平台前,应用服务器必要调用此接口在物联网平台注册设备,并设置设备的唯一标识(如IMEI)。
      /// 在设备接入物联网平台时携带设备唯一标识,完成设备的接入认证。
      /// </summary>
      /// <param name="accessToken"></param>
      /// <param name="info"></param>
      /// <returns></returns>
      public RegDeviceResult RegisterDevice(string accessToken, RegDeviceJson info)
      {
            var header = GetHeader(accessToken);

            string postData = info.ToJson();
            var url = Constants.AppBaseUrl + "/iocm/app/reg/v1.1.0/deviceCredentials";//名称巨细写不能错
            url += string.Format("?appId={0}", Constants.AppId);

            var result = WeJsonHelper<RegDeviceResult>.ConvertJson(url, postData, header);
            return result;
      }
......

<p>这里哀求的信息是 RegDeviceJson , 返回信息的类是RegDeviceResult 。我们依照API界说,实现对应的处理惩罚即可。</p>
<p>为了方便处理惩罚,我们可以把这些对应设备的实体类界说在一个文件内里,如DeviceJson.cs内里,如下所示,这样非常方便我们管理。</p>
<p><div align="center"></div></p>
<p> </p>
<p> 其他业务范畴的Api也是云云封装,不在逐一赘述。</p>
<p>我们测试的时间,可以建立一个单独的Winform项目举行接口功能的测试,也可以自己编写单位测试代码举行测试,根据自己纯熟程度选择吧。</p>
<p>比方鉴权接口测试代码如下所示,我们可以看看输出举行判断是否正常工作。</p>

      private void btnLogin_Click(object sender, EventArgs e)
      {
            var result = basicApi.Authentication();
            Console.WriteLine(result != null ? "accessToken:" + result.ToJson() : "获取效果堕落");

            if (result != null)
            {
                var refreshResult = basicApi.RefreshToken(result.refreshToken);

                Console.WriteLine(refreshResult != null ? "accessToken:" + refreshResult.ToJson() : "获取效果堕落");
                this.accessToken = refreshResult.accessToken;//记录待用
            }
      }

<p>设备注册的功能测试如下所示。</p>

      private void btnRegDevice_Click(object sender, EventArgs e)
      {
            if (string.IsNullOrEmpty(accessToken))
            {
                MessageUtil.ShowTips("请先鉴权获取AccessToken");
                return;
            }

            var deviceApi = new DeviceApi();
            var regDeviceInfo = new RegDeviceJson()
            {
                endUserId = "64bf5869-b271-4007-8db8-fab185e19c10",
                nodeId = "64bf5869-b271-4007-8db8-fab185e19c10",
                psk = "12345678",
                timeout = 0,
                verifyCode = "",
                deviceInfo = new DeviceJson()
                {
                  deviceType = "Smoke",
                  manufacturerId = "49ac78c99f3e453598c155870efe8bfc",
                  manufacturerName = "iqidi",
                  //与manufacturerId、manufacturerName、deviceType、model和protocolType系列参数二选一
                  //productId = "5d9bf49b6a018f02d04cae28",
                  model = "1001",
                  name = "NBSimulator",
                  imsi = "fafafasfasf",
                  mac = "testetst",
                  isSecurity = true.ToString().ToUpper(),
                  protocolType = "LWM2M",
                }
            };

            var regResult = deviceApi.RegisterDevice(accessToken, regDeviceInfo);
            Console.WriteLine(regResult != null ? regResult.ToJson() : "no regResult");
      }

<p>另外对于事故的关照,我们一样平常是在应用端被动的举行相应的处理惩罚,因此必要对它们的消息举行转换和处理惩罚。</p>
<p><div align="center"></div></p>
<p> </p>
<p> 针对以上的消息关照,我们必要界说对应的消息范例,然后举行判断处理惩罚。</p>
<p>我们另起一个项目,然后界说对应给的事故吸取处理惩罚,如下所示是一个统一的入口处理惩罚。</p>
<p><div align="center"></div></p>
<p> </p>
<p>有了一个总入口,我们把对应关照的信息转换为对应的实体后,就可以举行记录或者响应的处理惩罚了。</p>
<p>在后面我们接着开辟应勤奋能的时间,这些对应的接口API就可以集成整合在我们的体系中了。</p>
<p> </p>
<p> 以上就是对于华为物联网IOT平台应用侧的API封装处理惩罚的思路, 供大家参考交换。</p><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/wuhuacong/p/11726446.html" target="_blank">https://www.cnblogs.com/wuhuacong/p/11726446.html</a>
页: [1]
查看完整版本: 基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装