区块链和物联网解决方案实用指南(一)(2)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 区块链和物联网解决方案实用指南(一)

区块链和物联网解决方案实用指南(一)(1)https://developer.aliyun.com/article/1515711

创建一个设备

在本节中,您将运行类似步骤,创建一个模拟设备,连接到 IBM Watson IoT 平台,并发布事件。

  1. 在设置步骤中创建的 IoT 平台服务中,在菜单中选择设备,然后选择添加设备。创建一个名为 DeviceSimulator 的设备类型,并在设备 ID 字段中填写DeviceSimulator01


  1. 由于这只是一个模拟器,只需点击“下一步”,直到达到向导的末尾即可:


  1. 注意生成的设备凭据,格式如下:
设备类型 设备 ID 认证方法 认证令牌
  1. 回到您喜欢的 IDE,并创建具有与之前应用相同特性的项目:
npm install ibmiotf --save
  1. 确保您的package.json文件看起来像下面这样:
{
  "name": "sample-device",
  "version": "1.0.0",
  "description": "Hands-On IoT Solutions with Blockchain - Chapter 1 Device",
  "main": "index.js",
  "scripts": {
    "start": "node .",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Maximiliano Santos",
  "license": "ISC",
  "dependencies": {
    "ibmiotf": "⁰.2.41"
  }
}
  1. 接下来,创建一个名为device.json的文件,内容如下:
{
  "org": "<your iot org id>",
  "type": "DeviceSimulator",
  "id": "DeviceSimulator01",
  "auth-method" : "token",
  "auth-token" : "<device authentication token>"
}
  1. 创建一个名为index.js的文件,并添加以下内容:
var iotf = require("ibmiotf");
var config = require("./device.json");
var deviceClient = new iotf.IotfDevice(config);
deviceClient.log.setLevel('debug');
deviceClient.connect();
deviceClient.on('connect', function(){
  console.log("connected");
});
  1. 可以通过运行npm start命令来测试设备模拟器:
$ npm start
> sample-device@1.0.0 start /sample-device
> node .
[BaseClient:connect] Connecting to IoTF with host : ssl://3nr17i.messaging.internetofthings.ibmcloud.co
m:8883 and with client id : d:3nr17i:DeviceSimulator:DeviceSimulator01
[DeviceClient:connect] DeviceClient Connected
connected
  1. 现在,更新代码,将当前时间戳发送到 IoT 平台服务:
var iotf = require("ibmiotf");
var config = require("./device.json");
var deviceClient = new iotf.IotfDevice(config);
deviceClient.log.setLevel('debug');
deviceClient.connect();
deviceClient.on('connect', function() {
  console.log("connected");
  setInterval(function function_name () {
    deviceClient.publish('myevt', 'json', '{"value":' + new Date() +'}', 2);
  },2000);
});
  1. 再次运行npm start,设备将每两秒向 Watson IoT 平台发送一个事件。你可以检查应用程序的日志,查看它是否接收到了事件,如下所示:
Device Event from :: DeviceSimulator : DeviceSimulator01 of event myevt with payload : {"value":Sun May 20 2018 21:55:19 GMT-0300 (-03)}
Device Event from :: DeviceSimulator : DeviceSimulator01 of event myevt with payload : {"value":Sun May 20 2018 21:55:21 GMT-0300 (-03)}
Device Event from :: DeviceSimulator : DeviceSimulator01 of event myevt with payload : {"value":Sun May 20 2018 21:55:23 GMT-0300 (-03)}
Device Event from :: DeviceSimulator : DeviceSimulator01 of event myevt with payload : {"value":Sun May 20 2018 21:55:25 GMT-0300 (-03)}

恭喜!你的设备模拟器现在正在发布事件,你的应用程序正在接收它们!

摘要

在本章中,我们概述了物联网环境。我们了解了一些在成功实施物联网解决方案中起作用的重要技术要素。

我们还研究了不同类型的网络选项、选择设备类型时的重要考虑因素,以及如何创建一个连接到 IBM Watson IoT 平台的设备和应用程序。

在下一章中,你将通过创建一个简单的连接花园来提高你的开发技能。

进一步阅读

在 IBM Watson IoT 平台文档中可以找到其他语言的示例,例如 Python、Java、C++ 和 C#,链接如下:console.bluemix.net/docs/services/IoT/getting-started.html#getting-started-with-iotp

第二章:创建您的第一个物联网解决方案

在上一章中,我们探讨了物联网IoT)以及 IBM Watson IoT 平台。我们还创建了我们的第一个简单解决方案。在本章中,我们将通过创建一个简单的端到端解决方案来实践这一点,从选择设备到创建设备固件和一个用于控制简单花园浇水系统的应用程序。

