一、mqtt 协议实验
1. 实验目的
- 掌握 node-red 的 mqtt 协议节点的使用
1.2. 实验原理
MQTT 是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT 是专门针对物联网开发的轻量级传输协议。MQTT 协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前 MQTT 拥有各种平台和设备上的客户端,已经形成了初步的生态系统。

1.3实验内容
- 安装 mqtt 代理服务器
• 下载 apache-apollo-1.7.1 下载址:http://archive.apache.org/dist/activemq/activemq-apollo/1.7.1/
image.png
安装
– 解压,如解压到 D:/盘后,进入到 D:/java/apache-apollo-1.7.1/bin 目录下,执行命令apollo.cmd create mybroker
该命令会在 bin 路径下新建一个 mybroker 的文件夹,进入该文件夹,执行命令启动代理服务:
apollo-broker.cmd run
– 进入控制平台服务界面
image.png
登陆网址: http://127.0.0.1:61680 默认用户名:admin,密码:password
image.png -
mqtt 实验
(a) 使用 mqtt 节点连接代理服务器
• 使用 inject 节点、function 节点、mqtt out 节点按下图方式连接
image.png
• inject 节点设置为没 2 秒重复发送消息
• function 节点设置需要发送的消息和 mqtt 主题,消息 payload 可使用 json 对象的格式,主
题若写在 msg.topic 变量,则节点配置端不需要设置主题。
image.png
• 配置 mqtt 的连接服务端 ip,端口号等信息
image.png
• 配置 mqtt 的连接用户名和密码,默认是 admin,password
image.png
• 部署后,如果连接成功,在 node-red 的控制端应该能够看到“已连接到服务器”的相关字样。
image.png
• 进入 mqtt 服务器端,能显示具体的连接数据
image.png
(b) 使用 mqtt input 节点订阅消息
• 接入 mqtt input 节点和 debug 节点,按下图方式连接

• 配置需要订阅的服务端 ip 和订阅的主题

• 部署,此时你应该能够在调试面板查看到输出的 json 消息
(c) 发布和订阅感知层的实时数据
• 在 Lab08 的实验中,你已经学会了如何通过串口节点获取协调器传递过来的数据,请你利用本
次实验学习到的 MQTT 协议的相关知识,将传感器的数据推送至主题”/zigbee/topic/temperature”
和”/zigbee/topic/humidity” ;客户端通过订阅这两个主题获得对应的数据,并显示到你自建
的展示模板上来。
(d) mqtt 的优点
• 简单性:MQTT 是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解
除应用程序耦合,相对于其他协议,开发更简单;
• 稳定性:工作在 TCP/IP 协议上;由 TCP/IP 协议提供稳定的网络连接;
• 轻量级:小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流
量;适合低带宽,数据量较小的应用;
• 易用性:MQTT 协议的服务端程序已经非常成熟,PHP,JAVA,Python,C,C# 等系统语
言都可以来向 MQTT 发送相关消息;
• 开放性:源代码开放,都可以用,也进一步推动了 MQTT 的发展,百度云、阿里云、中国移
动 onenet 等几乎所有的开放性物联网平台都支持 MQTT。
3. 实现
- 安装 mqtt 代理服务器
下载 apache-apollo-1.7.1 下载址:http://archive.apache.org/dist/activemq/activemq-apollo/1.7.1/
image.png
解压,如解压到 D:/盘后,进入到 D:/java/apache-apollo-1.7.1/bin 目录下,
执行命令
apollo.cmd create mybroker
进入该目录下

在此目录下,使用cmd命令

使用 命令

接下来


该命令会在 bin 路径下新建一个 mybroker 的文件夹,进入该文件夹,执行命令启动代理服务:
apollo-broker.cmd run
进入文件夹

使用cmd

执行命令

启动成功

登陆网址: http://127.0.0.1:61680 默认用户名:admin,密码:password
进入界面 登录

登录成功

-
mqtt 实验
(a) 使用 mqtt 节点连接代理服务器
• 使用 inject 节点、function 节点、mqtt out 节点按下图方式连接
inject 节点设置为每 2 秒重复发送消息
function 节点设置需要发送的消息和 mqtt 主题,消息 payload 可使用 json 对象的格式,主题若写在 msg.topic 变量,则节点配置端不需要设置主题。
代码
msg.payload = {"name":"jack"};
msg.topic = "test/1";
return msg;

配置 mqtt 信息

配置 mqtt 的连接服务端 ip,端口号等信息

配置 mqtt 的连接用户名和密码,默认是 admin,password

部署后,如果连接成功,在 node-red 的控制端应该能够看到“已连接到服务器”的相关字样。

使用 mqtt input 节点订阅消息
接入 mqtt input 节点和 debug 节点,按下图方式连接

配置需要订阅的服务端 ip 和订阅的主题

• 部署,此时你应该能够在调试面板查看到输出的 json 消息

全部代码
[
{
"id": "02a347f0d7536246",
"type": "tab",
"label": "流程 8",
"disabled": false,
"info": "",
"env": []
},
{
"id": "7babbf7ec0ee362a",
"type": "inject",
"z": "02a347f0d7536246",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "2",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 120,
"y": 100,
"wires": [
[
"6b4c95f6fe8f474f"
]
]
},
{
"id": "6b4c95f6fe8f474f",
"type": "function",
"z": "02a347f0d7536246",
"name": "function 19",
"func": "msg.payload = {\"name\":\"jack\"};\nmsg.topic = \"test/1\";\nreturn msg;\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 150,
"y": 220,
"wires": [
[
"2a96dc04b19055d1"
]
]
},
{
"id": "2a96dc04b19055d1",
"type": "mqtt out",
"z": "02a347f0d7536246",
"name": "",
"topic": "",
"qos": "",
"retain": "",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "3c8f996439821d1a",
"x": 130,
"y": 340,
"wires": []
},
{
"id": "94d976d048f0799d",
"type": "mqtt in",
"z": "02a347f0d7536246",
"name": "",
"topic": "test/1",
"qos": "2",
"datatype": "auto-detect",
"broker": "3c8f996439821d1a",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 170,
"y": 440,
"wires": [
[
"3fc6df9d40e27917"
]
]
},
{
"id": "3fc6df9d40e27917",
"type": "debug",
"z": "02a347f0d7536246",
"name": "debug 32",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 420,
"y": 440,
"wires": []
},
{
"id": "3c8f996439821d1a",
"type": "mqtt-broker",
"name": "",
"broker": "127.0.0.1",
"port": "61613",
"clientid": "",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"userProps": "",
"sessionExpiry": ""
}
]











