摘要:IoT, Internet of Things,物联网,顾名思义,是物物相连。而要实现“物物相连”,一共有3个阶段性任务,而这3个阶段性任务,也伴随着巨大的挑战

本文分享自华为云社区《【云驻共创】以小窥大,从一盏路灯看亿万物联网之路》,作者: 启明。

物联网的必然趋势与巨大挑战

在介绍华为云IoT设备接入管理服务业务之前,我们需要先了解“IoT”是什么。

IoT, Internet of Things,物联网,顾名思义,是物物相连。而要实现“物物相连”,一共有3个阶段性任务,而这3个阶段性任务,也伴随着巨大的挑战:
image.png

阶段一:让“物”说话。

正如婴儿要融入世界,需要会说话一样,我们的“物”也需要能够与外界交流。感知物理世界,变成数字信号:让万物可以感知温度、空间、五觉,并且将自己感知到的进行数据化。在这数据化的过程中,我们发现如下挑战:

• 大量现存设备未被数字化;
• 多样化设备、各种行业协议、各种通信网络;
• 设备要求低功耗、低成本;
• 设备安全问题突出

阶段二:让“物”说一种话

婴儿光会说话是不行的,要能够和外界交流,还需要和外界使用共同的语言。对于“物”也是一样,我们需要将数变成Online,提供标准化数据,让外部能够理解“物”说的话。而这就需要有广联接和多协议接入,并且数据标准化,统一物模型。可是,现状却是:

• 百万中数据元素,缺乏标准和规范;
• 多样化数据格式
• 各厂商烟囱式发展,数据孤岛林立,数据互通困难

阶段三:让“物”时候有价值的话

在可以用同一种语言沟通的基础上,我们还需要让婴儿说有价值的话,才能够实现高效沟通。对于“物”而言,亦是如此。尤其是在“物”的世界,我们需要解决海量数据处理和分析,因此对算力的要求极高,并且要求实时性。最终的结果就是行业数字化、数字化行业。但是,正如前面说到的:

• 海量数据带来算力、存储问题;
• 实时流、时序、离线、多维分析复杂;
• 行业应用场景的复杂性;
• 商业闭环、价值变形和分配问题

以小窥大,从一盏路灯,看万物互联世界

首先,让我们在脑海里描绘一盏路灯的样子,你是不是觉得很简单?

我们来回顾一下路灯的发展史:
image.png

从五六十年代的时间控制器+本地回路控制,定时开关,最简单的逻辑处理关系;到70年代,加上光电控制器,稍微“聪明”了一些,能够感知周围的光感强度,从而调节开关,但是此时还只是在本地回路控制;而到了90年代,已经可以基于无线专网的三遥监控系统,实现远程回路控制;最后再到现在,基于物联网技术的智能化系统,实现信息融合、智能场景和应用拓展,从而实现智慧照明场景(如上图)。

可以看到,智慧场景下的智慧路灯,搭载了许多智能设备,诸如监控组件、LED屏幕、集中控制器、电动汽车充电桩等等,让一盏路灯实现一个路面能实现的基本功能。

以上,就是一盏灯的智慧之路,在这个过程中,物联网技术发挥了极大的作用,让一个单定时控制的路灯,一步步具有多场景、多应用的功能,最后演变为智慧路灯。

而华为云IoT设备接入管理服务,正是基于此技术。

华为云IoT设备接入管理服务介绍

首先,我们对物联网要有一个正确的认知:物联网是由多个服务组成的,而非单一的服务。下图是一个整体的物联网解决方案。
image.png

在图左侧,是设备,体现的是我们前面说到的:让设备说话、让设备时候同一种话、让设备有说价值的话。那么,我们首先要让这些设备能够“被”感知到,在这个过程中,我们通过物联网操作系统(LiteOS)或者SDK使能,使其智能化;然后感知到的东西以数据的形式通过网关、边缘网关或者直连的方式上传。具体要上传到哪里呢?

考虑到设备的海量问题,我们需要有一个物联网平台。数据通过前面所说的方式上传至物联网平台中的设备接入服务。在设备接入服务,可以实现多网络接入、多协议接入、设备影子等等多种功能;而在整体物联网平台上,还包括全球SIM连接、设备发放、数据分析等等服务。

在图右侧,更能对接华为云的其他产品,诸如DIS/DCS/OBS等等,帮助客户快速构筑满足客户要求的物联网应用,如智慧城市、智慧园区、车联网等等。

回归到技术本身。我们前面聊到,不同的设备,都可以通过华为云设备接入服务接入,但实际上,他们的接入方式和接入协议都是不一样的,那么华为云设备接入服务又是怎么屏蔽底端差异,实现设备接入的呢?

