一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

在这篇你将会接触到:从物联网工程师从硬件层-通信层到应用层全流程;开发华为云最基本的一些产品介绍和布局,使用将通过虚拟设备与华为云学习设备接入与使用;随后你将会通过一个STM32-ESP8266-MQTT-华为云的实例演示MQTT通讯、不同硬件设备上数据格式的处理转化以及一些最基础的通信知识;最后通过官方提供的IAM账号,挑战实时处理工业的数据流,建立数据通道,掌握好基本的算子的概念并学会运用它处理数据。

文章目录

华为云创建和IOT区块部分

因为华为云中的IOT和各个区块混杂在一起,所以很不容易找到这个IOT,所以在开始之前先来简单地介绍一下华为云的基本的操作页面。

当你登录并注册时,你会进入到华为云的主页,无论什么时候你绕晕了就回到这个主页面

官网链接
https://www.huaweicloud.com

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

现在你可以看下上面的一行栏目,比较重要的是三个东西:产品、开发者和控制台。开发者点进去是有大量的教程和认证课程等,有时间可以学习一下。第二个是控制台,IOT这块用的较少,在后面的服务器搭建这篇博客中我会详细每步都截图来讲明白。

产品是比较重要的,他在栏目的上方

产品这里你可以找到华为云的所有服务,正式因为这里的服务太多了,所以非常容易绕晕,下图即为产品页面,一共20个服务,这里我们只讲IOT的服务。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

这里就是我们要用的IOT服务模块,我们直接从这里开始,智能硬件是华为自家的设备我相信一般很少工业上买到,一般都是西门子等一些工业品牌。

所以我们的重点是物联网云服务,把工业数据接入到华为云并做出数据分析与数据模型建立。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
然后点击进入管理控制台,正式开始物联网云平台的搭建,这里就是物联网工程师工作的控制台。
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 虚拟设备-设备接入演示

我先来简单通俗讲一下设备接入的全流程,这个就是设备接入的整个流程,我们要做的事情:
1、先定义一个产品(叫什么名字,用什么通信协议、数据格式是什么等等,虽然理论上选择范围很多,但是工业上用的就那几套)
2、定义一个设备(就是你的端侧设备,这里主要是设定要密钥这些的链接验证方式、设备ID这些)
3、数据规则(我们云平台用什么数据格式发,设备用什么格式,是小数还是整数都要规定好)
4、这些数据存储在那里,既然我们用了华为云,肯定物联网的云优势就在这里,就是存储数据和数据处理这两方面。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
你可以在总览这里查看刚才说的每一个部分。
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

1.创建产品

点红色的那个创建产品,其他随便填,只是一个名称,但是数据格式如果使用我们的虚拟设备的话可以选择JSON格式

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

点击创建即可
然后你可以点一下这个产品的查看,这里有很多我们要用的信息,数据格式那里是我一开始做错了,是JSON的。这个页面别急着关掉,我们要在这里开始定义物模型,点开下面的红色的创建服务,开始干活。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 2.自定义物模型(定义服务-属性/命令)

这里的名字你随便起,这里提供三级的定义。我举个例子,比如说我要监控共享汽车设备状态还有天气的温湿度计的设备,这个设备就叫服务。

那对于第一个车子设备我想要知道他的两个情况:位置,即经纬度和是不是启动的,这个就叫做设备的属性。

所以我们先来创建第一个服务,车子设备,名字你随意起,添加服务如下:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
然后你需要点击添加属性来添加两个属性:位置和开车与否
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

添加属性时候你需要做的一下几个事情,其他的随便填:
1、定义属性是否可读可写
2、设备的取值范围
3、数据类型,浮点数还是整数等等

这里由于是使用虚拟设备来传输,什么数据都行,一般都是可读可写浮点比较多

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

最后如下图

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

3.注册设备(注册完成后状态显示未激活)

定义好华为云端的这些要接收和传输的信息以后,现在就可以继续点击设备,选择所有设备,然后右上角有个红色的注册设备,点击开始创建设备。

所属资源空间可以选择默认的,也可以去买一个自己超大盘,其实这个涉及云盘的一些内容就不扩充了。
其他的内容都是随拜填,设备认证选择密钥,密钥是比较流行的认证类型,然后密码自己填。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
创建出来如下图
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
你需要点击查看,里面我们需要的信息ID信息,为接下里做准备,这是我的页面,等会需要在这里提取设备ID。
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 4.MQTT虚拟生成设备

华为官方推荐的那个生成器需要依赖Java环境,我不推荐使用,这里用我这个,这也可以在下面的链接下载。

https://www.yuque.com/docs/share/48cb3122-a049-4268-83bc-9354776991cf?#

如果没办法下载,你也可以到CSDN上搜MQTT虚拟设备发送什么的,都可以下载的,但是都是VIP或者收费的,所以首选上面的下载链接,也可以私聊我发给你。

为了方便展示,我在设备把页面换成中文了。

解压好是如下图的页面的页面,链接名称写你的设备名称,比如手我定义的是test,然后第二个英文的是写你的设备ID,第三行是你的密钥密码,其他就不用调整了

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

然后进入如下页面

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

这个时候你查看自己的华为云设备这一个区块,你可以看到设备显示在线。说明这个时候你就成功了。接下来模拟设备接收与发送。

3.上报/订阅Topic发送json格式数据测试平台设备是否能正常接受到数据

接下来你按照下面的一个输入做出一些尝试,在topic输入下面的上报的代码,然后在下面的数据块总发送json格式的代码块
上报数据TOPIC:o c / d e v i c e s / d e v i c e i d / s y s / m e s s a g e s / u p 订 阅 消 息 T O P I C : oc/devices/{device_id}/sys/messages/up 订阅消息TOPIC:o c /d e v i c e s /d e v i c e i ​d /s y s /m e s s a g e s /u p 订阅消息T O P I C :oc/devices/{device_id}/sys/messages/down

