Microsoft Azure IoT Hub 应用 – 第三部分:使用云服务收集商业智能数据 BI

2016年8月18日星期四

Colibri

Introduction

这是关于 IoT 应用开发系列文章中的第三篇也是最后一篇。本文着重说明基于Auzre云服务来提供易于理解的数据可视化和商业智能。Toradex Colibri VF61 SoM 模块 + Iris 底板继续作为本次演示的可定制化单板电脑。图 1 回顾展示了本系列文章所介绍应用整体框图。

Block diagram of the application
图1:应用框图

如果读者想要了解更多关于本项目,以及如何发送数据到云端, 可以参考这个系列的前两篇文章。

Azure 是 Microsoft 提供的云服务平台,提供了多种应用如数据库,虚拟机,应用服务,机器学习,数据流分析,媒体和CDN服务,大数据解决方案,以及其他众多应用。Azure服务主要为 Iaas 和 PaaS – 分别对应Infrastructure as a Service 和 Platform as a service。IoT Hub在之前已经设置从设备获取消息,因此从现在起它的使用是透明的,但是还有另外两个Azure服务需要被使用来满足项目目标定义。

Stream Analytics 是一个用于近乎实时处理数据并将结果输出到仪表板,产生告警,导入数据库,对比当前数据流和历史数列等等功能的Azure服务。它的一些优点一是易于使用,只需要一些点击配置就可以让它工作;二是它使用类SQL语言来进行数据过滤;三是高灵活性,系统管理者可以根据项目需要配置数据流量范围从1MB/s到1GB/s;最后是低成本,服务部署是免费的,只是按照使用量付费。

Power BI 并不是一个Azure服务,而是一个Microsoft云服务,主要面向商业智能和数据可视化。虽然它并不不是Azure服务,但是可以通过Stream Analytics使用它的元数据。Power BI通过在仪表板显示相关在线数据序列信息使管理者可以利用这些信息来做决策或者洞察本质。事实上仪表板会持续刷新以便最快速度解决问题和获取机会。

现在,本项目所需的云服务已经介绍完毕,下面我们介绍如何配置这些服务。

配置Stream Analytics 和 Power BI

现在IoT Hub已经从嵌入式系统获得数据,并将这些数据提供给Stream Analytics,因此我们首先来配置Stream Analytics。在Azure portal中,选择+New > Internet of Things > Stream Analytics job,如图2所示。然后Job name必须填写,另外IoT Hub要使用的resource grouplocation必须设置。

Creating a Stream Analytics job
图 2: 创建Stream Analytics job

成功部署后,可以直接通过portal 主页来访问,结果显示如下图3。Job Topology 部分展示一些信息和输入配置, Query描述以及输出配置 – 这些会在本文后续一一解释。 Monitoring部分是可配置的,用于显示如输入和输出事件数量随时间变化,数据转换错误,乱序事件和其他选项等信息。然后还有一个Settings选项卡可做一些额外的调整配置。

Main Stream Analytics job panel
图 3: Stream Analytics 主面板

为了将IoT Hub配置为输入,点击Inputs并选择add选项,然后一个新input选项卡会打开,如下图4所示。Input Alias可以随意填写,Source必须选择为IoT Hub,然后IIoT HubShared Access Policy NameShared Access Policy Key须填写对应的IoT Hub信息 (如何获取这些信息请参考本系列文章的第一部分);其他选项可以保留默认配置即可。

Input settings for the Stream Analytics
图 4: Stream Analytics 输入设置

在设置Power BI为输出之前,由于其并不是Azure服务的一部分,我们首先需要创建一个账号。可以登陆Power BI 网站完成创建并且基本版本是免费的。注册完成后,页面会跳转到Power BI 界面,不过我们需要先配置Stream Analytics输出后再来配置Power BI。

我们只能在 management Azure portal 进行操作并通过recent 特性连接两个服务。打开后,从所有条目列表中选择Stream Analytics ,然后打开 outputs 选项卡,在页面下方点击 add output 按钮。最后在最近打开的窗口里面选择Power BI,如下图5所示。

Select the Stream Analytics output
图 5: Stream Analytics 输出选择

如需要,如下图6所示点击 Authorize Now 来授权连接。登陆到Power BI链接的Microsoft 账户。

Authorizing the Power BI as a Stream Analytics output
图 6: 授权 Power BI 做为 Stream Analytics 输出

然后如下图7所示,选择output alias, dataset nametable name, 如果你愿意也可以都保持一致。现在Stream Analytics 输出已经配置为发送数据到Power BI。

Configuring the Stream Analytics output
图 7: 配置 Stream Analytics 输出
Stream Analytics 查询: 筛选数据提供给 Power BI

既然Stream Analytics使用类SQL语言来定义其行为,我们可以将其作为一个数据筛选器使用,即输入信息只有满足特定条件时候才输出。为了阐述这个可能性,在这个例程中查询完成两个不同的工作:首先为了减小输出数据工作量,通过使用 tumbling window,将输入数据组织为10s window。举例说明,如果嵌入式系统每1秒钟发送数据给IoT Hub,那么每10个输入目标中只有1个会被发送给Power BI。但是问题是哪一个会被选择?发送给多数据会不会更好?

回答第一个问题,数据可以通过不同集合方式组织,如求和,平均值,标准差,最大值,出现概率或其他排序方式。详细说明可以参考这里。关于第二个问题,使用window的好处是如果输出应用有接受数据的限制,使用window可以保证在不超过应用限制的前提下保证数据完整性。在本文特定的项目中只有一个嵌入式设备发送数据到云端,这个可能不是问题,但是如果有大量设备连接或者少量设备但发送大量数据的情况, 使用window则是一个非常好的选择。

