17、利用Node - RED实现设备控制与通信

跟随虾哥项目实践,硬件选小智就对了

xiaozhi 开源方案官方适配,二次开发文档齐全

利用Node - RED实现设备控制与通信

1. 使用Amazon Alexa控制设备

1.1 基本项目搭建

要使用Amazon Alexa与Node - RED控制连接到树莓派的设备,可按以下步骤操作:
1. 创建函数节点 :创建一个名为“ON/OFF”的函数节点,在节点内输入以下代码:

if(msg.payload == "on")
  out = 1;
else
if(msg.payload == "off")
  out = 0;
msg.payload = out;
return msg;

此节点用于判断来自Alexa的消息,若为“on”则输出1,若为“off”则输出0。
2. 创建GPIO输出节点 :创建一个名为“LED”的rpi gpio out节点,将引脚设置为GPIO 2,类型设为数字输出,并将引脚状态初始化为逻辑0。
3. 连接节点并部署 :按照图15.3连接所有节点,然后点击“Deploy”。

1.2 项目测试

测试项目时,向Alexa发出指令:
- 说“Alexa, discover devices”,大约一分钟后,Alexa会确认检测到设备(本项目中为“Bedroom Lights”)。
- 说“Alexa, turn on bedroom lights”可打开LED。
- 说“Alexa, turn off bedroom lights”可关闭LED。

1.3 多设备控制项目

在项目74中,要控制LED和蜂鸣器,步骤如下:
1. 硬件连接 :LED连接到GPIO 2,蜂鸣器连接到GPIO 3。
2. 流程程序设置 :添加另一个名为“Buzzer”的Amazon Echo设备节点,该节点驱动另一个内容与之前相同的函数节点。第二个rpi gpio out节点用于驱动蜂鸣器,引脚设置为GPIO 3,类型为数字输出。
3. 重新发现设备 :由于新的Amazon Echo设备对Alexa来说是未知的,需要再次说“Alexa, discover devices”。之后可以通过以下指令控制:
- “Alexa, turn on bedroom lights”打开LED。
- “Alexa, turn off bedroom lights”关闭LED。
- “Alexa, turn on buzzer”打开蜂鸣器。
- “Alexa, turn off buzzer”关闭蜂鸣器。

1.4 高级Alexa节点

还可以使用名为“node - red - contrib - alexa - home - skill”的Alexa节点进行更复杂的控制任务。该节点(Alexa Home节点)要求用户注册并拥有账户才能使用,支持以下命令:
| 命令 | 描述 |
| ---- | ---- |
| TurnOnRequest | 打开请求 |
| TurnOffRequest | 关闭请求 |
| SetPercentageRequest | 设置百分比请求 |
| IncrementPercentageRequest | 增加百分比请求 |
| DecrementPercentageRequest | 减少百分比请求 |
| SetTargetTemperatureRequest | 设置目标温度请求 |
| IncrementTargetTemperatureRequest | 增加目标温度请求 |
| DecrementTargetTemperatureRequest | 减少目标温度请求 |
| GetTemperatureReadingRequest | 获取温度读数请求 |
| GetTargetTemperatureRequest | 获取目标温度请求 |
| SetLockState | 设置锁定状态 |
| GetLockState | 获取锁定状态 |
| SetColorRequest | 设置颜色请求 |
| SetColorTemperatureRequest | 设置色温请求 |

1.5 修改程序

在某些应用中,希望在感应到命令后打开LED,并在一段时间后自动关闭。可以通过在图15.3中添加一个触发节点来实现。示例流程程序中,LED在15秒后关闭。触发节点配置为发送1持续15秒,然后发送0。当 msg.payload 等于0(即Alexa被要求关闭“Bedroom Lights”)时,触发节点的输出会被重置。

2. 远程访问树莓派上的Node - RED

2.1 概述

在之前的项目中,通常通过Wi - Fi路由器的Wi - Fi链接访问树莓派上的Node - RED。为了能从全球任何地方访问Node - RED,可使用ngrok服务。