本章将涵盖以下主题:

  • 了解如何设置解决方案
  • 创建连接设备
  • 创建连接到平台的简单应用程序
  • 发布和处理设备事件
  • 将动作发布到设备
  • 在遇到问题时如何获取帮助

技术要求

完整的解决方案代码可在 ch2 文件夹中找到,位于 github.com/PacktPublishing/Hands-On-IoT-Solutions-with-Blockchain.git 存储库中。

确保您还安装了 Cloud Foundry CLI 和 Bluemix CLI;这些命令行界面的安装过程在 console.bluemix.net/docs/cli/index.html#overview 中有描述。

第一个物联网解决方案 - 花园解决方案

在 DIY 社区中,浇水系统是使用物联网的常见第一个项目。我们也将使用它作为一个示例项目,开始使用 IBM Watson IoT 平台。

需求概述

好的解决方案是基于真正对人们重要的问题。所以让我们从介绍实际问题开始我们的解决方案:

约翰独自一人住在城市的公寓里。他是一个商人,每周必须出差 3-4 天。在不出差或工作时,约翰喜欢照顾他的植物。然而,由于他一周有一半时间不在家,约翰正在努力保持他的花园健康和美丽。

约翰曾经在自动浇水系统中遇到过几次挑战性的经历:要么系统没有足够地给植物浇水(例如在炎热或干燥的日子),要么在天气好的时候给它们浇水太多。

约翰正在寻找一个解决方案,只有当植物达到一定的土壤湿度条件时,或者他觉得有必要时才给花园浇水。

解决方案概述

下图显示了将开发的解决约翰问题的解决方案组件的概述:


一个连接的设备将连接到约翰的植物上,并定期从植物和环境(土壤湿度和温度)中检索测量值,并将事件发布到 IBM Watson IoT 平台。该设备还将订阅触发命令(动作)。

部署到 IBM 云(Bluemix)的应用将订阅约翰的事件,并在达到配置的最低土壤湿度或高温阈值时,应用将发送动作命令以进行一定时间的浇水。

选择设备

鉴于前一节描述的要求,需要创建的设备必须具备以下功能:

  • 能够测量土壤湿度水平(模拟探针非常适合这种解决方案)
  • 具有双向通信能力(以便用户在觉得有必要时为花园浇水)
  • 能够配置土壤湿度的限制(可配置规则)

关于解决方案,还有以下假设是成立的:

  • 用户将提
  • 供 Wi-Fi 互联网连接
  • 用户将为系统提供能源供应
  • 该系统将用于公寓,因此不需要远距离连接
  • 负载大小是不确定的
  • 当提供了 Wi-Fi 连接时,相关性变得更高

由于我们在创建实际设备之前进行原型设计,有许多原型设计平台可以使布线和测试解决方案更加容易快速。为此,我们将使用其中一种最强大和模块化的平台:英特尔 Edison 和 Grove。

我们将寻找具有 Wi-Fi 连接和模拟传感器连接的设备(或组合)。我们还需要一个土壤湿度模拟传感器探针、一个温湿度传感器和一个水电磁阀。

因此,解决方案将需要一个零件列表,其形式将类似于以下内容:

数量 组件
1 英特尔 Edison 模块
1 英特尔 Edison Arduino 扩展板
1 Grove 基座 v2
1 Grove 土壤湿度传感器
1 Groove 温度传感器 v1.2
1 Grove 继电器模块
1 Grove 按钮模块
4 Grove 通用 4 脚电缆
1 12V 水电磁阀
1 12V 2A 电源适配器
2 杜邦线(公对公)

