最近,物联网的概念比较热门,一大批厂商抢着占领物联网的高低,包括有华为物联网、阿里云物联网、腾讯物联网、AWS物联网等等,无法一一列举,一般物联网包含设备侧开发、平台侧开发、应用侧开发,三个部分构成了线上线下的完整连接,和我们常规的微信应用、钉钉应用等不同,物联网的终端是由各种各样的设备组合而成,这些设备通过各种不同的协议(如CoAP,LWM2M、MQTT)连接到IOT的平台,而且这些设备是低能耗的设备,可以实时的发送数据上来,也可以接受来自IOT平台下发的各种操作指令。本篇随笔主要介绍基于华为物联网IOT的应用开发,实现对.net SDK的封装,方便后期进行应用集成使用。

1、物联网的相关介绍

物联网其实有点类似我们以前做的一些行业设备的接入,不过它相对比较通用化一些,可以连接各种各样的类型设备,而且更加安全、低能耗等,我们以前接入很多设备,可能需要走TCP/UDP协议,然后在后台服务器有一个对这些设备管理的一个Socket服务器,不过和物联网对比,这些都被彻底改造过了,以便适应更多的 应用场景,更简化的开发,以及支持更强大的功能吧。

物联网目前可以针对一些传感器采集一些特定的参数,如光感、温度、湿度、压力、电压、电流等常规的信息,也可以扩展实现语音、图像、视频等方面的采集处理,如经典的智慧路灯应用场景。

下面是其中的一个应用的架构设计,主要就是针对这些设备管理,物联网还提供了很多完善的应用API接口,使得我们可以更加简化对设备的管理(不用架设Socket服务),更加方便的通过API获取相应的信息,节省更多的维护成本。

物联网平台支持海量设备连接上云,设备与云端可以实现稳定可靠地双向通信。

  • 提供设备端SDK、驱动、软件包等帮助不同设备、网关轻松接入物联网云。
  • 提供2G/ 3G /4G、NB-IoT、LoRa、WiFi等不同网络设备接入方案,解决企业异构网络设备接入管理痛点。
  • 提供MQTT、CoAP、HTTP/S等多种协议的设备端SDK,既满足长连接的实时性需求,也满足短连接的低功耗需求。
  • 开源多种平台设备端代码,提供跨平台移植指导,赋能企业基于多种平台做设备接入。

一般的物联网平台,都会包括产品管理、设备管理、设备组管理、规则引擎管理、消息推送和消息订阅、任务管理、设备升级等等,不同的物联网云平台有所不同。

物联网的几个相关的协议:

MQTT(Message Queue Telemetry Transport)

MQTT是一个物联网传输协议,被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。

MQTTS指MQTT+SSL/TLS,在MQTTS中使用SSL/TLS协议进行加密传输。

CoAP(Constrained Application Protocol)

受约束的应用协议(CoAP)是一种软件协议,旨在使非常简单的电子设备能够在互联网上进行交互式通信。

CoAPS指CoAP over DTLS,在CoAPS中使用DTLS协议进行加密传输。

LWM2M(lightweight Machine to Machine)

LWM2M是由OMA(Open Mobile Alliance)定义的物联网协议,主要使用在资源受限(包括存储、功耗等)的NB-IoT终端

2、应用侧开发接口

应用侧的开发接口一般云平台都会提供不同平台的SDK,如阿里云开源提供Java SDK/C# SDK等;而华为则提供了Java、PHP等SDK,没有包含.net 的SDK。

阿里物联网云的应用侧API接口包括:

华为物联网云的应用侧API接口包括:

本篇主要介绍最基础的物联网SDK的包装,以方便后续的应用开发集成。本篇随笔也主要是基于华为应用侧API的封装,使用C#语言实现对.net SDK的全部封装处理。

针对上面的接口分类,我们定义不同的接口类来处理它们。

基本上所有API访问都先需要通过鉴权接口获取访问的token,鉴权接口定义如下所示。

而且华为的API接口,需要使用X509证书处理的,我们可以通过在官网下载对应的X509证书进行集成测试API。

