【第四.二篇】Node-RED Dashboard和MTQQ模拟实时数据

1.首先我又新增了一个流程2,只有chart孤立的节点

imageqtt in 节点

左侧节点面板要往下滚动,刚才看到的是 switch / slider / numeric / text input 这些,是属于 dashboard 分组的。你需要往上滚动找 「网络」(network) 分组,里面有:

  • mqtt in
  • mqtt out

mqtt in 拖到画布上,放在 chart 节点左边一点的位置。


拖进去之后,双击这个新的 mqtt in 节点打开配置,

  • Server:192.168.99.112.130:1883
  • Topic:sensor/temperature

 

image

 

image

 对此对这个action我有疑问选择哪一个,

 最后发现选择「订阅单个主题」 就行。

  • 订阅单个主题:固定订阅一个写死的主题(比如 sensor/temperature),适合你现在这种场景
  • 动态订阅:主题不写在节点里,而是由输入消息(msg.topic)动态决定,适合需要灵活切换主题的高级场景

保存并部署

然后去 SSH 窗口模拟发送数据

打开一个 SSH 终端,连接到你的虚拟机,执行:

bash
mosquitto_pub -h localhost -t "sensor/temperature" -m "75.3"

image 

原因

Mosquitto 从 2.0 版本开始有一个安全限制:默认只允许 localhost(127.0.0.1)连接,拒绝通过真实网卡 IP(比如 192.168.112.130)发起的连接,除非你显式配置允许。

你的 mqtt in 节点填的是 192.168.112.130:1883,虽然这台机器和 Node-RED 是同一台机器,但走的是网卡 IP 而不是 localhost,所以被 Mosquitto 拒绝了,连接卡在"连接中"出不来。

解决办法

SSH 到你的虚拟机,执行:

 
bash
sudo nano /etc/mosquitto/mosquitto.conf

在文件末尾添加这两行:

 
listener 1883
allow_anonymous true

保存退出(nano 里:Ctrl+O 保存,Ctrl+X 退出)

然后重启 mosquitto:

 
bash
sudo systemctl restart mosquitto
sudo systemctl status mosquitto   # 确认 active (running)

image

 

image

 

 

第一条命令拆解

 
bash
mosquitto_pub -h localhost -t "sensor/temperature" -m "75.3"

mosquitto_pub 是 Mosquitto 自带的一个命令行工具,专门用来发布(pub = publish)一条 MQTT 消息。各参数含义:

参数含义这里的值
-h host,要连接的 MQTT broker 地址 localhost(本机的 mosquitto)
-t topic,发布到哪个"主题"上 sensor/temperature
-m message,消息内容(payload) 75.3

翻译成人话:"连接到本机的 MQTT 服务器,往 sensor/temperature 这个主题上,发一条内容是 75.3 的消息,发完就退出。"

这条命令模拟的就是"一个真实的温度传感器,采集到了一次读数 75.3 度,把它上报出去"。


第二条命令拆解(循环发送)

 
bash
while true; do
  temp=$((RANDOM %80+20))
  mosquitto_pub -h localhost -t "sensor/temperature" -m "$temp"
  sleep 3
done

这是一个 Bash 脚本,逐行看:

  1. while true; do ... done —— 一个死循环,不停地重复执行中间的内容,直到你按 Ctrl+C 强制停止
  2. temp=$((RANDOM % 80 + 20)) —— 生成一个随机数
    • $RANDOM 是 Bash 自带的随机数变量(0~32767之间)
    • % 80 取余数,结果落在 0~79
    • + 20 整体偏移,最终落在 20~99 之间,模拟一个合理的温度范围
  3. mosquitto_pub -h localhost -t "sensor/temperature" -m "$temp" —— 跟第一条命令一样,只是把固定的 75.3换成了刚生成的随机温度变量
  4. sleep 3 —— 暂停3秒
  5. 循环回到第1步,再生成一个新随机数、再发一次

翻译成人话:"每隔3秒,生成一个20~99之间的随机温度,发送一次,一直循环,直到手动停止。" 这就模拟了一个传感器持续不断地采集并上报数据的真实场景。

 

这个非常就是和我们开发中的消息队列一样

相同点:核心模式一样

都是 发布/订阅(Pub/Sub)模式

  • 生产者不需要知道谁在消费
  • 消费者不需要知道谁在生产
  • 中间靠一个"中转站"(broker / 队列服务)解耦两边

你之前用的 mosquitto_pub 发消息、Node-RED mqtt in 订阅消息,这套模型和你往 RabbitMQ 一个 exchange 发消息、消费者监听 queue,思路上是一模一样的。

不同点:MQTT 是为"弱网、低功耗、海量设备"专门设计的

 MQTT传统消息队列(RabbitMQ/Kafka)