下图提供了部件列表表中指定的部件的概览。请注意,设备的形状和颜色仅用于说明目的,可能会因供应商、版本或其他特性而有所不同:


该图像是用 Fritzing 创建的,并在 CC BY-SA 3.0 下获得许可;请参阅 https://creativecommons.org/licenses/by-sa/3.0/

让我们快速查看一下此列表中的零件。

英特尔 Edison

Edison 是一款片上系统SoC),基于英特尔 x86 架构,内置蓝牙 4.0 和 Wi-Fi,专为物联网应用设计。Edison 运行名为 Yocto 的 Linux 发行版;支持许多平台,如 Python、Node.js、C 和 C++;并具有用于使用 Arduino IDE、Eclipse 和英特尔 XDK 开发解决方案的插件。

Arduino 扩展板

Intel 还推出了用于 Edison 的 Arduino 扩展板,它提供了与 Arduino 模块相同的标准引脚接口,并与 Arduino Shield 兼容。由于可以使用标准的 Arduino IDE、兼容的库、连接器和 Shield,因此 Intel Edison Arduino 扩展板是原型设计和运行 Arduino 程序的一个不错的接口。

Grove 系统

Grove 是由 Seeed 创建的一套组件和 Shield,用于创建一个标准化的模块化平台,供原型设计解决方案使用。有许多可用的原型设计,包括 Grove 平台的工作代码,尤其是在DIY社区网站上可以找到。

Grove 系统针对市场上广泛采用的平台(如 Arduino、Raspberry Pi 和 BeagleBone)提供了相应的 Shield。在互联网上可以找到包含计算模块、基础 Shield、Grove 模块和备件的捆绑销售套装。

请注意,并非每种传感器都兼容每种平台,因为一些平台缺乏某些功能。例如,Raspberry Pi 不提供模拟接口,因此通过模拟接口连接的传感器将与其不兼容。

让我们来看看作为这个物联网解决方案一部分的所有 Grove 组件。

用于 Arduino 的 Grove 基础 Shield

在本项目中,我们将使用 Arduino 的 Grove 基础 Shield,它提供了一个接口,用于将 Grove 标准连接器连接到 Arduino 引脚接口。它提供了四个模拟接口,四个 I2C 接口,七个数字接口和一个 UART 接口。

Grove 传感器

在本项目中,我们将使用两种不同类型的传感器:土壤湿度传感器和温度传感器。

土壤湿度传感器是一种模拟探针,可以提供土壤电阻测量数据,这一点我们将在本章后面进行解释。该传感器的温度是基于热敏电阻的,并且其规格和计算方法也在测量环境温度部分有详细介绍。

两种传感器都使用标准的 Grove 连接线,为探测器提供VCCGND和数据连接功能。

Grove 按钮

这个按钮与传感器一样连接到计算模块,但根据按钮是否按下,它可以提供开路或闭路状态。

它可能有不同的解释:按钮按下时中断连接,这意味着除非按下按钮,否则它会持续做某事;或者按钮按下时激活连接,这意味着只有在按下按钮后才会执行某些操作。

Grove 继电器

作为预期的一样,继电器模块连接到标准的 Grove 接口,但由于它不提供读数,所以被归类为执行器。

其他执行器模块,如 LED、显示器、电机驱动器和蜂鸣器,用于执行动作而不是读取状态。继电器模块也有两种状态,断路或闭路,这意味着继电器的输入连接没有连接到输出。

这结束了我们对零件的审查。让我们继续进行解决方案开发过程中的下一步。

接线装置

要组装硬件,我们需要正确连接传感器探针到处理单元——在本例中,是英特尔 Edison 模块。

Grove 模块使连接变得非常简单,如下面的步骤所示:

  1. 使用 Grove 通用电缆:
  • 将 Grove 湿度传感器连接到基础盾牌的A0连接插孔
  • 将 Grove 温度传感器连接到基础盾牌的A3连接插孔
  • 将 Grove 继电器模块连接到基础盾牌的D2连接插孔
  • 将 Grove 按钮模块连接到基础盾牌的D3连接插孔
  1. 使用跳线:
  • 将电磁阀的V+端连接到外部 12V 电源
  • 将外部GND引脚连接到基础盾牌的一个GND引脚
  • 将继电器连接到一个GND引脚
  • 将电磁阀GND端连接到另一个继电器模块连接处

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


