2016 年 4 月

第 31 卷,第 4 期

现代应用 - 编写适用于物联网的 UWP Apps

通过 Frank La La

在技术行业的最常用的短语之一现在是"物联网,"通常缩写为 IoT。IoT 承诺要将每个设备转变为智能设备通过连接到云。从云中,设备可以提供控制面和原始数据。照相机可以被远程控制。可以收集数据,并将其进行分析的模式,并深入分析。

而发生了许多文章 MSDN 杂志 》 上如何收集和分析这些设备中的数据,但尚未从硬件或线路透视的任何讨论。但是,使用这两个英尺跳转到 IoT 可能需要开发人员掌握新技能,如电子产品设计,电力,并在某些情况下,面积的焊接。开发人员而言,实际上就是非常愿意编写代码,但速度就不再那么熟悉的线路和电子束射基础虚拟世界中的所有内容。许多软件开发人员可能会发现自己想知道如何处理 solderless breadboards、 跨接电缆和反对方获得。本专栏将介绍其用途。

当然,可编程设备已经存在了多年。编写对这些设备的代码,但是,通常需要专用工具集和昂贵的原型制作硬件的额外知识。Raspberry Pi 2 模型 B 可以运行 Windows 10 IoT 核心,Windows 10 的特殊版本。Windows 10 IoT 核心是从 Windows 开发人员中心 IoT 网站免费下载 dev.windows.com/iot。现在,在 Raspberry Pi 2 上运行 Windows 10 IoT Core,通用 Windows 平台 (UWP) 开发人员可以利用其现有代码和技术。

在本专栏中,我将创建在 Raspberry Pi 2 运行一个 UWP 应用,并将基于数据的天气 API LED 指示灯闪烁。我将介绍 IoT 概念、 Raspberry Pi 2 模型 B 硬件和如何控制从 C# 代码。

项目: Frost 监视

随着春天使返回感兴趣的天气,许多积极 await 开始再次园艺的机会。但是,在许多领域的早期 spring 也可以将几个寒冷天气快照。我想知道寒冷天气是否在预测 Frost 能严重园艺因此损坏系统。为此,我将在屏幕上显示一条消息如果预测的低低于 38 ° f (3.3 摄氏度)。应用程序也迅速将作为额外的警告闪烁 LED。

除了通常需要通过编写于 UWP 应用的软件,我将需要具有某些额外的硬件。当然,我需要能够在其上部署我的解决方案 Raspberry Pi 2 模型 B。我还需要 MicroSD 卡、 一个 LED 指示灯、 220 Ohm 电阻器、 solderless 电路试验板、 跳线电线、 USB 鼠标和键盘和 HDMI 监视器。

Raspberry Pi 2 模型 B Raspberry Pi 2 模型 B 是我会将我 UWP 应用程序部署到其上的计算机。Raspberry Pi 2 包含 40 pin (请参阅 图 1),某些其中的常规用途输入/输出 (GPIO) 的 pin。使用代码时,我将能够操作或读取这些引脚的状态。每个 pin 具有两个值之一 ︰ 高或低 — 高,不适用于较高的电压和更低的电压低。这让我打开或关闭的指示灯。

Raspbery Pi 2 模型 B 引出线图
图 1 Raspbery Pi 2 模型 B 引出线图

MicroSD 卡 MicroSD 卡行为在 Raspberry Pi 2 硬盘驱动器。这是该设备将在其中查找着它的启动文件和操作系统。它是 UWP 应用程序中,一次部署时,将所在的位置。我侥幸心理 SD 卡尽可能小为 4 GB,但建议将有 8 GB。正常情况下,项目要求确定所需的卡的大小。如果,例如,我需要将大量的传感器数据本地存储在上载之前,我将需要更大的 SD 卡来支持更大的本地文件存储区。