device_id写上面我提到的设备ID

JSON数据格式:
{
“services”: [
{
“service_id”: “Track”,
“properties”: {
“Longitude”: 113.6320,
“Latitude”: 34.7685
}
},
{
“service_id”: “Sensor”,
“properties”: {
“Temperature”: 85.26,
“Humidity”: 35.8
}
}
]
}

代码如下图

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

当然topic指令并不是仅仅是简单的两句话,你可以打开产品那一栏点击查看,有一些列的代码指令提供参考

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

然后你在云端可以接收到我们虚拟设备的发送的消息,然后这边已经显示出来了。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
你可以点开来查看这个消息,由于一开始我设置成了二进制格式,这里发送的JSON的格式,所以只呈现我发送的数据原码,可以看下官方的数据格式

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

你可以在运维监控这里看到这些链接的设备

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

同时你可以在监控运维下的消息跟踪查看所有的消息历史记录

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 云端下发命令和控制

你也可以选择在设备管理中找到自己的设备,然后查看,你在上面一栏有个命令,你点开选择下图的同步命令下发,看下你的虚拟设备接收情况。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
最后随着设备接入的越来越多,回到总览这里查看所有设备的介入情况
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

ESP8266-STM32-传感器结合以实现端侧数据收集[MQTT]

前面这部分为了使的演示简单明了,同时也考虑到大部分的小伙伴看这篇博客是没有硬件在手,所以采用了虚拟设备进行云链接,现在我们开始展示硬件的云通信。

在这里主要的通讯模块是ESP8266,因为笔者实在是太菜,对NB-IOT或者4/5G模块或者LoRa的理解还不够深入,所以用这个例子来讲解MQTT的传输。

MQTT简介

MQTT可以为一种网络协议,是通讯的语言,比如说大家熟知的java、python、C/C+都是编程语言。而物联网设备间沟通的语言,就是网络协议。设备间想相互交流,通信双方必须使用同一种”语言”。比如说你和中国人问好说’你好’、日本人问好要说’こんにちは’、和英国人问好要说’hello’.

我以前在郭朝斌”物联网开发实战”中曾经听到是这么解释MQTT的重要性的,这里例子非常生动:

物联网的网络通信特点是物联网设备很大可能工作在不可靠、高延迟的网络环境中。 并且物联网系统中,设备数量多,而且交互非常复杂。比如家里的环境监测,温度、湿度、光照、二氧化碳、甲醛含量……这些都需要不同的设备测量,而且每个房间用到的设备也不同。如果让云平台的服务对每个设备分别做权限控制和数据阈值设置,这会非常麻烦。

因为当数据的”生产者”和”消费者”直接交互时,要是没有中间角色基于共同的目标协调,双方的耦合度会很大,导致系统很难实现。 这时候,需要把家为一个整体来处理,交互逻辑就会变得简单多了。设备经常需要根据实际使用环境做增加、减少等调整。

所以基于上述的这些特点,物联网系统在选择网络通信的协议时,一般采用一种发布-订阅式的结构。

发布 – 订阅模式

发布 – 订阅模式包含三个角色,分别是发布者、经纪人和订阅者,它们的关系如下图所示

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 消息传递的过程可以分为三步:

1.发布者(设备)负责生产数据。发布者发送某个主题的数据给经纪人,发布者不知道订阅者。
2.订阅经纪人管理的某个或者某几个主题。
3.当经纪人接收到某个主题的数据时,将数据发送给这个主题的所有订阅者。

比如说当使用美团外卖点一分午餐,这时候发布订单给外卖订单中心服务器时,外卖订单中心收到订单之后,再把订单发送给店家

发布 – 订阅模式之所以适合物联网系统因为在物联网场景中,一个传感器数据需要触发多个服务或者终端执行动作。
比如红外传感器,当它检测到有人体靠近时,就需要触发一系列动作:通知摄像头拍照,声光报警器执行报警,推送消息给主人的手机等。
怎么满足这种需求呢?我们最好让摄像头、声光报警器和手机都订阅”人体靠近”这个主题消息。当红外传感器被触发时,它发送人体靠近的消息,然后这些设备就能同时收到这个消息,接着完成系统定义的那些动作。这就是发布 – 订阅模式的工作方式。

MQTT 协议就是发布 – 订阅模式中的大佬,所以MQTT在物联网使用的范围非常广泛。

MQTT

MQTT它有三个主要特点:

1.采用二进制的消息内容编码格式,所以二进制数据、JSON 和图片等负载内容都可以方便传输。(华为云也是仅仅支持JSON和二进制)
2.协议头很紧凑,协议交互也简单,保证了网络传输流量很小。
3.支持 3 种 QoS(Quality of Service,服务质量)级别,便于应用根据不同的场景需求灵活选择。

这三个特点,让 MQTT 协议非常适合计算能力有限、网络带宽低、信号不稳定的远程设备,所以它成为了物联网系统事实上的网络协议标准。

请求 – 响应模式

请求 – 响应模式有两个角色,一个是客户端,另一个是服务器。
客户端是请求数据或者服务的一方。服务器则用来接收客户端的请求,并提供相应的数据或者服务。服务器在收到请求后,会获取数据,对资源数据(比如数据库)进行加工处理,准备好响应,然后返回给客户端。
请求 – 响应模式是无状态的通信方式,每个完整的请求 – 响应都是相互独立的。进一步细分的话,它还可以分为同步和异步两种。你可以看下这张图片。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

如果我们使用华为云的话,华为云就是我们的服务器,而我们的设备就是我们的客户端。之所以要采用云的工作方式,就是为了提高我们对数据加工处理的能力。

