十一、通过在 IBM 云中创建服务器端应用来可视化数据
在本章中,我们将使用 Node-RED 创建一个服务器应用来可视化已经从物联网边缘设备发送的数据。 对于服务器端应用,我想在这里使用 IBM Cloud。 通过本章中的教程,您将掌握如何在服务器应用上可视化传感器数据。
让我们从以下几个话题开始:
准备一个公共 MQTT 代理服务
在边缘设备上从 Node-RED 发布数据
在云端 Node-RED 上订阅和可视化数据
本章结束时,您将掌握如何在云平台上可视化传感器数据。
技术要求
要在本章取得进展,你需要具备以下条件:
IBM 云帐户:https://cloud.ibm.com/
一个 clouddmqtt 账户:https://cloudmqtt.com/
本章使用的代码可在第十一章文件夹https://github.com/PacktPublishing/-Practical-Node-RED-Programming中找到。
准备公共 MQTT 代理服务
回想上一章,第十章,处理树莓派上的传感器数据。 我们将与边缘设备(树莓派)相连的温湿度传感器的数据发送到云端,并确认云侧可以观测到数据。
在前一章中,我们检查了如何使用名为mosquito 的服务操作 MQTT 代理到。 这是为了将数据从边缘设备发送到 MQTT 代理。
然而,这是一个机制,所有事情都在树莓派上本地完成。 本质上,在尝试实现物联网机制时,MQTT 代理应该位于公共位置,并且可以通过 internet 从任何地方访问。
您可以在公共云中托管自己的mosquito toMQTT 代理,但这会在设置和维护它方面增加一些额外的复杂性。 有许多可用的公共 MQTT 服务可以使启动变得更容易。
在本章中,我们将为 MQTT 代理使用一个名为clouddmqtt的服务,但是您可以用您喜欢的服务替换 MQTT 代理部分。 您还可以在 IaaS 上发布自己的 MQTT 代理,例如mosquito 到,而不是使用 SaaS:

图 11.1 - clouddmqtt 概述
重要提示: MQTT 代理是一个服务器,它接收来自发布者的消息并将其发送给订阅者。在 PubSub 中传递消息的服务器称为 MQTT 代理。
PubSub 是Publisher和Subscriber的合成词:
a)出版商是传递信息的人。
b)订阅者是订阅消息的人。
您可以将其看作是接收来自客户机的消息并将其分发给客户机的服务器。
MQTT 与普通套接字通信的不同之处在于它是在一对多的基础上进行通信的。 换句话说,它具有一种将一个客户机的消息分发给许多人的机制。 这个系统使我们能够同时实时地向许多人传递信息。
现在我们将学习如何准备clouddmqtt。 如前所述,CloudMQTT是作为 SaaS 发布的 MQTT 代理。 如果不使用clouddmqtt,而希望使用另一个 SaaS MQTT 代理或在 IaaS 上发布 MQTT 代理,则可以跳过此步骤。 但是,使用 MQTT 代理的基本配置信息保持不变,因此我相信这一步将帮助您配置任何 MQTT 代理。
执行以下步骤在CloudMQTT上创建 MQTT 代理服务:
Log in to CloudMQTT at https://cloudmqtt.com/.
访问网站时,点击窗口右上方的登录按钮:

图 11.2 - CloudMQTT 网站
如果您已经有了您的 clouddmqtt 帐户,通过输入您的电子邮件地址和密码登录您的帐户:

图 11.3 -登录 clouddmqtt
如果您还没有账号,请通过窗口底部的注册按钮创建一个新账号:

图 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 发布数据
简体中文翻译:
在本节中,我们将对树莓派(Raspberry Pi)进行配置。首先,启动树莓派并打开 Node-RED 流程编辑器。 该 Node-RED 流程编辑器中应仍保留第10章 在树莓派上处理传感器数据中实现的、用于向服务器发送传感器数据的流程。 如果你已删除该流程,或尚未创建,请参照第10章 在树莓派上处理传感器数据重新操作。
双击构成该流程的 mqtt out 节点,打开设置窗口。 上一次我们使用了 Mosquitto,而本次将连接至 CloudMQTT。
执行以下步骤配置树莓派上的 Node-RED 连接到 clouddmqtt:
访问你在 第十章, 从树莓派上的传感器模块获取传感器数据 Handling Sensor Data on the Raspberry Pi 中创建的流程。
在本章中,我们只使用带有mqtt out节点的流,因为这个场景仅用于向树莓派发送数据:

图 11.9 -访问我们在前一章中创建的流
编辑 mqtt out 节点:
现在我们需要编辑连接配置。 双击mqtt out节点打开设置窗口:

图 11.10 -打开 mqtt out 节点的设置窗口
设置连接到 clouddmqtt 的配置。
设置Topic、Qos、保持值如下:
Topic:pack
Qos:1
Retain:true
点击**服务器(Server)右侧的编辑(Edit)**按钮(铅笔图标),打开凭证属性窗口。