2.2 ngrok的使用

2.2.1 端口更改

由于某些原因,ngrok无法使用端口80,需将默认端口号从80更改为其他值,例如1880。

2.2.2 安装和使用ngrok的步骤
  1. 创建账户 :访问网站https://ngrok.com ,输入详细信息创建账户。
  2. 获取隧道令牌 :点击左侧的“Auth”链接,获取唯一的隧道令牌。
  3. 选择软件版本 :选择Linux (ARM)版本的软件。
  4. 复制软件到树莓派 :将软件复制到树莓派的文件夹(例如/home/pi),也可先下载到PC,再使用WinSCP工具复制到树莓派。软件名为“ngrok - stable - linux - arm.zip”。
  5. 解压软件并保存令牌 :在树莓派上解压软件,并通过输入命令将令牌保存到文件“ngrok.yml”中。
  6. 创建安全隧道 :在树莓派终端输入 ./ngrok http 1880
  7. 获取访问地址 :会出现类似图16.4的屏幕,找到以“Forwarding”和“https”开头的部分,这就是要在浏览器中输入的地址,例如“https://2353edf8.ngrok.io”。
  8. 启动Node - RED :手动或在树莓派重启时自动启动Node - RED。之后在浏览器中输入上述地址即可远程访问Node - RED,但在远程访问时不能关闭ngrok屏幕。

2.3 自动启动Node - RED

可使用以下命令控制Node - RED在树莓派启动时的自动启动:
- 要在树莓派启动后自动启动Node - RED,输入 pi@raspberrypi:~ $ sudo systemctl enable nodered.service
- 要禁用自动启动,同样输入 pi@raspberrypi:~ $ sudo systemctl enable nodered.service (此处原文疑似有误,应为 disable )。
- 要检查Node - RED是否正在运行,输入 pi@raspberrypi:~ $ ps axg | grep node - red

3. 使用蓝牙与Node - RED

3.1 蓝牙概述

蓝牙是一种短距离无线通信技术,最初是作为基于RS232的串行通信的无线替代方案开发的,现在广泛用于在两个兼容蓝牙的设备之间传输数据。大多数智能手机都内置了蓝牙硬件,可用于向其他PC和兼容的手机传输数据。蓝牙工作在2.4至2.485 GHz频率范围内,由蓝牙特别兴趣小组管理。

3.2 安装蓝牙节点

在树莓派的Node - RED中使用蓝牙,需先在节点面板中安装蓝牙节点:
1. 启动Node - RED。
2. 点击“Menu -> Manage palette”,然后点击“Install”。
3. 输入“node - red - contrib - bluetooth - serial - port”并点击“install”。安装完成后,节点面板中会添加两个新节点:“bt serial in”和“bt serial out”。
4. 在树莓派上安装蓝牙:在终端输入 pi@raspberrypi:~ $ sudo apt - get install bluez

3.3 项目75:使用蓝牙控制LED和蜂鸣器

3.3.1 项目描述

本项目中,LED和蜂鸣器连接到树莓派的GPIO端口,通过智能手机的蓝牙接口发送命令来打开和关闭它们。

3.3.2 硬件连接

LED连接到GPIO 2,蜂鸣器连接到GPIO 3。

3.3.3 流程程序设置

流程程序由4个节点组成:
1. 创建蓝牙输入节点 :创建一个“bt serial in”节点,使用Android手机时,需找到手机的蓝牙MAC地址并输入到该节点。查找Android手机蓝牙MAC地址的步骤如下:
- 启用手机的蓝牙功能。
- 点击“Settings”。
- 点击“System”。
- 点击“About phone”。
- 点击“Status”。
- 向下滚动,直到看到蓝牙地址。本项目中手机的MAC地址为“B4:CD:27:15:68:7B”。
2. 创建函数节点 :创建一个名为“ON/OFF”的函数节点,输入以下代码:

var out1 = null;
var out2 = null;
var T = msg.payload.toString();
if(T == "LON")
  out1 = {payload: 1};
else if(T == "LOFF")
  out1 = {payload: 0};
if(T == "BON")
  out2 = {payload: 1};
else if(T == "BOFF")
  out2 = {payload: 0};
return[out1, out2];

此节点将“bt serial in”节点返回的二进制数据转换为字符串,并根据命令设置输出。
3. 创建GPIO输出节点 :创建两个名为“LED”和“Buzzer”的rpi gpio out节点,将“LED”节点的引脚设置为GPIO 2,“Buzzer”节点的引脚设置为GPIO 3,类型都设为数字输出,并将引脚初始化为0。
4. 连接节点并部署 :按照图17.3连接所有节点,然后点击“Deploy”。

3.3.4 树莓派设置

为了能从手机应用访问树莓派,需在树莓派命令行进行以下更改:
1. 编辑文件“/etc/systemd/system/dbus - org.bluez.service”:输入 pi@raspberrypi:~ $ sudo nano /etc/systemd/system/dbus - org.bluez.service
2. 修改文件内容:在“ExecStart =”行末尾添加“–C”,并在“ExecStart”行后添加一行“ExecStartPost=/usr/bin/sdptool add SP”。最终两行内容如下:

ExecStart=/usr/lib/bluetooth/bluetoothd -C
ExecStartPost=/usr/bin/sdptool add SP
  1. 保存文件并退出:按“Ctrl + X”,然后按“Y”。
  2. 重启树莓派:输入 pi@raspberrypi:~ $ sudo reboot
3.3.5 查找树莓派蓝牙MAC地址及设置可发现性

在向树莓派发送命令之前,需知道树莓派的蓝牙MAC地址。在命令模式下输入 pi@raspberrypi:~ $ bluetoothctl ,然后输入 [MyDevice]# show ,可在列表顶部找到蓝牙MAC地址。输入以下命令使树莓派的蓝牙可被发现:

[MyDevice]# agent on
[MyDevice]# discoverable on
[MyDevice]# exit
3.3.6 发送命令

确保Node - RED正在运行,启动手机上的蓝牙应用(本项目使用的是“Bluetooth Terminal by Qwerty”)。点击右上角的三个点,点击“Make discoverable”,然后点击“Connect a device – Insecure”,选择树莓派,等待显示“connected: raspberrypi”消息。此时可以通过蓝牙链接从手机向树莓派发送以下命令:
- “LON”:打开LED。
- “LOFF”:关闭LED。
- “BON”:打开蜂鸣器。
- “BOFF”:关闭蜂鸣器。

4. Node - RED与MQTT

4.1 MQTT概述

MQTT(Message Queuing Telemetry Transport)是为机器对机器(M2M)通信创建的消息协议,基于发布和订阅机制。它在低带宽和高响应时间的情况下,对于发送数据和控制信息非常有用,尤其适用于向执行器发送数据和从传感器检索数据的场景。MQTT由IBM在1999年为卫星通信开发,现已成为物联网(IoT)应用的标准通信协议。其官方网站为http://mqtt.org 。

4.2 MQTT的工作原理

4.2.1 基本结构

MQTT协议中有发送者(Publisher)、接收者(Subscriber)和中间服务器(Broker)。例如,温度传感器作为发布者将测量值发送给代理,代理接收并保存数据,然后将测量值发送给订阅了该数据的其他设备。

4.2.2 基本概念

MQTT有5个基本概念:
| 概念 | 描述 |
| ---- | ---- |
| Publisher(发布者) | 发送数据或消息到某个主题的节点,例如发送环境温度值的传感器节点。 |
| Subscriber(订阅者) | 订阅接收数据或消息的设备,可以是计算机、智能手机、微控制器或其他处理器。 |
| Messages(消息) | MQTT网络中交换的信息,可以是数据或命令,如温度值或打开开关的命令。 |
| Topics(主题) | 用于注册对传入消息的兴趣或指定发布消息的位置,用字符串表示,由正斜杠分隔,每个正斜杠表示一个主题级别,例如“home/kitchen/led”。主题区分大小写。 |
| Broker(代理) | 接收所有消息,过滤消息并决定哪些客户端感兴趣,然后将消息发送给所有订阅的客户端。 |

