資安

带你读《基于区块链的物联网项目开发》之二:创建物联网解决方案

点击查看第一章

第2章

创建物联网解决方案
在上一章中,我们探讨了物联网和IBM Watson物联网平台。我们还创建了一个简单的解决方案。在本章中,我们将再创建一个端到端解决方案,从设备选择到创建设备固件和应用,最终实现给花园浇水的自动控制系统。
本章将讨论如下主题:

  • 理解如何创建解决方案。
  • 创建一个连接设备。
  • 创建一个连接到平台的简单应用。
  • 发布和处理设备事件。
  • 向设备发布行动。
  • 如何获取帮助。

2.1 技术要求

完整的解决方案代码在ch2文件夹中,网址:https://github.com/PacktPub-lishing/Hands-On-IoT-Solutions-with-Blockchain.git存储库。
确定你已经安装了Cloud Foundry CLI 和 Bluemix CLI,这些命令行接口的安装过程详见网址https://console.bluemix.net/docs/cli/index.html#overview

2.2 园艺解决方案

浇水系统是物联网DIY群体常用案例。我们也把它作为我们在IBM Watson物联网平台启程的案例。

2.2.1 需求概述

好的解决方案可以真正解决人们的问题,让我们从对实际问题的了解开始我们的解决方案:
John是个商人,一个人住在城里的一间公寓,一周要出差3~4天。在不旅行或不工作的时候,John喜欢照顾他的植物。然而,由于他每周有半个星期不在家,又要保证他的花园健康和美丽,John必须费一番脑筋。
John给花园安装了自动浇水系统,但是该系统还存在一些问题:要么是系统在天气炎热或干燥的时候没有给植物浇足够的水,要么是在天气好的时候水浇多了。
John想知道是否有办法控制浇水时间,即只有植物达到一定的土壤水分条件时或者当他认为有必要时,系统才给他的植物浇水。


2.2.2 解决方案概览

下图展示了为解决John的问题而开发的解决方案:

image.png

给John的花园增加一台联网设备,该设备按照设定的程序对土壤湿度和周围环境温度进行测量,并将事件发布给IBM Watson物联网平台,设备还能通过订阅触发器发布指令。
在IBM Cloud(Bluemix)上事先部署的应用程序将对John花园设备发送过来的数据进行判断,每当达到配置的最低土壤湿度水平或较高的温度阈值时,该应用都会发送一个操作命令,在一定时间内为植物浇水。

2.2.3 设备选择

根据上一节的方案设计,该项目所选用的设备必须具有如下功能:

  • 能够测量土壤湿度(模拟探测仪很适合这种方法)。
  • 具有人机交互能力(这样用户就可以在他觉得有必要的时候给花园浇水)。
  • 能够对土壤湿度进行监测(可配置的规则)。

要实现该解决方案,还要满足如下条件:

  • 用户能够提供Wi-Fi网络连接。
  • 为系统提供电源。
  • 该系统仅供公寓使用,因此无须远程连接。
  • 搭载的容量与Wi-Fi连接无关。

由于我们是在创建实际的设备之前进行原型化,所以可利用现有原型平台快速建立连接和测试。为此,我们可使用功能比较强大且实现模块化的平台Intel Edison和 Grove。
我们将寻找具有Wi-Fi连接和模拟传感器连接的设备、土壤湿度传感器、土壤温度传感器和水电磁阀等,该解决方案的具体设备列表如下:

image.png

下图概述了在设备列表中指定的设备,但设备的形状和颜色只供参考,可能会因供应商、版本或其他特性而有所不同:

image.png