Solderless 电路试验板和跳线电线 为了连接到 Raspberry Pi 2 组件,我将需要创建电子束射从 Raspberry Pi 2 通过我的组件,并返回到 Raspberry Pi 2 遵循的路径。这被称为一条线路。尽管我可以使用任意数量的方式将部件连接在一起,速度最快且最简单方式是 solderless 电路试验板。名称可以看出,我不需要焊接组件在一起以创建线路。我将使用跳线电缆来建立连接。Solderless 电路试验板我用于此项目的类型具有 30 行和套接字的 10 个列。请注意,列有两个分组分为五部分:"从 a 到 e"和"通过 j f"。 每个孔通过电气连接到在其行和列组中的每个其他漏洞。原因说明了为什么会成为明显很快。

LED 指示灯和电阻器 在此项目中,我将连接到 Raspberry Pi 2 主板的指示灯。Raspberry Pi 2 上的针操作 5 伏。指示灯,但是,将刻录在此电压。注册会减少额外的能源,以确保线路 LED 指示灯安全。

以太网电缆、 USB 鼠标和键盘和 HDMI 监视器 Raspberry Pi 2 模型 B 具有四个 USB 端口、 以太网插孔和 HDMI 输出之间的其他连接器。一旦 UWP 应用在设备上运行时,我可以与其进行交互非常非常相似,就好像在 PC 或平板电脑上因为我有一个显示并将能够输入邮政编码以下载特定区域的预测。

将 Windows 放到 Raspberry Pi 2

若要开始使用 Windows 10 IoT Core,我按照上的指示执行 bit.ly/1O25Vxl。第一步是下载 Windows 10 IoT 核心工具在 bit.ly/1GBq9XR。Windows 10 IoT 核心工具包含用于处理 IoT 设备的实用工具,WindowsIoTImageHelper 和 WindowsIoTWatcher。WindowsIoTImageHelper 提供了一个 GUI 以设置到 SD 卡与 Windows IoT 核心启动文件的格式。WindowsIoTWatcher 是一个实用工具,定期扫描本地网络中的 Windows IoT 核心设备。我将使用它们很快。

连接硬件

要启动的 IoT 创建解决方案,我需要使"thing"要使用的。这是许多开发人员查找最令人生畏 IoT 项目的一部分。大多数开发人员都习惯于代码中,通过移动 bits 不一定为电子束射周围都能够在一起绑定部分。为了使简单,我将非常基本的闪烁 LED 指示灯项目 (bit.ly/1O25Vxl),但增强使用来自 Internet 的实时数据。基本硬件设备是相同的 ︰ 指示灯、 solderless 电路试验板、 跨接电缆和 220 Ohm 电阻器。

Raspberry Pi 2 模型 B 有大量的 GPIO 引脚。可以通过代码操作多个插针的状态。但是,某些这些引脚保留了函数,并且不能通过代码控制。幸运的是,有便利的关系图,每个 pin 的用途。关系图所示 图 1 又称为"引出线",提供的电路板的接口映射。

设计一条线路

从根本上说,我需要创建是电子束射中所示通过流动的电路 图 2。电子束射启动刚开始在针 1,标记为 3.3 v 中的电源 图 1。此 pin 提供 3.3 v 到线路的电量,并就会亮起 LED 此电源。事实上,3.3 v 是 LED 指示灯过多电源。若要防止它精疲力竭了,我将电阻器放在线路以消减一些电能。接下来电路上是 GPIO 5,这引出线关系图中,根据是物理 pin 29。此 pin,可以通过代码来控制,使 LED 指示灯"智能"。 我可以将输出电压此刻度格设置为任一 high (3.3 伏) 或较低的 (0 伏) 和 LED 指示灯将是开还是关,分别。

线路关系图
图 2 线路关系图

生成一条线路

现在,就可以生成中所示的电路 图 2。为此,我需要采用一个跳线电缆的一端孔并将其连接到 Raspberry Pi 2 上的插针 29。然后,我将另一端,男性结束时,放入我 solderless 电路试验板上的插槽中。我选择,第 7 行 e 列。接下来,我采取 LED 指示灯并将在较短的路线放置到槽中,第 7 行处列 a、 将其他、 较长 LED 放入位于第 8 行、 的槽时列。现在,我采取电阻器并置于第 8 行、 列 c,另一端插入行月 15 日,列 c 的一端。最后,我将第二个跳线电缆的男性一端置于位于行 15,槽列,并将插孔的一端连接到 Raspberry Pi 2 上的针 1。完成所有这些操作后,我有些东西看起来像 图 3