图 11.11 -单击 Edit 按钮打开属性设置
在服务器设置面板上,选择Connection选项卡,按如下方式填写每个属性:
Server:driver.cloudmqtt.com
Port: 18913
不应该更改Connection选项卡中的其他属性,必须保持其默认值。
Connection选项卡设置参考如下截图:

图 11.12 - MQTT 代理服务器设置
接下来,选择Security选项卡到编辑配置以连接 MQTT 代理,并按如下方式填写每个属性:
用户名:您从 CloudMQTT 获得的用户。
Password: The password that you got from CloudMQTT.
Security选项卡设置参考如下截图:

图 11.13 - MQTT 代理用户和密码设置
您可以在 clouddmqtt 管理菜单中检查这些属性。 这个菜单可以通过 clouddmqtt 仪表板的 Instances 列表来访问:https://customer.cloudmqtt.com/instance

图 11.14 - clouddmqtt 实例列表
这就完成了树莓派一侧的设置。 接下来,让我们设置 Node-RED 流编辑器,以便在云端使用 Node-RED 获取(订阅)数据。
在云端 Node-RED 上订阅和可视化数据
在本节中,我们将学习如何在云端使用 Node‑RED 对接收到的数据进行可视化展示。 这会用到我们在第六章 在云端部署 Node‑RED中学过的一个仪表板节点,不过这次我们将选择**仪表盘(Gauge)**界面,让展示效果更美观一些。
这次使用的云端 Node-RED 运行在 IBM Cloud (PaaS)上,但是之前创建服务作为 MQTT 代理的 CloudMQTT 是一种不同于 IBM Cloud 的云服务。
在本章中,我们将了解存在 MQTT 代理,以便可以从不同的地方访问它,发布者(数据发布者)和订阅者(数据接收者)都可以使用它,而不需要知道它在哪里。
IBM 云上准备 Node-RED
现在,让我们通过执行以下步骤创建一个连接到 CloudMQTT 的 Node-RED 流。 这里,我们将在 IBM 云上使用 Node-RED。 请注意,它是不是树莓派上的 Node-RED:
打开 Node-RED 流编辑器,登录到 IBM Cloud,并调用已经从仪表板创建的 Node-RED 服务。
在控制面板的资源摘要(Resource summary)卡片中,点击查看全部(View all)或Cloud Foundry 服务(Cloud Foundry services)。 点击任一选项,都会进入你在 IBM Cloud 上创建的资源列表。

图 11.15 -打开资源列表
如果您还没有在 IBM 云上创建 Node-RED 服务,请参考第六章,在云中实现 Node-RED 服务,在继续之前创建一个。
在**资源列表(Resource list)**界面中显示的 Cloud Foundry 应用(Cloud Foundry apps) 下方,点击你创建的 Node-RED 服务,以打开 Node-RED 流程编辑器

图 11.16 -选择您创建的 Node-RED 服务
然后,点击 访问应用地址(Visit App URL) 以打开 Node-RED 流程编辑器:

图 11.17 -单击 Visit App URL
当显示 Node‑RED 流程编辑器的顶部界面时,点击 前往你的 Node‑RED 流程编辑器(Go to your Node‑RED flow editor) 按钮,打开 Node‑RED 流程编辑器:

图 11.18 -单击 Go to your Node-RED 流编辑器按钮
创建一个流程来实现数据可视化:
当你在 IBM Cloud 上打开 Node‑RED 流程编辑器后,请按照以下步骤创建流程: 放置 mqtt in 节点、json 节点、两个 change 节点,并在每个 change 节点后放置 gauge 节点。 如果你需要查看该流程的调试日志,请在任意节点后添加 debug 节点。在本示例中,分别在 mqtt in 节点和第一个 change 节点后放置了两个 debug 节点。
你已经安装了包含 gauge 节点在内的仪表板节点。如果尚未安装,请返回第六章 在云端部署 Node‑RED 中为用例2——数据可视化创建流程的教程,按照说明安装仪表板节点。

图 11.19 -形成流
编辑 mqtt in 节点。双击 mqtt in 节点打开设置窗口,按以下值设置 Topic、Qos 和 Output:
Topic: packt
Qos: 1
Output: auto-detect (string or buffer) 自动检测(字符串或缓冲区)
点击**服务器(Server)右侧的编辑(Edit)**按钮(铅笔图标),打开凭证属性:

图 11.20 -单击 Edit 按钮打开属性设置
在服务器设置面板中,选择**连接(Connection)**选项卡,并按以下值填写各项属性:
服务器(Server):driver.cloudmqtt.com
端口(Port):18913
连接选项卡中的其他属性请勿修改,必须保持默认值。 你可以参考下面的截图进行连接选项卡的设置。