好,一般来说,ESP8266都是通过WI-FI来通信,但是方式和硬件设备条件有一些不同,有以下两种产品:
第一种是独立的开发版,有独立的处理器与充足的I/O管脚的,像下图

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
第二种是通讯模块,需要搭配板子使用,期间是信息传递的桥梁,将信息传输的平台,然后把平台传输会设备。烧录器上面那个芯片就是我们的WI-FI模块
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

接下来我们主要详细讲将STM32和ESP8266模块这种搭配为例子

; STM32+ESP8266+MQTT+华为云

这里参考一位大佬的博客,大家感兴趣可以去看下
https://blog.csdn.net/hao1__/article/details/121050775

首先我来说下这里完成的工作:
华为云
1、获取端口、域名、WI-FI、ClientId、Username、Password
2、自定义操作topic
STM32端
1、ST-Link仿真器、STM32、ESP8266硬件连接
2、配置、填写和写入topic

最后云端获取温湿度数据以及控制继电器开关

获取端口、域名、WI-FI、ClientId、Username、Password

1、WI-FI
这个只需要准备好你家的WI-FI名字和密码就可以

2、端口-域名
你根据下图的提示,在总览这里找到MQTT华为这端的域名和端口

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

3、ClientId、Username、Password
这三个需要进入到点击进入生产工具网址,进行三元组信息生产。
生成工具网址:
https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
将我们在华为云的ID地址和密钥复制进去,将生成之后生成ClientId、Username、Password复制保存

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 自定义操作topic

我们上面已经接触过用topic进行数据的传输,这里我们自定义一个topic,跟着下面三张图的讲解就可以完成,但是还是要提醒一下,topic不可以直接用,而是把{ deviceId_ID}需要替换成自己的ID

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

ST-Link仿真器、STM32、ESP8266硬件连接

这个设备用的是stm32l,需要加装一个ST-Link,同时将ESP8266模块直接装入板子进行配置。一起来看下吧
一、材料准备
准备以下材料

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

将ESP8266模块插进去

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
将串口线一端插入到STM32L的USB口,另一端插入到电脑的USB口
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

连接ST-Link仿真器
用3条杜邦线接入STM32L的 DIO、GND、CLK中

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
另一头的杜邦线接入仿真器,仿真器USB接口接入电脑。
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 配置、填写和烧录

代码在QQ讨论群下载
131322621

配置ST-Link仿真器

打开代码,点击配置仿真器

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 填写

现在需要通讯的的那几个要素(端口、域名、WI-FI、ClientId、Username、Password )依次填入

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

填入自定义topic,来触发特定的指令,比如说传输温湿度、打开关闭

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

校验结果

写两个数据上传到华为云

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

你可以在特定的指令中下达我们特定的topic,然后开关继电器

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 数据格式问题

这里要强调数据格式问题,一个是JSON格式、一个是二进制数据流格式,在上面接入设备的时候你就会发现一个问题,如果不同格式的发送到华为云平台,虽然不会报错,但是只可以接收到一段完整的代码,而不能提取出其中的数据,所以正确的格式在多设备的数据处理中尤其重要。

这里有篇博客写的非常好,解决了ESP8266和STM32两个设备中的格式转化问题,下面它的链接:
https://blog.csdn.net/qq_44857700/article/details/112388324?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen

实现方式
首先以这两个作为例子,剩下的不论是什么设备都是这流程:
1、安装当下环境的JSON解析库
2、串口接收的实现
3、JSON库对数据进行解析
4、JSON数据再处理打包发送

在这里ESP8266按装的Arduino的环境(ArduinoJson库),STM32按装的是Keil5的环境(Jansson库),这和上面那个例子是一样的,都是Keil环境。

串口接收的实现

在ESP8266程序中需要将usartEvent();函数放到loop()函数中。

/*串口数据接收*/
void usartEvent(){
  comdata = "";
  while (Serial.available())//时刻读取硬件串口数据
  {
    comdata = Serial.readStringUntil('\n');//从串口缓存区读取字符到一个字符串型变量,直至读完或遇到某终止字符。
    UserData(comdata);//进行JOSN数据解析
  }
  while (Serial.read() >= 0){}//清除串口缓存
}

ArduinoJson库实现数据解析

/*数据解析{status:true}*/
void UserData(String content){
  StaticJsonDocument<200> doc;//&#x7533;&#x8BF7;JSON&#x89E3;&#x6790;&#x7A7A;&#x95F4;
  DeserializationError error = deserializeJson(doc,content);
  if (error) {//&#x89E3;&#x6790;&#x9519;&#x8BEF;
    Serial.print(F("deserializeJson() failed: "));
    return;
  }
  status=  doc["status"];
}
</200>

ArduinoJson库实现数据的打包发送

参照ArduinoJson库的JsonGeneratorExample工程即可得到以下代码,当然也可采用serial.println()函数进行格式化输出。

  StaticJsonDocument<200> doc;
  doc["sensor"] = "gps";
  doc["time"] = 1351824120;
  serializeJsonPretty(doc, Serial);
</200>

STM32部分

STM32同ESP8266一样,我会从以下四部分介绍:①JSON解析库的安装②串口接收的实现③JSON库实现数据解析④JSON数据的打包发送

JSON解析库的安装

关于这个库还没有下载的小伙伴可以参照这个博客安装:
【STM32上使用JSON – 羊羊得亿 – 博客园】https://www.cnblogs.com/yangxuli/p/7885225.html

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 串口接收的实现

STM32的串口中断我才用的是串口空闲中断,空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断。
代码实现如下:
需要定义的全局变量:u8 buf1_size = 0;//串口数据接收数量标记 bool data_change = 0;//串口接收完成/变化标志位