为了实现对API进行的.net SDK封装,我们定义一些系统常见变量,方便在接口中使用。

根据鉴权返回的结果,我们定义一个对应的实体类来存储这些属性信息,如下所示。

    /// <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; }
}

然后根据鉴权定义,我们实现对这个接口的封装处理。

    /// <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;
}

对于Token的刷新操作,封装也是类似操作

        /// <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;
}

上面有些是为了方便操作,定义了一些公用类库,以减少代码的重复。

一般除了鉴权外的所有的API,它们处理方式都类似的,都是以 application/json 格式进行交互,使用POST、PUT、GET、Delete操作方式实现对数据的处理。

而且它们都需要有固定的请求头信息,我们以设备注册为例进行介绍。

一般我们可以通过一个函数封装,对接口的头部请求信息进行设置,如下所示。

        /// <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;
}

然后在定义请求的JSON和返回的JSON对应的实体类对象,封装对应的API接口即可。

例如,我们注册设备的接口封装如下所示。

    /// <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;
}
......

这里请求的信息是 RegDeviceJson , 返回信息的类是RegDeviceResult 。我们依照API定义,实现对应的处理即可。

为了方便处理,我们可以把这些对应设备的实体类定义在一个文件里面,如DeviceJson.cs里面,如下所示,这样非常方便我们管理。

其他业务范畴的Api也是如此封装,不在一一赘述。

我们测试的时候,可以建立一个单独的Winform项目进行接口功能的测试,也可以自己编写单元测试代码进行测试,根据自己熟练程度选择吧。

例如鉴权接口测试代码如下所示,我们可以看看输出进行判断是否正常工作。

        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;//记录待用
}
}

设备注册的功能测试如下所示。

        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 = "",
timeout = ,
verifyCode = "",
deviceInfo = new DeviceJson()
{
deviceType = "Smoke",
manufacturerId = "49ac78c99f3e453598c155870efe8bfc",
manufacturerName = "iqidi",
//与manufacturerId、manufacturerName、deviceType、model和protocolType系列参数二选一
//productId = "5d9bf49b6a018f02d04cae28",
model = "",
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");
}

另外对于事件的通知,我们一般是在应用端被动的进行相应的处理,因此需要对它们的消息进行转换和处理。

针对以上的消息通知,我们需要定义对应的消息类型,然后进行判断处理。

我们另起一个项目,然后定义对应给的事件接收处理,如下所示是一个统一的入口处理。

有了一个总入口,我们把对应通知的信息转换为对应的实体后,就可以进行记录或者响应的处理了。

在后面我们接着开发应用功能的时候,这些对应的接口API就可以集成整合在我们的系统中了。

以上就是对于华为物联网IOT平台应用侧的API封装处理的思路, 供大家参考交流。

