利用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的步骤
- 创建账户 :访问网站https://ngrok.com ,输入详细信息创建账户。
- 获取隧道令牌 :点击左侧的“Auth”链接,获取唯一的隧道令牌。
- 选择软件版本 :选择Linux (ARM)版本的软件。
- 复制软件到树莓派 :将软件复制到树莓派的文件夹(例如/home/pi),也可先下载到PC,再使用WinSCP工具复制到树莓派。软件名为“ngrok - stable - linux - arm.zip”。
- 解压软件并保存令牌 :在树莓派上解压软件,并通过输入命令将令牌保存到文件“ngrok.yml”中。
-
创建安全隧道
:在树莓派终端输入
./ngrok http 1880。 - 获取访问地址 :会出现类似图16.4的屏幕,找到以“Forwarding”和“https”开头的部分,这就是要在浏览器中输入的地址,例如“https://2353edf8.ngrok.io”。
- 启动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
- 保存文件并退出:按“Ctrl + X”,然后按“Y”。
-
重启树莓派:输入
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为物联网应用开发提供了一个强大而灵活的平台,结合各种技术可以实现多样化的设备控制和通信需求。通过不断地探索和创新,我们可以开发出更加智能、高效的物联网解决方案。
超级会员免费看



1013

被折叠的 条评论
为什么被折叠?