我们首先来看下面这张图:
image.png

通讯模型:在华为云设备接入服务里,定义了“通讯模型”。同样以我们之前说的婴儿说话为例。人与人之间的沟通,虽然语言有很多种,但是表达的方式还是主要以声音(说话)或者视觉(手语)为主。而物与物之间,同样的,主要的内容也主要是几类:命令下发、命令相应、属性设备等等。

设备影子:而在此基础之上,我们还有“设备影子”这一概念。物联网平台支持创建设备的“影子”。设备影子是一个JSON文件,用于存储设备的在线状态、设备最近一次上报的设备属性值、应用服务器期望下发的配置。每个设备有且只有一个设备影子,设备可以获取和设置设备影子以此来同步设备属性值,这个同步可以是影子同步给设备,也可以是设备同步给影子。

通用协议接入层:在具备“通讯模型”以后,我们需要把设备数据和通讯模型进行关联,而进行关联的就是“通用协议接入层”。通过通讯协议接入层,我们可以将不同的协议类型(如MQTT/CoAP/TCP等等)上的不同数据转化到通讯模型上。

编解码处理:一款产品的设备上报数据时,如果“数据格式”为“二进制码流”,则该产品需要进行编解码插件开发;如果“数据格式”为“JSON”,则该产品下不需要进行编解码插件开发。

以NB-IoT场景为例,NB-IoT设备和物联网平台之间采用CoAP协议通讯,CoAP消息的payload为应用层数据,应用层数据的格式由设备自行定义。由于NB-IoT设备一般对省电要求较高,所以应用层数据一般不采用流行的JSON格式,而是采用二进制格式。但是,物联网平台与应用侧使用JSON格式进行通信。因此,需要开发编码插件,供物联网平台调用,以完成二进制格式和JSON格式的转换。
image.png

华为云IoT设备接入管理服务云化架构解读

IoT设备接入管理服务架构

image.png

在讲解整个框架之前,我们首先要明确的是,华为云IoT设备接入服务内部,实际上是基于Cloud Native(云原生)的微服务的一个架构。里面所有业务相关的服务,都是无状态的。无状态的服务就意味着可以随时被创建,也可以随时被kill掉。

也就是说,即使任何一个服务实例出现问题,都可以通过创建服务来保证业务的无损。同时在海量并发的情况下,通过弹性的缩、扩容,能够使服务满足对应业务量的需求。

在基于无状态服务的框架下,除了负载均衡层(目的是为了让海量的设备能够接入到服务中),上面可以分为两层:

一层是CIG云通讯网关层,这一层实际上是将各种各样的设备的不同的协议和不同的数据格式转换成统一的模型;

另一层是连接&管理业务服务:数据和协议转换成统一的模型,流转到这一层后,由业务服务来做处理,比如说消息流转推送、设备影子、规则引擎服务,以及任务管理服务等等。

更上层是公有云支撑管理服务:通过公有云的支撑服务,像CBC/IAM/SMN等等来整体构建设备接入管理服务。

以上就是设备技术管理服务的一个大致的框架。通过此框架可以了解内部的业务处理逻辑,有助于大家理解后续我们的沙箱实验体验。

产品模型(Profile)-统一的数据&通讯模型

产品模型,也就是常说的Profile,简单来说也就是通信模型的映射。
image.png

上图是如何将不同类型的数据映射到通讯模型上面的实例。

在图左侧,有3个不同的表计。虽然它们都是水表,但是它们是由不同的厂家生产的,因此数据格式和协议也是不一样的,那么我们该如何采集它们的数据形成统一的格式呢?

答案就是产品模型。通过产品模型里面不同的插件,可以将这些不同数据转换成相同格式的数据。对设备厂商来说,无需修改设备代码,通过插件即可适配不同企业的诉求,降低设备厂家的维护复杂度。而对上层应用来说,降低了上层应用对设备管理复杂度,通过在平台规整不同厂家的数据,形成统一的Profile,上层应用无需感知不同设备的差异
image.png

接下来再看规则引擎。规则引擎是华为云IoT设备接入服务特有的能力,通过规则引擎可以实现数据流转和设备联动。无缝与公有云其他服务对接,实现设备数据按需流转和处理;

而设备联动,也是基于规则引擎来实现的,由条件触发,基于预置规则,引发多设备协同反应,如提醒、告警、状态报告等等。

华为云IoT智慧路灯沙箱实验演示

在介绍完华为云IoT设备接入管理服务之后,接下来然后就带大家了解一下相关的沙箱实验。

