# 十、处理树莓派的传感器数据 在本章中,我们将学习如何处理来自边缘设备的数据发生在**物联网**(Internet of Things (IoT))使用 Node-RED。 我们不仅将讨论数据处理,还将讨论从边缘设备向服务器应用发送数据。 至于设备,我想用树莓派。 完成本章的教程后,您将能够处理边缘设备获取的传感器数据。 让我们从以下四个主题开始: * 从树莓派的传感器模块获取传感器数据 * 学习 MQTT 协议并使用 MQTT 节点 * 连接到 MQTT 代理 * 检查本地主机数据状态 ## 技术要求 要在本章取得进展,你需要具备以下条件: * 树莓派:[https://www.raspberrypi.org/](https://www.raspberrypi.org/ ) * 本章使用的代码可在[https://github.com/PacktPublishing/-Practical-Node-RED-Programming](https://github.com/PacktPublishing/-Practical-Node-RED-Programming)的**第 10 章**文件夹中找到。 ## 从树莓派上的传感器模块获取传感器数据 在本章中,我们将学习如何使用 Raspberry Pi 上的 Node-RED 处理从传感器设备获取的数据,并将数据发布到 MQTT 代理。 对于传感器设备,我们将使用[第五章](05.md#用例-2--温湿度传感器)、*中使用的温湿度传感器*实现 Node-RED local。 请参见[第五章](05.md#五本地实现的-node-red)、*实现 Node-RED local*中的每个步骤,了解 Raspberry Pi 上传感器设备的连接和使能方法。 准备将温度/湿度传感器连接到树莓派上。 这是边缘装置。 您已经在[第五章](05.md)*实现 Node-RED 本地*中购买并配置了您的边缘设备。 本章不使用光传感器: * **树莓派 3**(https://www.raspberrypi.org/) * 传感器模块:**林基地帽覆盆子π,格罗夫温度和湿度传感器(SHT31)**([https://www.seeedstudio.com/Grove-Base-Hat-for-Raspberry-Pi.html](https://www.seeedstudio.com/Grove-Base-Hat-for-Raspberry-Pi.html),[https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-SHT31.html](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-SHT31.html)) ### 准备设备 请准备设备来收集您树莓派上的温度/湿度传感器数据,如下: 1. 将传感器模块连接到你的树莓派: 当所有设备准备就绪后,连接树莓 Pi 和 Grove Base HAT,将 Grove 温湿度传感器(SHT31)连接到 I2C 端口(任何 I2C 端口都可以): ![Figure 10.1 – Connecting the temperature/humidity sensor to your Raspberry Pi ](img/Figure_10.1_B16353.jpg) 图 10.1 -将温度/湿度传感器连接到树莓派上 2. 将你的树莓派连接到互联网: 我们将继续从树莓派连接到服务器端,所以请确保您通过 Wi-Fi 连接到互联网。 当然,你也可以通过网线连接到调制解调器来访问互联网。 树莓派默认有一个网线接口,所以你要做的就是插入网线: ![Figure 10.2 – Connecting your Raspberry Pi to the internet ](img/Figure_10.2_B16353.jpg) 图 10.2 -连接树莓派到互联网 这就是我们接下来要做的。 接下来,我们将了解如何从传感器节点获取数据。 ### 检测 Node-RED 从传感器设备获取数据 正如你在[*第 5 章*](05.html#_idTextAnchor062),*实现 Node-RED 本地*中学到的,从 Grove Base 温湿度传感器模块获取数据应该很容易。 从传感器节点获取数据的步骤如下: 1. 制作一个简单的流程来获取数据。 选择三个节点,也就是说,一个**注入节点,一个**grove-temperature-humidity-sensor-sht3x 节点,**和**调试节点,从面板左侧的流编辑器和拖拽到工作区中放置它们。 2. 放置好之后,请按照下图所示顺序进行接线: ![Figure 10.3 – Placing and wiring nodes ](img/Figure_10.3_B16353.jpg) 图 10.3 -放置和连接节点 3. 检查 **grove-temperature-humidity-sensor-sht3x** 节点的设置。如需查看设置,请双击 **grove-temperature-humidity-sensor-sht3x** 节点,打开设置界面。 在此设置屏幕上没有要设置的值或项。 您只需要确保将端口指示为**I2C**。 检查完成后,关闭设置界面。 确保在**凹槽-温湿度传感器-sht3x**节点下方看到一个蓝色方形图标和文本**I2C**。 这表示 Grove Base 温湿度传感器模块已成功连接到您的树莓派上。 如果此图标变为红色,说明模块未正确连接**I2C**端口,请重新正确连接硬件: ![Figure 10.4 – Checking the port is set as I2C ](img/Figure_10.4_B16353.jpg) 图 10.4 -检查端口设置为 I2C 4. 执行流并单击流编辑器右上角的**Deploy**按钮检查结果,以完成部署。 5. 部署成功后,点击**inject**节点上的开关,启动流: ![Figure 10.5 – Deploy and click the button on the inject node ](img/Figure_10.5_B16353.jpg) 图 10.5 -部署并单击注入节点上的按钮 如果可以确认采集到的传感器数据值在流编辑器的**debug**选项卡中以 JSON 形式显示,则工作成功。 这样就可以从传感器模块中获得数据: ![Figure 10.6 – Making sure that the data is visible from the sensor module ](img/Figure_10.6_B16353.jpg) 图 10.6 -确保数据从传感器模块可见 现在我们知道树莓派上的 Node-RED 可以处理传感器数据。 让我们学习将该数据发布到 MQTT 代理的过程。 ## 学习 MQTT 协议并使用 MQTT 节点 现在已经成功地获取了传感器数据,让我们将数据发送到服务器。 我们通常选择适合所传输内容的协议; 例如,当交换邮件时,我们使用 SMTP。 目前,HTTP 被用作 internet 上的通用协议。 例如,HTTP 用于互联网上的各种通信,例如在浏览器中显示网页和在服务器之间交换数据。 HTTP 是一种用于在 internet 上交换内容的协议。 在很多情况下,internet 上设置的路由、防火墙等网络设备允许 HTTP 通信用于各种目的,并且 HTTP 与 internet 兼容。 在物联网领域,MQTT 经常被用作通用协议,而不是 HTTP。 这意味着 MQTT 协议是物联网世界的标准,就像 HTTP 协议是 web 世界的标准一样。 **MQTT**(简称**MQ 遥测传输**)是由 IBM 和 Eurotech 于 1999 年首次创建的一种通信协议。 2013 年,国际标准化组织 OASIS 推动了该协议的标准化。 MQTT 打算在 TCP/IP 上使用。 简而言之,它专门从事**机对机**(**M2M**)的 internet 通信,以及 internet 上机器与其他资源之间的通信。 这里提到的*机器*是微型计算机板,如 pc 和小型 Linux 板(包括树莓派)。 自 1999 年以来,M2M 已经发展了多年,出现了**IoT**这个词,而当传统机器通过互联网进行通信时,现在常常采用 MQTT。 因此,MQTT 是物联网的最佳协议。 MQTT 之所以重要的原因之一是它提供了一种轻量级的协议来处理窄带网络和低性能设备上的数据: ![Figure 10.7 – Conceptual diagram of typical M2M communication ](img/Figure_10.7_B16353.jpg) 图 10.7 -典型 M2M 通信概念图 从上面的信息中,您可以看到为什么在物联网中使用 MQTT 协议。 现在让我们考虑 Node-RED 如何使用 MQTT 协议传输数据。 Node-RED 默认提供以下两个与 MQTT 相关的节点: * **mqtt in**:**mqtt in 节点**连接到 MQTT 服务器,并订阅指定主题上的消息。 * **mqtt out**: **mqtt out**节点连接到 mqtt 代理并发布消息: ![Figure 10.8 – An mqtt in node and mqtt out node ](img/Figure_10.8_B16353.jpg) 图 10.8 - mqtt in 节点和 mqtt out 节点 您可以在 Node-RED 流编辑器的侧面板上的**网络**类别下找到这些内容。 如果您想为 MQTT 代理设置服务器地址和主题并使用发布和订阅,那么可以使用这两个节点。 现在让我们尝试将传感器数据发送到本地 MQTT 代理。 ## 连接到 MQTT 代理 现在,让我们通过 Node-RED 将 Raspberry Pi 上的传感器数据发送到 MQTT 代理。 这里我们将使用流行的 MQTT 代理**mosquito to**。 在本章中,我们将进一步准备设备,以便将设备数据发送到服务器。 在服务器端实际接收和处理数据的任务将在下一章中通过一个亲身实践的例子来演示。 因此,在这里我们将使用蚊子只是为了检查数据传输是否正确执行。 ### Mosquitto mosquito to 是在开源 BSD 许可下发布的,并为 MQTT V3.1/v3.1.1 提供代理功能。 它适用于主要的 Linux 发行版,如 RedHat Enterprise Linux, CentOS, Ubuntu 和 OpenSUSE,以及 Windows。 它也可以在像树莓派这样的小型计算机上运行。 在本章中,我们将验证边缘设备的传感器数据可以通过 MQTT 代理发送到 Raspberry Pi 的本地主机。 这很简单。 我相信,如果我们能够以这种方式将数据发送到 MQTT 代理,我们将能够立即在服务器端看到边缘设备的传感器数据。 下面是一张通用配置图,展示了 Mosquitto 的使用示例。 ![Figure 10.9 – Mosquitto overview ](img/Figure_10.9_B16353.jpg) 图 10.9 - Mosquitto概况 在本章中,我们将从边缘设备实现 Node-RED 流,将数据发送到你家树莓派的。 使用 IBM Cloud 的数据可视化将在下一章中实现。 > 重要提示: Mosquitto 是一款极为重要且实用的工具,也是在 Node-RED 中实现物联网机制的核心平台。深入理解 Mosquitto 的相关知识,能助力你进一步拓展 Node-RED 的应用场景。 > 你可以通过官网 [https://mosquitto.org/](https://mosquitto.org/)了解更多关于 Mosquitto 的详细信息。 现在,我们来在你的树莓派上配置 Mosquitto。 ### 在树莓派上配置 Mosquitto 在这一部分,我们将使蚊子,以便它可以运行在树莓派。 流程很简单。 只需安装 mosquito to 并启动服务。 按照和的步骤来准备树莓派: 1. 要安装 Mosquitto,请在终端中执行以下命令: ```bash $ sudo apt install mosquitto ``` 2. 要启动 Mosquitto 服务,请在终端中执行以下命令: ```bash sudo systemctl start mosquito to ``` 启动完成后,可以通过以下命令查看蚊子服务状态: ```bash sudo systemctl status mosquito to ``` 这就是它在终端中的显示效果: ![Figure 10.10 – Mosquitto running status ](img/Figure_10.10_B16353.jpg) 图 10.10 -Mosquitto 运行状态 3. 要安装 Mosquitto 客户端工具,请在终端中执行以下命令: ```bash $ sudo apt install mosquitto-clients ``` 4. 要检查发布与订阅功能,请在树莓派上使用以下命令运行 **订阅端(Subscriber)**。这里我们将 **packt** 设置为 **主题(topic)**。 ```bash $ sudo apt install mosquitto-clients $ mosquitto_sub -d -t packt ``` 终端显示效果如下: ![Figure 10.11 – Start subscribing to Mosquitto with the topic packt ](img/Figure_10.11_B16353.jpg) 图 10.11 -开始订阅带有主题包的 mosquito to 5. 在另一个终端中,使用以下命令向此代理发布一些文本: ```bash $ mosquito _pub -d -t pack -m“Hello packet !” ``` 终端显示效果如下: ![Figure 10.12 – Publishing a message to Mosquitto with the topic packt ](img/Figure_10.12_B16353.jpg) 图 10.12 -发布带有主题包的消息到 mosquito 您将看到您在终端订阅上发布的消息。 你现在准备好使用蚊子。 接下来,我们将在树莓派的 Node-RED 上实现 Pub/Sub。 ### 制作一个流来获取传感器数据并将其发送到 MQTT 代理 现在,在树莓派上启动 Node-RED 流编辑器,按照以下步骤创建流: 1. 在之前**检查 Node‑RED 能否从传感器设备获取数据**一节中创建的流程里,将 **mqtt out** 节点放在 **grove-temperature-humidity-sensor-sht3x** 节点后面。 另外将 **mqtt in** 节点和 **debug** 节点与 **mqtt out 流程**分开布置,并按照下图所示进行接线: ![Figure 10.13 – Placing these nodes and wiring them ](img/Figure_10.13_B16353.jpg) 图 10.13 -放置这些节点并连接它们 2. 双击编辑 **mqtt out** 节点,在**属性(Properties)**选项卡中按如下设置参数,以连接到你已运行的 Mosquitto MQTT 服务器。 - Server: localhost - Port: 1883 你可以点击铅笔图标来编辑**服务器(Server)**和**端口(Port)**的值。 - Topic: packt - Qos: 1 - Retain: true 设置窗口应该是这样的: ![Figure 10.14 – Setting the properties of the mqtt out node ](img/Figure_10.14_B16353.jpg) 图 10.14 -设置 mqtt out 节点的属性 3. 双击编辑 **mqtt in** 节点,打开设置窗口。在**属性(Properties)**选项卡中按如下设置参数,以订阅你已运行的 Mosquitto MQTT 服务器上的主题: - Server: localhost - Port: 1883 点击铅笔图标即可编辑**服务器(Server)**和**端口(Port)**的值。 - Topic: packt - Qos: 1 - Output: auto-detect (string or buffer) 设置窗口应该是这样的: ![Figure 10.15 – Setting the properties of the mqtt in node ](img/Figure_10.15_B16353.jpg) 图 10.15 -设置节点中的 mqtt 的属性 至此,我们已经完成了通过**mosquito 向**MQTT 代理订阅并发布主题**包**的流程,在您的树莓派本地宿主上。 接下来,我们将检查本地主机上数据的状态。 ## 检查本地主机数据状态 在本节中,我们将通过以下步骤,检查蚊子是否可以通过你的树莓派 i 上的 Node-RED 接收到你的树莓派发送的传感器数据: 1. 在树莓派上的 Node-RED 实例上运行上一节中创建的流。 2. 点击 **inject** 节点的开关,运行此流程并发布 Grove 温湿度传感器数据。 ![Figure 10.16 – Run the flow to publish the data ](img/Figure_10.16_B16353.jpg) 图 10.16 -运行流来发布数据 3. 检查数据是否已订阅成功。 在这个 Node-RED 实例中目前有两个流。 一个是将数据发布到 mosquito 到 MQTT 代理的流,另一个是订阅来自该代理的数据的流。 订阅的流通常处于待机状态,因此当数据发布时,订阅的数据会自动输出到**debug**选项卡。 4. 检查**debug**选项卡。 你应该看看你发布的数据: ![Figure 10.17 – Check the result of the publishing and subscribing\ ](img/Figure_10.17_B16353.jpg) 图 10.17 -检查发布和订阅的结果 恭喜你! 现在您知道了如何处理边缘设备上的 Raspberry Pi 和 Grove Base 传感器模块获取的传感器数据,并将其发送到 MQTT 代理。 ## 小结 在本章中,以实践教程的形式,我们体验了如何处理边缘设备上的传感器数据并将其发送到 MQTT 代理。 这是使用 Node-RED 为物联网创建边缘设备端应用的方法之一。 在下一章中,我们将看到一个实际的例子,接收传感器数据并通过 Node-RED 将其可视化到服务器端(云)。