下面我们快速浏览一下列表中的设备
1. Intel Edison系统
Edison是一个芯片系统,基于英特尔x86架构,具有专门为物联网应用设计的嵌入式蓝牙4.0和Wi-Fi。Edison运行名为Yocto的Linux发行版,支持Python、Node.js、C和C++等许多平台,还有用于使用Arduino IDE、Eclipse和Intel XDK开发解决方案的插件。
2. Arduino 拓展板
Intel 公司发布了Edison 系统的Arduino扩展板(breakout board),其中用到的引脚接口(pin interface)与Arduino 模块用到的引脚接口标准一致,且与多种Arduino shield扩展版兼容。可以使用标准Arduino IDE、兼容库、连接器和shield, 因此Intel Edison Arduino扩展板是一款非常好的Arduino原型操作平台接口。
3. Grove系统
Grove包含一系列组件和shield,它创建了标准化的模块化平台,其中包含由SeeeD创建的原型解决方案的构建块。有许多可用的原型,包括可以在互联网上使用的Grove平台的工作代码,特别是DIY社区站点上。
Grove系统为市场上大量采用的平台提供了shield,例如Arduino、Raspberry Pi和BeagleBone。可以在互联网上找到与计算模块、面包板、Grove模块和备件捆绑在一起的包。
注意,并非每个传感器都与每个平台兼容,因为某些平台缺乏某些功能。例如,Raspberry Pi不提供模拟接口,因此通过模拟接口连接的传感器与其不兼容。
让我们看看将作为这个物联网解决方案的一部分使用的Grove组件。
(1)Arduino Grove面包板
在本项目中,我们将使用Arduino Grove面包板(base shield),它提供了一个接口,用于Grove标准的连接器,以将Grove模块连接到Arduino引脚接口。它提供4个模拟接口、4个I2C接口、7个数字接口和1个UART接口。
(2)Grove传感器
在本项目中,我们将使用两种不同类型的传感器:土壤湿度传感器和环境温度传感器。
土壤湿度传感器是模拟探测仪,提供土壤电阻测量,我们稍后将在本章中解释。温度传感器建立在热敏电阻基础上,其技术指标和计算方法在2.3.2节也有详细的介绍。
两个传感器都使用标准Grove连接器电缆,该电缆提供VCC、GND和到探测仪的数据连接。
(3)Grove按钮
这个按钮与传感器一样连接到计算模块,但提供了开路或闭路状态,由按钮控制。
它可以有不同的解释:当按钮被按下时,连接被中断,这意味着它在按钮没有按下的时候可以继续做一些事情;或者当按钮被按下时,连接被激活,这意味着它只在按钮被按下之后才会做一些事情。
(4)Grove继电器
继电器模块连接到标准的Grove接口,由于其不提供读数功能,所以被归为执行器。
其他执行器模块,如LED、显示器、电机驱动器和蜂鸣器等,用于执行操作,而不是读取状态。继电器模块也有两种状态,开路或闭路,这意味着继电器的输入连接没有连接到输出端。
我们对各部分的介绍到此结束,下面继续讨论解决方案中的下个步骤。

2.2.4 设备布线

要组装硬件,我们需要正确地将传感器探测仪连接到处理单元,即Intel Edison模块。Grove模块使连接非常简单,如以下步骤所示:

  1. 使用Grove通用电缆:

●将Grove湿度传感器连接到面包板的A0连接插孔上。

●将Grove温度传感器连接到面包板的A3连接插孔上。

●将Grove继电器模块连接到面包板的D2连接插孔上。

●将Grove按钮模块连接到面包板的D3连接插孔上。

  1. 使用跳线:

●将电磁阀的V+端连接到外接12V电源。

●将外部GND引脚连接到面包板中的GND引脚上。

●将继电器连接到GND引脚上。

●将电磁阀GND端子与一个继电器模块连接上。

下图显示了正确的连接方式:

image.png

2.3 对设备固件进行编码

接下来,我们将创建一个设备应用(固件)来读取传感器数据并将其发送到指定的应用程序。在上一章中,我们使用Node.js从设备模拟器发布事件,现在我们将使用这个方法来利用上一章的代码。记住,这个解决方案的目的是在温度高或土壤湿度太低时给植物浇水。
下一节将展示创建固件所需的代码,该代码将读取所有传感器数据并将事件发布到IBM Watson物联网平台。

2.3.1 测量土壤湿度

在本项目中采用的传感器探测仪是一种电阻式传感器,它测量通过传感器探测仪的电流。它有两个被物理分离的探测仪,一个连接到正极,另一个连接到GND端。当两个探测仪由一个共同的表面连接时,它将测量通过该表面的电流并给我们一个读数。
在我们的案例中,探测仪接触土壤时会测量流过的电流。当土壤湿度增加后会变得更易导电,探测仪会探测到更多的电流。
Arduino拓展版中的 Intel Edison模数转换器(ADC)有12位分辨率,但是通过软件限制为10位分辨率。如果我们将此作为测量的基础,我们将得到以下对读数的理解:


image.png

这意味着我们的读数范围是0~1 023,其中0表示根本没有水,1 023表示100%的水。当然由于土壤中矿物质等杂质的存在,会影响读数。但在本方案中,我们暂且忽略这一因素,假设土壤湿度测量是准确的。当它完全干燥时,其测量值是0%,如果是一杯水,其测量值是100%。
下面代码目标是每2秒读取一次土壤湿度传感器:

image.png

要运行代码,请在Edison的SSH控制台中输入npm start。
为了测试,我们先看看输出到控制台的传感器读数,并对这些数据有一定了解:

image.png

0代表土壤湿度为0%,1 023代表土壤湿度为100%,利用程序中的样本测量值这样计算:

image.png

利用前面的公式,将测量值转换为百分比值,如下所示:

image.png

2.3.2 检测环境温度