4.2.3 通配符
  • 单级通配符 :使用“+”表示单级通配符,例如“home/+/led”可以匹配“home/bedroom/led”“home/livingroom/led”“home/garden/led”等。
  • 多级通配符 :使用“#”表示多级通配符,必须放在主题末尾,例如“home/kitchen/#”可以匹配“home/bedroom/led”“home/livingroom/light”等。

4.3 MQTT与HTTP对比

MQTT基于TCP/IP协议,比发送HTTP请求更快,因为消息可以小到2字节,且没有HTTP的头部信息。此外,MQTT消息会自动分发给感兴趣的客户端。

综上所述,通过上述方法可以利用Node - RED结合Amazon Alexa、蓝牙和MQTT实现对树莓派连接设备的多样化控制和数据传输。无论是远程控制设备,还是在本地通过蓝牙进行交互,都为物联网应用开发提供了强大的工具和方法。

4.4 MQTT的应用场景

MQTT在物联网领域有广泛的应用场景,以下为一些常见的例子:
- 智能家居 :在智能家居系统中,各种设备如智能灯泡、智能门锁、智能窗帘等可以作为发布者或订阅者。例如,温度传感器作为发布者将室内温度数据发布到特定主题,智能空调作为订阅者订阅该主题,根据温度数据自动调节温度。
- 工业监控 :在工业生产中,传感器可以实时监测设备的运行状态、温度、压力等参数,并将这些数据发布到MQTT代理。监控中心的计算机作为订阅者接收这些数据,实现对工业设备的远程监控和故障预警。
- 农业自动化 :在农业领域,传感器可以监测土壤湿度、光照强度、气象条件等信息,并将数据发送到MQTT代理。灌溉系统、遮阳设备等可以根据这些数据进行自动控制,实现农业生产的自动化。

4.5 在Node - RED中使用MQTT

在Node - RED中使用MQTT可以方便地实现设备之间的通信和数据传输。以下是在Node - RED中使用MQTT的基本步骤:
1. 添加MQTT节点 :在Node - RED的节点面板中,找到MQTT节点(通常有MQTT in和MQTT out节点),将它们添加到工作区。
2. 配置MQTT节点 :双击MQTT节点,配置MQTT代理的地址、端口、主题等信息。例如,设置代理地址为 mqtt://your - broker - address ,端口为1883,主题为 home/livingroom/temperature
3. 连接节点 :将MQTT节点与其他节点(如函数节点、GPIO输出节点等)连接起来,实现数据的处理和控制。例如,将MQTT in节点连接到函数节点,对接收的数据进行处理,然后将处理结果发送到GPIO输出节点控制设备。
4. 部署流程 :点击“Deploy”按钮,部署流程,使Node - RED开始运行。

下面是一个简单的Node - RED流程示例,用于接收MQTT消息并控制LED:

[
    {
        "id": "mqtt - in - node",
        "type": "mqtt - in",
        "z": "flow - id",
        "name": "MQTT In",
        "topic": "home/livingroom/led/control",
        "qos": "0",
        "datatype": "auto",
        "broker": "mqtt - broker - id",
        "x": 150,
        "y": 200,
        "wires": [
            [
                "function - node"
            ]
        ]
    },
    {
        "id": "function - node",
        "type": "function",
        "z": "flow - id",
        "name": "Process Message",
        "func": "if (msg.payload === 'on') {\n    msg.payload = 1;\n} else if (msg.payload === 'off') {\n    msg.payload = 0;\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 350,
        "y": 200,
        "wires": [
            [
                "rpi - gpio - out - node"
            ]
        ]
    },
    {
        "id": "rpi - gpio - out - node",
        "type": "rpi - gpio - out",
        "z": "flow - id",
        "name": "LED",
        "pin": "2",
        "type": "out",
        "set": "",
        "level": "0",
        "freq": "",
        "out": "out",
        "x": 550,
        "y": 200,
        "wires": []
    },
    {
        "id": "mqtt - broker - id",
        "type": "mqtt - broker", "z": "",
        "name": "MQTT Broker",
        "broker": "your - broker - address",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "willTopic": "",
        "willQos": "0",
        "willPayload": ""
    }
]

