物联网 - 使用 C++ 在 Visual Studio 中开发 Azure 连接的 IoT 解决方案
通过
Marc Goodner
|2016 年 4 月
物联网 (IoT) 现在是无处不在。IoT 是很多东西,但它最简单可以理解为会收集到的云中的进一步处理的传感器数据。这体现在许多不同类型的设备部署以收集这类传感器数据;引入在规模较大; 该数据的丰富的云服务大数据分析和机器学习的处理和操作对该数据;丰富的报表和客户端应用程序获得见解从这些数据。
您如何开始使用 IoT? 您需要一种设备、 云和工具来编写和部署到每个软件解决方案。
在本文中我将逐步介绍设备连接到 Azure IoT 使用 c + + 项目模板在 Visual Studio 中,其中涉及的最常见的设备。您将学习如何起立 Azure IoT 中心来引入您设备的数据,并了解有关可对该数据的相关服务。Azure IoT 服务提供了巨大的程度的灵活性,因为它们是与设备自身使用的编程语言无关,还因为,通过 Azure IoT 设备客户端 Sdk 中,它们支持的语言和设备日益增多。在本文中我将重点介绍 c + + 由于广泛的设备支持它提供 — 从给运行完整的操作系统,如 Linux 或 Windows IoT 设备最小、 最节能的微控制器 — 和由于控制权但是它提供了开发人员通过较低级别设备的功能。即使您不是 c + + 开发人员将学习足以能够简单应用程序部署到将网络连接的设备并获取数据到 Azure。
这篇文章的方案是一个简单 — — 从设备中收集光线传感器数据,到 Azure。目标不是完整的端到端解决方案,而是重点介绍基础知识-如何收集数据并验证它是否获得到云。我将展示如何在其他 Azure 服务中使用此数据以及如何在 Azure 订阅中部署这些服务。IoT 的详细信息,请访问
aka.ms/iotmsdnb16
, ,其中,您还可以找到此文章,其他文档,很多更多示例中所讨论工具的链接和完整的端到端 IoT 应用程序称为连接点,则可以轻松部署到你的 Azure 订阅,您可以连接到你的设备。
首先,我将设置 Azure IoT 中心,然后编写一些代码在 Visual Studio 中将测试数据发送到 Azure 后端。然后我执行同样的实际数据从各种设备,并演示您可以使用所收集的传感器数据的 Azure 服务的讨论的最后。
Azure IoT Suite 和 Azure IoT 中心
IoT 解决方案的云部分中,Azure 提供了多种服务,包括 Azure IoT 中心和名为 Azure IoT 套件,可减少了前期的捆绑工作,并提供了更长远的可伸缩性。Azure IoT 中心是设备的连接点进行了优化,以支持大量数据,基本功能的引入,假定数百万台设备发送不断更新的部署并不是少见。您可以选择支持最多 8000 消息每日 (非常适合于原型制作或个人项目) 或任何一个的两个付费版本的免费版,一个用于接受最多具有 400000 消息一天的项目越小,扩展为更大的实现的一个支持多达 600 万个消息一天。具体取决于您正在构建的 IoT 解决方案的规模,你可以部署尽可能多的 IoT 中心,因为您需要支持您的解决方案需要的消息量。IoT 中心还提供设备管理的功能和设置定制到 IoT 部署的需求,以及大量开放源代码 Sdk 的开发设备连接性和服务管理您的解决方案的组成部分。
Azure IoT 套件提供了不断增长的完整的端到端 IoT 解决方案、 预配置为简化开发过程的集合。其中包括诸如预测维护、 使用来自计算机的传感器数据来预测问题发生之前等常见 IoT 项目的解决方案。Azure IoT 套件解决方案包含一组预配置的 Azure IoT 服务,包括 Azure IoT 中心,且可以设置到你的 Azure 订阅,以便您可以快速部署 IoT 解决方案,然后自定义以满足您的项目的独特需求。
是否使用预配置的 Azure IoT 套件解决方案或部署您自己的 Azure 服务集时,您将使用相同 Azure IoT Sdk 开发您的应用程序的设备端。中的示例所示,我将手动设置 Azure IoT 中心实例背后一些简单的服务来说明一个简单的 IoT 的端到端解决方案。
连接到 Azure 的 IoT 中心
第一步是设置你的 Azure IoT 中心。如果你没有 Azure 订阅,您可以创建免费试用订阅。完成后,登录到 Azure 门户,选择新建 |物联网 |Azure 的 IoT 中心完成选项,并选择新建。选择定价层 (您可以部署的每个订阅的 IoT 中心免费层只有一个实例),完成附加提示,然后选择创建 (请参阅
图 1
)。
图 1 创建新的 Azure IoT 中心
接下来,请确保您拥有的 Visual Studio 2015 社区版或更高版本与 c + + 工具安装并正确配置。您需要对扩展 Visual c + + 的 Linux 开发、 Visual c + + IoT 开发和 Azure IoT 中心连接的服务,以及 Windows IoT 核心模板在计划安装针对 Windows IoT 设备。您可以找到这些扩展 Visual Studio 库上的或将它们从安装的工具的 Visual Studio 内 |扩展和更新菜单。同样,Arduino 和 mbed 的示例使用 PlatformIO 启用对于这些主板,您可以在 platformio.org 获取编译器。
现在,创建一个项目来连接到 IoT 中心。有许多 Azure IoT SDK 的示例介绍此代码,每个侧重于特定的协议或设备。获取此代码的最简单方法是安装目前支持 C# 和 c + + 项目的 Azure IoT 中心连接的服务扩展插件。我需要快速原型到我的代码之前涉及到设备,因此我要执行此操作在 Windows 上。安装后该扩展,创建新的 Win32 项目在 Visual c + + 下。
在项目中,右键单击引用并选择添加连接的服务。在来自最多、 选择 Azure IoT 中心连接的服务,并选择配置对话框 (请参阅
图 2
)。
图 2 使用 Azure 的 IoT 中心连接服务扩展
登录使用你的 Azure 帐户,就可以看到 IoT 中心。选择它并选择添加。如果你已添加的任何设备到 IoT 中心; 这将打开的现有设备的列表否则,将为空。选择新设备并选择一个名称,我们称之为 ThingOne。等待其显示出来并选择它。这会拉取具有需要和生成新的文件、 azure_iot_hub.cpp 和相应的标头 azure_iot_hub.h,包含 helper 函数来封装用于将数据发送到 Azure IoT 中心使用您选择的设备的必要的连接字符串的最佳做法的库的 NuGet 包。当然,您将需要修改所生成的代码来处理要发送和接收的消息。现在,我们会将默认的消息。添加新的标头引用在控制台应用程序代码并将对 send_device_to_cloud_message 函数的调用放在 main 中。您的代码应如下所示 ︰
#include "stdafx.h"
#include "azure_iot_hub.h"
int main()
send_device_to_cloud_message();
return 0;
接下来,使用 IoT 中心资源管理器验证您的消息要发送到 IoT 中心。这是基于 Node.js,因此,如果您的系统上尚未安装它则应立即安装跨平台 CLI 工具。获取通过 npm 工具 ︰
npm install -g iothub-explorer@latest
接下来,在命令提示符、 启动 IoT 中心浏览器来查看从您的设备发送到 Azure IoT 中心的数据。在注释 azure_iot_hub.cpp 文件的是必要的命令使用连接字符串和设备名称。若要靠您自己在 Azure 门户中查找此字符串,选择你的 IoT 中心,然后选择 Essentials 栏上的密钥图标将显示共享访问策略面板中查看。
iothub-explorer [<connection-string>} monitor-events ThingOne
您将看到一条消息,指出正在被监视的事件从您的设备。现在,切换回 Visual Studio,通过按 F5 启动调试。你应看到一个事件接收在控制台中,"Hello Cloud 中。
您可能想要暂停此处以查看生成的代码处理到 Azure 的连接。Send_device_to_cloud_message 内您将发现正在创建 IoT 客户端 ︰
IOTHUB_CLIENT_HANDLE iothub_client_handle =
IoTHubClient_CreateFromConnectionString(connection_string, AMQP_Protocol);
请注意 AMQP_Protocol,这是默认情况下,尽管也可以在此处使用其他协议,如 HTTP 和 MQTT。你将注意周围创建此客户端提供错误处理和得以正确释放。恰好在成功创建了客户端后会发送消息本身 ︰
d::string message = "Hello, Cloud!";
IOTHUB_MESSAGE_HANDLE message_handle =
IoTHubMessage_CreateFromByteArray((const unsigned char*)message.data(),
message.size());
同样,您将看到提供错误处理,并请求发送到 IoT 中心,以确认回执传送。您现在可以进行一些小的改动,以将您自己的消息发送。
当移动到使用实际的传感器时,您将检测到使用 photoresistor,也称为 Light 依赖电阻器或 LDR 的亮度,因此,让我们修改代码以发送具有一个值的消息适合于这种情况。在标头文件 azure_iot_hub.h,添加作为函数调用的参数的 int。完成后,标头的内容应如下所示 ︰
// Insert call to this function in your code:
void send_device_to_cloud_message(int);
在 send_device_to_cloud_message 函数定义中,更改消息使用传感器数据,而不是发送 Hello World 的值。下面是举例说明如何以 JSON 格式实现的 ︰
char msgText[1024];
sprintf_s(msgText, sizeof(msgText), "{\"ldrValue\":%d}", ldrValue);
std::string message = msgText;
对于更复杂的 JSON 数据或其他格式,可以使用您最喜欢的 c + + 库。
现在,更新您的主函数,以便传递一些值作为传感器数据 ︰
#include "stdafx.h"
#include "azure_iot_hub.h"
int main()
int ldrValue = 500; // value will be read from a sensor in later examples
send_device_to_cloud_message(ldrValue);
return 0;
使用 IoT 中心浏览器仍在运行,观看生成和运行您的项目的消息。您将看到一个新的事件附带 JSON 格式的数据,{ldrValue: 500 }.
祝贺您! 您现在拥有 IoT 云和一些代码已准备好与传感器连接到它绑定到设备。
设备和传感器
对于此应用程序中实际的传感器,我要使用从 Seeed Studios Grove 系统。Grove 提供范围广泛的具有与扩展板接口连接到您的设备,常见连接器的传感器,避免所需的 breadboards 和面积的焊接开发原型 IoT 解决方案。您可以当然,使用您喜欢的任何传感器或无根本如果您想要模拟设备代码中的传感器数据。特定 Grove 设备之所以演示的代码示例中以下光线传感器,部分为简单起见,因为它产生一个模拟的输出,因此我无需查找和安装特定的库,一个过程,它因平台而异。在所有示例中,传感器插入标 A0 有 Grove 扩展板上的连接器。如果您不想使用一个屏蔽,并且不适合于电路试验板,只需连接到电源,且您的主板上模拟输入插针 LDR。
该解决方案的设备部分中,我要介绍三种方法 ︰ Raspberry Pi、 Arduino 和 mbed。有许多因素考虑在内,在选择 IoT 项目中,一台设备时,这三个选项涉及一系列不同的方案。对于较小的部署,各种现成的设备可以简化开发过程。但是,对于大型部署,这些选项不是经济划算。(对于成千上万的设备的部署,从而降低硬件成本,甚至是降至美元或两个,可以有很大差别。) 如果您刚开始了解 IoT,可能因此开发的简易性胜过此类成本降至最低,但用于原型制作您可能需要考虑它。基本设置中的设备不包括在这里,但您会发现指向资料联机 aka.ms/iotmsdnb16。图 3 显示设备和传感器本节所述。
图 3 从左,Grove Hat 和光传感器附加、 与 Arduino Yun、 Grove 基本防护罩,FRDM 64 mbed 板底部 Raspberry Pi 2
在撰写本文时,Azure IoT 中心连接的服务扩展可以只向下拉动二进制库以用于在 Windows 上。Microsoft 正在为实现此目的针对其他平台。也就是说,该扩展生成的代码无法跨平台工作。在所遵循的步骤,将重新使用为处理发送到 Azure IoT 中心的消息之前生成的代码。每个设备部分用于独立的因此可以跳过的设备的部分您并不感兴趣。
Raspberry Pi Raspberry Pi 是 ARM 处理器和 GPU 的单板计算机。它可以运行各种版本的 Linux 和 Raspberry Pi 2 还支持 Windows 10 IoT。Raspberry Pi 提供极大的灵活性 — 它是完整的计算机,包括网络、 USB、 GPIO 和 HDMI (尽管它不支持模拟传感器),这要归功于充满活力的 maker 社区示例项目随之大量涌现并提供了联机帮助。成本,但不会大的灵活性 — 更高能力对备选方案和有限的选项以自定义绘制比较。因此如果您是原型制作该设备不能访问硬编码电源或将部署在较大数字,您可能还是要以另一台板开头。
本文中,我要将 Raspberry Pi 中扩充板结合使用 Grove 连接线从 Dexter 行业,还增加了模拟的支持,以及光线传感器连接到 A0。我也要使用适用于 Linux (的 Linux 开发扩展的 Visual c + + 的一部分),它可以生成和调试的代码在远程 Linux 计算机最近推出的新项目系统支持。转到文件 |新项目。Visual c + + 下 |跨平台中,选择控制台应用程序 (Linux)。这将打开一个帮助文件,介绍了此项目类型的新功能,以及如何将远程 Linux 计算机添加到项目。说明进行操作还将介绍 Azure IoT 库获取适用于 Linux 和设置 Grove 防护罩的一些提示。
从第一个项目的生成的文件复制到此项目。命名你的项目的解决方案中打开 cpp 文件并添加对 azure_iot_hub.h 的引用。现在更新 main,以连续,从设备读取的传感器数据中的代码中所示 图 4。
图 4 读取使用 Raspberry Pi 的传感器数据
#include "azure_iot_hub.h"
#include <unistd.h>
#include "grovepi.h"
int main()
int ldrValue;
while(1) {
ldrValue = analogRead(0);
send_device_to_cloud_message(ldrValue);
sleep(5);
return 0;
现在你可以运行您的应用程序从 Visual Studio 中。它将您的源复制到您指定的位置中即 Pi、 生成和运行它们。与 Visual Studio 中任何其他代码,您可以设置断点。该代码运行之后,您将看到与模拟数据一样,IoT 中心资源管理器接收到事件 {ldrValue: 1013 }.
这种支持适用于 Linux 不能局限于 Raspberry Pi;它还适用于 Intel Edison、 BeagleBone 或任何远程 Linux 计算机等其他基于 Linux 的设备。
Raspberry Pi 2 上的 Windows 10 IoT Core 是另一个选项。请参阅 windowsondevices.com 有关入门的信息。安装了这些工具后,请转到文件 |新的项目,然后在 Visual c + + Windows 和选择空白应用 (通用 Windows) 下的外观。将 UWP 对 Windows IoT 扩展的引用添加到项目中。编写本文时,有一些其他步骤所需的 UWP。请这些都是仍然需要的情况下,参阅生成的文件 azure_iot_hub.cpp 中的注释。在 mainpage.xaml.cpp 中的应用程序代码,添加对 azure_iot_hub.h 引用包含文件。
在 MainPage.xaml.h 中包含文件,添加以下私有声明 ︰
private:
const int readPin = 4;
Windows::Devices::Gpio::GpioPin ^pin_;
此代码演示如何直接从 GPIO pin 使用 UWP Api 读取。请参阅 aka.ms/iotmsdnb16 更新有关使用 c + + 使用 Grove Pi 防护罩。更新函数定义和实现,以将传感器值传递为 JSON 对象,如前面的示例中所示。
接下来,将更新在 mainpage.xaml.cpp 中,MainPage 的实现,如下所示 ︰
MainPage::MainPage()
int ldrValue;
auto gpio = GpioController::GetDefault();
pin_ = gpio->OpenPin(readPin);
pinValue = (int) pin_->Read();
send_device_to_cloud_message(ldrValue);
请确保 Azure IoT 中心侦听您的设备,然后生成和部署。从由您光线传感器流,您将看到的值的 JSON 消息。调试工作正如您所料,因为目标设备为另一台 Windows 计算机。没有在您的目标是一种 Windows IoT 设备时所需任何特殊配置。
Arduino Arduino 比可能更多 maker 项目中找到任何其它板有。由于其广泛分布的吸引力,很多其他提供程序已添加到 Arduino IDE 的对其主板的支持。传感器制造商级别是支持的同样高,且可以轻松地将其并入 Arduino IDE 的库。这些主板自身有公共提供各种数字和模拟的输入和输出中扩展 shields 如 Grove 基防护罩要添加的公共窗体因素的连接器。已由很多其他板提供程序采用该外观造型。有许多 Arduino/Genuino 板可供选择,到功能强大的 ARM 范围内的低功率 Mcu chips,并且第三方主板的丰富生态系统可用。作为开源硬件平台,所有图表都都可用,使其在大型部署中使用的优秀平台。
并非所有 Arduinos 都具有内置的不过,网络连接,因此您需要选择一个执行,或者使用将网络添加到您的设备扩展防护罩。附加 Grove 基防护罩并插入到标记为 A0 端口光线传感器。
基本 Arduino 项目称为草图,构成包含相同的名称以.ino 结尾的文件的文件夹。此文件是只是一个 c + + 文件。Arduino IDE 隐藏了大量复杂程度及其默认值绑定 API 库。有很多联机指南,涵盖了基本 Arduino 设置和使用情况;请访问 Arduino.cc 或 aka.ms/iotmsdnb16 如果您需要为指针。如果你想的更完整的 Visual Studio 功能,但想要控制在 Arduino 生态系统内且使用.ino 格式,Visual Micro 提供了从 Arduino IDE 将大部分板和库管理功能引入直接在 Visual Studio 扩展。
若要使用直接 c + + 而不是.ino 草格式,请确保您已安装 IoT 开发扩展的 Visual c + + 并创建一个新项目。然后,从 Visual c + + |跨平台上,选择空白应用程序 (IoT) 项目。这将打开一个帮助文件,说明此项目类型的新功能。请参阅有关如何添加和配置您的主板项目中的这些指令。
请参阅有关适用于 Arduino 初始化 PlatformIO 和导入所需的 Azure IoT 库项目中的自述文件。从第一个练习到 lib 文件夹和 src 文件夹到 azure_iot_hub.cpp 复制 azure_iot_hub.h 文件 ︰
#include "azure_iot_hub.h"
int lightSensorPin = 0;
int ldrValue;
void loop()
ldrValue = analogRead(lightSensorPin);
send_device_to_cloud_message(ldrValue);
delay(2000);
现在可以生成并部署代码到主板。请确保 Azure IoT 中心资源管理器正在运行,以便您可以看到在板中发送的消息。调试支持,以及。为此值变化,这样设置,请参阅项目中包含的帮助文件。
mbed ARM mbed 平台是另一个极好的选择。这是一种操作系统,用于基于 ARM 的微控制器为开发提供了一个通用框架,支持范围广泛的原型制作板由许多 ARM 芯片供应商提供的。所有这些供应商有其自己到生产环境的自定义设计的路径。对于大规模的部署,mbed 是启动的极佳位置。在 Microsoft,我们一直在使用主板 freescale 提供、 Marvel、 STMicro 和其他人。范围的选择,但是,还可以使其有点难知道从何处着手,但可以帮助在 mbed.org 优秀在线的社区。请注意您不会为实现 Raspberry Pi 或 Arduino mbed 找到多个 maker 样式项目联机。每个 ARM 供应商生成 mbed 板具有入门入门的指导;我强烈建议您那里启动。
在本文中,我要使用 freescale 提供自由 K64F 板,因为它具有内置以太网,这使它很容易地获取连接到 Internet。此板还具有标头匹配 Arduino,因此您可以使用同一个 Grove 基屏蔽连接您的传感器。附加到标记为 A0 即插即用光传感器。
同样,与 Raspberry Pi 和 Arduino 中,我在 Visual Studio 中用于微控制器支持。请确保您已安装 IoT 开发扩展的 Visual c + + 并创建一个新项目。选择 Visual c + + |跨平台 |空白应用程序 (IoT)。这将打开一个帮助文件,说明此项目类型的新功能。请参阅有关如何添加和配置您的主板项目中的这些指令。
我要为此项目将 PlatformIO 用作我的生成工具。PlatformIO 是一个灵活的系统,支持将许多不同的微型控制器平台。请参考有关适用于 mbed 目标初始化 PlatformIO 和导入所需的 Azure IoT 库项目中的自述文件。中的 lib 文件夹到第一个练习和 src 文件夹到 azure_iot_hub.cpp azure_iot_hub.h 文件复制。
更新您的程序代码中所示 图 5。
图 5 读取使用 MBed 的传感器数据
#include "azure_iot_hub.h"
#include "mbed.h"
AnalogIn lightSensorPin(A0);
float ldrSensorValue;
int ldrValue
int main()
{ while(1) {
ldrSensorValue = lightSensorPin.read();
ldrValue = (int) (ldrSensorValue * 1000);
send_device_to_cloud_message(ldrValue);
delay(2000);
现在可以生成并部署代码到主板。请确保 Azure IoT 中心资源管理器正在运行,以便您可以看到在板中发送的消息。调试支持,以及。此设置会有所不同,请参阅项目中包含的帮助文件。
使用 Azure 服务中的传感器数据
既然您已经看到了您的设备从流动到 Azure 的传感器数据,您可以将其用于任何可用的 Azure 服务。这是 Azure IoT 套件或连接点项目中的参考实现可帮助你了解可能的匹配项和环节如何连接在一起。
例如,可以处理通过 IoT 中心传入的实时信息并将其用作输入到其他服务。此处的常见模式是异常检测和通知。若要配置这种类型的警报,您将创建 IoT 中心将作为其输入 Stream Analytics 服务。接下来,将向存储 Blob 或 PowerBI,例如定义此作业的输出,然后定义一个查询来分析数据来自输入,例如寻找超过特定阈值的值。任何匹配项则会将发送给定义的输出 (请参阅 图 6)。
图 6 曾经最简单的流分析作业
您可以使用存储 Blob 作为然后会发送 SMS 警报,一个逻辑应用程序的输入,或在 PowerBI 的情况下无法用在不断变化的条件的接近实时的仪表板中。机器学习服务还提供丰富的机会来解锁从大量可以被收集,实时热路径中或通过分析历史数据的传感器数据的值。这些是几个示例。所有可供进一步处理和报表对数据的 Azure 服务,您可以实现任何 IoT 需求。
需要注意的一点是,可以使用 IoT 中心可以使用事件中心的任何位置。如果您发现的服务正在尝试使用不具有 IoT 中心选项,您需要获取事件中心兼容名称。转到 IoT 中心在 Azure 门户中,选择消息传送。在设备到云设置,您将看到对事件中心兼容的名称和终结点。
始终充分利用了 IoT 数据涉及多个服务的使用。Azure 资源管理器 (ARM) 模板可帮助您管理复杂性。在 JSON 中,编写这些模板定义用于部署,包括部署、 位置、 要使用,如此等等,值排序的 Azure 服务和它们允许您快速部署一套完整的服务,以创建一个 IoT 云后端。有关将解决方案部署到特定的 Azure 订阅在 IoT 套件内使用这些模板。因为这些模板为简单的 JSON 文件,您可以还跟踪它们的方法在版本控制系统以便在将来的部署中使用,会说从原型迁移到生产部署。
IoT 与您的未来
必须在构建物联网扮演着一个角色。如果您已经尚未向此路径下启动的希望这篇文章能激起您感兴趣。如果您已经被黑客 Arduinos 和 Raspberry Pi 设备多年以来已,可能会发现值此处介绍的新 Visual Studio c + + 功能。如果你不是 c + + 开发人员,您可能会发现这些新功能使 c + + 得更方便地使用。
没有更多的 Azure IoT 不是我在此处介绍。我介绍的基础知识,为了便于您开始使用,并提供您可以更进一步的指针。不要尝试一下。我期待看到您的生成。
请记住要访问 aka.ms/iotmsdnb16 有关更多资源,并继续学习。
Marc Goodner的项目经理,她致力于 IoT 工具在 Visual Studio 团队和 Microsoft 的车库 Maker 社区的积极参与者。他对于正常的单个 malt 深表感谢。
感谢以下的微软技术专家对本文的审阅: Olivier bloch 发布和 Artur Laksberg