图像是使用 Fritzing 创建的,并且受 CC BY-SA 3.0 许可证的保护 https://creativecommons.org/licenses/by-sa/3.0/

编写设备固件

接下来,我们将创建一个设备应用程序(固件),该应用程序读取传感器数据并将其发送到后备应用程序。在上一章中,我们使用 Node.js 从设备模拟器发布事件,现在我们将使用此方法来利用前一章的代码。请记住,此解决方案的目标是在温度过高或土壤湿度过低时浇水。

下一节显示了创建读取所有传感器数据并将事件发布到 IBM Watson IoT 平台的固件所需的代码。

测量土壤湿度

此项目中使用的传感器探针是一个电阻性传感器,它测量通过传感器探针的电流。它有两个物理分离的探针;一个探针连接到正极,另一个连接到GND端。当两个探针通过一个共同的表面连接时,它将测量通过该表面传递的电流并给我们一个读数。

在我们的情况下,当探针接触土壤时,它将测量通过的电流。当土壤变湿时,它变得更加导电,这意味着更多的电流将通过探针。

位于 Arduino 扩展板上的英特尔 Edison ADC(模拟到数字)转换器具有 12 位分辨率,但通过软件限制为 10 位分辨率。如果我们将此作为测量的基础,我们将获得以下读数的理解:

2¹⁰ = 1024

这意味着我们的读数将是从 0 到 1,023 的值,其中 0 表示没有水,1,023 表示水的 100%。这将因土壤中存在的其他杂质而变化,例如矿物质。然而,在这种情况下,我们将假设土壤被完美地测量。当它完全干燥时,它会给我们一个 0% 的测量值,如果是一杯没有任何土壤的水,它会给我们一个 100% 的读数。

以下代码将每两秒读取一次土壤湿度传感器:

var mraa = require('mraa');
var pin0 = new mraa.Aio(0);
var getSoilMoisture = function() {
  var sensorReading = pin0.read();
  return sensorReading;
};
setInterval(function() {
  console.log("Current Moisture " + getSoilMoisture());
},2000);

要运行代码,请在 Edison 的 SSH 控制台中键入 npm start

为了测试目的,让我们查看打印到控制台的传感器测量读数并对这些值有所了解:


我们已经知道,0 表示 0% 的水分,1,023 表示 100%,这意味着程序中的样本测量读数如下:


将读数值应用于前面的公式将使它们转换为百分比值,如下所示:

读数数值 湿度百分比
256 25.02%
307 30.00%
302 29.52%
303 29.61%
299 29.22%
298 29.13%

测量环境温度

与上一个代码块类似(但稍微更加数学上复杂),温度传感器返回传感器的模拟读数。

如果我们查看制造商的说明 (wiki.seeedstudio.com/Grove-Temperature_Sensor_V1.2/) 关于如何读取传感器,我们将发现传感器的 v1.2 配有一个热敏电阻,其值为 4,250,以及一个 100k 电阻。

因此,使用该传感器计算温度值的公式如下:


以下代码将基于传感器读数每两秒给出一次温度:

var mraa = require('mraa');
var pin3 = new mraa.Aio(3);
var RESISTOR = 100000;
var THERMISTOR = 4250;
var getTemperature = function() {
  var sensorReading = pin3.read();
  var R = 1023 / sensorReading - 1;
  R = RESISTOR * R;
  var temperature = 1 / (Math.log(R/RESISTOR)/THERMISTOR+1/298.15)-273.15;
  return temperature;
};
setInterval(function() {
  console.log("Current Temperature " + getTemperature());
},2000);

此代码的输出将类似于以下内容:


使用 SSH 控制台,这些读数将被记录。

打开继电器

最后但同样重要的是,因为我们想要打开一个继电器,让水流出然后关闭,所以打开水的代码在一秒后关闭两秒后如下所示:

var mraa = require('mraa');
var pinD2 = new mraa.Gpio(2);
pinD2.dir(mraa.DIR_OUT);
setTimeout(function() {
  pinD2.write(1);
  setTimeout(function() {
    pinD2.write(0);
  },2000);
},1000);