第二个主要工作是通过发送符合下面状态的数据到输出端 – 不论是驾驶者太靠近另一辆车,突然刹车或者翻车,来识别驾驶者的危险行为甚至事故。这些状态是否有用取决于谁在查看Power BI仪表板:例如如果管理者想要学习车温度和另一辆车距直接的关联,这些条件设置就不会很有用,因此IoT开发者必然要问:我需要什么样的输出?

已经部署的查询代码请见如下。注意在 SELECT 字段处,max, minavg功能用于组织window 变量,另外一些变量重新命名了;count函数用于记录假设的事故或危险情况发生数量。INTO字段指定数据应采用什么输出,这个必须和之前配置好的output alias一致。FROM字段同样设置好需要使用的input。 GROUP BY 字段定义了window时间和未分组变量,如识别字符串。WHERE 字段则为危险情况筛选。同样注意这个筛选器虽然是一个简单模型,但可以通过使用更多对比变量和其他精细数学模型来改进为实际使用场景。

SELECT  
System.Timestamp AS myTimestamp,  
   ObjectName as carIdentifier,  
   Avg(temp) AS temperature, -- degree celsius  
Min(acceleration.accel_x) AS accel_x, -- metres per second squared  
Max(acceleration.accel_y) AS accel_y,  
Min(acceleration.accel_z) AS accel_z,  
Max(gyroscope.gyro_x) AS gyro_x, -- degree per second 
Max(gyroscope.gyro_y) AS gyro_y,  
Max(gyroscope.gyro_z) AS gyro_z,  
Max(CAST(gps.latitude AS bigint)) AS latitude,  
Max(CAST(gps.longitude AS bigint)) AS longitude,  
Max(CAST(gps.altitude AS bigint)) AS altitude,  
Max(CAST(gps.speed AS bigint)) AS speed,  
Min(distance) AS distance, 
Count(Min(distance)) AS accidents 
INTO  
   powerbi  
FROM  
   iothub  
WHERE  
--car overturned 
   acceleration.accel_z < 0   
--sudden braking (randomly chosen value)  
   OR acceleration.accel_x < -2  
--too close to the next vehicle while at high speed (> 40km/h)  
   OR (distance < 1.5 AND gps.speed > 11.11)  
GROUP BY  
TumblingWindow(ss, 10),  
ObjectName 

最后可以通过Azure portal界面进入Stream Analytics 工作页面后点击start开始。通常会需要几十秒到几分钟时间来启动。

创建Power BI 仪表板

为了创建一个Power BI仪表板,首先需要确认所有需要的系统已经运行:Stream Analytics 工作,IoT Hub 和 Toradex 嵌入式系统。然后通过浏览器登陆Power BI,左边栏会显示Datasets菜单,Stream Analytics 输出数据会在这里自动显示 (只有当Stream Analytics筛选器至少发出一个数据后才会显示)。选择这个,如下图8所示。

Creating a Power BI dashboard
图 8: 创建一个 Power BI 仪表板

现在可以选择一个数据可视化选项,如一个线状图表或者一个表格。本文使用柱状图来显示危险状态和事故可视化数据,同时用一个仪表来指示有多少这种状况发生。除了可以选择标准样式,也可以自定义或者从 community customized models 下载。

下面我们来创建一个堆叠柱状图为例。如下图9(a),axis 栏设置为 mytimestamplegend 栏设置为 caridentifier,然后 value 栏设置为 distance;当然legend和title是可编辑的,另外添加一个数值为0.5的参考线以便于更直观的发现和另外一辆车的车距已经太小,如图9(b)所示。图10展示了翻车和突然刹车事件的图表和事故统计的仪表。在进入下一步骤之前,我们需要先保存当前报告。

Creating chart and adding values

(a)

Creating chart and adding visuals

(b)
图 9: 创建图表并添加(a)数值 和 (b)图形
Power BI report
图 10: Power BI 报告

如果想要这些图表实时更新,需要将他们每一个都添加到仪表板。不过报告本身需要重新加载页面才能刷新数据 (至少至文本完成时还是这样)。首先,从左边栏创建一个新的仪表板,如之前的图8所示。然后进入报告后,在每个图表的右上角有个 pin visual 选项,用这个可以将图表添加到仪表板。

下图11展示了从车获取的数据结果,实施方案如下:为了获取真是的汽车数据,遥控汽车被放到了一台真实汽车里面。为了满足Stream Analytics的筛选条件,横向加速度被采用来模拟重力,因为其始终为负值;车加速度就是真是加速度数据;因为遥控车是放在真是汽车里面,因此车距基本上始终小于0.5m。另外,整个系统并未装备3G或者Sigfox,而是通过手机作为WIFI路由使用。在图片下面,还有一个视频展示实时仪表板,温度图表创建以及从仪表板快照生成PDF文档。

Final dashboard from the Power BI
图 11: 最终的 Power BI 仪表板
youtube picture

到此本系列关于如何创建一个端到端的IoT应用的文章已经结束。当然,本文只是给想关注这个领域的读者一个概览,或者对想对IoT初步了解的读者一个指南,因为还有很多的可能性以及Toradex嵌入式系统适合的方案在这里并没有列出。希望本系列文章是有帮助的,同时在这里要感谢来自巴西的 Grupo Viceri团队提供Azure和商业智能方面的经验,最终使得这个IoT 汽车项目可以顺利合作完成。以后再见!

参考

本博客最初以葡萄牙语发表于Embarcados.com,请见 这里.

#IoT (Internet of Things) #Microsoft Azure IoT #NXP® Vybrid™
Author Leonardo Graboski Veiga, Toradex Brasil

Leave a comment

Your email ID will be kept confidential. Required fields are marked *


请填写上面所示的字符。不区分大小写。



* Your comment will be reviewed and then added. Thank you.