类似于前面的代码块(更复杂一些),温度传感器返回传感器的模拟读数。
关于制造商如何读取传感器见网址:http://wiki.seeedstudio.com/Grove- Temperature-Sensor_V1.2/,我们会发现传感器v1.2带有一个值为4 250的热敏电阻和一个100 k的电阻。
因此,使用该传感器计算温度值的公式如下:


image.png

下面的代码将根据传感器的读数每2秒给出一次温度:

image.png
image.png

此代码的输出如下所示:

image.png

这些读数主要通过SSH控制台被记录下来。

2.3.3 打开继电器

最后,由于我们希望开关继电器来控制水的流动,在1秒后打开水和2秒后关闭水的代码如下:

image.png
image.png

延迟1秒后,你将看到D3继电器模块启动,你也将听到一个点击。这意味着继电器连接被关闭,2秒后它将关闭并打开连接。

2.3.4 发布事件

在本章,我们已经研究了Node.js脚本,该脚本能够同时读取土壤湿度和温度,我们还研究了可以打开和关闭让水流向植物的继电器的代码。
现在的目标是将这两个值发布到IBM Watson物联网平台。
如上一章所示,有必要创建一个设备并记录凭证,以便我们可以使用它们将设备连接到平台。下面代码执行常规事件的发布:


image.png
image.png

脚本启动后,它们将从device.json文件加载配置,连接到IBM Watson物联网平台,然后每5分钟发布一次包含当前土壤湿度和温度的事件。

2.3.5 监测事件

查看设备发布数据的最简单方法是使用板卡。如果在创建卡时保持设备脚本运行,它将从设备发布的数据结构中获取值。

  1. 若要创建卡,请访问IBM Watson IoT Platform控制台并选择左侧菜单中的面板:

    image.png


  2. 在页面右上方,选择+Create New Board,按照提示填写信息。大多数必须提供的信息是杂乱无章的,但要确保它对目标用户是有意义的。在这里创建的板是用来显示植物监测读数的:

    image.png


板是一组相关的卡片,卡片是设备向平台发布的一组相关值。

  1. 选择创建的板,并通过选择+Add New Card创建卡片。
  2. 选择Line chart 设备可视化按钮,创建设备:

    image.png


  3. 在选择Line chart卡片之后,需要为事件创建数据源。将创建的设备作为卡片的数据源。数据源,顾名思义,就是信息的来源,可以用它和从设备上收集的度量来填充表格:

    image.png


6.在对数据源进行选择处理之后,有必要对将要绘制在图表上的指标进行选择。如果设备已经向IBM Watson物联网平台发布了一些事件,则可以使用度量名称进行选择编辑。另一方面,如果以前从未运行过设备代码,则需要提供度量名称。建议至少在创建图表之前测试设备代码以避免出错。
7.在正在开发的解决方案中,我们希望卡片在线条图中同时绘制并跟踪。将每个度量与其对应的单位、最大值和最小值相加。对于土壤水分,我们使用百分比,所以单位分别为%的最小值和最大值分别为0和100:

image.png

  1. 温度以摄氏度为单位,最小和最大值分别为0和100:

    image.png


  2. 选择喜欢的卡片大小,并为其命名,并创建它。现在,已发布的数据可以可视化了:

    image.png


可以按照时间线验证植物设备传输的测量结果。还可以改变图中的时间线。

2.3.6 订阅行动

发布设备事件之后,该定义设备操作了。在案例中,解决方案用户John希望在监测到土壤湿度阈值时,系统能够给他的植物浇水。
水流量由电磁阀控制,电磁阀由继电器模块开启和关闭。下面的代码是对以前的代码的更新,包括订阅植物浇水操作,这将打开阀门1分钟。

  1. 首先导入所有包依赖项,用预定义的值定义电阻和热敏电阻常数,然后从device.json加载配置:

    image.png


  2. 然后,创建帮助函数,将传感器读数转换为可用的值。以下功能负责从实际的设备中检索传感器值,并将它们转换为人类可以理解的值:

    image.png


  3. 下一步是创建一个激活电磁阀的辅助函数,等待所要求的时间(seconds ToWater变量的值),然后关闭阀门以便停止浇水:

    image.png


  4. 连接到IBM Watson物联网平台并创建一个发布函数,它将每5分钟将事件发布到平台上:

    image.png


image.png

  1. 并创建订阅water事件的函数,触发water Plant功能:

    image.png


按照用户John的需求所进行的设备固件编码结束。

2.4 创建后端应用

设备固件安装完成以后,主要进行应用程序开发,应用程序负责处理设备事件并发送命令,以便John的花园可以一直保持一定湿度。
应用程序代码将在IBM Cloud平台(Bluemix)上运行。由于这只是一个应用示例,我们将使用环境变量来存储参数(温度和土壤湿度阈值)。

