传感器遥测 2.0.1
Sensor Telemetry 2.0.1 将温度数据传送到 Microsoft Azure IoT 中心,并从 Windows 通用应用程序远程监控数据。数字修复!
故事
更新:传感器遥测项目已经过数字修复。 2017 年 5 月 17 日更新并更名为 Sensor Telemetry 2.0.1
简介
概览
在这个项目中,我们将监控一个温度传感器 (MCP9808 ) 并将遥测读数发送到 Microsoft Azure IoT 中心 流分析 作业将处理消息并将它们写入 Azure SQL 数据库 桌子。我们将使用移动应用 查看传感器读数的历史记录。
应用程序
该项目包含两个通用 Windows 应用程序 (在通用 Windows 平台,UWP 上)共享大约 99% 的代码。一个针对Raspberry Pi(或ARM),另一个针对x86 或x64 平台。
该应用程序的 IoT 版本在 Raspberry Pi 上运行并从 MCP9808 读取温度。应用程序将遥测事件发送到 Azure IoT 中心和 SignalR 中心。此版本还将侦听来自 Azure IoT 中心的命令。
在计算机上启动的客户端版本将侦听来自 SignalR 集线器的传感器更新并将其显示在屏幕上。此版本还将通过 Azure IoT Hub 向 IoT 版本发送命令。
技术
本项目中的应用基于MVVM (Model-View-ViewModel) 模式并使用 Prism 构建 库并使用 Prism.Unity IoC (控制反转)容器。除了这些库之外,应用程序还使用 Event Aggregator 在 Prism.Event 中找到 库尽可能地创建一个纯事件驱动的架构。应用程序使用这个库来允许内部模块在保持松散耦合的同时进行通信。
该应用程序还在 Azure 移动应用程序上使用 SignalR 来允许应用程序的多个实例相互通信。温度读数会“广播”给所有远程运行的客户端,以便他们可以接收温度传感器读数并显示在主视图中。
架构
该应用程序的核心是作为独立项目构建的 MCP9808 库,可以在其他应用程序中重复使用。该项目是作为 UWP 库开发的,可以在任何 Windows 10 应用程序中使用。如果在没有 I2C 的设备上使用库 总线库不会返回任何设备对象。这种方法可用于“检测”传感器,并在未找到传感器时优雅地忽略库。
在 UWP 客户端应用程序中,有几个块组成了整个应用程序。视图是可见的页面,每个视图都有一个负责视图状态的视图模型。共有三个存储库:应用程序设置 (IApplicationSettingsRepository )、调试信息 (IDebugConsoleRepository ) 和读写 MCP9808 (ITemperatureRepository )。围绕 ITemperatureRepository 构建了两个具体的类; 一个封装了 MCP9808 库,一个是应用程序不在 Raspberry Pi 上运行时使用的空设备。
类Mcp9808TemperatureRepository 使用定时器服务监控 MCP9808,并在每次温度读数或警报状态发生变化时通过内部事件聚合器发布温度信息。仅当当前读数与先前读数不同时才会发送新事件。
还有一系列由IBackgroundService定义的服务 在后台运行的各种活动。
下图描绘了架构的高级视图以及各种块和服务之间的连接。
遥测服务
此服务监控温度变化事件(通过订阅),并在温度发生变化时向 Azure 服务总线事件中心发送消息。
定时器服务
这个简单的服务是一个计时器,它每 500 毫秒发布一个事件,并被视图模型用来在视图上显示当前时间。 Mcp9808TemperatureRepository 也使用它 每秒读取一次传感器。定时器事件参数包括一个计数器,可与 mod 函数一起使用,以轻松地将定时器间隔划分为所需的长度。事件参数上有一个名为 IsMyInterval(TimeSpan interval) 的方法可以为您进行数学计算。您需要做的就是将间隔提供为 TimeSpan 对象。
Alert Pin 监控服务
此服务监控连接到 MCP9808 上警报引脚的 GPIO 引脚的状态。当GPIO的值发生变化时,该服务发布一个事件。
LED 服务
此服务负责打开和关闭 LED。这是通过监控(通过订阅)温度变化事件来完成的,该事件还包括 MCP9808 的警报状态。当警报状态发生变化时,LED 会相应地更新。
按钮监控服务
此服务监控连接到按钮的 GPIO 引脚,并在按钮释放时发布事件。此事件由 Mcp9808TemperatureRepository 获取 当器件处于手动警报复位模式(MCP9808 中断模式)时。调试事件也被发布,以便可以在调试控制台中查看按钮的状态。
通知中继服务
该服务监控 SignalR 集线器和内部事件聚合器,并根据预定义的映射(使用 EventRelayMap 班级)。这实质上允许应用程序只知道内部事件系统,并且仍然能够与应用程序的其他实例发送和接收消息。
调试控制台服务
此服务监视应用程序(通过订阅)以调试事件并将它们添加到内部集合中。它还实现了DebugConsoleRepository ,它允许调试控制台视图通过视图模型在应用程序中显示这些事件。
应用初始化
当应用程序启动时,它会启动 StartPage 首先查看,它会自动调用 StartPageViewModel .这个视图模型在启动到主视图之前让所有东西都启动并运行。
入门
电路要求
该电路需要一块大型无焊面包板,以及可选的 T 形鞋匠和带状电缆(我使用 Vilros 出售的版本)。面包板可以从很多地方获得(我从当地商店和亚马逊购买)。该电路还使用了一个带有四个引脚的瞬时触觉按钮开关。有很多种;任何人都可以。最后,对于温度传感器,我使用了 Adafruit 的 MCP9808 高精度 I2C 温度传感器分线板。
电路可以在没有鞋匠的情况下构建。只需按照项目结束时的备用面包板图即可。
电路组装
使用本指南组装电路,同时使用位于页面底部附近的图表作为指南(注意:电线的颜色是可选的,并且已被选择以帮助使电路易于组装构建时跟随)。
- 将四个 LED 分别放在面包板上。
- 连接 220 Ω 的一端 电阻连接到每个 LED 的阳极,并将电阻的另一端连接到 3V3 (引脚 1 或 17)在 Raspberry Pi 上。所有四个 LED 阳极都应连接到 3V3 通过 220 Ω 电阻器。最好使用 + 之一 面包板上的导轨,用于 3V3 连接。
- 将蓝色 LED 的阴极连接到 GPIO 18 (引脚 12)在 Raspberry Pi 上。
- 将绿色 LED 的阴极连接到 GPIO 23 (引脚 16)在 Raspberry Pi 上。
- 将红色 LED 的阴极连接到 GPIO 12 (引脚 32)在 Raspberry Pi 上。
- 将黄色 LED 的阴极连接到 GPIO 16 (引脚 36)在 Raspberry Pi 上。
- 将 MCP9808 放在面包板上。
- 连接Vdd 在 MCP9808 上到 3V3 在树莓派上。
- 连接GND 在 MCP9808 上到 GND 在树莓派上。 Raspberry Pi 上的接地可以是以下任一引脚:6、9、14、20、25、30、34 和 39。
- 连接SCL 在 MCP9808 到 SCL 在 Raspberry Pi(引脚 5)上。
- 连接SDA 在 MCP9808 到 SDA 在 Raspberry Pi(引脚 3)上。
- 连接 10K Ω Alert 之间的电阻 MCP9808 和 3V3 上的引脚 在树莓派上。
- 连接警报 将 MCP9808 上的引脚连接到 GPIO 6 (引脚 31)在 Raspberry Pi 上。
- 将按钮开关放在面包板上。
- 将开关的一侧连接到 GPIO 5 (引脚 29)在 Raspberry Pi 上。
- 连接开关的另一端 GND 在树莓派上。
- 连接 10K Ω GPIO 5 之间的电阻 和3V3 在树莓派上。
以下是我使用补鞋匠建造的电路的一些照片。
Microsoft Azure 要求
如果您没有 Azure 帐户,则需要创建一个。开设帐户后,您可以获得 200 美元的信用额度。转到 azure.com 然后点击免费帐户链接 .如果您已有帐户,请通过 portal.azure.com 登录门户 .
注意:本指南不是配置 Azure 的详尽指南。如果您以前从未使用过该门户,则可能需要熟悉它。我将尽我所能完成此项目所需的步骤。
在整个设置过程中让自己登录 Azure 门户。您将需要多次参考它。
Azure IoT 事件中心设置
- 选择新建 在门户的左侧菜单中。
- 选择物联网
- 选择物联网中心
- 为您的中心输入一个唯一的名称。
- 选择订阅。
- 在资源组下 选择新建 并为您的组输入名称。请注意,您将对该项目期间创建的所有 Azure 资源使用此组。
- 选择一个位置(尽量将所有资源保持在同一区域以保持较低的费用 ).
- 如果这是您的第一个 IoT 中心,请选择定价和规模层。然后选择 F1 Free .您的帐户中可以有一个免费层。
- 最后,点击创建 并等待创建 IoT 中心。
- 点击左侧菜单中的 IoT 中心以查看新中心。
- 单击新中心可查看详细信息概览。您需要稍后再参考此视图。
创建设备
为了安全起见,Azure 物联网中心要求在中心内唯一标识和注册每个设备。可以使用 Azure SDK 和代码注册设备,但对于此项目,我们将使用 Azure SDK 中提供的设备资源管理器。
- 通过获取 zip 文件或克隆存储库,从 https://github.com/Azure/azure-iot-sdk-csharp 从 GitHub 下载 Azure SDK。
- 如果您下载了 zip 文件,请将其展开到您磁盘上的一个文件夹中。
- 打开文件夹 azure-iot-sdk–csharp-master\tools\DeviceExplorer .
- 在 Visual Studio 中打开 DeviceExplorer 项目。
- 运行应用程序。
- 返回 Azure 门户并选择您的 IoT 中心。点击共享访问政策 链接并选择 iothubowner .点击复制 连接字符串 - 主键旁边的按钮 .
- 在“设备资源管理器”窗口中,将此字符串粘贴到标有 IoT 中心连接字符串的文本框中 .
- 点击更新 按钮。
- 更改为管理层 设备资源管理器中的选项卡,然后点击创建 .
- 为您的设备输入一个名称(例如,TemperatureDevice1 ).
- 确保自动生成密钥 选中复选框并点击创建 .
- 点击完成 .
- 稍后您将需要返回此应用程序以获取设备连接字符串。
Azure SQL 数据库设置
遥测数据将存储在 Azure SQL 数据库中。使用门户创建数据库。
- 点击SQL 数据库 在门户菜单中。
- 点击添加 按钮。
- 输入数据库的名称(即 SensorTelemetry)
- 选择订阅。
- 对于资源组 选择使用现有 并选择传感器遥测 从下拉菜单中。
- 单击服务器链接以设置新服务器。
- 输入服务器的名称。
- 输入用户名(稍后您将需要它,因此请记住它 ).
- 输入密码(稍后您将需要此密码,因此请记住它 ).
- 选择一个位置(尽量将所有资源保持在同一区域以保持较低的费用 ).
- 点击选择 .
- 点击定价层 .
- 选择基本 .
- 点击选择 .
- 点击创建 .
- 单击 SQL Server 列表中的新服务器,
- 点击设置服务器防火墙 允许从您的计算机访问 SQL Server。
- 在起始 IP 和结束 IP 范围内输入连接名称和外部 IP 地址。
- 单击省略号以保存条目。
- 点击保存 以保存 IP 地址。
创建数据库表
使用的表将手动创建。 Code First 部署可以在移动应用中使用,但创建的表将与流分析不兼容。
- 打开 Visual Studio。
- 选择SQL Server 对象资源管理器 从视图 菜单。
- 右键单击 SQL Server 对象并选择添加 SQL Server .
- 浏览 Azure 数据库并选择您在上一步中创建的数据库。
- 输入您的用户名和密码,然后点击连接 .
- 展开对象资源管理器项目,直到看到您创建的数据库。
- 右键点击该数据库并选择新建查询 .
- 复制此项目页面底部的 SQL 脚本并将其粘贴到 Visual Studio 代码窗口中。
- 选择执行 来自 SQL 运行脚本的菜单。
- 在资源管理器中展开表格对象将显示新创建的名为 SensorReadings 的表格 .
创建应用服务计划
创建应用服务需要应用服务计划。
- 在门户菜单中选择应用服务计划。
- 输入计划的名称。
- 对于资源组 选择使用现有 并选择传感器遥测 从下拉菜单中。
- 选择一个位置。
- 点击定价层 并选择B1 基本 .
- 点击创建 .
创建应用服务 ( 移动应用 )
网站和 SignalR 中心将与应用服务一起运行。
- 点击新建 从门户菜单。
- 选择网络+移动 从列表中。
- 选择移动应用 .
- 输入应用程序的名称。
- 选择订阅。
- 对于资源组 选择使用现有 并选择传感器遥测 从下拉菜单中。
- 选择您在上一步中创建的应用服务计划。
- App Insights 是可选的。
- 点击创建 .
Azure 流分析设置
流分析作业将监视 IoT 中心上的数据事件并将它们写入 SQL Server 数据库。作业将由输入(IoT 中心)、输出(SQL 表)和用于选择要使用的字段的查询组成。
- 选择新建 .
- 选择数据 + 分析 从菜单中。
- 选择流分析作业 从菜单中。
- 输入作业的唯一名称。
- 选择订阅。
- 对于资源组,选择使用现有并从下拉列表中选择传感器遥测。
- 选择一个位置(尽量将所有资源保持在同一区域以保持较低的费用 ).
- 点击创建 .
- 选择更多服务> 从菜单中。
- 向下滚动到流分析 然后点击星号 .这会将其固定到门户菜单。
- 点击流分析作业 在门户菜单中。
- 选择您刚刚创建的作业。
- 点击输入 .
- 点击添加 .
- 输入输入的名称(即 SensorTelemetry-Input)。
- 将来源更改为 IoT 中心 .
- 接受其余的默认值。
- 点击创建 .
- 点击输出 .
- 点击添加 .
- 输入输出名称(即 SensorTelemetry-Output)。
- 选择SQL 数据库 作为水槽。
- 选择传感器遥测数据库。
- 输入您在创建数据库服务器时指定的用户名。
- 输入您在创建数据库服务器时指定的密码。
- 输入 传感器读数 表名。
- 点击创建 .
- 选择查询 .
- 替换文本[YourOutputAlias] 带有输出的名称(保留方括号)。
- 替换文本[YourInputAlias] 输入的名称(保留方括号)。
- 替换星号 (* ) 与此文本: [TimestampUtc]、来源、温度、IsCritical、IsAboveUpperThreshold、IsBelowLowerThreshold
- 点击保存 然后点击是 如果出现提示。
- 点击概览 在流分析作业菜单中。
- 点击开始 按钮。
- 立即选择。
- 点击开始 .
配置软件
使用页面底部的存储库链接,将代码下载为 zip 文件或将存储库克隆到您的计算机并在 Visual Studio 中打开该项目 .
配置和发布移动应用
需要将 Web 应用程序(位于 Web 文件夹中)发布到 Azure 应用服务。
- 右键点击 Visual Studio 中的项目 并选择发布 .
- 点击Microsoft Azure 应用服务 .
- 从列表中选择您的应用服务(如果这是第一次,您可能需要登录)。
- 点击确定 .
- 点击下一步 .
- 转到 Azure 门户
- 选择SQL 数据库 从门户菜单。
- 选择您的数据库。
- 点击显示数据库连接字符串 链接。
- 点击ADO.NET旁边的复制按钮 字符串。
- 返回 Visual Studio 并将此字符串粘贴到标记为 MS_TableConnectionString 的文本框中 .
- 将用户名和密码更改为您在创建 SQL Server 时设置的值。
- 点击下一步 .
- 点击发布 .
- 发布完成后,将启动指向您的新网站的浏览器。
输入 IoT 中心凭据
在运行应用程序之前,您需要在代码中输入您的 IoT 中心设备凭据。
- 在 Visual Studio 中打开项目。
- 扩展传感器遥测 UWP 下的项目 文件夹并打开 App.xaml 背后的代码 .
- 向下滚动到包含 IIotHubConfiguration 定义的部分 .
- 打开设备资源管理器 在 Visual Stduio 的另一个实例中进行项目。
- 点击“管理”标签。
- 右键单击您之前创建的设备。
- 点击复制所选设备的连接字符串 菜单中的选项。
- 返回传感器遥测项目并将连接字符串粘贴到文本{YOUR CONNECTION STRING HERE} .
- 在文本{YOUR DEVICE ID HERE}上输入设备名称 .
- 保存此文件。
- 扩展传感器遥测物联网 项目并找到 App.xaml 的隐藏代码 .
- 向下滚动到包含 IIotHubConfiguration 定义的部分 .
- 从之前的 app.cs 复制并粘贴相同的配置 文件。
输入移动应用网址
移动应用网址也需要输入到代码中。
- 在 Visual Studio 中打开项目。
- 扩展共享 项目。
- 打开 UnityConfiguration.cs .
- 向下滚动到包含 IMobileServicesConfiguration 的部分 定义。
- 打开 Azure 门户。
- 点击应用服务 .
- 选择应用服务 您为此项目创建的。
- 将鼠标悬停在网址上 然后点击复制 图标。
- 返回 Visual Studio 并将 URL 粘贴到文本{YOUR MOBILE SERVICES URL HERE} .
阅读更多详情:传感器遥测2.0.1
制造工艺