沙箱实验介绍

image.png

智慧路灯沙箱实验组网结构如上。为了方便大家在线完成路等试验,我们需要有一个虚拟设备,在此我们使用的是设备模拟器。设备接入平台,上报属性,然后接收平台下发的命令。而在平台上层,有一个基于华为云软开云的应用层的实现。大致步骤如下:

1、通过华为云软件开发平台构建一个路灯的模拟应用(真实的应用可以参考其构建的方法);

2、申请ECS云服务,将构建的应用部署于ECS上,通过EIP对接IoT设备接入服务,并进行订阅通知;

3、在实验桌面运行MQTT模拟器,模拟路灯设备的行为

设备模拟器

在正式开始之前,我们先看一下设备模拟器(如下图)。
image.png

连接参数配置区:

设备模拟器打开之后,打开“MQTT设备模拟器”页签。在“连接参数配置区”需要指定进入平台的地址信息,拿到“注册设备成功”或者设备ID和设备密钥,并与平台建立连接;

消息上报区:

与平台建立连接之后,设备上报数据到平台。下面有“消息上报区”,可以在指定设备上报属性的topic之后,在下面将jason格式数据粘贴进来,并进行上报;

日志打印区:

右侧是一个类似消息跟踪的日志打印区域,在此可以看到消息上报的消息记录,包括平台的下发的命令,也会在这里做一个打印跟踪。

Topic订阅区:

Topic订阅区是另一个页签。设备需要订阅平台下发命令的相关topic的时候,就可以在这里指定topic进行订阅。

应用实现-API介绍

在实验桌面里面,创建代码仓库之后,可以查看详细的源文件。而比较典型的几个源文件的实现,是对应用侧API的实现,比如:

创建设备API:src/main/java/com/huawei/service/RegisterDirectConnectedDevice.java

创建订阅API:src/main/java/com/huawei/service/SubscribeDataChg.java

下发设备命令API:src/main/java/com/huawei/service/CreateDeviceCommand.java

基于这些源文件的样例代码,开发人员可以再基于自己的思路,做定制化开发。

前台web页面布局的关键文件,就是一个index的html的源文件,加一个 js脚本:

页面布局:src/main/resources/static/index.html

脚本文件:src/main/resources/static/js/common.js

智慧路灯沙箱实验实操步骤

智慧路灯沙箱实验,分为7步:

1、编译构建智慧路灯应用DevCloud

2、创建主题并订阅SMN

3、创建弹性云服务器ECS

4、部署智慧路灯应用DevCloud

5、导入产品模型IoTDA

6、配置智慧路灯应用Web

7、结果验证
image.png

开发者在登录华为云账号,进入沙箱实验之后,会有上图页面:

左上角呈现实验账号,开发者拿这个实验账号在实验桌面里面通过firefox浏览器登录华为云,并通过控制台进入到各个服务。

账号下有 step by step的实验步骤指导,按照步骤操作即可。

右上角有一个完成进度显示,实时刷新,可以得到进度显示和实验倒计时。

在左侧部分,有一些相关的命令执行,可以方便大家执行的时候快速拷贝。

由于时间限制,我们省略前面简单的1~4步,从第5步然后创建产品开始,正常后面的正式实验过程中。

PS:前面1~4步过程中需要注意的事项是在创建主题并订阅的时候,平台会发送一个确认的短信到用户手机上,用户需要查看短信,点击里面的链接,确认之后才能完成实际的订阅。

接下来,我们正式进入实验操作:

导入产品模型:

创建产品

在华为云控制台,展开左侧导航,选择“服务列表”-> “物联网”->“设备接入IoTDA”,如下图所示:
image.png

在左侧栏中选择“产品”,点击“创建产品”,参数如下:
image.png

①所属资源空间:Default_APP_Sandbox_user_iot

②产品名称:自定义,如:StreetLight

③协议类型:MQTT

④数据格式:JSON

⑤厂商名称:自定义,如:Huawei_IoT

⑥设备类型:自定义,如:StreetLight

填写完成,点击“立即创建”,产品创建成功,请记录“产品ID”信息,并查看“详情”。
image.png

上传模型文件

点击创建的产品进入详情,然后点击“上传模型文件”,选择SmartStreetLight.zip文件,点击“确认”完成上传。
image.png

配置智慧路灯应用(订阅推送方案)

访问智慧路灯Web界面

新建浏览器标签页,输入http://EIP:8080/index.html(使用步骤3.2中弹性云服务器的弹性公网IP替换地址中的“EIP”),访问智慧路灯Web页面。

参数设置

在弹出的“参数设置”窗口,参数填写如下:

①数据来源:参数设置页面下拉框选择“订阅推送”。

②本机IP:“控制台”->“服务列表”->“计算”->“弹性云服务器ECS”进入服务器列表,进行查看并复制弹性公网IP。
image.png

③主题URN:“控制台”->“服务列表”->“管理与监管”->“消息通知服务SMN”进入主题列表,进行查看并复制主题URN。

④APPID:“控制台”->“服务列表”-> “物联网”->“设备接入IoTDA”,在左侧导航栏选择“资源空间”,复制获取产品所需的“APPID”。
image.png

⑤账号名:系统为您分配的华为云实验账号名。

⑥IAM用户名:系统为您分配的华为云实验用户名。

⑦IAM用户密码:系统为您分配的华为云实验密码。
image.png

⑧项目ID:控制台在右上角用户名下拉框中选择“我的凭证->API凭证”页面复制获取所属区域为“华北-北京四”的项目ID。
image.png

⑨产品ID:“控制台”->“服务列表”-> “物联网”->“设备接入IoTDA”,在左侧导航栏选择“产品”,复制获取产品所需的“产品ID”。
image.png
image.png

填写完成后点击“确定”,弹窗提示如下,表示参数设置成功。
image.png

注册设备

输入设备标识(自定义,如123456789f),点击“注册设备”。
image.png

弹窗提示如下,表示注册设备成功。请记录“设备Id”和“密钥”信息,用于后续验证。
image.png

注意:请记录设备id以及密钥,便于后期使用!

设备注册成功后是“未激活”状态,请选择“服务列表”-> “物联网”->“设备接入服务”,在左侧栏选择“设备 > 所有设备”,点击设备标识码进入,查看设备Id,或修改密钥。

结果验证(设备属性上报/订阅/设备命令下发)

模拟器与平台建立连接

打开MQTT设备模拟器

在实验桌面双击“Xfce终端”打开Terminal,执行以下命令打开设备接入模拟器(HubSimulator.jar),然后切换到MQTT设备模拟器页签。
image.png

建立连接

在MQTT设备模拟器页签下,填写参数如下:

①服务IP:进入“服务列表”-> “物联网”->“设备接入IoTDA”,在左侧栏选择“总览”,点击“平台接入地址”。
image.png

复制使用MQTT/MQTTS接入信息的域名。
image.png

②设备ID:配置智慧路灯应用,注册设备成功后返回的设备Id

③设备密钥:配置智慧路灯应用,注册设备成功后返回的密钥

配置好以上参数后,点击“建立连接”按钮。
image.png

建立连接成功后,右侧日志显示MQTT服务连接成功,如下图所示:
image.png

若无法建立连接,请打开“命令提示符”窗口,输入“ping 服务IP”查看您的主机是否能和华为云物联网平台正常通信,若无法正常通信,请更换主机的网络环境。

查看设备状态

回到物联网所有设备列表( “服务列表”-> “物联网”->“设备”→“所有设备”),设备状态变更为“在线”,如下图所示:
image.png

模拟器设备属性上报

模拟器发送消息,上报设备属性。

①在模拟器窗口中的Topic栏中输入以下代码:$oc/devices/{device_id}/sys/properties/report,其中的{device_id}需要替换成实际设备ID。

$oc/devices/{device_id}/sys/properties/report

②消息内容:

其中,光感强度可自定义,灯状态建议为OFF。

在模拟器窗口中的消息编辑栏中输入以下代码:

{"services":[{"service_id":"Sensor","properties":{"luminance":"200","light_state":"OFF"}}]}
image.png

发送消息成功后,右侧日志显示信息推送成功(图片仅为示意,请以实际上报数据为准)。

查看应用界面变化

返回智慧路灯Web界面,此时显示“环境亮度”为200LUX,“灯状态”为关。
image.png

注意:模拟器与Web页面之间会有短暂延迟,不用刷新页面,几秒钟后可发现页面会随之变化!

模拟器订阅Topic

切换到“订阅Topic”页签,并在Topic栏中输入以下代码:

$oc/devices/{device_id}/sys/commands/#,其中的{device_id}需要替换成实际设备ID。

输入完毕后,点击“订阅”按钮可完成订阅。

$oc/devices/{device_id}/sys/commands/#
image.png

订阅成功后,右侧日志显示订阅Topic成功。

平台下发设备命令/模拟器响应

终端联控模式配置

返回智慧路灯Web界面,“路灯控制”选择“终端联控模式”,开关选择“开”,单击“设置”,然后点击”确认”。