延迟一秒后,你将看到 D3 继电器模块的 LED 灯亮起,并且会听到一声点击。这意味着继电器连接已关闭,两秒后它将关闭并打开连接。

发布事件

在本章的这一点上,我们已经探讨了能够读取土壤湿度和温度的 Node.js 脚本,并且我们还查看了能够打开和关闭让水流到植物的继电器的代码。

现在的目标是将这两个值发布到 IBM Watson IoT 平台。

如前一章所示,需要创建一个设备并记录凭据,以便我们可以使用它们将设备连接到平台。下面的代码执行事件的定期发布:

var iotf = require("ibmiotf");
var mraa = require('mraa');
var config = require("./device.json");
var deviceClient = new iotf.IotfDevice(config);
var temperatureSensor = new mraa.Aio(3);
var moistureSensor = new mraa.Aio(0);
var RESISTOR = 100000;
var THERMISTOR = 4250;
var getTemperature = function() {
 var sensorReading = temperatureSensor.read();
 var R = 1023 / sensorReading - 1;
 R = RESISTOR * R;
 var temperature = 1 / (Math.log(R/RESISTOR)/THERMISTOR+1/298.15)-273.15;
 return temperature;
};
var getSoilMoisture = function() {
 var sensorReading = moistureSensor.read();
 return sensorReading;
};
deviceClient.connect();
deviceClient.on('connect', function(){
console.log("connected");
setInterval(function function_name () {
deviceClient.publish('status', 'json', '{ "temperature": ' + getTemperature() +', "soilMoisture": ' + getSoilMoisture() + '}', 2);
},300000);
});

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

监测事件

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

  1. 要创建卡片,请访问 IBM Watson IoT 平台控制台,并在左侧菜单中选择看板:


  1. 在页面右上角,选择+ 创建新看板,填写所需信息,并创建看板。大多数必须提供的信息都是杂项,但确保对目标用户有意义。这里创建的看板应该显示所监测到的植物读数:


看板是一组相关的卡片,卡片是设备发布到平台的相关值的集合。

  1. 选择已创建的看板,并通过选择+ 添加新卡片创建卡片。
  2. 选择 折线图 设备可视化和已创建的设备:


  1. 选择折线图卡后,需要选择事件的数据源。将已创建的设备作为此卡的数据源。数据源,顾名思义,是将用于从设备收集的度量值填充图表的信息源:


  1. 选择数据源后,需要选择将在图表上绘制的度量。如果设备已经向 IBM Watson IoT 平台发布了一些事件,那么度量名称将可供选择。另一方面,如果设备代码以前从未运行过,则需要提供度量名称。建议(但不是必须)在创建图表之前至少测试设备代码,以避免错误。
  2. 在正在开发的解决方案中,我们希望卡片在折线图中具有两个度量值,并进行跟踪。使用相应的单位和最小和最大可能值添加每个度量值。对于土壤湿度,我们使用百分比,因此单位应为%,最小和最大值分别为0100


  1. 对于以摄氏度(°C)测量的温度,最小和最大可能值分别为0100


  1. 选择您喜欢显示的卡片大小,命名卡片,并创建它。您现在可以可视化发布的数据了:


可以验证植物设备发送的测量值,在时间线上绘制出来。还可以更改图表的时间范围。

订阅操作

在为设备发布事件之后,现在是定义需要由设备处理的操作的时候了。在我们的情况下,解决方案的用户 John 希望能够在检测到定义的土壤湿度阈值时给植物浇水,当温度达到可配置值时,或者当他触发浇水植物的事件时。

水流由电磁阀控制,该阀由继电器模块打开和关闭。以下代码是先前代码的更新,包括订阅浇水植物动作,该动作将打开阀门一分钟。

  1. 起点是导入所有包依赖项,使用预定义值定义RESISTORTHERMISTOR常量,并从device.json中加载配置:
var iotf = require("ibmiotf");
var mraa = require('mraa');
var config = require("./device.json");
var deviceClient = new iotf.IotfDevice(config);
var temperatureSensor = new mraa.Aio(3);
var moistureSensor = new mraa.Aio(0);
var relayControl = new mraa.Gpio(2);
var RESISTOR = 100000;
var THERMISTOR = 4250;
  1. 然后,创建辅助函数将传感器读数转换为可用值。以下函数负责从实际设备检索传感器值并将其转换为人类可理解的值:
var getTemperature = function() {
  var sensorReading = temperatureSensor.read();
  var R = 1023 / sensorReading - 1;
  R = RESISTOR * R;
  var temperature = 1 / (Math.log(R/RESISTOR)/THERMISTOR+1/298.15)-273.15;
  return temperature;
};
var getSoilMoisture = function() {
  var sensorReading = moistureSensor.read();
  return sensorReading;
};
  1. 下一步是创建一个辅助函数来激活电磁阀,等待请求的时间量(secondsToWater变量的值),然后停止激活阀门以停止浇水:
var waterPlant = function(secondsToWater) {
  relayControl.write(1);
  setTimeout(function() {
    pinD2.write(0);
  },secondsToWater * 1000);
  1. 连接到 IBM Watson IoT 平台并创建一个发布函数,该函数将每五分钟向平台发布事件:
deviceClient.connect();
deviceClient.on('connect', function(){
  console.log("connected");
  setInterval(function function_name () {
    deviceClient.publish('status', 'json', '{ "temperature": ' + getTemperature() +', "soilMoisture": ' + getSoilMoisture() + '}', 2);
  },300000);
});
  1. 创建一个订阅water事件的函数,触发waterPlant函数:
deviceClient.on("command", function (commandName,format,payload,topic) {
  if(commandName === "water") {
    var commandPayload = JSON.parse(payload.toString());
    console.log("Watering the plant for " + commandPayload.duration + " seconds.");
    waterPlant(commandPayload.duration);
  } else {
    console.log("Command not supported.. " + commandName);
  }
});

这完成了我们的设备固件的编码,以便它可以执行我们的用户 John 所期望的操作。

创建后端应用程序

设备固件设置完成后,现在是专注于开发将处理设备事件并发送命令以便在 John 不在家时给他的植物浇水的应用程序的时候了。

应用程序的代码将在 IBM Cloud 平台(Bluemix)上运行。由于这只是一个示例应用程序,我们将使用环境变量来存储参数(温度和土壤湿度阈值)。

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

  1. 要在 IBM Cloud 中创建一个应用程序,请访问console.bluemix.net,选择创建资源选项,并在左侧菜单中选择 Cloud Foundry Apps,然后选择 SDK for Node.js。做完这些之后,给应用程序命名并创建运行时:


  1. 当应用程序创建完成后,在左侧菜单中选择 Connections,并创建到 IoT 服务的连接:


  1. 在创建到 IBM Watson IoT Platform 组织的连接之后,选择左侧菜单中的 Runtime 选项,然后选择 Environment Variables。在屏幕底部,添加两个用户定义变量,MINIMUM_MOISTURE 的值为 300MAXIMUM_TEMPERATURE 的值为 50


与之前章节中使用 JSON 文件存储配置不同,现在唯一需要的配置是在 VCAP_SERVICES 和环境变量中。可以使用默认库包从代码中访问这些变量,并且在 Node.js 中有用于访问 Cloud Foundry 环境相关设施的加速器,比如在下一节中介绍的代码中使用的 cfenv 模块。

上传代码

由于我们正在将应用程序部署到 Cloud Foundry 环境中,重要的是要知道 Cloud Foundry 容器期望容器发布一个 HTTP 端口,所以即使我们不使用容器来公开 HTTP 资源,我们仍然会启动 Express JS 服务器。

以下代码处理从设备接收到的事件,并在满足任何条件时发布动作。

  1. 再次,代码的入口是加载模块依赖项并从 Cloud Foundry 环境变量中收集所需配置:
var express = require("express");
var cfenv = require("cfenv");
var Client = require("ibmiotf");
var minimumMoisture = parseInt(process.env.MINIMUM_MOISTURE);
var maximumTemperature = parseInt(process.env.MAXIMUM_TEMPERATURE);
  1. 然后,从 Cloud Foundry 环境加载配置数据并生成连接配置数据:
var app = express();
var appEnv = cfenv.getAppEnv();
var iotConfig = appEnv.getService("Internet of Things Platform-mf");
var appClientConfig = {
  "org": iotConfig.credentials.org,
  "id": "hands-on-iot-app",
  "auth-key": iotConfig.credentials.apiKey,
  "auth-token": iotConfig.credentials.apiToken
}
  1. 下一步是连接到 IBM Watson IoT Platform 并订阅目标设备事件:
var appClient = new Client.IotfApplication(appClientConfig);
appClient.connect();
appClient.on("connect", function () {
  appClient.subscribeToDeviceEvents();
});
appClient.on("deviceEvent", function (deviceType, deviceId, eventType, format, payload) {
  var deviceData = JSON.parse(payload);
  1. 每当从订阅接收到事件时,应用程序都会检查设备报告的温度是否更高或土壤湿度是否低于定义的阈值。如果是,则发布带有指定持续时间(以秒为单位)的浇水事件到设备,以激活浇水阀:
if(deviceData.temperature > maximumTemperature ||
deviceData.soilMoisture < minimumMoisture ) {
    console.log("Device, please water the plant for 60 seconds");
    var actionData= { duration : 60 };
    actionData = JSON.stringify(actionData);
    appClient.publishDeviceCommand(deviceType, deviceId, "water", "json", actionData);
  }
});
  1. 最后,启动 Express 服务器,以便 IBM Cloud SDK for Node.js 容器在 Cloud Foundry 环境中启动并受监控:
var port = process.env.PORT;
app.listen(port, function() {
 console.log("App listening!");
});

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

bluemix login
bluemix target -o <your_cloud_foundry_organization_name> -s <space_where_your_app_will_be_deployed>
bluemix cf push


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

bluemix cf logs <your_application_name> 

该命令将从 Cloud Foundry 应用程序检索并显示日志文件,如下所示。为确保您能检索这些日志,请确保所有应用程序跟踪都发送到 stdoutstderr


从 Cloud Foundry 应用程序的日志文件

查看设备日志,可以看到每当满足条件时,它们都会收到浇水的操作请求:


此时,您已经在 IBM Cloud 环境中拥有一个 IoT 应用程序和设备,并且已连接并正常工作。

摘要

在本章中,我们开发了在支持 Node.js 的真实设备上运行的解决方案。我们还使用了低级别的 mraa 库,该库与设备的 GPIO(通用输入/输出)进行交互,读取模拟传感器(温度和土壤湿度传感器),并使用数字引脚开关继电器的开关。这看起来非常简单,但大多数设备都具有传感器和执行器,这可能会改变它们的使用方式。但是,它们基本上遵循相同的概念。

我们在 IBM Watson IoT 平台中创建了一个仪表板,有助于查看设备发布的实时数据。我们还在 IBM Cloud 平台(Bluemix)中创建了一个应用程序,并将后台服务(IBM Watson IoT 平台组织)附加到了应用程序上,以利用配置数据连接到服务,并使用 Bluemix 命令行界面部署应用程序。

接下来的章节将介绍区块链作为互连业务平台,并解释其价值以及它增加业务链价值的常见用例。

进一步阅读

完成使用 IBM Watson IoT 平台的解决方案所需的大多数资源都可以在官方文档中找到,链接如下:console.bluemix.net/docs/services/IoT/index.html#gettingstartedtemplate。社区还发布了许多使用 IBM Watson IoT 的配方,并可在 developerWorks 配方网站上找到,链接如下:developer.ibm.com/recipes/tutorials/category/internet-of-things-iot/

了解如何将项目上传到 GitHub 存储库以及如何创建交付流水线以在推送新更改到存储库时自动构建、测试和部署应用程序也非常有帮助。尽管这不在本书的范围之内,但这仍然是一个非常好的实践。

关于 Grove 系统平台、模块、套件和组件规格的更多信息可以在制造商的网站上找到:wiki.seeedstudio.com/Grove/


相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
5天前
|
安全 物联网 5G
未来科技浪潮之巅:区块链、物联网与虚拟现实的交汇点
【10月更文挑战第38天】在科技不断进步的今天,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正逐步渗透到我们生活的方方面面。本文将探讨这些技术的发展趋势,以及它们如何在未来塑造我们的世界。我们将通过浅显易懂的语言和实际案例,揭示这些技术背后的原理,并展望它们如何共同作用,创造出前所未有的应用场景。让我们一起踏上这趟探索之旅,看看这些令人兴奋的技术是如何相互交织,共同推动社会向前发展的。
|
5天前
|
传感器 数据采集 物联网
未来已来:探索区块链、物联网和虚拟现实的融合与创新
【10月更文挑战第38天】在科技不断进步的今天,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在重塑我们的世界。这些技术不仅单独发展,它们之间的融合更是开启了无限的可能性。本文将深入探讨这些技术的发展趋势和应用场景,揭示它们如何相互促进,共同构建一个更加智能、互联的未来。
|
5天前
|
存储 传感器 物联网
未来已来:区块链、物联网与虚拟现实技术融合的新篇章
【10月更文挑战第38天】本文旨在探索新兴技术区块链、物联网(IoT)和虚拟现实(VR)在未来社会的应用前景。通过分析这些技术的发展趋势,我们将揭示它们如何相互交织,共同塑造一个更智能、更互联的世界。文章将不包含传统意义上的摘要内容,而是直接深入主题,展开讨论。
|
7天前
|
供应链 物联网 区块链
新技术潮流下的未来图景:区块链、物联网与虚拟现实的融合与创新
【10月更文挑战第36天】在数字化时代的浪潮中,新兴技术如区块链技术、物联网(IoT)以及虚拟现实(VR)正逐渐渗透到我们生活的方方面面。本文将深入探讨这些技术的发展趋势和应用场景,通过分析它们如何相互促进,共同塑造一个更加智能、互联的世界。我们将从基础概念出发,逐步展开讨论,揭示它们在未来社会中的潜在影响和价值。
16 4
|
8天前
|
供应链 安全 物联网
未来已来:探索区块链、物联网与虚拟现实的融合革新
【10月更文挑战第35天】在技术的大潮中,区块链、物联网(IoT)和虚拟现实(VR)如同三颗璀璨的星辰,各自闪耀着独特的光芒。本文将带您穿梭于这些技术的发展趋势与应用场景之间,揭示它们如何交织出一幅未来的画卷。我们将从基础概念出发,逐步深入到它们在现实世界中的实际应用,以及它们之间的相互作用如何催生新的创新模式。准备好,让我们一起揭开新技术趋势的神秘面纱,探索它们如何塑造我们的未来。
|
6天前
|
供应链 物联网 区块链
探索未来:区块链、物联网与虚拟现实技术的融合与创新
【10月更文挑战第37天】在技术不断进步的今天,新兴技术如区块链、物联网和虚拟现实正在逐渐改变我们的生活和工作方式。本文将探讨这些技术的发展趋势和应用场景,并提供代码示例来说明它们是如何相互融合和创新的。我们将从区块链技术的基础开始,介绍其在金融领域的应用;然后探讨物联网技术的发展及其在智能家居中的应用;最后,我们将讨论虚拟现实技术的进步以及它在游戏和教育领域的应用。通过这些技术的融合与创新,我们可以更好地理解和预测未来的发展趋势。
|
6天前
|
供应链 物联网 区块链
新技术趋势与应用:探索区块链、物联网和虚拟现实的未来
【10月更文挑战第37天】本文将探讨新兴技术如区块链、物联网和虚拟现实的发展趋势和应用场景。我们将从这些技术的基本原理出发,分析它们在当前社会中的应用,并预测未来的发展方向。同时,我们还将提供一些代码示例,以帮助读者更好地理解这些技术。
|
4天前
|
存储 安全 物联网
政府在推动物联网技术标准和规范的统一方面可以发挥哪些作用?
政府在推动物联网技术标准和规范的统一方面可以发挥哪些作用?
66 50
|
4天前
|
安全 物联网 物联网安全
制定统一的物联网技术标准和规范的难点有哪些?
制定统一的物联网技术标准和规范的难点有哪些?
14 2
|
4天前
|
存储 数据采集 物联网
物联网技术在物流领域的应用会遇到哪些挑战?
物联网技术在物流领域的应用会遇到哪些挑战?
17 4