2.4.1 在IBM Cloud平台上创建Cloud Foundry应用程序

  1. 要在IBM Cloud中创建应用程序,请访问https://console.bluemix.net,选择Createre source选项并在左侧菜单中选择Cloud Foundry Apps,然后为Node.js选择SDK。完成此操作后,给应用程序命名并创建运行:

    image.png


  2. 应用程序创建完成后,选择左侧菜单栏的Connections 选项,创建一个到物联网服务的连接:

    image.png


  3. 创建与IBM Watson物联网平台机构的连接后,选择左侧菜单中的Runtime选项,然后选择Environment Variables。在屏幕底部,添加两个User defined变量,MINIMUM_MOISTURE值填写300,MAXIMUM_TEMPRATURE值填写50:

    image.png


上一章中我们使用了一个JSON文档储存配置,但是本章不同,我们现在所需的配置是上一章中已经存储的配置,目前需要的唯一配置是VCAP_SERVICES及其环境变量。这些变量可以通过缺省库包的代码来访问,同时,在Node.js中有很多“加速器”,这些“加速器”将有助与访问Cloud Foundry环境相关的设备,例如:在下一章中使用的代码展示的cfenv模块。

2.4.2 上传代码

我们要将应用部署到Cloud Foundry环境中, 而重要的是要了解, Cloud Foundry 容器希望发布一个HTTP端口,所以即使没有使用容器露出HTTP 资源接口,我们也要开启 Express JS 服务器。
以下代码处理从设备接收的事件,并在满足条件时发布行动指令。

  1. 同样,代码的入口点是加载模块依赖项,并从Cloud Foundry环境变量收集所需的配置:

    image.png


  2. 然后从Cloud Foundry环境加载配置数据并生成连接配置数据:

    image.png


  3. 下一步是连接到IBM Watson物联网平台并订阅目标设备事件:

    image.png


  4. 每当从订阅接收到事件时,应用程序检查设备报告的温度是否更高或土壤湿度是否低于定义的阈值。如果是这样,将以秒为单位的指定持续时间的水事件发布到设备上,从而激活喷水阀:

    image.png


  5. 启动Express服务器,Node.js 容器的IBM Cloud SDK启动,并在Cloud Foundry环境下对其进行监控:

    image.png


要部署应用程序,请打开manifest.yml文件并更改应用程序的name属性。然后,打开命令行终端,切换到应用基本目录(manifest.yml所在的位置),并使用bluemix CLI部署应用:

image.png

获取成功部署消息后,使用bluemix CLI检查应用日志:

image.png

该命令将从Cloud Foundry应用程序中检索和显示日志文件,如下所示。要确保可以检索这些日志,请确保所有应用跟踪都发送到stdout和stderr:

image.png

Cloud Foundry应用的日志文件
查看设备日志,你可以看到,每当满足设定条件时,设备都会收到一个为花园浇水的行动请求:

image.png

此时,你已经有了一个物联网应用和设备连接,并且可以在IBM 云环境中正常工作。

2.5 小结

在本章中,我们开发了一个在支持Node.js的真实设备上运行的解决方案。我们还使用与设备GPIO(通用IO)交互的低级mraa库,读取模拟传感器(温度和土壤湿度传感器),并使用数字引脚打开和关闭继电器。这看起来很简单,但大多数设备都有传感器和执行器,这可能会改变它们的使用方式。然而,它们本质上遵循相同的概念。
我们在IBM Watson物联网平台中创建了一个仪表盘,它有助于查看实时数据设备发布的内容。我们还在IBM Cloud平台(Bluemix)中创建了一个应用程序,并将支持服务(IBM Watson物联网平台组织)附加到应用程序,以便利用配置数据连接到服务,并使用Bluemix命令行界面部署应用程序。
下一章将介绍作为互联企业平台的区块链,并解释其价值和常见的应用案例,其中它为业务链增加价值。

2.6 补充阅读

使用IBM Watson物联网平台完成解决方案所需的大部分资源可以在以下链接的官方文档中找到:https://console.bluemix.net/docs/services/IoT/index.html#gettingstartedtemplate
IBM社区还发布了许多IBM Watson物联网开发指南,可在developerWorks Recipes网站上找到:https://developer.ibm.com/recipes/tutorials/category/internet-of-things-iot/
了解如何将项目上载到GitHub存储库以及如何创建交付路线,以便在系统有新的更新推送到存储库时可自动构建、测试和部署应用程序,这一点虽不在本书范围内,但是也非常有用。
有关Grove系统平台、模块、捆绑的平台模块和组件规格的更多信息,请访问制造商网站:http://wiki.seeedstudio.com/Grove/



























Leave a Reply

Your email address will not be published. Required fields are marked *