Raspberry Pi 2 在透明塑料的情况下与已完成的布线
图 3 Raspberry Pi 2 透明塑料用例中使用的已完成的布线

引导启动设备

有了 Windows IoT Core 安装到 MicroSD 卡后,我会将插入 Raspberry Pi 2 的 SD 卡。然后,我连接网络电缆、 USB 鼠标和 HDMI 监视器,并插入 Raspberry Pi 2。设备会启动并最终中显示的屏幕 图 4 会弹出的向上 (我记下的设备名称和 IP 地址)。

在 Raspberry Pi 2 的 Windows IoT Core 上默认信息屏幕
图 4 在 Raspberry Pi 2 的 Windows IoT Core 上的默认信息屏幕

编写软件

与硬件安装完成时,我现在可以在我的 IoT 项目的软件部分工作。在 Visual Studio 中创建 IoT 项目很容易。它本质上是与任何其他 UWP 项目相同。与往常一样,我通过选择文件来创建我的项目 |在 Visual Studio 2015,并选择空白应用 (通用 Windows) 作为模板的新项目。我选择调用我的项目"WeatherBlink。" 一次在项目加载我需要为 UWP 添加对 Windows IoT 扩展的引用。右键单击引用在我的解决方案在解决方案资源管理器和对话框中,如下所示,检查 Windows IoT 扩展 Extensions 下 UWP 在通用 Windows 树中 (请参阅 图 5)。最后,我单击确定。

为 Visual Studio 2015 中 UWP 添加对 Windows IoT 扩展的引用
图 5 的 Visual Studio 2015 中 UWP 添加对 Windows IoT 扩展的引用

现在,我已添加到我的项目的正确引用,我将添加以下 using 语句到 MainPage.xaml.cs 文件的顶部 ︰

using Windows.Devices.Gpio;

Windows.Devices.Gpio 命名空间包含所有的功能,我需要访问 GPIO Raspberry Pi 2 上的插针。设置状态的给定 pin 非常简单。例如,下面的代码将针 5 的值设置为高:

var gpioController = GpioController.GetDefault();
gpioPin = gpioController.OpenPin(5);
  gpioPin.Write(GpioPinValue.High);

读取插针的值是一样简单 ︰

var currentPinValue = gpioPin.Read();

因为 GPIO 引脚是需要在应用程序之间共享的资源,很容易地通过类范围变量对它们进行管理 ︰

private GpioPin gpioPin;
private GpioPinValue gpioPinValue;

并将其初始化中一种常用方法 ︰

private void InitializeGPIO()
{
  var gpioController = GpioController.GetDefault();
  gpioPin = gpioController.OpenPin(5);
  gpioPinValue = GpioPinValue.High;
  gpioPin.Write(gpioPinValue);
  gpioPin.SetDriveMode(GpioPinDriveMode.Output);
}

创建简单的用户界面

由于这是一个 UWP 应用程序,我有权访问的完整 Windows 10 UWP 界面控件。这意味着我 IoT 只能有一个具有在我的部件没有额外的工作完全交互的接口。许多 IoT 实现都是"无头,",这意味着它们有没有用户界面。

此项目将有一个简单的 UI,将显示一条消息,根据天气预报。如果键盘和鼠标连接到 Raspberry Pi 2,最终用户将能够输入邮政编码并相应地,如中所示更新的天气预报信息 图 6

WeatherBlink UWP 应用程序的用户界面
图 6 WeatherBlink UWP 应用程序的 UI

借助智能设备