#include <stdarg.h>
#include <string.h>
void USART1_printf (char *fmt, ...){
    char buffer[USART1_REC_LEN+1];  // &#x6570;&#x636E;&#x957F;&#x5EA6;
    u8 i = 0;
    va_list arg_ptr;
    va_start(arg_ptr, fmt);
    vsnprintf(buffer, USART1_REC_LEN+1, fmt, arg_ptr);
    while ((i < USART1_REC_LEN) && (i < strlen(buffer))){
        USART_SendData(USART1, (u8) buffer[i++]);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    }
    va_end(arg_ptr);
}

void USART1_Init(u32 bound){ //&#x4E32;&#x53E3;1&#x521D;&#x59CB;&#x5316;
    //GPIO&#x7AEF;&#x53E3;&#x8BBE;&#x7F6E;
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //&#x4F7F;&#x80FD;USART1&#xFF0C;GPIOA&#x65F6;&#x949F;
     //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //&#x590D;&#x7528;&#x63A8;&#x633D;&#x8F93;&#x51FA;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //USART1_RX   PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//&#x6D6E;&#x7A7A;&#x8F93;&#x5165;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   //Usart1 NVIC &#x914D;&#x7F6E;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//&#x62A2;&#x5360;&#x4F18;&#x5148;&#x7EA7;3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //&#x5B50;&#x4F18;&#x5148;&#x7EA7;3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ&#x901A;&#x9053;&#x4F7F;&#x80FD;
    NVIC_Init(&NVIC_InitStructure); //&#x6839;&#x636E;&#x6307;&#x5B9A;&#x7684;&#x53C2;&#x6570;&#x521D;&#x59CB;&#x5316;VIC&#x5BC4;&#x5B58;&#x5668;
    //USART &#x521D;&#x59CB;&#x5316;&#x8BBE;&#x7F6E;
    USART_InitStructure.USART_BaudRate = bound;//&#x4E00;&#x822C;&#x8BBE;&#x7F6E;&#x4E3A;9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//&#x5B57;&#x957F;&#x4E3A;8&#x4F4D;&#x6570;&#x636E;&#x683C;&#x5F0F;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//&#x4E00;&#x4E2A;&#x505C;&#x6B62;&#x4F4D;
    USART_InitStructure.USART_Parity = USART_Parity_No;//&#x65E0;&#x5947;&#x5076;&#x6821;&#x9A8C;&#x4F4D;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//&#x65E0;&#x786C;&#x4EF6;&#x6570;&#x636E;&#x6D41;&#x63A7;&#x5236;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //&#x6536;&#x53D1;&#x6A21;&#x5F0F;
    USART_Init(USART1, &USART_InitStructure); //&#x521D;&#x59CB;&#x5316;&#x4E32;&#x53E3;
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//&#x5F00;&#x542F;ENABLE/&#x5173;&#x95ED;DISABLE&#x4E32;&#x53E3;&#x63A5;&#x6536;&#x4E2D;&#x65AD;
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//&#x5F00;&#x542F;&#x4E32;&#x53E3;&#x7A7A;&#x95F2;&#x4E2D;&#x65AD;
    USART_Cmd(USART1, ENABLE);                    //&#x4F7F;&#x80FD;&#x4E32;&#x53E3;
}

void USART1_IRQHandler(void){ //&#x4E32;&#x53E3;1&#x4E2D;&#x65AD;&#x670D;&#x52A1;&#x7A0B;&#x5E8F;&#xFF08;&#x56FA;&#x5B9A;&#x7684;&#x51FD;&#x6570;&#x540D;&#x4E0D;&#x80FD;&#x4FEE;&#x6539;&#xFF09;
    u8 clear = clear;
    USART_ClearFlag(USART1,USART_FLAG_TC);

    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)//&#x4E32;&#x53E3;&#x4E2D;&#x65AD;&#x53D1;&#x751F;
    {
        if(data_change == 0)//&#x91CD;&#x65B0;&#x63A5;&#x6536;
        {
            memset(USART1_RX_BUF,0,sizeof(USART1_RX_BUF));//&#x6E05;&#x7A7A;&#x6574;&#x4E2A;&#x63A5;&#x6536;&#x6570;&#x7EC4;
            data_change = 1;//&#x6807;&#x5FD7;&#x4F4D;&#x62C9;&#x9AD8;
        }
        USART1_RX_BUF[buf1_size++]=USART1->DR;
    }

    else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)//&#x7A7A;&#x95F2;&#x4E2D;&#x65AD;&#x53D1;&#x751F;
    {
        buf1_size = 0;
        data_change = 0;//&#x6807;&#x5FD7;&#x4F4D;&#x62C9;&#x4F4E;&#xFF0C;&#x4E0B;&#x6B21;&#x6570;&#x636E;&#x6539;&#x53D8;&#x8FDB;&#x5165;
        data_sys = 1;//&#x5141;&#x8BB8;&#x89E3;&#x6790;

        clear = USART1->SR;//&#x7A7A;&#x95F2;&#x4E2D;&#x65AD;&#x8981;&#x8BFB;&#x8FD9;&#x4E24;&#x4E2A;&#x5BC4;&#x5B58;&#x5668;
        clear = USART1->DR;
        USART_ClearITPendingBit(USART1,USART_IT_IDLE);//&#x6E05;&#x9664;&#x7A7A;&#x95F2;&#x4E2D;&#x65AD;&#x6807;&#x5FD7;&#x4F4D;
    }
}
</string.h></stdarg.h>

JSON库实现数据解析

JSON库解析需要调用头文件#include