基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装的更多相关文章

  1. 基于华为物联网IOT的应用开发 ---界面管理开发

    在前面随笔<基于华为物联网IOT的应用开发 --- 基于.net 的SDK封装>介绍过IOT中应用侧SDK的封装,主要就是基于华为IOT的应用侧封装,以便在应用系统中进行调用.应用侧SDK ...

  2. 基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一

    [摘要]仓储管理存在四大细分场景:出入库管理.盘点.分拣和货物跟踪.本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践. 仓储 ...

  3. 基于华为云IoT Studio自助生成10万行代码的奥秘

    华为IoT小助手们搬好板凳.备好笔记本.听了HDC.Cloud的几场华为云技术架构师的直播讲课,感觉获益匪浅却又似懂非懂,直后悔自己没有好好打下基础.为了避免再次出现这样的情况,小助手偷偷跑去找了华为 ...

  4. 华为物联网IoT学习笔记目录

    实验准备: 1.<小熊派功能介绍> 2.<小熊派硬件分析> 3.<STM32Cube软件安装介绍> 4.<MDK软件安装介绍> 5.<华为 IoT ...

  5. 聊聊如何在华为云IoT平台进行产品开发

    摘要:华为云物联网平台承载着南北向数据互通的功能职责. 本文分享自华为云社区<如何基于华为云IoT物联网平台进行产品开发>,作者: Super.雯 . 华为云物联网平台承载着南北向数据互通 ...

  6. Form_Form Builder开发基于视图页面和自动代码生成包(案例)

     2014-01-06 Created By BaoXinjian

  7. 直击Huawei Mate 40产线背后的华为云IoT智能制造

    摘要:数字孪生?在数字世界找到物理世界的设备! 本文分享自华为云社区<[云驻共创]Huawei Mate 40产线直击之华为云IoT智能制造助力工厂数字化转型>,原文作者:启明. Part ...

  8. HC大会,华为联合合作伙伴发布一站式物联网IoT开发工具小熊派BearPi

    传统的物联网产品开发步骤复杂,涉及硬件开发.软件开发.云端开发等众多流程.而且产品的开发周期长.开发成本高.产品稳定性不佳.维护成本高.而物联网设备本身市场竞争激烈,价格低,设备更新迭代快,所以在保证 ...

  9. 华为云MVP熊保松谈物联网开发:华为云IoT是首选,小熊派是神器

    摘要:在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间,也得乘风破浪跟上新技术的节奏. 在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间 ...

随机推荐

  1. AirFlow常用命令

    airflow常用命令如下所示: airflow test dag_id task_id execution_date 测试task 示例: airflow test example_hello_wo ...

  2. ubuntu上vritualbox为系统分配硬盘空间

    VBoxManage是virtualbox 在ubuntu上提供的管理virtualbox的命令行命令 VBoxManage modifyhd windowsDevEnv --resize VBoxM ...

  3. 由于找不到opencv_world***d.dl,无法继续执行代码。重新安装程序可能会解决此问题。关于opencv使用imshow函数闪退解决方法等问题

    1.将缺失的文件放到程序根目录的debug中 2.将Debug x64下的附加依赖项改为只有后缀为d.lib的那个库文件,去除另一个,问题就这么解决了,虽然我也不知道加上另一个为什么就会闪退

  4. 使用opencv训练分类器时,traincascade训练报错:Train dataset for temp stage can not be filled.解决方法

    opencv分类器训练中,出错一般都是路径出错,例如, 1.opencv_traincascade.exe路径 2.负样本路径文件,neg.dat中的样本前路径是否正确 3.移植到别的电脑并修改完路径 ...

  5. 个人网站(sysoft.net.cn)被k,公司名都搜索不出来了,怎么办?

    今年上班后,好2019年3月初,上班后(年前大病一场 ,两个月没维护网站),发现公司网站所有收录都掉了,搜索公司名都不不到了,宝宝真是惊呆了.   有些人说是百度出了故障,有人说是百度算法.   说句 ...

  6. .NET Conf 2019 大会上发布.NET Core 3.0

    北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演,主要围绕.NET Core 3.0的新特性和社区展开. 多功能性是.Ne ...

  7. [Spark] 01 - What is Spark

    大数据 云计算概念 课程:Spark编程基础(Python版) 大数据4V特性 Volumn, Variety, Velocity, Value. 思维方式 通过数据发现问题,再解决问题. 速度更重要 ...

  8. 安装pytest-allure-adaptor后,运行报错:AttributeError: module 'pytest' has no attribute 'allure'

    ​ 原因:因为pytest-allure-adaptor库基本被python3放弃了,运行很不友好,反正我运行就是报错 解决方法: 先卸载:pip uninstall pytest-allure-ad ...

  9. Spring 梳理-@Controller

    @Controller是一个构造性注解(stereotype),它基于@Component 在自动扫描中,组件扫描器会自动将@Controller申明的类注册为Spring应用上下文的一个bean 可 ...

  10. 深入MYSQL随笔

    (1)查询生命周期:从客户端到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回给客户端.执行是整个生命周期中,最重要的阶段. (2)慢查询基础:优化数据访问,减少访问的数据行. (3)查询不 ...