设计目标 物联网设备、传感器、弱网环境 企业级系统间通信、大数据流
协议本身 极简,几十字节的包头 相对重,功能更全
持久化/重放 默认不存储历史消息(除非用 retain 或额外存储) Kafka 天生支持消息持久化和回放
路由方式 基于 Topic 字符串通配符(sensor/+/temp Exchange/Routing key(RabbitMQ)或 Partition(Kafka)
典型场景 传感器上报、IoT设备控制 订单系统、日志收集、流处理
连接方式 客户端长连接,专为"在线/离线"状态设计(Will消息就是干这个的) 看具体实现

一个关键区别,跟你刚做的实验直接相关

刚才如果你先发数据,再打开 Node-RED 订阅,这条消息是收不到的——MQTT 默认"发完即丢",不等你。

而 Kafka 这种消息队列,消息会被持久化在硬盘上,哪怕消费者晚到,重启之后还能从头读取历史消息

MQTT 也有个折中方案叫 retain 消息(发布时加个 retain 标志),broker 会保留"最后一条",新订阅者一上线就能拿到这"最新状态",但也只是最后一条,不是完整历史。这也是为什么实际项目里,MQTT 通常配合 InfluxDB做真正的历史数据存储——MQTT 负责"实时搬运",数据库负责"持久记忆"。



整条链路的交互细节

 

1️⃣ Mosquitto(MQTT broker)是一个"消息中转站",不是数据库

它本身不存储数据、不处理逻辑,唯一的工作是:维护一份"谁订阅了哪个主题"的名单,一旦有人往某个主题发消息,就立刻转发给所有订阅了这个主题的人。

2️⃣ 具体发生的事情,按时间顺序:

① 你的 SSH 终端执行 mosquitto_pub

   ↓ (建立一个临时连接,发完即断开)
② 连接到 Mosquitto broker(localhost:1883)
   ↓
③ 告诉 broker:"我要往 sensor/temperature 主题发一条消息,内容是 75.3"
   ↓
④ Mosquitto 收到后,查自己的订阅名单:
   "谁订阅了 sensor/temperature?" → 找到你的 Node-RED(mqtt in 节点)
   ↓
⑤ Mosquitto 主动把这条消息推送给 Node-RED
   (这就是刚才"已连接"状态的意义——Node-RED 提前订阅好了,一直在线等消息)
   ↓
⑥ Node-RED 的 mqtt in 节点收到消息,把它包装成一个标准消息对象:
   msg.payload = "75.3"
   msg.topic = "sensor/temperature"
   ↓
⑦ 这条 msg 沿着你画的连线,传给下一个节点(chart)
   ↓
⑧ chart 节点(属于 Dashboard)把这个数值,作为一个新的数据点,
   推送到浏览器里打开的 Dashboard 页面
   ↓
⑨ 浏览器收到推送(通过 WebSocket 实时连接,不需要你手动刷新),
   折线图自动画上这个新的点

3️⃣ 几个容易误解的点,特别说明一下:

 

  • Mosquitto 不知道"温度"这个概念,它只是无脑转发字节流。sensor/temperature 只是一个你自己起的字符串名字,换成 abc/123 一样能用,只是没意义
  • Node-RED 和 Dashboard 之间是实时推送,不是轮询。你看到图表自动跳动而不需要刷新页面,就是因为 Node-RED 后台通过 WebSocket 把新数据主动"推"给了浏览器
  • mosquitto_pub 这个命令本身和 Node-RED 没有任何直接关系,它只认 Mosquitto broker。哪怕你把 Node-RED 关掉,这条命令依然能正常执行成功(只是没人订阅,消息发出去就没人收,相当于白发)条命令拆解
 
bash
mosquitto_pub -h localhost -t "sensor/temperature" -m "75.3"

mosquitto_pub 是 Mosquitto 自带的一个命令行工具,专门用来发布(pub = publish)一条 MQTT 消息。各参数含义:

参数含义这里的值
-h host,要连接的 MQTT broker 地址 localhost(本机的 mosquitto)
-t topic,发布到哪个"主题"上 sensor/temperature
-m message,消息内容(payload) 75.3

翻译成人话:"连接到本机的 MQTT 服务器,往 sensor/temperature 这个主题上,发一条内容是 75.3 的消息,发完就退出。"

这条命令模拟的就是"一个真实的温度传感器,采集到了一次读数 75.3 度,把它上报出去"。


第二条命令拆解(循环发送)

 
bash
while true; do
  temp=$((RANDOM %80+20))
  mosquitto_pub -h localhost -t "sensor/temperature" -m "$temp"
  sleep 3
done

这是一个 Bash 脚本,逐行看:

  1. while true; do ... done —— 一个死循环,不停地重复执行中间的内容,直到你按 Ctrl+C 强制停止
  2. temp=$((RANDOM % 80 + 20)) —— 生成一个随机数
    • $RANDOM 是 Bash 自带的随机数变量(0~32767之间)
    • % 80 取余数,结果落在 0~79
    • + 20 整体偏移,最终落在 20~99 之间,模拟一个合理的温度范围
  3. mosquitto_pub -h localhost -t "sensor/temperature" -m "$temp" —— 跟第一条命令一样,只是把固定的 75.3换成了刚生成的随机温度变量
  4. sleep 3 —— 暂停3秒
  5. 循环回到第1步,再生成一个新随机数、再发一次

翻译成人话:"每隔3秒,生成一个20~99之间的随机温度,发送一次,一直循环,直到手动停止。" 这就模拟了一个传感器持续不断地采集并上报数据的真实场景。

 

posted @ 2026-06-26 14:16  WaitLove  阅读(17)  评论(0)    收藏  举报