4.6 MQTT的安全问题

在使用MQTT时,安全问题至关重要。以下是一些常见的MQTT安全措施:
- 使用TLS/SSL加密 :通过使用TLS/SSL协议对MQTT通信进行加密,防止数据在传输过程中被窃取或篡改。在配置MQTT节点时,启用TLS/SSL选项,并提供证书和密钥。
- 身份验证 :对MQTT客户端进行身份验证,确保只有授权的客户端可以连接到MQTT代理。可以使用用户名和密码进行身份验证,或者使用更高级的身份验证机制,如证书认证。
- 访问控制 :在MQTT代理中设置访问控制规则,限制客户端对主题的访问权限。例如,只允许特定的客户端发布或订阅某些主题。

4.7 MQTT的性能优化

为了提高MQTT的性能,可以采取以下措施:
- 合理选择QoS级别 :MQTT提供了三种QoS级别(0、1、2),不同的QoS级别对消息的可靠性和性能有不同的影响。在实际应用中,根据需求合理选择QoS级别,避免不必要的性能开销。
- 优化主题设计 :合理设计主题结构,避免使用过于复杂的主题。使用通配符时要谨慎,避免过多的匹配操作影响性能。
- 使用集群和负载均衡 :对于大规模的MQTT应用,可以使用MQTT代理集群和负载均衡技术,提高系统的并发处理能力和可靠性。

5. 总结与展望

5.1 总结

本文介绍了如何利用Node - RED结合多种技术实现对树莓派连接设备的控制和通信。通过使用Amazon Alexa,可以通过语音命令控制设备;利用ngrok可以实现从全球任何地方远程访问树莓派上的Node - RED;借助蓝牙技术,可以通过智能手机与树莓派进行近距离通信;而MQTT则为设备之间的通信提供了高效、可靠的消息传输机制。

5.2 展望

随着物联网技术的不断发展,Node - RED在物联网应用开发中的作用将越来越重要。未来,我们可以进一步探索以下方向:
- 更多设备的集成 :将更多类型的设备(如Arduino、ESP32 DevKitC等)集成到Node - RED项目中,实现更广泛的设备控制和数据采集。
- 智能算法的应用 :结合机器学习、人工智能等智能算法,对采集的数据进行分析和处理,实现更智能的设备控制和决策。
- 跨平台应用 :开发跨平台的Node - RED应用,支持在不同的操作系统和设备上运行,提高应用的兼容性和可用性。

通过不断地学习和实践,我们可以充分发挥Node - RED的优势,开发出更加智能、高效的物联网应用。

以下是一个简单的mermaid流程图,展示了MQTT的基本工作流程:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px;
    A(Publisher):::process --> B(Broker):::process
    C(Subscriber):::process --> B
    B --> C

这个流程图展示了MQTT中发布者、代理和订阅者之间的关系。发布者将消息发送到代理,代理接收并转发消息给订阅者。

综上所述,Node - RED为物联网应用开发提供了一个强大而灵活的平台,结合各种技术可以实现多样化的设备控制和通信需求。通过不断地探索和创新,我们可以开发出更加智能、高效的物联网解决方案。

跟随虾哥项目实践,硬件选小智就对了

xiaozhi 开源方案官方适配,二次开发文档齐全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值