使用 Node-RED 和 InfluxDB 轻松实现物联网
作者:Charles Mahler / 产品, 用例, 开发者
2022 年 3 月 30 日
导航至
在本文中,您将了解 Node-RED,这是一种流行的工具,用于快速将不同类型的硬件和软件粘合在一起。您将了解 Node-RED 的一些核心概念,然后学习如何使用 MQTT 代理和 InfluxDB 来创建一些工作流程,例如存储来自传感器的数据。
什么是 Node-RED?
Node-RED 是一种开源、低代码、可视化编程工具,基于基于流程的开发概念。其背后的想法是使其非常容易连接 API、硬件设备以及可通过某种类型的网络连接访问的任何其他内容。
Node-RED 提供了许多预构建的“节点”,允许非开发人员使用可视化界面创建自定义集成和自动化,同时也允许开发人员在需要时使用 JavaScript 或另一种语言编写的外部服务编写自己的自定义节点。在许多方面,Node-RED 可以被视为低代码运动的最早示例之一,这种运动的受欢迎程度正在上升。
Node-RED 最初由 IBM 开发,然后贡献给了 OpenJS 基金会。可以说,Node-RED 最大的优势是生态系统和社区,在 GitHub 上拥有超过 14,000 颗星,以及一个社区库,其中包含超过 3000 个预构建节点和 2000 个可定制流程,涵盖了许多常见的用例。
简而言之,使用像 Node-RED 这样的工具的好处是
- 无需重新发明轮子 - 大量预构建功能
- 庞大的社区,提供许多常见问题的解决方案
- 易于扩展,可为您的用例提供自定义功能
Node-RED 核心概念
在本节中,我将介绍 Node-RED 的一些主要组件,这将帮助您快速入门。
节点
正如您可能从名称中预期的那样,节点是 Node-Red 的重要组成部分。它们是使用 Node-Red 时执行的所有操作的基本构建块。节点由从先前节点接收消息对象或 HTTP 请求等外部事件触发。节点处理消息或事件,然后将其传递到下一个节点。
以下是 Node-RED 提供的一些最常见和最有用的节点
- Inject(注入) - Inject 节点允许您通过注入消息负载手动启动流程。负载可以是字符串、数字或具有多个属性的对象。此节点也可以设置为在设定的时间或定期间隔运行。
- Change(更改) - Change 节点是编写自定义函数以执行基本转换或修改(例如在消息对象上添加或删除属性)的不错替代方案。
- Debug(调试) - Debug 节点可用于帮助开发流程并查找任何潜在的错误发生的位置。默认情况下,它会将消息负载发送到调试侧边栏,但也可以自定义为发送不同的信息,并打印到您启动 Node-RED 的终端。
- Switch(切换) - Switch 节点允许根据定义的规则将消息路由到流程的不同分支。例如,如果您有一个传感器检测温度,您可能希望根据某个阈值创建警报。如果温度未超过该阈值,您可以结束流程。
- Function(函数) - Function 节点允许您编写自定义 JavaScript 代码,用于 Node-RED 提供的预构建节点不支持您的用例的情况
除了这些节点之外,还有许多其他节点用于处理消息、存储数据和处理不同类型的网络请求。
流程
流程可以被认为是组织节点序列的容器。它们在 Node-RED 编辑器中表示为独立的选项卡。您可以使用许多不同的策略和最佳实践来确定何时应将流程划分为多个不同的流程或将其全部放在一起。
消息
消息是从流程开始到结束通过节点传递的 JavaScript 对象。对象上的属性可以由节点添加或修改。约定是将最相关的信息存储在消息对象上名为 payload
的属性中,该属性本身通常称为 msg
。
上下文
Node-RED 中的上下文本质上是定义全局变量的能力,节点可以直接访问这些变量,而不是从传递给节点的消息中访问。上下文可以在 3 个不同的级别进行作用域限定。第一个是节点级别,只有设置值的节点才能访问它。第二个是流程级别,值对于该流程中的所有节点都可见。最终的上下文级别是真正的全局级别,Node-RED 实例中的任何节点都可以访问该值。
Node-RED 流程教程
现在让我们进入实际教程,使用 Node-Red 创建一些流程。如果您想继续操作,您将需要一个正在运行的 Node-RED 实例。您有多种安装 Node-RED 的选项,如果您已经安装了 NPM,这可能是最简单的选择。您也可以使用 Docker 或使用 Git 从源代码安装。您可以在Node-Red 文档中查看所有可用选项。
安装 Node-RED 后,您可以打开 Web 浏览器并访问端口 1880 上的 localhost,即可看到 Node-Red 编辑器。我们将首先创建一个基本的“hello world”流程,以确认一切正常运行。
首先,从左侧边栏拖动一个 inject 节点,并将其放在编辑器上。单击节点并将负载更改为字符串,值为您想要的任何输入,我将遵循传统,并使用“hello world”作为我的值。
现在抓取一个 debug 节点并将其放在编辑器上,默认情况下,它将输出先前节点传递的消息负载。单击 debug 节点并选中“system console(系统控制台)”框,以便我们的消息也将打印到终端以及调试侧边栏。您的编辑器应如下所示
现在您可以单击 Node-Red 编辑器右上角的 deploy(部署)。单击 inject 节点左侧的框以启动您的流程。如果一切正常,您应该会在终端和 Node-Red 调试侧边栏中看到值
Node-RED MQTT 流程
现在我们将转向更复杂的内容。对于此流程,我们将 Node-RED 连接到 MQTT 代理,使用 Node-Red 函数节点转换数据,然后使用 InfluxDB 存储数据以进行长期存储和分析。
您需要做的第一件事是安装 InfluxDB Node-Red 包。为此,请单击编辑器右上角部署按钮旁边的汉堡菜单图标。然后单击“manage palette(管理调色板)”,然后单击“Install(安装)”选项卡。在搜索框中键入 InfluxDB,然后选择名为 node-red-contrib-influxdb 的包。
安装该软件包后,如果您滚动到屏幕左侧节点调色板的底部,您应该会看到添加了三个用于使用 InfluxDB 的新节点。
您现在需要创建一个 InfluxDB 实例。您可以创建一个免费的 InfluxDB Cloud 帐户或在本地安装 InfluxDB。创建一个存储桶,然后获取具有访问该存储桶权限的 API 令牌。您可以在 InfluxDB 文档中找到有关如何执行此操作以及更多内容的说明。
对于此流程,我们将使用 MQTT In
节点连接到 HiveMQ 提供的免费 公共 MQTT 代理,而不是使用 inject 节点来启动。如果您已经在本地安装了 MQTT 代理,也可以使用它,配置是相同的。将 MQTT 节点拖到编辑器上后,单击该节点,并通过提供服务器 URL 和端口号来添加新的代理。对于 HiveMQ,URL 为 broker.hivemq.com
,端口为 1883
。将版本保留为 MQTT V3.1.1。
将节点的 Action(操作)
设置为订阅单个主题,并输入您要侦听的主题,在这种情况下,它可以是您想要的任何主题。为了简单起见,我将主题设置为 nodered
。一旦您部署此流程,Node-RED 将连接到代理并侦听该主题名称下的任何消息。
我们将通过 MQTT 传递温度数字,以模拟某种记录空气温度的物联网传感器。默认情况下,这将作为字符串传递,因此我们需要创建一个函数将其转换为整数,然后再使用 InfluxDB 存储它。向页面添加一个函数节点,并将以下代码放入节点中
msg.payload = Number(msg.payload)
return msg;
现在添加 InfluxDB Out
节点并将其连接到函数。通过添加 URL 和 API 令牌来创建 InfluxDB 服务器实例。然后添加您的组织 ID 和您要存储数据的存储桶的名称。
要测试一切正常,您可以使用任何 MQTT 客户端,HiveMQ 还提供了一个易于使用的 websocket 客户端,在此处。将主题设置为与 MQTT 节点中的主题匹配,然后发布一条以数字作为值的消息,如下所示
如果一切正常,您应该会在每次向代理提交 MQTT 消息时开始在 InfluxDB 实例中看到数据
流程本身应类似于此,请注意,MQTT 节点提供了一个通知框,让您知道是否能够连接到代理
Node-RED 项目构想
现在您已经基本了解了如何使用 Node-RED,但是实际的真实世界用例是什么?在本节中,我将为您提供一些潜在的领域,您可以探索这些领域,以使用 Node-Red 构建您自己的自定义项目。
数据可视化和分析
Node-Red 最适合作为不同组件之间的粘合剂,使其易于移动数据。虽然 Node-RED 确实提供了一些基本的存储和可视化功能,但使用专门的工具来完成这些事情是有意义的。正如您在 MQTT 示例中看到的那样,InfluxDB 可用于存储和可视化数据。对于分析,Flux 脚本语言为分析时间序列数据提供了大量功能。Node-RED InfluxDB 包还为您提供了一个节点,用于将 InfluxDB 中的数据查询到 Node-Red 中,因此如果您喜欢这些工具,则可以访问生态系统中的其他工具。
智能家居
Home Assistant 是一个流行的家庭自动化框架,它提供了与众多智能设备的集成。但是,许多用户发现使用 Home Assistant 提供的工具很难构建更定制的工作流程。Node-RED 是这些情况下的常见选择,并且有大量的潜在项目选项将帮助您了解更多关于 Node-RED 的信息,并且从实践角度来看也很有用。
Node-RED 作为事件处理框架
虽然本文的重点主要集中在物联网相关方面,但我认为将 Node-RED 视为处理任何类型事件的工具是了解您真正可以用它做多少事的最佳方式。Node-RED 使您能够快速连接和侦听 HTTP、websockets、TCP、MQTT 和许多其他网络协议。
因此,它可用于在几乎任何类型的应用程序之间移动数据,并允许您通过 NPM 模块访问整个 NodeJS 生态系统。您也始终可以选择通过 API 或通过 Exec 节点运行本地命令来访问其他服务。使用 Node-RED,您唯一的限制实际上是您自己如何组合它提供的工具的创造力。