#include <jansson.h>
bool led_status;
//&#x5F00;&#x5173;&#x706F;JSON&#x51FD;&#x6570;{"status":true}
//&#x5B58;&#x5728;&#x95EE;&#x9898;!!&#x4F7F;&#x7528;&#x672C;&#x51FD;&#x6570;&#x89E3;&#x6790;&#x540E;&#x4E32;&#x53E3;printf&#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#xFF0C;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;USART1_printf&#x51FD;&#x6570;&#x5B9E;&#x73B0;&#x53D1;&#x9001;
/**
* @brief  Json&#x89E3;&#x6790;&#x51FD;&#x6570;
* @param none
* @return
* - 0 &#x8F6C;&#x6362;&#x6210;&#x529F;
* - 1 &#x8F6C;&#x6362;&#x5931;&#x8D25;
* @details
*/
uint8_t Jansson_Analysis(char *text)
{
    json_error_t error;
    json_t *root;

    root = json_loads((const char*)text, 0, &error);
    if(json_is_object(root))
    {
        status = json_object_get(root, "status");
        if(json_is_true(status))
            led_status = 1;
        else if(json_is_false(status))
            led_status = 0;
    }
    else
    {
        USART1_printf("root format error:%d-%s\r\n", error.line, error.text);
        return 1;
    }
    json_decref(root);//&#x91CA;&#x653E;JSON&#x7A7A;&#x95F4;
    return 0;
}
/*
// string &#x7C7B;&#x578B;&#x7684;&#x89E3;&#x6790;
name = (char *)json_string_value(json_object_get(root, "name"));
// int &#x7C7B;&#x578B;&#x7684;&#x89E3;&#x6790;
age = json_integer_value(json_object_get(root, "age"));
// double &#x7C7B;&#x578B;&#x7684;&#x89E3;&#x6790;
score = json_real_value(json_object_get(root, "score"));
// bool &#x7C7B;&#x578B;&#x7684;&#x89E3;&#x6790;
status = json_object_get(root, "status");
if(json_is_true(status))
else if(json_is_false(status))
*/
</jansson.h>

JSON数据的打包发送

Jansson包提供了一个json数据打包的函数,但此函数在打包过程中会占用极大的片内空间,因此在这里仅介绍给大家,不推荐大家使用,推荐大家使用的方法还是使用printf函数进行格式化输出。

/**
* @brief  &#x5C06;&#x6570;&#x636E;&#x6253;&#x5305;&#x4E3A;Json&#x683C;&#x5F0F;
* @param [in] status
* @return none
* @details
*/
void jansson_pack(bool state)
{
    json_t *root;
    char *out;
    /* Build the JSON object */
    root = json_pack("{sb}","status",status);
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("%s",out);
    json_decref(root);//&#x91CA;&#x653E;JSON&#x7A7A;&#x95F4;
    free(out);//&#x91CA;&#x653E;JSON&#x7A7A;&#x95F4;
}
/*
s &#x4EE3;&#x8868;string&#x7C7B;&#x578B;
b &#x4EE3;&#x8868;bool&#x7C7B;&#x578B;
d &#x4EE3;&#x8868;int&#x7C7B;&#x578B;
f &#x4EE3;&#x8868;float&#x3001;double&#x7C7B;&#x578B;
*/

使用printf格式化输出只需要:

printf("{\"status\":%d}",status);

实时数据分析

关于实时的数据分析,这里一般都没有现成的实时数据流,但是幸运的是华为云官方提供了三个Demo,可以登录在他们的IAM用户使用,将下面的3个账号中的一个依次填入到登录的IAM界面中
账号1
IoTAnalyticsDemo
IoTAnalyticsDemo1
IoTAnalyticsDemo
账号2
IoTAnalyticsDemo
IoTAnalyticsDemo2
IoTAnalyticsDemo
账号3
IoTAnalyticsDemo
IoTAnalyticsDemo3
IoTAnalyticsDemo

你需要退出自己的账号,然后回到原来的页面

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

上面三个账号随便一个都可以使用,都是官方提供的

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

还是和第一次的一样,点开产品,点IOT物联网,点IOT数据分析,然后点开始使用开始我们的开发工作。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

你会进入到工作台中,

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
首先先了解一下整个数据分析的结构吧。
首先数据分析主要由以下的步骤组成:

1 、配置数据源
配置与IoT数据分析服务交互的外部数据源。
2、 创建数据管道
通过数据管道进行数据预处理和数据流控制。
3 、配置存储
完成老化策略配置,将数据导入存储。
4 、资产建模
基于业务述求,为物理对象创建出一个实时映射的数字镜像。
5 、数据分析
选择合适的数据分析方式,开启数据探索。
6 、结果导出
将分析结果导出并下载到本地,或转到第三方存储中。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

用于做分析的数据源有以下的来源,可以根据实际的工业需求进行选择,这次演示用的IoTDA实时数据源做分析。
IoTDA实时数据源
DIS数据源
DMS(kafka)数据源
离线数据源
API数据源

这里详细说下IoTDA实时数据源,等会要用的呢

; 添加IoTDA实时数据源

操作步骤
1、访问并登录”IoT数据分析”服务控制台,点击”立即使用”。
2、在左侧导航栏选择”数据源>IoTDA实时数据源”,点击页面中”立即授权”按钮进行确认授权。以便后续IoTA服务与IoTDA服务能够互相访问租户数据。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
3、确认授权后,点击”添加数据源”,输入数据源名称、在实例下拉列表中选择1个您名下的IoTDA设备接入服务实例、并在产品栏选择您需要把该IoTDA实例下哪些产品的数据上报到数据分析服务中,然后点击”确定”。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

创建数据管道

1、访问并登录”IoT数据分析”服务控制台,点击”立即使用”。
2、在左侧导航栏选择”数据管理”,进入数据管道页面,在”管理列表”点击”创建数据管道”。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

3、弹出”创建数据管道”对话框,您可自行填写”作业名称”、”描述”,并选择数据源

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

使用IoTDA数据源时,系统会自动读取该数据源的相关信息及相关的产品信息,生成作业执行流程,如图所示。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

