Node-Red 实战编程(二)
原文:
zh.annas-archive.org/md5/C5AA5862C03AC3F75583D0632C740313译者:飞龙
第七章:从 Node-RED 调用 Web API
在本章中,让我们从 Node-RED 调用 Web API。基本上,在 Node-RED 中,处理是根据创建的流程进行的,但连接处理的是 JSON 数据。从这个意义上说,它与 Web API 非常兼容。
让我们从以下四个主题开始:
-
学习节点的输入/输出参数
-
学习节点的输入/输出参数
-
如何在节点上调用 Web API
-
如何使用 IBM Watson API
到本章结束时,你将掌握如何从 Node-RED 调用任何类型的 Web API。
技术要求
要在本章中继续进行,你将需要以下内容:
- Node-RED(v1.1.0 或更高版本)
本章中使用的代码可以在github.com/PacktPublishing/-Practical-Node-RED-Programming的Chapter07文件夹中找到。
学习 RESTful API
阅读本书的许多人可能已经熟悉 Web API。然而,为了使用 Node-RED 调用 Web API,让我们回顾一下 RESTful API。
REST代表表述性状态转移。RESTful API 基本上指的是根据“REST 原则”实现的 Web 系统的 HTTP 调用接口。因此,广义上来说,可以说 REST API 和 RESTful API 是相同的东西。那么,RESTful API 究竟是什么?我们将在本节中学习 RESTful API 的概述和原则,以及使用 RESTful API 的优缺点。
REST 是由 HTTP 协议创造者之一 Roy Fielding 在 2000 年左右提出的,是一组(或一种思维方式)适用于构建分布式应用程序时链接多个软件的设计原则。此外,RESTful API 是根据以下四个 REST 原则设计的 API:
-
可寻址性:它具有能够通过 URI 直接指向资源的属性。所有信息都应该由唯一的 URI 表示,这样你就可以一目了然地看到 API 版本,是否获取数据,更新等。
-
无状态性:所有 HTTP 请求必须完全分离。不应执行会话等状态管理。
-
连接性:这指的是在一条信息中包含“链接到其他信息”的能力。通过包含链接,你可以“连接到其他信息”。
-
统一接口:使用 HTTP 方法进行所有操作,如信息获取、创建、更新和删除。在这种情况下,HTTP 方法是获取(“GET”)、创建(“POST”)、更新(“PUT”)和删除(“DELETE”)。
这些是四个原则。从这四个原则中可以看出,REST 的一个主要特点是它更有效地利用了 HTTP 技术,并且与 Web 技术有很高的亲和性。因此,它目前被用于开发各种 Web 服务和 Web 应用程序。
随着智能手机的广泛使用,业务系统不仅可以在 PC 上使用,还可以在移动设备上使用,这一点变得越来越明显。此外,用户不仅选择一个系统,而是选择可以与多个系统和各种 Web 服务链接的系统。RESTful API 作为解决这些问题的不可或缺的工具受到了极大的关注。
如下图所示,可以从任何地方通过互联网调用 Web API:
图 7.1 - RESTful API 图表
现在,让我们回顾一下 Node-RED 是什么。它的工作流工具样式类似于一个独立的工具,但 Node-RED 当然也是 Web 应用程序之一。换句话说,它是一个非常适合与此处描述的 RESTful API 一起使用的应用程序。
接下来,让我们再次介绍 Node-RED 节点具有哪些参数。
学习节点的输入/输出参数
在 Node-RED 中有许多节点,但适合调用 Web API(REST API)的并不多。调用 Web API 时常用的节点是http request节点。
要在 Node-RED 上调用外部 API,只需将 API 的端点 URL 设置为http request节点的 URL 属性。
例如,在调用 API 时需要在端点 URL 中设置参数时,可以设置连接的前一个节点的输出值。这种方法非常简单。在参数的值设置部分,可以设置{{payload}}变量,而不是字面字符串。
在{{payload}}中,输入从前一个处理节点继承的字符串。
以以下示例为例(请注意,此 URL 不存在):http://api-test.packt.com/foo?username={{payload}}&format=json:
图 7.2 – 使用{{payload}}作为参数设置 API 端点 URL
http request节点的过程不能仅由http request节点执行。在http request节点之前,需要连接触发过程,例如inject节点。在那时,如果有要传递给 API 调用的参数,也就是http request节点,请在msg.payload中设置它。
如果要在http request节点中调用的 API 是POST,则通过在预处理节点中创建 JSON 数据,并将其存储在msg.payload中,然后连接到http request节点,可以将其作为请求参数满足。
通过像这样使用http request节点,可以轻松实现 API 协作。API 调用对于在 Node-RED 上链接多个服务非常重要。例如,Node-RED 的function节点基本上是通过 JavaScript 处理的,但是通过将用其他开发语言开发的程序制作成 API,可以通过从 Node-RED 调用来使用。
如何在节点上调用 Web API
到目前为止,我们已经了解了什么是 RESTful API,以及哪个节点适合调用 API。
在这部分,让我们创建一个实际从 Node-RED 调用 API 的流程,并学习如何调用 API 以及如何处理 API 的结果值。
首先要考虑一些事情,比如要调用哪个 API。幸运的是,互联网上发布了各种 API。
这次,我想使用 OpenWeatherMap API。在 OpenWeatherMap 中,例如,准备了以下用于数据获取的 API:
-
当前天气数据
-
每小时预报 4 天
-
每日预报 16 天
-
气候预报 30 天
-
天气警报
-
等等...
有关更多信息,请参阅 OpenWeatherMap 的官方网站:openweathermap.org/。
好的,让我们准备使用 OpenWeatherMap API。
创建账户
要使用 OpenWeatherMap API,我们需要创建一个账户。请访问以下 URL:openweathermap.org/。
如果您已经有账户,请直接登录,无需进行以下步骤。
对于第一次使用的人,请点击登录按钮,然后点击创建账户链接。注册很容易。只需按照指示操作,并在注册后确认 OpenWeatherMap 发送给您的电子邮件。这是创建账户页面的样子:
图 7.3 – 创建 OpenWeatherMap 账户
接下来,让我们创建一个 API 密钥。
创建 API 密钥
当您登录 OpenWeatherMap 时,可以看到API 密钥选项卡,请点击它。您已经有一个默认的 API 密钥,但请为本教程创建一个特定的 API 密钥。输入任何密钥字符串,然后点击生成按钮。
请注意,本书中显示的 API 密钥是我创建的示例,不能使用。请务必在您的账户中创建一个新的 API 密钥:
图 7.4 - 生成 API 密钥
重要提示
创建 API 密钥后,密钥将在 10 分钟到几个小时内不会激活。如果在访问下一节中描述的 API 端点 URL 时返回 Web 响应错误,例如 401,则指定的 API 密钥可能尚未激活,请等待并重试。
检查 API 端点 URL
要检查您的 API 端点 URL,请按照以下步骤操作:
-
单击菜单栏上的API按钮。您可以在那里看到一些 API。
-
在本教程中,我们将使用当前天气数据,所以请点击当前天气数据下的API 文档按钮:
图 7.5 - 打开当前天气数据的 API 文档
- 这个 API 有一些类型的参数,比如按城市,按城市 ID,按邮政编码等等。请选择带有城市名称和 API 密钥参数的按城市名称。
API 文档,城市名称,州代码和国家代码来自 ISO 3166。API 调用区域下的 URL 是使用此 API 的端点 URL。请将此 URL 复制到剪贴板:
图 7.6 - 带参数的 API 端点 URL
接下来,让我们看看我们是否可以运行这个 API。
检查 API 是否可以运行
让我们尝试使用这个 API。您只需打开浏览器,粘贴 URL,并用您自己的城市名称和 API 密钥替换它。您可以选择任何城市名称,但 API 密钥是您在上一节中创建的特定密钥:
图 7.7 - 调用 API 并获取结果
我现在已经确认这个 API 可以正常工作。现在让我们从 Node-RED 调用这个 API 并使用它。
创建调用 API 的流程
现在让我们创建一个在 Node-RED 上调用 OpenWeatherMap API 的流程。在您的环境中启动 Node-RED。您可以使用独立的 Node-RED 或 IBM Cloud 上的 Node-RED:
图 7.8 - 使用 API 的流程
对于这个,流程非常简单,很容易制作。请按照以下步骤制作流程:
-
在调色板上放置一个注入节点和两个调试节点。这些节点可以使用默认设置。这里不需要更改设置。
-
在调色板上放置http 请求节点,然后打开http 请求节点的设置面板,并在设置面板的URL文本框中使用您的参数(城市名称和 API 密钥)设置 API 端点 URL,如下图所示:
图 7.9 - 使用您的参数设置 API 端点 URL
- 在调色板上放置一个json节点。此节点可以与默认设置一起使用。这里不需要更改设置。但是,以防万一,让我们确保json节点的Action属性设置为在 JSON 字符串和对象之间转换。这是一个选项,将把作为输入参数传递的 JSON 数据转换为 JavaScript 对象:
图 7.10 - 检查 Action 属性
- 将所有节点连接如下图所示:
图 7.11 - 连接所有节点
请将时间戳节点和http 请求节点连接起来。http 请求节点的输出连接到json节点和调试节点。最后,请将json节点的输出连接到另一个调试节点。
- 更改设置并连接所有节点后,您需要部署并单击注入节点的开关。现在您可以在右侧面板的调试窗口中看到数据:
图 7.12 - 在调试窗口上的结果数据(JSON)
您还可以在与以下屏幕截图相同的调试窗口上查看结果数据的 JSON 对象:
图 7.13 – 调试窗口上的结果数据(对象)
恭喜!您已成功通过调用 OpenWeatherMap API 创建了一个示例流程。如果您没有完全成功创建此流程,您也可以在此处下载此流程定义文件:github.com/PacktPublishing/-Practical-Node-RED-Programming/blob/master/Chapter07/open-weather-flows.json。
在下一节中,我们将学习在 IBM Cloud 上使用 Node-RED 的便利性以及 IBM Watson API。
如何使用 IBM Watson API
在上一节中,您学习了如何调用 API 并处理 API 的结果值。
在本节中,我们将创建一个实际从 Node-RED 调用 API 的流程,但我们将学习如何调用 IBM 提供的 Watson API。我们还将创建一个实际从 Node-RED 调用 API 的流程,但我们将学习如何调用 IBM 提供的 Watson API。
为什么要使用 Watson?Watson 是 IBM 提供的人工智能服务和 API 的品牌。
所有 Watson API 都可以从 IBM Cloud 上使用。因此,通过在 IBM Cloud 上运行 Node-RED,您可以有效地使用 Watson 的服务。这样做的好处是,当从 Node-RED 调用 Watson API 时,可以省略身份验证的实现。
Watson 可以从 IBM Cloud 以外的环境调用,因此可以直接从树莓派调用,也可以从 AWS 和 Azure 等云平台或本地环境中使用。请参见下图,显示 Watson API 的外观:
图 7.14 – Watson API 图表
有关更多信息,请参阅 IBM Watson 官方网站:www.ibm.com/watson。
好的,让我们看看在 IBM Cloud 上使用 Node-RED 上的 Watson API 有多容易。
登录 IBM Cloud
如果您已经按照第一章的步骤进行操作,您应该已经有了 IBM Cloud 帐户。只需登录 IBM Cloud (cloud.ibm.com)。
如果您没有 IBM Cloud 帐户,请从以下网址创建一个并登录 IBM Cloud。有关详细说明,请参阅第六章,在云中实现 Node-RED:ibm.biz/packt-nodered。
在 IBM Cloud 上启动 Node-RED
在上一节中,我们使用独立的 Node-RED 或 IBM Cloud 上的 Node-RED 创建了一个示例流程。当然,您可以使用独立版本的 Node-RED 来调用 Watson API,但会丢失一些好处。因此,在本部分中,我们将使用 IBM Cloud 上的 Node-RED。
与上一步一样,如果您还没有在 IBM Cloud 上使用 Node-RED,请返回到第六章,在云中实现 Node-RED,并按照其中的步骤激活 IBM Cloud 上的 Node-RED,然后再进行下一步。
创建 Watson API
接下来,在 IBM Cloud 上创建 Watson 的服务。严格来说,这意味着创建一个作为服务的实例,以便您可以调用 IBM Cloud 上提供的 Watson API 服务作为您自己的 API。
Watson 有几个 API,例如语音识别、图像识别、自然语言分析、情感分析等。这次,我想使用情感分析 API。
按照以下步骤创建 Watson Tone Analyzer API 服务:
- 从目录中搜索 Watson。在仪表板上,请单击
tone analyzer,然后选择Tone Analyzer面板:
图 7.15 – 搜索 Watson 服务
- 请参考以下列表和图 7.16填写每个属性:
a. 默认(您可以将其修改为任何您想要使用的名称)
d. 资源组:默认(对于 Lite 账户,您无法选择其他内容)
e. 标签:N/A
- 在输入/选择所有属性后,点击创建按钮:
图 7.16 – 创建 Tone Analyzer 服务
- 当创建并激活时,您可以在Tone Analyzer实例仪表板上看到状态为活动。请检查 API 密钥和 URL。API 密钥和 URL 在从任何应用程序调用 API 时使用。但是,在本教程中不使用这些,因为 IBM Cloud 上的 Node-RED 可以在不需要认证编码的情况下调用 Watson API。
您可以从此屏幕上的管理菜单中检查 API 密钥和 URL:
图 7.17 – 检查您的凭证
在下一节中,我们将连接 Node-RED 和 Tone Analyzer 服务。
连接 Node-RED 和 Tone Analyzer 服务
正如您已经知道的,Node-RED 可以在不需要认证编码的情况下调用 Watson API。在使用 Node-RED 与 Watson API 之前,我们需要连接 Node-RED 和 Watson API 实例。在上一步中,我们创建了Tone Analyzer API 实例,所以让我们按照以下步骤连接这两个实例:
-
点击左上角的IBM Cloud标志按钮,转到主仪表板。
-
点击资源摘要面板上的查看全部按钮。
-
在Cloud Foundry 应用区域点击 Node-RED 实例(应用)名称:
图 7.18 – 选择您创建的 Node-RED 服务
- 点击连接菜单,然后点击创建连接按钮:
图 7.19 – 为 Node-RED 和 Watson 创建连接
- 检查Tone Analyzer服务并点击下一步按钮:
图 7.20 – 点击下一步按钮选择连接服务
- 对于访问角色和服务 ID,无需进行修改。点击连接按钮:
图 7.21 – 点击连接按钮完成连接
- 我们需要重新启动 Node-RED 以激活连接。点击重新启动按钮:
图 7.22 – 点击重新启动按钮开始重新启动 Node-RED 服务
- 请等待直到您的 Node-RED 实例的重新设置完成。完成后,您将获得运行状态的成功连接。之后,请通过访问应用 URL链接打开 Node-RED 流程编辑器:
图 7.23 – 检查 Node-RED 服务的 Node.js 运行时状态
您已成功准备好 Node-RED 和 Watson API 流程。接下来,让我们通过调用 Tone Analyzer API 来创建流程。
通过调用 Tone Analyzer API 创建流程
现在,让我们创建一个在 Node-RED 上调用 Watson Tone Analyzer API 的流程。您已经在 IBM Cloud 上启动了 Node-RED。可以使用独立的 Node-RED 或 IBM Cloud 上的 Node-RED。
为了继续本教程,您需要安装以下两个节点:
- node-red-node-twitter:这是一个获取和发布推文到 Twitter 的节点。
图 7.24 – 安装 node-red-node-twitter
msg.payload。在向 Watson Tone Analyzer API 传递参数时使用:
图 7.25 - 安装 node-red-node-sentiment
在调色板中搜索这些节点并将它们安装到您的 Node-RED 流编辑器中。之后,按照下图所示创建一个流程:
图 7.26 - 使用 Tone Analyzer API 的流程
在这个流程中,功能节点处理从 Twitter 获取的结果值中包含的文本、语调和情感,以便将它们作为单独的调试输出。这样可以更容易地查看结果。
这个流程比您在上一步创建的流程要复杂一些。请按照以下步骤进行流程:
-
创建一个 Twitter ID(Twitter 账户)并在您的 Twitter 开发者帐户上创建一个应用程序,以便通过您的 Twitter 账户验证访问推文。
-
在 Twitter 开发者的项目和应用下访问概述,然后单击创建应用按钮:
图 7.27 - 在 Twitter 开发者上创建应用程序
- 使用任何字符串设置应用程序名称,然后单击完成按钮。
图 7.28 - 设置您的应用程序名称
- 之后,请检查访问令牌和访问令牌密钥区域。
您将看到令牌。请注意并保存您的访问令牌和访问令牌密钥。这些也将用于twitter in节点的设置:
图 7.29 - 记下您的令牌和令牌密钥
- 将twitter in节点放置在您的工作区,并双击它以打开设置窗口:
图 7.30 - 放置 twitter in 节点
- 单击设置窗口上的编辑(铅笔图标)按钮以编辑您的 Twitter 信息:
图 7.31 - 编辑 Twitter 属性
- 设置您的 Twitter ID,API 密钥和令牌。
API 密钥、API 密钥密钥、访问令牌和访问令牌密钥的值应从步骤 8中的文本编辑器中获取。
- 设置这些设置后,请单击添加按钮返回到twitter in节点的主设置窗口:
图 7.32 - 配置您的 Twitter 信息
-
选择
#nodered作为标签。您可以为名称设置任何名称。 -
最后,单击完成按钮以完成添加这些设置并关闭窗口:
图 7.33 - 完成节点中 Twitter 的设置
- 将情感节点放置在您的工作区。它将在twitter in节点之后连接。
对于这个节点,不需要设置或更改任何属性:
图 7.34 - 放置情感节点
- 按顺序在您的工作区上的情感节点之后放置情感分析器 v3节点:
图 7.35 - 放置情感分析器 v3 节点
- 打开情感分析器 v3节点的设置面板,并将方法和URL属性设置如下:
a. 名称:您想要命名的任何字符串
b. 方法:一般语调
c. version_date:多个语调
d. 语调:全部
e. 句子:真
f. 内容类型:文本:
图 7.36 - 配置情感分析器 v3 节点属性
- 按顺序在您的工作区上的情感分析器 v3节点之后放置功能节点:
图 7.37 - 放置功能节点
- 打开function节点的设置面板,并使用以下源代码编写 JavaScript:
msg.payload = {
"text" : msg.payload,
"tone" : msg.response,
"sentiment" : msg.sentiment
};
return msg;
有关function节点的编码,请参考以下屏幕截图:
图 7.38 - 功能节点的 JavaScript 源代码
您可以在这里获取代码:github.com/PacktPublishing/-Practical-Node-RED-Programming/blob/master/Chapter07/format-payload.js。
- 最后,放置三个
msg.payload.text:对于msg.payload.tone:对于msg.payload.sentiment:对于调试选项卡
有关布线说明,请参阅图 7.26。我们已经完成了流程节点的配置。
测试流程
流程现在已经完成。当您点击twitter in节点连接到您的 Twitter 帐户时,它将自动检索符合您标准的推文并处理后续流程。
这是自动完成的,因此您无需采取任何特殊操作。
在这里,它被设置为获取所有具有#nodered作为标签的推文。如果您没有收到很多推文,这意味着没有创建包含指定标签的推文,请更改twitter in节点中设置的标签并重试。
此流程的所有处理结果将显示在调试选项卡中。
从获取的推文中提取推文正文并显示的是msg.payload.text:
图 7.39 - 获取推文正文的结果
从获取的推文中提取和显示检测到的情绪的是msg.payload.tone:
图 7.40 - 从推文中的语调分析结果
从获取的推文中判断情感是积极还是消极的是msg.payload.sentiment:
图 7.41 - 推文情感的结果
恭喜!您已成功调用 Watson API 创建了一个示例流。如果您没有完全成功创建此流程,您也可以在此处下载此流程定义文件:github.com/PacktPublishing/-Practical-Node-RED-Programming/blob/master/Chapter07/get-sentiment-twitter-flows.json。
总结
在本章中,我们学习了如何创建调用两种类型的 Web API 的示例流(应用程序)。我们逐渐习惯于创建复杂的流程。在 Node-RED 中经常发现调用 Web API 的用例。我们在这里学到的流程创建方法将帮助我们将来创建更复杂的流程。
在下一章中,让我们了解一个可以与 GitHub 等存储库集成的项目功能,这是从 Node-RED 版本 1.0 添加的功能。
第八章:使用 Git 的项目功能
在本章中,您将学习到一个非常有用的项目功能。Node-RED 的项目功能是一种使用 Git 在 Node-RED 流程编辑器上进行版本管理的工具/功能。实际上,默认情况下是禁用的。启用此功能可以让您以一种新的方式管理您的流程。我相信许多开发人员熟悉 GitHub 和 GitLab 等 Git 服务。Node-RED 的项目功能使用 Git 和 GitHub 进行版本控制,因此我认为这非常容易理解。
以下是本章将涵盖的主题:
-
启用项目功能
-
使用 Git 存储库
-
连接远程存储库
在本章结束时,您将能够了解如何使用项目功能,如何将您自己的 Git 存储库连接到 Node-RED 流程编辑器,并如何使用版本控制工具 Git 管理流程作为项目。
在本章结束时,您将掌握如何使用项目功能并使用它制作应用程序。您可以在 GitHub 或 GitLab 等任何托管的 Git 服务中使用它。
技术要求
要在本章中取得进展,您将需要以下内容:
-
您可以通过官方网站创建 GitHub 帐户:
github.com/。 -
需要通过官方网站安装的 Git 客户端工具:
git-scm.com/downloads。
启用项目功能
例如,在您想要管理自己的流程同时与他人共享它,或者您想要更新他人创建的流程的情况下,当团队仅使用 Node-RED 流程编辑器时,开发会很困难。
Node-RED 的项目功能是一种管理与您制作的每个流程相关的文件的方法/功能。它涵盖了使用 Node-RED 可共享的创建应用程序所需的所有文件。
这些都受 Git 存储库支持。也就是说,所有文件都有版本。这使开发人员能够与其他用户合作。
在 Node-RED 版本 1.x 上,默认情况下禁用项目功能,因此必须在名为settings.js的config文件中启用它。
重要提示
在 Node-RED 的本地环境中创建项目时,到目前为止创建的流程可能会被覆盖为空白表格。您可以通过互联网下载此文档中创建的所有流程的流程配置的 JSON 文件,但是如果您在本地环境中的 Node-RED 中创建了自己的流程,则建议导出流程配置文件。
我们在本书中创建的所有流程定义和 JSON 文件都可以在此处下载:github.com/PacktPublishing/-Practical-Node-RED-Programming。
现在让我们尝试项目功能。我们将在本地环境(如 macOS 或 Windows)上使用独立版本的 Node-RED。为了使用项目功能,我们首先需要启用它。让我们按照以下步骤启用它:
- 需要重写
settings.js文件以启用/禁用项目功能。首先找到此文件。settings.js文件可以在存储所有用户配置的 Node-RED 用户目录中找到。
在 Mac 上,默认情况下,此文件位于以下路径下:
/Users/<User Name>/.node-red/settings.js。
在 Windows 上,默认情况下,此文件位于以下路径下:
C:\Users\<User Name>\.node-red\settings.js
- 编辑
settings.js文件。可以使用任何文本编辑器打开settings.js。我在这里使用了vi。使用以下命令打开settings.js:
$ vi /Users/<User Name>/.node-red/settings.js
重要提示
请将命令替换为适用于您的环境的命令。
- 编辑您的
settings.js文件,并在module.exports块内的editorTheme块中设置true,以启用项目功能:
module.exports = {
uiPort: process.env.PORT || 1880,
…
editorTheme: {
projects: {
enabled: true
}
},
…
}
-
保存并关闭
settings.js文件。 -
通过运行以下命令重新启动 Node-RED 以启用我们修改的设置:
$ node-red
我们现在已成功启用了 Node-RED 的项目功能。
要使用此功能,您需要访问 Git 和 ssh-keygen 命令行工具。Node-RED 在启动时检查它们,并在缺少任何工具时通知您。
如果设置完成没有任何问题,并且您已重新启动 Node-RED,则项目功能将可用。接下来,让我们设置 Git 存储库以供使用。
使用 Git 存储库
我们在上一节中启用了项目功能。重新打开流程编辑器,您将被提示使用当时创建的流程内容创建您的第一个项目。这将是欢迎屏幕:
图 8.1 - 欢迎屏幕
我们需要设置 Git 等版本控制客户端。如前所述,Node-RED 的项目功能使用 Git 作为版本控制工具。与常规 Git 一样,您可以根据项目管理文件更改,并根据需要与远程存储库同步。
Git 跟踪谁做出了更改。它与您的用户名和电子邮件地址一起工作。用户名不必是您的真实姓名;您可以使用任何您喜欢的名称。
如果您的本地设备已经配置了 Git 客户端,Node-RED 将查找这些设置。
首先,在您的本地环境中执行版本控制。它利用了您本地环境中安装的 Git 客户端的功能。如果您尚未安装 Git,请提前安装。
现在,按照以下步骤在 Node-RED 流程编辑器上创建项目:
-
首先,让我们创建一个项目。这非常容易。在项目创建窗口中输入项目名称和描述。
-
命名流程文件。默认情况下,它已命名为
flow.json。
换句话说,Node-RED 会自动将当前在流程编辑器上配置的流程迁移到一个新项目中。保持默认名称即可。当然,如果您愿意,也可以在此处选择重命名。
如果您将项目发布在 GitHub 等公共网站上,加密凭据文件是个好主意。
如果选择加密,必须创建一个用于加密的密钥。该密钥不包括在项目中,因此如果与某人共享项目,则需要单独向克隆项目的用户提供凭据文件解密密钥。
- 在添加所需信息后,单击创建项目按钮:
图 8.2 - 项目屏幕
恭喜!您已创建了您的第一个项目。
- 接下来,检查项目历史。我们可以在 Node-RED 流程编辑器上使用版本控制功能。您可以通过单击右上角的项目历史按钮访问项目历史面板:
图 8.3 - 项目历史面板
- 您可以在此面板上看到没有更改的项目。要检查更改历史功能是否已启用,请在此工作区上创建一个流程。
如果您经常使用 Git 或 GitHub,您应该能够通过查看此面板的结构来理解每个项目的含义和作用。如果项目下的文件结构或内容发生变化,目标文件将显示在本地更改区域。当您将更改移动到提交阶段(即添加时),目标文件的显示将移动到要提交的更改区域。如果输入提交消息并完成提交,版本将增加一次。
这与 Git 客户端所做的完全相同。
- 创建一个简单的流程。您可以创建任何您选择的流程,例如,我在
flow.json文件中使用了一个flow.json文件,这是整个流程的配置文件,已经更新。因此,flow.json已被识别为 Git 管理中要更改的文件:
图 8.5-Node-RED 已经意识到 flow.json 已更改
-
现在,让我们遵循 Git 的规范并继续进行。首先,将更改的文件放在提交阶段。这是 Git 的
git add命令。 -
单击
flow.json文件已从本地更改区域移动到提交区域。 -
接下来,让我们提交
flow.json中的更改。单击git commit命令:
图 8.7-单击提交按钮提交文件
- 单击提交按钮后,将打开提交注释窗口。请在此处输入提交注释,然后单击提交按钮:
图 8.8-单击提交按钮完成提交过程
- 提交现在已完成。最后,让我们检查提交历史区域。您会看到已创建一个新版本作为更改历史:
图 8.9-已添加新历史
在创建项目后,您可以像往常一样使用 Node-RED 编辑器。
现在,让我们为 Node-RED 流编辑器添加一个新的用户界面以实现项目功能。
访问项目设置
您正在处理的项目将显示在右侧窗格的顶部。在项目名称旁边,还有一个显示项目设置按钮:
图 8.10-信息面板上的项目信息
您还可以从主菜单下的“项目 | 项目设置”选项中访问项目设置屏幕:
图 8.11-如何通过主菜单访问项目设置
当显示项目设置面板时,您会看到每个设置有三个选项卡:
-
此项目的
README.md文件 -
依赖项:管理项目的节点列表
-
设置:管理项目设置和远程存储库:
图 8.12-项目设置面板
如果要检查和修改 Git 设置,可以通过主菜单访问设置面板:

图 10.17 - 检查发布和订阅的结果\
恭喜!现在您知道如何处理树莓派和 Grove Base 传感器模块在边缘设备上获取的传感器数据,并将其发送到 MQTT 代理。
摘要
在本章中,通过实际操作教程的形式,我们体验了如何在边缘设备上处理传感器数据并将其发送到 MQTT 代理。这是使用 Node-RED 为物联网创建边缘设备端应用程序的一种方式。
在下一章中,我们将看一个实际的例子,接收传感器数据并通过 Node-RED 在服务器端(云端)进行可视化。
第十一章:通过在 IBM Cloud 中创建服务器端应用程序来可视化数据
在本章中,我们将创建一个服务器应用程序,用于可视化从物联网边缘设备发送的数据,使用 Node-RED。对于服务器端应用程序,我想在这里使用 IBM Cloud。通过本章中的教程,您将掌握如何在服务器应用程序上可视化传感器数据。
让我们从以下主题开始:
-
准备一个公共 MQTT 代理服务
-
在边缘设备上从 Node-RED 发布数据
-
在云端 Node-RED 上订阅和可视化数据
在本章结束时,您将掌握如何在云平台上可视化传感器数据。
技术要求
要在本章中取得进展,您将需要以下内容:
-
IBM Cloud 帐户:
cloud.ibm.com/ -
CloudMQTT 帐户:
cloudmqtt.com/ -
本章中使用的代码可以在
github.com/PacktPublishing/-Practical-Node-RED-Programming的Chapter11文件夹中找到。
准备一个公共 MQTT 代理服务
回想一下上一章,第十章,在树莓派上处理传感器数据。我们将连接到边缘设备(树莓派)的温度/湿度传感器的数据发送到云端,并确认可以在云端观察到数据。
在上一章中,我们检查了如何使用名为Mosquitto的服务操作 MQTT 代理。这是为了专注于从边缘设备发送数据到 MQTT 代理。
然而,这是一个在树莓派上本地完成的机制。基本上,在尝试实现物联网机制时,MQTT 代理应该位于公共位置,并且可以通过互联网从任何地方访问。
在公共云中托管自己的Mosquitto MQTT 代理是可能的,但这会增加一些额外的复杂性,涉及设置和维护。有许多公共 MQTT 服务可用,可以使入门变得更容易。
在本章中,我们将使用名为CloudMQTT的服务作为 MQTT 代理,但您可以用您喜欢的服务替换 MQTT 代理部分。您还可以在 IaaS 上发布自己的 MQTT 代理,例如Mosquitto,而不是使用 SaaS:
图 11.1 - CloudMQTT 概述
重要提示
MQTT 代理是一个服务器,它接收来自发布者的消息并将其发送给订阅者。
在 PubSub 中传递消息的服务器称为 MQTT 代理。
PubSub 是发布者和订阅者这两个词的结合:
a) 发布者是传递消息的人。
b) 订阅者是订阅消息的人。
您可以将其视为从客户端接收消息并将其分发给客户端的服务器。
MQTT 与普通的套接字通信不同,它是一对多的通信。换句话说,它有一种机制,可以将一个客户端的消息分发给许多人。这个系统允许我们实时同时向许多人传递消息。
我们现在将学习如何准备CloudMQTT。如前所述,CloudMQTT是作为 SaaS 发布的 MQTT 代理。如果您不使用CloudMQTT,想要使用另一个 SaaS MQTT 代理或在 IaaS 上发布 MQTT 代理,您可以跳过此步骤。但是,使用 MQTT 代理的基本配置信息保持不变,因此我相信这一步将帮助您配置任何 MQTT 代理。
执行以下步骤在CloudMQTT上创建一个 MQTT 代理服务:
- 登录到
cloudmqtt.com/的CloudMQTT。
当您访问网站时,点击窗口右上角的登录按钮:
图 11.2 - CloudMQTT 网站
如果你已经有了 CloudMQTT 账户,请通过输入你的电子邮件地址和密码登录你的账户:
图 11.3 - 登录到 CloudMQTT
如果你还没有你的账户,请通过窗口底部的Sign up按钮创建一个新账户:
图 11.4 - 创建你的账户
- 创建一个实例。
登录后,单击窗口右上角的Create New Instance按钮:
图 11.5 - 创建一个新实例
- 选择一个名称和付款计划。
这个名称是为了你的 MQTT 代理服务。你可以给它任何你想要的名字。我用了Packt MQTT Broker。
不幸的是,免费计划Cute Cat已经不再可用。所以,我们将在这里选择最便宜的计划Humble Hedgehog。这个计划每月需要 5 美元。
使用这个付费服务取决于你。如果你想避免计费,你需要寻找一个免费的 MQTT 代理服务。
选择名称和付款计划后,单击Select Region按钮:
图 11.6 - 选择名称和付款计划
- 选择一个区域和数据中心。
这个服务正在AWS上运行。所以,你可以选择数据中心所在的区域。你可以选择任何区域。在这里,我们使用US-East-1。
- 做出选择后,点击Review按钮:
图 11.7 - 选择区域和数据中心
- 接下来,完成 MQTT 代理实例的创建。
请检查付款计划、服务名称、服务提供商和数据中心区域。之后,点击Create instance按钮完成此实例的创建:
图 11.8 - 完成 MQTT 代理实例创建
在边缘设备上发布来自 Node-RED 的数据
在本节中,我们将配置我们的树莓派。首先,启动树莓派并打开 Node-RED 流编辑器。这个 Node-RED 流编辑器应该仍然有一个流来发送传感器数据,实现在第十章,在树莓派上处理传感器数据中。如果你已经删除了这个流,或者你还没有创建它,请参考第十章,在树莓派上处理传感器数据来重新执行它。双击组成流的mqtt out节点以打开设置窗口。我们上次使用了Mosquitto,但这次我们将连接到CloudMQTT。
执行以下步骤配置树莓派上的 Node-RED 连接到 CloudMQTT:
- 访问你在第十章中创建的流程,在树莓派上处理传感器数据。
在本章中,我们只使用了一个带有mqtt out节点的流,因为这个场景只是为了向树莓派发送数据:
图 11.9 - 访问我们在上一章中创建的流程
-
编辑
packt -
1 -
true -
单击Edit按钮(铅笔标记)右侧的Server以打开凭证属性:
图 11.11 - 单击“编辑”按钮打开属性设置
-
在服务器设置面板上,选择
driver.cloudmqtt.com -
18913
Connection选项卡中的其他属性不应该被更改,必须保持它们的默认值。
你可以参考以下截图来设置Connection选项卡:
图 11.12 – MQTT 代理服务器设置
- 接下来,选择安全选项卡来编辑配置以连接 MQTT 代理,并填写每个属性如下:
-
用户名:您从 CloudMQTT 获得的用户。
-
密码:您从 CloudMQTT 获得的密码。
您可以参考以下截图来设置安全选项卡:
图 11.13 – MQTT 代理用户和密码设置
您可以在 CloudMQTT 管理菜单中检查这些属性。此菜单可以通过 CloudMQTT 仪表板的实例列表访问:customer.cloudmqtt.com/instance
图 11.14 – CloudMQTT 实例列表
这完成了树莓派端的设置。接下来,让我们设置 Node-RED 流编辑器,以便可以在云端的 Node-RED 上获取(订阅)数据。
在云端 Node-RED 上订阅和可视化数据
在本节中,我们将看到如何使用 Node-RED 在云端可视化接收到的数据。这使用了我们在第六章中学到的仪表板节点之一,但这次,我们将选择 Gauge 的 UI,使其看起来更好一些。
这次使用的云端 Node-RED 运行在 IBM Cloud(PaaS)上,但是之前创建了 MQTT 代理服务的 CloudMQTT 是一种与 IBM Cloud 不同的云服务。
在本章中,我们将学习到 MQTT 代理存在的原因,以便可以从各个地方访问它,并且发布者(数据分发者)和订阅者(数据接收者)都可以在不知道它在哪里的情况下使用它。
在 IBM Cloud 上准备 Node-RED
现在,让我们通过以下步骤创建一个连接到 CloudMQTT 的 Node-RED 流。在这里,我们将在 IBM Cloud 上使用 Node-RED。请注意,这不是树莓派上的 Node-RED:
-
打开 Node-RED 流编辑器,登录到您的 IBM Cloud,并从仪表板中调用您已经创建的 Node-RED 服务。
-
要么点击查看全部,要么点击Cloud Foundry 服务在资源摘要仪表板上的瓷砖。点击任一选项都会带您到您在 IBM Cloud 上创建的资源列表:
图 11.15 – 打开资源列表
如果您在 IBM Cloud 上尚未创建 Node-RED 服务,请参考第六章,在云中实现 Node-RED,在继续之前创建一个。
- 在资源列表屏幕上显示的Cloud Foundry 应用下,点击您创建的 Node-RED 服务以打开 Node-RED 流编辑器:
图 11.16 – 选择您创建的 Node-RED 服务
- 然后,点击访问应用 URL来访问 Node-RED 流编辑器:
图 11.17 – 点击访问应用 URL
- 当 Node-RED 流编辑器的顶部屏幕显示时,点击转到您的 Node-RED 流编辑器按钮来打开 Node-RED 流编辑器:
图 11.18 – 点击转到您的 Node-RED 流编辑器按钮
- 创建一个流来可视化数据。
当您在 IBM Cloud 上访问您的 Node-RED 流编辑器时,请按以下步骤创建一个流。在每个change节点之后放置mqtt in节点,json节点,两个change节点和gauge节点。如果您想要获取此流的调试日志,请在任何节点之后添加debug节点。在本例中,在mqtt in节点和第一个change节点之后放置了两个debug节点。
您已经拥有仪表板节点,包括仪表节点。如果没有,请返回到第六章中的为用例 2 制作流程-可视化数据教程中,在云中实现 Node-RED,以获取仪表板节点:
图 11.19 – 制作流程
-
编辑
packt -
1 -
auto-detect(字符串或缓冲区) -
单击右侧的编辑按钮(铅笔图标)以打开凭据属性:
图 11.20 – 单击编辑按钮打开属性设置
-
在服务器设置面板上,选择
driver.cloudmqtt.com -
18913
连接选项卡的其他属性不应更改,必须保持其默认值。
您可以参考以下截图进行连接选项卡设置:
图 11.21 – MQTT 代理服务器设置
- 接下来,选择安全选项卡以编辑连接 MQTT 服务器的配置,并使用以下值填写每个属性:
-
用户名:您从 CloudMQTT 获取的用户。
-
密码:您从 CloudMQTT 获取的密码。
您可以参考以下截图进行安全选项卡设置:
图 11.22 – MQTT 代理用户和密码设置
正如您可能已经注意到的那样,这些属性具有您在树莓派 Node-RED 上为mqtt out节点设置的相同值。如有必要,请参考 CloudMQTT 仪表板。
- 现在,编辑 json 节点。双击属性中的
msg.payload:
图 11.23 – 设置 json 节点属性
- 编辑规则区域下to框中的
msg.payload.temperature的设置。然后,单击完成按钮关闭设置窗口:
图 11.24 – 设置第一个更改节点的属性
- 此外,在规则区域的to框中编辑第二个
msg.payload.humidity的设置,然后单击完成按钮关闭设置窗口:
图 11.25 – 设置第二个更改节点的属性
- 编辑第一个仪表节点的设置。双击第一个仪表节点以打开设置窗口,然后单击右侧的编辑按钮(铅笔图标)以打开属性:
图 11.26 – 单击编辑按钮打开属性设置
- 在仪表板的组设置面板中,使用以下值填写每个属性:
树莓派传感器数据
- 在此处提供任何名称都可以。此名称将显示在我们将创建的图表网页上。
其他属性不应更改,必须保持其默认值。您可以参考以下截图:
图 11.27 – 设置组名
-
返回到
Temperature的主面板 -
°C(如果您希望使用华氏度,请使用°F) -
范围:-15 ~ 50(如果您希望使用华氏度,请相应调整范围)
其他属性不应更改其默认值。您可以参考以下截图进行设置:
图 11.28 – 设置仪表节点属性
-
编辑第二个
湿度的设置 -
% -
范围:0 ~ 100
其他属性不应更改其默认值。您可以参考以下屏幕截图进行设置:
图 11.29 – 设置表盘节点属性
请确保在 Node-RED 上部署流程。
这完成了 IBM Cloud 上的 Node-RED 配置。这意味着此流程已经订阅(等待数据)使用主题packt进行 CloudMQTT 服务。接下来是发布和订阅数据的时间。
在 IBM Cloud 上可视化数据
在边缘设备端,即树莓派上,我们已准备好使用主题packt将传感器数据发布到 CloudMQTT。在云端,流程已经使用packt主题进行 CloudMQTT 服务。
对于树莓派,执行以下步骤发布您的数据:
- 从您的树莓派发布数据。
访问您的树莓派上的 Node-RED 流程编辑器。单击注入节点的按钮以运行此流程以发布槽温度和湿度传感器数据:
图 11.30 – 运行发布数据的流程
- 检查 IBM Cloud 上数据的接收情况。
您将能够通过 CloudMQTT 接收(订阅)数据。您可以在 IBM Cloud 上的 Node-RED 流程编辑器的调试选项卡上检查:
图 11.31 – 检查数据的订阅情况
- 通过 IBM Cloud 上的 Node-RED 流程编辑器的图表选项卡打开图表网页,然后单击打开按钮(对角箭头图标)打开它:
图 11.32 – 打开图表网页
您将看到显示数据的网页表盘图表:
图 11.33 – 显示图表网页
恭喜!现在您知道如何观察从树莓派发送到服务器的数据并将其可视化为图表。
如果您希望在 Node-RED 上进行流程配置文件以使此流程生效,您可以在这里获取:github.com/PacktPublishing/-Practical-Node-RED-Programming/blob/master/Chapter11/getting-sensordata-with-iotplatform.json。
总结
在本章中,我们体验了如何接收从边缘设备发送的传感器数据并在服务器端进行可视化。
在本章中,我们在 IBM Cloud 上使用了 CloudMQTT 和 Node-RED。Node-RED 可以在任何云平台和本地运行,并且您可以尝试在任何环境中制作这种应用。因此,记住这种模式对于您未来在其他云 IoT 平台上的开发肯定会有用。
在下一章中,我们将介绍如何使用 Node-RED 制作一个聊天机器人应用的实际场景。这将为您介绍 Node-RED 的新用法。
第十二章:使用 Slack 和 IBM Watson 开发聊天机器人应用程序
在这一章中,我们将使用 Node-RED 创建一个聊天机器人应用程序。对于聊天机器人应用程序的用户界面,我们将使用 Slack,并且我们将使用 IBM Watson AI 来进行技能。完成本章的教程后,您将学会如何将 Node-RED 与外部 API 结合起来创建一个应用程序。这将帮助您在未来使用 Node-RED 创建可扩展的 Web 应用程序。
让我们从以下主题开始:
-
创建 Slack 工作区
-
创建 Watson 助手 API
-
从 Node-RED 启用与 Slack 的连接
-
构建聊天机器人应用程序
在本章结束时,您将掌握如何使用 Node-RED 制作 Slack 聊天机器人应用程序。
技术要求
要在本章中取得进展,您将需要以下内容:
-
IBM Cloud 账户:
cloud.ibm.com/。 -
本章使用的代码可以在
github.com/PacktPublishing/-Practical-Node-RED-Programming的Chapter12文件夹中找到。
创建 Slack 工作区
这个实践教程使用Slack作为您的聊天机器人应用程序的用户界面。Node-RED 负责控制聊天机器人应用程序背后的消息交换。
这个聊天机器人应用程序的整体视图如下:
图 12.1 – 应用程序概述
首先,使用以下步骤为此应用程序创建一个 Slack 工作区。如果您已经有一个 Slack 工作区,可以使用现有的工作区。在这种情况下,跳过以下步骤,并在您的工作区中创建一个名为learning-node-red的频道:
- 访问
slack.com/create,输入您的电子邮件地址,然后点击下一步按钮:
图 12.2 – 输入您的电子邮件地址
- 从 Slack 收到的电子邮件中检查六位数验证码:
图 12.3 – 检查六位数验证码
- 在您点击下一步并输入您的电子邮件地址后显示的窗口中输入验证码。输入验证码后,您将被自动重定向到下一个窗口:
图 12.4 – 输入验证码
- 给您的工作区取一个名字,然后点击下一步按钮:
图 12.5 – 给您的工作区取一个名字
- 在您的工作区中创建一个频道。您可以使用
Learning Node-RED:
图 12.6 – 您的工作区名字
- 点击暂时跳过而不添加队友:
图 12.7 – 本教程不需要队友
- 点击在 Slack 中查看您的频道打开您创建的工作区:
图 12.8 – 在 Slack 中查看您的频道
您已为本教程创建了工作区:
图 12.9 – 您已创建了工作区
重要提示
聊天机器人所在的频道最好是只有您参与的频道,除非有公共目的。这是因为聊天机器人的活动可能会对不喜欢(或对聊天机器人不感兴趣的)参与者造成干扰。
此时,您已经准备好在 Slack 中运行您的聊天机器人的工作区和频道。接下来,我们将创建一个将成为聊天机器人引擎的机制。
创建 Watson 助手 API
这个实践教程使用 IBM 的Watson 助手 API作为聊天机器人的引擎。Watson 助手可以使用自然语言分析来解释自然对话的意图和目的,并返回适当的答案。
有关 Watson 助手的详细信息,请访问以下网址:www.ibm.com/cloud/watson-assistant-2/。
要使用 Watson 助手 API,您需要在 IBM Cloud 上创建 Watson 助手 API 的实例。按照以下步骤创建它:
- 登录到 IBM Cloud 仪表板,并在目录中搜索
助手。单击搜索结果中的助手图块:
图 12.10 – 搜索 Watson 助手
-
创建 Watson 助手 API 服务。为 Watson 助手服务数据中心选择一个区域。达拉斯很稳定,所以我们选择了达拉斯。
-
选择Lite作为定价计划。其他项目,如服务名称和资源组,可以保留其默认值。
-
单击创建按钮:
图 12.11 – 创建 Watson 助手服务
- 启动 Watson 助手工具。单击启动 Watson 助手按钮打开 Watson 助手控制台:
图 12.12 – 启动 Watson 助手控制台
- 在您的Watson 助手服务中创建一个技能。
当您第一次打开 Watson 助手控制台时,您将自动转到我的第一个技能屏幕。
通常,您会在这里创建一个 Watson 助手技能,但是这个实践教程将专注于 Node-RED 而不是如何使用 Watson 助手。因此,通过导入预先准备的定义文件在 Watson 助手中创建一个技能。
如果您想创建自己的技能,那很好。在这种情况下,官方的 Watson 助手文档会帮助您:cloud.ibm.com/apidocs/assistant/assistant-v2。
-
点击
告诉我一个笑话。 -
为此框架创建一个助手,将助手的名称设置为
Respond Joke Phrase,然后单击创建助手按钮:
图 12.14 – 创建助手
- 导入对话。创建助手后,将显示所创建助手的设置屏幕。在该设置屏幕上的对话区域中,单击添加对话技能按钮:
图 12.15 – 添加对话技能
-
选择导入技能选项卡,并选择要导入的技能的 JSON 文件。在
github.com/PacktPublishing/-Practical-Node-RED-Programming/blob/master/Chapter12/skill-Respond-Joke-Phrase.json下载此 JSON 文件。 -
选择 JSON 文件后,单击导入按钮:
图 12.16 – 导入对话技能文件
您将在对话区域看到Respond Joke Phrase:
图 12.17 – 导入对话技能
- 技能导入完成。您可以返回简单的问候和笑话短语,因此尝试使用 Watson 助手控制台中提供的试一试功能进行对话:
图 12.18 – 试一试
单击试一试按钮时,将打开聊天窗口。在聊天窗口中尝试输入以下对话:
"你好"; "嗨"; "告诉 我 笑话"; "你 知道 笑话吗?"*; 等等…
图 12.19 – 测试对话
如果您得不到一个好的答案,请尝试另一个短语。Watson 自然语言理解将在 Watson 助手的试一试窗口中说的对话分成意图或实体的类。如果对话没有分成所需的类,您可以在试一试窗口中训练助手 API。
现在您已经使用 Watson Assistant 创建了自动回答对话,还有一件事要做,那就是确认技能 ID。这是您以后需要从 Node-RED 操作 Watson Assistant 作为 API 所需的 ID。
通过以下步骤从技能屏幕检查技能 ID:
- 在您创建的技能瓦片的右上角的技能菜单下点击查看 API 详细信息:
图 12.20 - 访问查看 API 详细信息菜单
- 记下显示的技能 ID:
图 12.21 - 检查并记录技能 ID
我们现在已经创建了一个自动回复聊天的聊天机器人服务。接下来,让我们将其与 Slack 用户界面集成。
启用从 Node-RED 到 Slack 的连接
接下来,让我们继续在您的 Node-RED 环境中准备一个 Slack 节点。启动在 IBM Cloud 上创建的 Node-RED 流程编辑器。
在这一步中,您要做的是在您的 Node-RED 环境中安装一个连接到 Slack 的节点。这种方法很简单。您所要做的就是在管理调色板窗口中找到并安装节点,这在其他章节中已经做过多次。
按照以下步骤继续:
重要提示
我相信您在 IBM Cloud 上的 Node-RED 流程编辑器已经作为服务(作为 Node.js 应用程序)创建好了,但如果您还没有这样做,请参考第六章**,在云中实现 Node-RED,在继续本章之前在 IBM Cloud 上创建一个 Node-RED 服务。
- 您需要安装node-red-contrib-slack节点才能从 Node-RED 中使用 Slack,因此点击管理调色板:
图 12.22 - 打开管理调色板窗口
- 搜索
node-red-contrib-slack节点并点击安装按钮:
图 12.23 - 安装 node-red-contrib-slack 节点
- 您将在调色板上看到属于node-red-contrib-slack的四个节点。您必须为构建此示例应用程序准备 Slack 节点:
图 12.24 - Slack 节点将出现在您的调色板上
- 通过在 Slack 应用程序(桌面或 Web)上通过设置和管理 | 管理应用访问Slack App 目录,在您的 Slack 工作区中创建一个机器人:
图 12.25 - 选择管理应用
- 移动到 Slack App 目录网站后,点击
https://<your workspace>.slack.com/apps。
以下 URL 仅供参考:packtnode-red.slack.com/apps。
此 URL 根据 Slack 上每个工作区的名称自动生成。
- 点击获取基本应用程序按钮,转到应用程序搜索窗口:
图 12.27 - 点击获取基本应用程序按钮
- 搜索单词
bots并点击结果中的Bots:
图 12.28 - 搜索 Bots 并选择它
- 在Bots应用程序屏幕上点击添加到 Slack按钮:
图 12.29 - 将 Bots 应用添加到您的工作区
-
设置
packt-bot。 -
点击添加机器人集成按钮:
图 12.30 – 设置您的机器人名称
- 在下一个屏幕上,将生成并显示用于使用机器人的 API 令牌。记下这个令牌,以免忘记。创建 Node-RED 流程时会使用这个 API 令牌:
重要提示
在与应用程序共享机器人用户令牌时要小心。不要在公共代码存储库中发布机器人用户令牌。这是因为任何人都可以使用这个 API 令牌访问机器人。
图 12.31 – 确认您的 API 令牌
- 点击保存集成按钮完成 Bot 应用程序的集成:
图 12.32 – Bot 应用程序集成完成
现在您已经准备好了。让我们继续进行流程创建过程。
构建一个聊天机器人应用程序
到目前为止,您已经在 Watson 助手中创建了一个聊天机器人引擎,创建了一个 Slack 工作区,并集成了 Bot 应用程序,您可以在该 Slack 工作区中使用。
在这里,我们将把这些服务与 Node-RED 结合起来,并创建一个机制,使得在 Slack 工作区中说话时,机器人会在 Node-RED 中回答。
按照以下步骤创建一个流程:
- 将 Watson 助手连接到 Node-RED。通过 IBM Cloud 上的资源列表访问您的 Node-RED 服务仪表板。选择连接选项卡,然后点击创建连接按钮:
图 12.33 – 在 Node-RED 上创建新连接
- 选择您创建的 Watson 助手服务,然后点击下一步按钮:
图 12.34 – 在 Node-RED 上创建新连接
- 点击连接按钮,使用默认选项完成连接设置。执行此操作将重新启动 Node-RED 应用程序,这将需要几分钟来完成:
图 12.35 – 完成在 Node-RED 上创建新连接
- 创建处理 Slack 上对话的流程。
您已经有了 Slack 节点和 Watson 节点,可以在这个实践教程中使用。
- 放置一个slack-rtm-in节点,两个function节点,一个assistant节点,slack-rtm-out和一个debug节点。放置它们后,按照以下图示将它们依次连接起来:
图 12.36 – 放置节点并连接它们
- 为每个节点设置参数。
按照以下步骤设置每个节点的参数。对于需要编码的节点,请按照以下方式进行编码:
- slack-rtm-in节点:
a) 点击编辑按钮(铅笔图标)打开属性面板:
图 12.37 – 打开属性面板
b) 输入packt-bot:
图 12.38 – 设置连接 Slack 应用程序的配置属性
当您返回到此节点的主面板时,您会看到Slack 客户端属性中的配置已经设置。
c) 点击完成按钮关闭此设置:
图 12.39 – 完成设置 slack-rtm-in 节点的属性
- function节点(第一个):
a) 在第一个function节点中,输入以下内容:
global.set("channel",msg.payload.channel);
msg.topic = "message";
msg.payload = msg.payload.text;
return msg
您也可以参考以下图示:
图 12.40 – 第一个 function 节点编码
在这个 function 节点中,从 Slack 发送的消息被从 Slack 发送的 JSON 数据中取出,并再次放入msg.payload中。
另一个重要的过程是将从 Slack 发送的频道信息存储在 Node-RED 的全局变量中。这里存储的频道信息将在稍后向 Slack 发送响应消息时使用。
- 助手节点:
在上一步中,您将 Watson 助手连接到了 Node-RED。这意味着您可以从 Node-RED 调用助手 API,而无需使用 API 密钥或密码。
当我双击助手节点以打开设置面板时,我没有看到任何属性,比如 API 密钥。如果您在设置面板中看到它们,这意味着 Watson 助手和 Node-RED 连接过程失败了。在这种情况下,请重新执行连接过程。
这里只有一个属性需要设置。在assistant节点的设置面板中,将您之前写下的 Watson 助手技能 ID 设置为工作区 ID属性:
图 12.41 - 将技能 ID 设置为工作区 ID
这完成了助手节点的设置。保存您的设置并关闭设置面板。
- 功能节点(第二个节点):
在第一个功能节点中,输入以下代码:
var g_channel=global.get("channel");
msg.topic = "message";
msg.payload = {
channel: g_channel,
text: msg.payload.output.text[0]
}
return msg
您还可以参考以下图:
图 12.42 - 第二个功能节点编码
第二个功能节点将 Watson 助手返回的自动回复消息存储在msg.payload.text中,并获取保存在第一个功能节点中的 Slack 频道信息,并将其存储在msg.payload.channel中。
- 您创建的
packt-bot已经放置在此节点属性中。如果尚未设置,请从下拉列表中手动选择。单击完成后,设置将完成:
图 12.43 - 检查 slack-rtm-out 节点的属性设置
- 调试节点:
这里的调试节点只是简单地输出日志。不需要设置。
- 在 Slack 上检查机器人应用。
使用 Slack 创建了一个自动回答聊天机器人。让我们尝试对话。
- 在您的 Slack 工作区创建的频道上,添加您集成的机器人应用程序,并单击频道上的添加应用链接:
图 12.44 - 单击添加应用链接
- 单击添加按钮将机器人应用添加到您的频道中:
图 12.45 - 添加您创建的机器人应用
现在,让我们真正进行一次对话。在您添加了这个机器人应用的频道上提及并与您的机器人(例如packt-bot)交谈。由于我们这次学习的唯一对话是问候和听笑话,我们将从 Slack 发送一条看起来与这两者之一相关的消息。
首先,让我们打个招呼。您将看到一种问候的回应:
图 12.46 - 与聊天机器人交换问候
然后发送一条消息,比如请 告诉 我 一个 笑话。它会随机回复一个机器人选定的笑话:
图 12.47 - 机器人回答一些笑话
干得好!您终于用 Node-RED 创建了聊天机器人应用。
如果您希望在 Node-RED 环境中创建此流程的流程配置文件,可以在此处获取:github.com/PacktPublishing/-Practical-Node-RED-Programming/blob/master/Chapter12/slack-watson-chatbot-flows.json。
总结
在本章中,我们体验了如何使用 Slack、Watson 和 Node-RED 制作聊天机器人应用程序。这次,我们使用 Slack 作为聊天平台,但您可以使用任何具有 API 的聊天平台,例如 LINE、Microsoft Teams 等,而不是 Slack。
本章对于创建任何非物联网应用程序也非常有帮助。Node-RED 可以通过与任何 Web API 链接来开发各种应用程序。
在下一章中,让我们开发自己的节点。当然,它可以在任何环境中使用。使用 Node-RED 开发自己的节点意味着开发一个无法通过现有节点完成的新节点。这无疑是 Node-RED 高级用户的第一步。