图 11.21 - MQTT 代理服务器设置
接下来,选择**安全(Security)**选项卡,编辑用于连接 MQTT 服务器的配置,并按以下值填写各项属性:
用户名(Username):你从 CloudMQTT 获取的用户。
密码(Password):你从 CloudMQTT 获取的密码。
你可以参考下面的截图进行安全选项卡的设置。

图 11.22 - MQTT 代理用户和密码设置
您可能已经注意到,这些属性与您为 Raspberry Pi node - red 上的mqtt 输出节点设置的值相同。 如有必要,请参考 clouddmqtt 仪表板。
现在编辑 json 节点。双击 json 节点打开设置窗口,在操作(Action)中选择在 JSON 字符串与对象之间转换(Convert between JSON String & Object),并在**属性(Property)**中设置为 msg.payload:

图 11.23 -设置 json 节点属性
编辑 change 节点的设置。双击第一个 change 节点打开设置窗口,然后在**规则(Rules)**区域下方的对应输入框中设置为
msg.payload.temperature。完成后点击 Done(完成) 按钮关闭设置窗口。
图 11.24 -设置第一个更改节点的属性
同样,编辑第二个 change 节点的设置。双击第二个 change 节点打开设置窗口,在**规则(Rules)**区域的对应输入框中设置为
msg.payload.humidity,然后点击 Done(完成) 按钮关闭设置窗口。
图 11.25 -设置第二个变更节点的属性
编辑第一个 gauge 节点的设置。双击第一个 gauge 节点打开设置窗口,然后点击 Group(分组)右侧的 Edit(编辑)按钮(铅笔图标)以打开属性设置:

图 11.26 -单击 Edit 按钮打开 Properties 设置
在仪表板的分组设置面板中,按以下值填写各项属性:
名称(Name):Raspberry Pi Sensor data(树莓派传感器数据)
此处填写任意名称均可,该名称将显示在我们即将创建的图表网页上。
其他属性请勿修改,必须保持默认值。你可以参考下面的截图:

图 11.27 -设置组名
返回仪表(gauge)节点设置的主面板,并按以下值填写各项属性:
类型(Type):Gauge(仪表)
标签(Label):Temperature(温度)
单位(Units):°C(若你更倾向使用华氏度,请填写 °F)
范围(Range):-15 ~ 50(若使用华氏度,请相应调整范围)
其他属性请勿修改,保持默认值即可。你可以参考下面的截图进行设置。

图 11.28 -设置度量节点属性
编辑第二个仪表(gauge)节点的设置。双击第二个 gauge 节点打开设置窗口,然后选择上一步中你创建的相同分组名称。按以下值填写各项属性:
类型(Type):Gauge(仪表)
标签(Label):Humidity(湿度)
单位(Units):%
范围(Range):0~10
其余属性请勿修改,保持默认值即可。你可以参考下面的截图进行设置:

图 11.29 -设置规范节点属性
请确保在 Node-RED 上部署流。
这就完成了 IBM Cloud 上的 Node-RED 配置。 这意味着该流已经使用主题包订阅了 clouddmqtt 服务(等待数据)。 接下来,是发布和订阅数据的时候了。
IBM 云中数据的可视化
在设备的边缘,在树莓派上,我们准备将传感器数据与主题包一起发布到 clouddmqtt。 在云计算方面,流已经包含了 clouddmqtt 服务的包主题。
对于树莓派,执行以下步骤来发布您的数据:
从你的树莓派发布数据:
在树莓派上访问 Node-RED 流编辑器。 点击inject节点的按钮,运行此流,发布树林温湿度传感器数据:

图 11.30 -运行发布数据的流
在 IBM Cloud 上检查数据是否已接收:
您将能够通过 CloudMQTT 接收(订阅)数据。 您可以在 IBM Cloud 上 Node-RED 流编辑器的debug选项卡上检查:

图 11.31 -检查数据的订阅
通过 IBM Cloud 中 Node‑RED 流程编辑器上的图表选项卡打开图表网页,然后点击打开按钮(斜向箭头图标)将其打开:

图 11.32 -打开图表网页
你会看到网页测量图表显示的数据:

图 11.33 -显示图表网页
恭喜你! 现在您知道了如何观察服务器上树莓派发送的数据,并将其可视化为一个图表。
如果您希望流配置文件在您的 Node-RED 上创建流,您可以在这里获取:https://github.com/PacktPublishing/-Practical-Node-RED-Programming/blob/master/Chapter11/getting-sensordata-with-iotplatform.json。
小结
在本章中,我们体验了如何接收从边缘设备发送的传感器数据并在服务器端可视化它。
在本章中,我们在 IBM Cloud 上使用了 CloudMQTT 和 Node-RED。 Node-RED 可以运行在任何云平台和本地,您可以尝试在任何环境中创建这种应用。 这就是为什么记住这个模式肯定会对您未来开发其他云物联网平台有帮助。
在下一章中,我们将看看使用 Node-RED 创建聊天机器人应用的实际操作场景。 这将向您介绍一种使用 Node-RED 的新方法。