上图所示示例中,所选择的IoTDA数据源包含两种设备:烟感设备与水表,系统自动生成了两个处理分支,分别用于处理这两种设备上报的数据。

这两个分支各自以一个”产品过滤”算子作为起始点,分别过滤出这两种设备的数据,以便于各续处理流程仅处理某一种产品的数据,如图所示。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

系统还自动根据这两种设备的产品信息(该产品信息以安全的方式从IoTDA获取),生成了默认的输出配置。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

请用户自行选择存储组,并填写存储名称,补齐配置内容即可保存,如图所示。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 处理流程-数据源配置、清洗与输出

数据源配置

1、IoTDA数据源
在画布上选中”IoT设备接入数据源”算子,在右侧配置面板处,可修改算子名称、选择数据源、填写事件时间字段路径、时间格式,如图。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
2、DIS数据源配置
在画布上选中”DIS数据源”算子,在右侧配置面板处,可修改算子名称、选择数据源、填写事件时间字段路径、时间格式、时区,如图。
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 数据清洗

目前提供了产品过滤、增改属性类、删除属性类、过滤消息类、增加消息类、规约消息类几个类型的数据清洗算子。增加清洗步骤的操作方式为,在算子节点上点击右键,可以看到”向前”、”向后”两个菜单,如图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

接下来,以产品过滤、数据计算、选择属性、数据过滤、超时插补、数据聚合为例,分别介绍一下不同类型的算子配置。各个算子配置的详细说明请参考”算子使用指南”。

1、产品过滤
“产品过滤”仅可添加在”IoT设备接入数据源”算子后,因此,仅在”IoT设备接入数据源”算子上点击右键时,可以看到”产品过滤”算子。
添加好算子节点后,在算子节点上点击鼠标左键,即可打开右侧的算子配置面板,如图:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

系统会根据所选择的产品,自动生成该算子的输出内容:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

2、数据计算
按照表达式进行数值计算,计算的结果赋值给源属性。
添加好算子节点后,在算子节点上点击鼠标左键,即可打开右侧的算子配置面板,如图:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

3、选择属性
在输入数据中选择保留的属性,未选择的属性被删除。当数据字段较多时,用户可使用该功能筛选出业务所关系的字段。
添加好算子节点后,在算子节点上点击鼠标左键,即可打开右侧的算子配置面板,如图:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

使用该配置筛选出batteryLevel与batteryVoltage两个字段,因为后续处理流程仅使用这两个字段。

4、数据过滤
根据设置的条件过滤数据,满足条件的数据则输出,不满足条件的数据将被丢弃。
添加好算子节点后,在算子节点上点击鼠标左键,即可打开右侧的算子配置面板,如图:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

使用该配置过滤出batteryLevel不等于0且batteryVoltage大于100的数据。
数据过滤算子不会修改数据输出,用户可展开”输出”项检查输出内容。

5、超时插补
提供基于时间的数据插补功能。时间支持延迟等待时长,以及指定固定时间点。插补数据为上一条实际数据,但是事件时间为插补计算出的时间。
添加好算子节点后,在算子节点上点击鼠标左键,即可打开右侧的算子配置面板,如图:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

6、数据聚合
数据聚合算子,对数据流中的数据根据窗口周期进行汇聚计算。
添加好算子节点后,在算子节点上点击鼠标左键,即可打开右侧的算子配置面板,如图:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

数据输出

将数据输出到IoTA的存储,以便进一步分析(资产建模、实时分析、时序分析、离线分析)使用。
用户可以配置算子名称、选择存储组、填写存储名称,并选择所需要的属性及属性类型等信息,如图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 运行数据管道

数据管道编辑完成后,作业状态会变为”就绪”态,如图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

“就绪”态的作业即可运行:在”管理列表页”点击作业卡片,进入”作业详情页”,然后点击右上角的红色按钮”启动作业”。

启动作业时,系统会自行判断用户的作业是否需要实时计算资源,若需要实时计算资源,则会弹出如下对话框供用户自行选择:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

模型与资产

1、创建资产模型
点击”新建”,如下图1中①所示
输入模型名称、显示名称,点击确定,如下图1中②所示
图1 新增模型

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

2、添加属性信息
手动添加
点击手动添加,如下图1中①所示
输入名称、显示名称、选择属性类别、数据类型、属性值(指属性的默认值)、范围和单位,点击确定,如下图1中②所示;在单位定义时,系统已预置一系列常用单位,若无合适单位、用户可手动输入自定义单位。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

快速添加

IoTA提供了快速批量添加属性的功能,用户可以将在存储管理中定义的物的各种属性快速引入到资产模型中,引用时需要指定存储位置,具体步骤如下:

点击快速添加,如下图2中①所示
选择数据存储,如下图2中②所示
输入范围,勾选要添加的属性,点击确定,如下图2中③所示。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

3、添加分析任务
点击添加分析任务,如下图1中①所示
输入名称,选择类型,完成输入参数、表达式的定义,并把分析任务的输出映射到具体所需的属性后点击确定即可,如下图1中②所示;分析任务概念详细介绍请见分析任务定义。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
1、创建资产
在资产管理页,点击”新建资产”,如下图1中①所示
输入名称,选择模型,点击确定,如下图1中②所示
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 数据分析

在进过了上面这么多步骤以后,就可以对数据进行分析了,根据不同的数据源有三种分析:实时分析、实时分析、离线分析:
1、实时分析
这里提供了丰富的IoT实时处理算子以及提供相应的编排开发IDE,适合用来一站式的开发、调测、部署、监控实时作业,可以满足IoT行业各种实时数据分析场景。
2、实时分析
针对IoT数据的显著时序特征,基于物联网资产模型提供海量时序数据的存储和多种时间维度的聚合计算能力,丰富的图表分析方式让数据规律清晰可见。
3、离线分析
通过标准 SQL开发数据分析任务,并轻松处理TB-EB级别海量数据,可在报表统计、设备行为分析等无需实时处理数据的场景使用。