①若当前灯状态为“关”,开关选择为“开”,服务后台会实时下发一条开灯命令,弹窗提示会有5-10秒左右延迟,请耐心等待。

②若当前灯状态为“关”,开关选择为“关”,不会触发命令下发,直接弹窗提示设置成功。

即“灯状态”与“开关选择”一致时,不会触发命令下发;“灯状态”与“开关选择”不一致时,会触发实时命令下发。
image.png

命令接收

因为当前“灯状态”为关,“开关选择”为开,查看模拟器日志区域,会收到一条开灯命令。(payload的值经过base64加密,解密后即可得到命令内容)。
image.png

模拟器发送消息,上报变更后的设备属性。

①Topic:$oc/devices/{device_id}/sys/properties/report,其中的{device_id}需要替换成实际设备ID。

②消息内容:

其中,光感强度可自定义,灯状态建议为ON。

{"services":[{"service_id":"Sensor","properties":{"luminance":"110","light_state":"ON"}}]}

查看应用界面变化

如下图所示,应该显示“环境亮度”为110LUX,“灯状态”为开。
image.png

短信/邮件通知

在模拟器上单击“断开连接”后,重复7.4.1,“路灯控制”选择“终端联控模式”,开关选择“关”,单击“设置”。

因为灯状态为“开”,开关选择为“关”,服务后台会实时下发一条关灯命令;而设备处于离线状态,导致命令下发失败。

此时,系统会发送短信/邮件通知告知订阅用户命令下发失败;通知内容为命令下发失败的错误信息。

通知示例:【华为云】错误信息:{"error_code":"IOTDA.014016","error_msg":"Operation not allowed. The device is not online."}

设备变更为“离线”状态,请登录华为云控制台,选择“物联网 > 设备接入服务”,在左侧导航栏,选择“设备 > 所有设备”,根据设备标识码查看设备状态。
image.png

模拟器接收反应

因为当前“环境亮度”为110LUX,“灯状态”为开,查看模拟器日志区域,应该会收到关灯命令。

①若当前“环境亮度”大于“亮度阈值”,且“灯状态”为“开”,服务后台会实时下发一条关灯命令,弹窗提示会有5-10秒左右延迟,请耐心等待。

②若当前“环境亮度”小于“亮度阈值”,且“灯状态”为“开”,不会触发命令下发,直接弹窗提示设置成功。

即“环境亮度”小于“亮度阈值”,且“灯状态”为“开”或“环境亮度”大于“亮度阈值”,且“灯状态”为“关”时,不会触发命令下发;反之,则会触发实时命令下发。
image.png

模拟器发送消息,上报变更后的设备属性。

①Topic:$oc/devices/{device_id}/sys/properties/report,其中的{device_id}需要替换成实际设备ID。

②消息内容:

其中,光感强度<100,灯状态为OFF。

{"services":[{"service_id":"Sensor","properties":{"luminance":"80","light_state":"OFF"}}]}

查看Web界面

返回智慧路灯Web界面,单击“设置”,查看模拟器日志区域,会收到一条开灯命令。
image.png

删除资源

删除弹性云服务器 ECS

在华为云控制台,选择“服务列表”-> “计算”-> “弹性云服务器 ECS”进入,勾选待删除ECS服务器,如ecs-iot,选择“更多 > 删除”,在弹窗中请勾选删除弹性公网IP和数据盘后,点击“是”完成删除。

删除设备接入服务 IoTDA

在华为云控制台,选择“服务列表”->“物联网”->“设备”→“所有设备”进入所有设备列表,根据设备标识码删除设备,如123456789f。然后在左侧栏选择“产品”,删除产品,如StreetLight。

删除桌面下载的资源包

桌面双击“Xfce终端”打开Terminal,输入以下命令下载删除“HubSimulator.jar”文件。

cd Desktop/

rm HubSimulator.jar

接下来删除“SmartStreetLight.zip”压缩包。命令如下:

rm SmartStreetLight.zip

至此实验体验完毕。

总结

华为云设备接入服务(IoT Device Access)是华为云的物联网平台,提供海量设备连接上云、设备和云端双向消息通信、批量设备管理、远程控制和监控、OTA升级、设备联动规则等能力,并可将设备数据灵活流转到华为云其他服务,帮助物联网行业用户快速完成设备联网及行业应用集成。全新升级后的设备接入服务IoTDA,整合了原设备接入服务和设备管理服务的功能。

感兴趣就来一起体验一下吧~ https://www.huaweicloud.com/p...

点击关注,第一时间了解华为云新鲜技术~


华为云开发者联盟
1.4k 声望1.8k 粉丝

生于云,长于云,让开发者成为决定性力量