本系列是一个入门级别的动手实验,也是抽取了我们在做物联网开发中的最典型的应用场景,包含:
- 设备发送数据到云;
- 从云端控制设备;
- 在云端对上传的数据进行实时分析,提取有用的数据写入数据库;
- 在云端对上传的数据进行实时分析,满足某些条件时发出邮件报警;
本系列内容共分三篇文章介绍:
1.《Azure IoT Hub 动手训练营 (1)- 前置条件(准备工作)》
2.《Azure IoT Hub 动手训练营 (2)- 实验1,发送设备到云的消息和从云端控制设备(Node.js Device SDK /Service SDK)》
本文是本系列内容第三篇,以下是本文正文:
本实验使用动手实验(1)中的代码。
流分析实战(1):将Azure IoT Hub的遥测数据全部写入到 Azure SQL 数据库中;观看本节视频演示
本小节准备工作:
本小节实战:
流分析实战(2):统计过去30S内的遥测数据,当平均温度大于30°C时发送消息到Event Hub, 经由Logic app发送报警电子邮件;观看本节视频演示
- 创建Event Hub并设定为流分析的输出,阅读图文步骤
- 修改查询,阅读图文步骤
- 启动查询并在Event Hub Portal 查询结果,阅读图文步骤
- 创建Logic App并配置从Event Hub触发执行通过SMTP发送报警电子邮件,阅读图文步骤
准备工作(a)创建流分析服务
流单元设置为1:
进入流分析控制台,常用的三个功能为 输入,输出,查询:
输出设置为Azure SQL DB, 需要先创建一个Azure SQL DB。
准备工作(b)创建Azure SQL数据库
输入服务器名称,设置管理员账号和密码后,即可创建数据库逻辑服务器,然后需要,在逻辑服务器上创建数据库:
在本例中,我们修改了数据库的 计算和存储层级:
在查询编辑其中创建表:
登录的时候,会出现如下错误:
需要将错误提示中的IP地址添加到数据库防火墙中:
添加防火墙后,重新执行登录到查询编辑器:
也可以在防火墙规则中做如下设置,则不用每次手动添加Azure相关服务 对数据库的访问:
接下来在查询编辑其中创建表:
本例中创建表的sql语句如下(注:本语句仅作为流程演示,不处理索引等优化):
CREATE TABLE [dbo].[TelemetryFromIoTHub](
[DeviceName] [nvarchar](50) NULL,
[Temperature] [nvarchar](50) NULL,
[OutPutTime] [datetime] NULL
) ON [PRIMARY]
GO
点击查询编辑器中的运行按钮,将创建数据库表:
点击下图刷新按钮,即可看到新创建的数据库表:
流分析实战(1)- a.设置流分析的输入和输出
添加输入,选择”IoT 中心“:
在下拉列表中选择我们的IoTHub, 其余保持不变:
添加输出,选择“SQL 数据库”,填写输出的别名等信息,选择刚创建的数据库作为输出目标:
流分析实战(1)- b.设置流分析的查询
流分析查询,支持嵌套,如下图所示的数据结构中,可以通过 IoTHub.ConnectionDeviceId的形式取出嵌套对象的内容:
[
{
"temperature": 24.21303541882745,
"humidity": 74.61976840888555,
"EventProcessedUtcTime": "2020-04-16T07:52:14.5159152Z",
"PartitionId": 2,
"EventEnqueuedUtcTime": "2020-04-16T06:52:59.4290000Z",
"IoTHub": {
"MessageId": null,
"CorrelationId": null,
"ConnectionDeviceId": "seanyu",
"ConnectionDeviceGenerationId": "637225529989135485",
"EnqueuedTime": "2020-04-16T06:52:59.0000000",
"StreamId": null
}
},
{
"temperature": 32.67715489220832,
"humidity": 73.98847667040462,
"EventProcessedUtcTime": "2020-04-16T07:52:14.5159152Z",
"PartitionId": 2,
"EventEnqueuedUtcTime": "2020-04-16T06:52:58.4130000Z",
"IoTHub": {
"MessageId": null,
"CorrelationId": null,
"ConnectionDeviceId": "seanyu",
"ConnectionDeviceGenerationId": "637225529989135485",
"EnqueuedTime": "2020-04-16T06:52:58.0000000",
"StreamId": null
}
},
{
"temperature": 22.95865720961004,
"humidity": 64.28459895101837,
"EventProcessedUtcTime": "2020-04-16T07:52:14.5159152Z",
"PartitionId": 2,
"EventEnqueuedUtcTime": "2020-04-16T06:52:57.4130000Z",
"IoTHub": {
"MessageId": null,
"CorrelationId": null,
"ConnectionDeviceId": "seanyu",
"ConnectionDeviceGenerationId": "637225529989135485",
"EnqueuedTime": "2020-04-16T06:52:57.0000000",
"StreamId": null
}
}
]
将以下查询语句拷贝到查询对话框中:
SELECT
System.Timestamp AS OutPutTime,
IoTHub.ConnectionDeviceId AS DeviceName,
temperature AS Temperature
INTO
tosqldb
FROM
fromiothub
如下图所示:
流分析实战(1)- c.运行流分析并检查结果
在流分析概述页面,点击启动按钮,稍等片刻即可看到下方有数据流入和流出:
在SQL server查询分析器中也能查询到相应的数据:
本小节结束!
流分析实战(2):a.创建Event Hub并设定为流分析的输出
在市场中选择 Event Hubs:
选择标准层(20使用者组),其余保持默认值:
新建事件中心:
输入一个名称,其余值保持默认:
为流分析添加输出到事件中心:
输入一个输出别名,选择现有的event hub信息:
流分析实战(2):b.修改查询,将报警信息输出到事件中心
修改流分析查询:
select System.Timestamp AS OutPutTime,IoTHub.ConnectionDeviceId AS DeviceName,
Avg(temperature) AS avgtemperature into toeventhub
from fromiothub
TIMESTAMP BY EventProcessedUtcTime
GROUP BY SlidingWindow(second,30), IoTHub.ConnectionDeviceId
HAVING Avg(temperature)>30;
点击保存:
流分析实战(2):c.启动查询并在Event Hub Portal 查询结果
启动流分析:
等待一段时间后,可以看到流分析输入输出已经正常:
同时,在Event Hub概述页面中,也能看到数据流入:
至此,我们的设备遥测信息经过流分析将报警数据输出到了Event Hub事件中心中。
流分析实战(2):d.创建Logic App并配置从Event Hub触发执行通过SMTP发送报警电子邮件
创建逻辑应用:
填写逻辑应用的名称,选择区域即可创建:
创建空白的逻辑应用:
选择 EventHubs:
点击如下图所示位置:
输入名称,选择事件中心:
选择默认的策略:
从下拉列表中选择自己的Event Hub, 然后点击新步骤:
在全部中,选择SMTP:
填写SMTP的信息,请使用自己QQ邮箱等的SMTP信息,或者使用我们提供的测试用的SMTP:
注意,我们提供的测试SMTP用的人比较多,收到垃圾邮件策略的影响,可能出现邮件无法正常发送的情况。
选择必备的参数:
收件人填写自己的邮箱, 主题可以自定义,内容选择 content:
点击保存按钮保存逻辑应用:
接下来稍等片刻即可收到新邮件:
将Azure IoT Hub的遥测数据全部写入到 Azure SQL 数据库中
统计过去30S内的遥测数据,当平均温度大于30°C时发送消息到Event Hub, 经由Logic app发送报警电子邮件