接下里我们就用一个演示来把前面全部过程都贯穿一遍。

实例演示-使用IoTA实现电子工厂SMT产线OEE分析实践

这是官方提供的一个经典案例,通过跑这个案例,你可以基本熟悉实时数据分析的全流程。

总体流程介绍

从设备侧到应用侧端到端数据分析过程

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 1、主流程说明:

设备上报数据(也可基于设备模拟器)

基于标准物模型,设备定时通过MQTT协议自动上报设备属性数据。

IoT设备接入服务

通过配置设备数据转发规则将设备属性数据和设备消息到IoTA服务。

IoT数据分析服务

基于数据管道接收设备数据,并通过资产建模和计算分析能力,实时计算生成产线和设备OEE相关数据,判断数据是存存在异常信息。

3D应用:

通过调用IoTA的API获取数据,以3D形式展示产线和设备,可查看产线和设备OEE,设备关键指标,告警等故障信息,同时可查到相关历史数据。

2、IoTA内部主要分析流程说明

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 3、开通IoT数据分析服务。

登录华为云,搜索”IoTA”,在产品主页点击”立即使用”,进入IoTA服务Console页面,此时会自动开通IoTA服务。

4、设备管理服务授权配置

完成IoTDA服务授权配置

5、创建管道作业接入IoTDA数据

分析数据的第一步需要将SMT设备上报的数据接入到IoTA服务,基于IoTDA服务授权配置后,数据即会从IoTDA服务自动转发到IoTA中,通过创建管道作业可将从IoTDA转发的数据接入,用户通过构建管道作业实现对设备数据进行清洗,规整,去重,增加外部业务属性信息等一系列处理,为下一步基于资产模型分析设备属性数据做好准备,本案例中管道作业为计算设备OEE相关指标准备好基础数据。

6、创建SMT产线和设备资产模型

为了构建物联网领域业务对象的数字孪生模型,IoT数据分析服务参考软件工程中面向对象的思想提供了”资产建模”能力,其中核心概念包括资产模型和资产,模型包括属性(类属性)和分析任务(类方法),对物理世界事物构建数字资产模型时,必须先定义好资产模型、然后再创建资产,即要先定义好SMT产线和设备的资产模型,再基于设备模型实例化创建设备资产。

7、创建SMT产线和设备资产

在完成SMT产线和设备模型构建后,用户可通过该模型,实例化创建对应的资产,包括工厂,产线,设备资产,发布资产后,结合前端管道作业输出的设备数据,可实时监控资产的运行状态。
详细操作请参考 创建SMT产线和设备资产。

8、使用资产模型实时计算产线和设备OEE及设备数据异常分析

在完成SMT产线和设备模型及资产构建后,系统自动根据模型结合资产数据计算引擎,根据设备上报的数据对SMT产线和设备OEE进行实时计算,通过Console可对设备状态、设备关键属性、设备数据异常告警等进行实时监控。

9、第三方应用实时呈现SMT产线和设备数据分析结果

IoTA当前提供标准API对外开放数据,包括设备原始数据,资产快照和历史数据,第三方应用通过API实时获取SMT产线的各项分析结果,包括设备OEE,设备状态、设备关键属性、数据异常告警,设备属性历史数据等进行实时呈现。

实例演示

创建管道与IOTDA数据接入

在开始前因为整个流程涉及的算术非常复杂,这里我不会展示具体某个流程的算数或者详细配置,这也不利用我们对整个流程掌握,我尽量将整个流程简化再简化。

1、创建管道作业,进入IoTA Console,选择左侧导航栏”数据管道”,然后点击右侧”创建数据管道”。

这里的数据源倒入部分就没有展示,数据源可以参考上面的流程,只需要两步即可倒入

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

输入作业名称,描述,选择数据源”IoTDA”类型,点击”确定”进入作业编辑页面。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 2、进入管道作业编辑页面,系统默认为作业配置了”IoT设备接入数据源”,”产品过滤”,”数据存储输出” 3个算子,如下图所示。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
3、添加存储组, 点击某一个存储输出算子,比如印刷机存储输出算子,右侧配置存储组名称中点击下方的”添加”,然后输入存储组名称”SMT-Demo-Storage”,点击右侧图标,保存配置。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 4、添加存储,比如印刷机存储输出算子,在”数据存储名称”中点击添加,输入存储名称”Printing1″点击右侧图标,保存配置。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
5、重复步骤3,步骤4,将其它5个设备输出算子配置好数据存储名称,配置完成点击右上角”保存”,保存成功后可在存储管理页面中查看已创建好的存储组和存储名称。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 6、为打印机添加”数据计算算子”,右键点击算子图标,弹出菜单中选择”数据计算”算子,如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

为了整体流程更加简洁明了,这里不对算子进行过多讲解

7、为打印机再添加”数据计算算子”,右键点击算子图标,弹出菜单中选择”数据计算”算子,如下图所示

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

算子的配置如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 8、为打印机再添加”数据过滤”算子,右键点击算子图标,弹出菜单中选择”数据计算”算子,如下图所示

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
9、重复步骤6~步骤8将其它设备分支添同样的算子进行处理,配置后的效果如下图所示

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 10、为印刷机增加计划工作状态属性, 右键点击IoTDA数据源算子弹出”添加产品过滤”算子图标,

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
产品过滤算子的参数和上面的印刷机分支相同
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
11、增加超时插补算子,右键点击增加”超时插补”算子,算子配置如下:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 12、为印刷机增加”数据计算”算子,用于转换时间格式,配置方法与步骤6相同
13、为印刷机增加”数据计算”算子,用于增加增加PlanningWorkStatus属性,算子参数配置如下

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 14、为印刷机增加数据输出算子,用于将设备计划工作状态数据输出到存储中,算子配置如下图所示

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
15、重复步骤10~步骤14为其它5种SMT设备分别增加设备计划工作状态属性数据,最终完成后如下图效果:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 16、点击右上角保存,并启动作业。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