为了使我的 IoT 设备天气预报意识到,我需要以从 Internet 下载天气数据。由于这是一个 UWP 应用程序,我有所有的库和工具访问给我。我选择从中获取天气数据 openweathermap.org/api, ,它用于 JSON 格式的给定位置提供天气数据。Kelvin 给出了所有温度结果。图 7 显示我的代码是否检查天气和更改的闪烁根据结果的速率。通常情况下,一旦空气温度到达大约 38 ° f (3.3 摄氏度),将发出 frost 警告。如果没有更 frost 的机会,我希望 LED 闪烁,快速以向我发送警报我园处于逼近的危险。否则,我希望 LED 闪烁缓慢,以便让我知道还有到设备的电源。由于 REST API 调用和分析 JSON 响应 UWP 中的是正确涵盖的主题,我省略了该特定的代码,为简洁起见。

图 7 检查天气和的闪烁速率

private async void LoadWeatherData()
{
  double minTempDouble = await GetMinTempForecast();
  // 38F/3.3C = 276.483 Kelvin
  if (minTempDouble <= 276.483)
  {
   Blink(500);
   txtStatus.Text = "Freeze Warning!"
  }
  else
  {
    Blink(2000);
    txtStatus.Text = "No freezing weather in forecast."
  }

Blink 方法非常简单 — — 它将根据发送给它的参数的调度计时器间隔设置 ︰

private void Blink(int interval)
{
  blinkingTimer = new DispatcherTimer();
  blinkingTimer.Interval =
    TimeSpan.FromMilliseconds(interval);
  blinkingTimer.Tick += BlinkingTimer_Tick;
}

BlinkingTimer_Tick 方法是代码来打开或关闭 LED 所在的位置。它读取 pin 的状态,并将状态设置为其相反的值 ︰

private void BlinkingTimer_Tick(
  object sender, object e)
{
  var currentPinValue = gpioPin.Read();
  if (currentPinValue == GpioPinValue.High)
  {
    gpioPin.Write(GpioPinValue.Low);
  }
  else
  {
    gpioPin.Write(GpioPinValue.High);
  }
}

完整的源代码位于 bit.ly/1PQyT12

部署应用程序

将应用程序部署到 Raspberry Pi 2 需要在我的 PC 上的初始设置。首先,我需要我体系结构更改为 ARM,然后下播放图标旁边的下拉列表中,我将选择远程计算机。远程连接对话框 (请参阅 图 8) 出现,其中我可以手动输入我的设备的 IP 地址也可以选择从自动检测设备的列表。在任一情况下,不需要身份验证才可用。最后,我按下选择和现在我可以将我的解决方案部署到设备。

远程连接对话框
图 8 的远程连接对话框

设计注意事项

IoT 世界上打开开发人员的新机遇和挑战。在生成 IoT 设备原型时,很重要,应考虑在将在其中部署的运行时环境。将设备有电源和网络连接可以轻松访问? 家庭调温器肯定笑吧,但可能不会放置在远程林中气象站。很明显,大部分这些挑战将决定如何,我构建我的设备,例如,添加用于户外方案可防风雨容器。将我的解决方案是无头或需要 UI? 这些挑战将决定如何将编写代码。例如,如果我的设备通过 4g 网络传输数据然后我需要的数据传输成本考虑进来。我当然想要优化的我的设备发送的数据量。与任何是纯粹的软件的项目,请记住最终用户需求至关重要。

总结

控制从代码指示灯可能不会更改世界,虽然有其他可能的许多应用程序。而不是依靠天气预报 API,我无法连接到 Raspberry Pi 2 温度传感器,并将其放在或附近我园。如果中检测到它的湿度我家的特定部分,则发出警报可能会发送一封电子邮件的设备呢? 想象一下安装空气质量传感器各地主要城市或只是在邻居。假设在屋顶来确定已经落后足够 snow 以确定是否存在风险折叠上放置权重传感器。一切皆有可能。

转,并生成最大优势 !


Frank La Vigne是 Microsoft 技术与公民参与团队的技术推广者。他帮助用户充分利用技术,从而创建更美好的社区。定期在他的博客 FranksWorld.com 并且具有通道调用的 Frank 世界电视 YouTube。(youtube.com/FranksWorldTV)。

衷心感谢以下技术专家参与本文的审阅: Rachel Appel、 Robert Bernstein、 Andrew Hernandez