启动成功后,约1分钟左右,作业状态为”运行中”表示作业正常运行。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

创建SMT产线和设备资产模型

注意:这里我对大量的表格和数据进行了删减,主要是强调开发过程的流程和步骤掌握,因为每个工业的算子和算法都不一样,所以更加关注的对平台的使用

1、创建设备模型:印刷机模型,在IoTA Console中左侧导航栏中选择”资产建模”,”模型”,点击上方”新建”

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

输入模型名称: Printing, 显示名称: “印刷机”,点击”确定”保存。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 2、为印刷机增加属性,点击 属性信息下方”快速添加”按钮,可从数据存储中快速导入印刷机属性字段,减少手工操作。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

在数据存储中下拉选择”Printing”存储名称,勾选所有导入的属性,然后点击”确定”保存。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

导入后效果如下

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
3、为印刷机增加静态类型和分析任务类型的属性,通过界面”手动添加”方式,按照”设备公共性属性列表”的参数进行配置。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 4、为印刷机模型增加分析任务,通过界面”添加分析任务”,按照”设备公共分析任务列表”的参数进行配置。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
5、重复步骤1~步骤5 创建其它5种设备的模型。
6、创建产线模型

点击新建,弹出模型对话框,输入模型名称:”ProductLine”,显示名称:”产线”, 点击”确定”。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 7、添加产线模型的属性信息。

在左侧模型导航栏上选择上一步创建的”ProductLine”模型, 在”属性信息”页面点击 “手动添加”,如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

在对话框中输入属性相关信息,包括名称,显示名称,属性类别,数据类型,单位等信息。然后点击”确定 “完成添加属性。如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

完成后效果图

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
8、添加产线模型的分析任务

选择分析任务页面,点击”添加分析任务”。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
弹出对话框中,参考下图和表格输入相关信息,若输入参数较多,通过”添加参数” 逐个增加参数。
一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 9、创建工厂模型

点击新建,弹出模型对话框,输入模型名称:”Factory”,显示名称:”工厂”, 点击”确定”。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
10、至此工厂,产线,设备的模型已创建完成,如下图如示。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 创建SMT产线和设备资产模型

1、创建设备模型:印刷机模型,在IoTA Console中左侧导航栏中选择”资产建模”,”模型”,点击上方”新建”

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
输入模型名称: Printing, 显示名称: “印刷机”,点击”确定”保存。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 2、为印刷机增加属性,点击 属性信息下方”快速添加”按钮,可从数据存储中快速导入印刷机属性字段,减少手工操作。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
在数据存储中下拉选择”Printing”存储名称,勾选所有导入的属性,然后点击”确定”保存。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
导入后效果如下

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
3、为印刷机增加静态类型和分析任务类型的属性,通过界面”手动添加”方式,按照”设备公共性属性列表”的参数进行配置。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 4、为印刷机模型增加分析任务,通过界面”添加分析任务”,按照”设备公共分析任务列表”的参数进行配置。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
5、重复步骤1~步骤5 创建其它5种设备的模型。

创建产线模型

6、点击新建,弹出模型对话框,输入模型名称:”ProductLine”,显示名称:”产线”, 点击”确定”。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 7、添加产线模型的属性信息。

在左侧模型导航栏上选择上一步创建的”ProductLine”模型, 在”属性信息”页面点击 “手动添加”,如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

在对话框中输入属性相关信息,包括名称,显示名称,属性类别,数据类型,单位等信息。然后点击”确定 “完成添加属性。如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

完成添加后的效果如下图所示。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
8、添加产线模型的分析任务

选择分析任务页面,点击”添加分析任务”。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

完成配置后的效果如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 9、创建工厂模型

点击新建,弹出模型对话框,输入模型名称:”Factory”,显示名称:”工厂”, 点击”确定”。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
10、至此工厂,产线,设备的模型已创建完成,如下图如示。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

; 使用资产模型实时计算产线和设备OEE

1、从IoTA导航栏,点击”资产建模型”,再点击”资产”,选择已创建的”SMTFactoryDemo”进入资产界面。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 2、选择进入资产监控页面。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
3、选择某一设备资产,比如选择”印刷机”设备,可实时查看当前设备上报的所有测量类型属性数据,同时也能查看所有计算任务类型属性的实时结果数据。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 4、选择产线资产,比如”SMT产线1″,可以实时查看到当前产线的OEE相关的指标计算结果。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
5、查看某个设备资产的历史数据,比如查看印刷机的历史数据,点击选择印刷机资产,点击属性值右边的图标,即可查看当前设备资产的历史数据时序分析图,比如查看资产属性的平均值曲线。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)
; 6、通过点击右上角的,可查看资产时序历史原始数据。

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

第三方应用实时呈现数据分析结果

1、点击 http://123.60.210.97:8088/ 打开终端贴片产线应用。
2、可点击某个设备查看此设备的关键属性值,及此设备的OEE指标,同时可查看产线或设备的历史数据,如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

3、查看设备数据异常告警事件,点击设备中的黄色感叹号图标,会显示设备属性的异常数据信息,如下图所示:

一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

Original: https://blog.csdn.net/weixin_47567401/article/details/122740792
Author: 翼达口香糖
Title: 一文解锁华为云新技能-AIOT开发全流程【设备接入-ESP端侧数据收集[MQTT]-实时数据分析】(步步截图较详细)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/600257/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球