ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

本地Node-RED十分钟搭建MQTT物联网可视化控制流

本地Node-RED十分钟搭建MQTT物联网可视化控制流 1. 鸟哥杂谈开场本地 Node-RED 到底值不值得折腾我一直觉得物联网项目最难的不是写代码而是把“传感器发数据、平台收数据、页面看数据、开关控设备”这条链路快速串起来。以前用单片机裸写 Web 服务器改一次页面就要重新烧录用云平台又常常被设备数量、消息条数和网络环境限制。后来我把 Node-Red 装到本地小主机上才发现可拖拽、图形化的物联网编排工具是真省事。Node-Red 不是取代单片机也不是取代 MQTT Broker它更像一个“接线员”左边接硬件右边接界面中间用节点和连线把逻辑画出来。这篇文章适合三类人第一类是做物联网工程毕业设计、课程设计需要快速做出可视化和远程控制效果的人第二类是在智能家居、环境监测、智慧物流、智慧出行等场景里做原型验证的人第三类是不想写太多前端代码但又想让 ESP32、树莓派、旧电脑跑出一个像样控制面板的人。十分钟搭建自己的本地 Node-Red不是让你十分钟造出商业系统而是让你十分钟看到一条能跑通的物联网数据流。这个区别很重要很多教程把“安装完成”当成“项目完成”实际用起来才发现坑都在后面。1.1 为什么我不推荐一上来就追复杂平台本地 Node-Red 最大的好处是“看得见、改得快、拆得开”。你在浏览器里打开localhost:1880拖一个 MQTT 输入节点再拖一个调试节点点一下部署消息立刻在右侧打印出来。这个过程没有编译、没有烧录、没有等待云端规则生效。对于做环境监测的人来说ESP32 只要负责采温和发 MQTTNode-Red 负责订阅、判断阈值、写数据库、推仪表盘职责非常清楚。哪天传感器换了只改 MQTT 主题哪天页面要加一个图表只拖一个 dashboard 节点。硬件归硬件逻辑归逻辑界面归界面。我见过不少新手一开始就上重型框架结果卡在账号、设备模型、物模型、数据解析上真正的传感器反而没调通。Node-Red 的图形化虽然看起来“轻”但它背后是 Node.js 生态装节点就能扩展数据库、串口、Modbus、HTTP、WebSocket、邮件、企业微信机器人等能力。你可以把它当玩具也可以把它当家庭自动化中枢。关键在于先跑通一条最小链路再慢慢加东西。十分钟搭建的目标就是这条最小链路。1.2 “可拖拽图形化”不等于零学习成本Node-Red 的拖拽确实降低了写胶水代码的门槛但你不懂“消息对象”照样会卡住。每个节点之间传的不是电压也不是引脚电平而是一个 JavaScript 对象通常写作msg。传感器数据一般放在msg.payload里主题信息放在msg.topic里。你想取温度就要知道数据是 JSON 字符串还是对象你想做判断就要会写一点点 Function 节点代码。所谓图形化是把流程可视化不是把逻辑变没。我的经验是先学会inject、debug、mqtt in、mqtt out、function、dashboard这六类节点百分之七八十的本地物联网原型都能拼出来。2. 动手前的准备别急着敲命令先把这几样东西理清很多人装 Node-Red 失败不是命令写错而是环境没理清。Node-Red 依赖 Node.jsNode.js 版本又会影响节点安装。你如果直接在系统自带的老 Node.js 上装很可能遇到node-gyp编译失败、串口节点装不上、dashboard 节点报错。我的做法是先确认系统版本再装一个较新的 Node.js LTS 版本最后装 Node-Red。硬件方面旧笔记本、迷你主机、树莓派、NAS 里的容器都能跑。局域网里最好有一台常开的设备不然你关掉电脑自动化流程也停了。2.1 软件清单Node.js、Node-RED、MQTT Broker、浏览器软件四件套里Node.js 是运行时Node-Red 是编排工具MQTT Broker 是消息中转站浏览器是操作台。你可以用本地 Mosquitto 当 Broker也可以用局域网里其他设备上的 Broker。Node-Red 自身不负责保存 MQTT 消息它只是订阅和发布。很多人把 Node-Red 当数据库结果重启后历史数据全丢这就是概念没分清。Broker 负责转发Node-Red 负责处理数据库负责留存dashboard 负责展示。各自干各自的事排错时才能快速定位。Node.js 版本建议选 LTS不要盲目追最新版。Node-Red 官方对 Node.js 版本有要求装之前去官方文档扫一眼版本对应关系能省很多时间。Windows 用户可以直接下载安装包macOS 用户可以用 HomebrewLinux 用户可以用 NodeSource 或 nvm。树莓派用户注意架构ARMv7 和 ARM64 的安装方式略有差别。如果你只是体验Docker 是最省心的方式镜像里已经打包好 Node.js 和 Node-Red不用折腾系统依赖。2.2 硬件清单旧电脑、树莓派、ESP32 都能上本地 Node-Red 对硬件要求不高。我实测在一台双核四线程、4GB 内存的旧笔记本上Node-Red 加 Mosquitto 加 SQLite待机内存占用大约 200MB 到 400MB。树莓派 3B 以上就能跑树莓派 Zero 2 W 也能跑轻量流程但 dashboard 图表多的时候会吃力。ESP32 负责末端采集DHT11、DHT22、SHT30、BME280 都可以。继电器模块、LED、蜂鸣器可以做执行器。网络方面所有设备最好在同一局域网MQTT Broker 地址用固定 IP别用会变的 DHCP 地址否则今天能连、明天掉线排查起来很烦。如果你没有硬件也可以先用inject节点模拟数据。比如每秒生成一个随机温度送到 dashboard 仪表盘。这样做的好处是先验证 Node-Red 流程和页面再上硬件。硬件到了以后把inject换成mqtt in就行。很多毕业设计卡在“硬件还没到页面先做不了”其实完全可以用模拟数据先把展示逻辑跑通。2.3 心智模型流、节点、连线、消息四件事弄懂就不迷路Node-Red 里最核心的四个词是 Flow、Node、Wire、Message。Flow 是一张流程图Node 是流程图上的功能块Wire 是节点之间的连线Message 是线上跑的数据。你可以把 Flow 想成工厂流水线Node 是工位Wire 是传送带Message 是传送带上的零件。零件从上一个工位流到下一个工位每个工位可以加工、判断、分流、合并。消息对象通常包含payload、topic、msgid等字段你也可以自己加字段比如msg.temperature、msg.deviceId。概念生活类比实际作用Flow一条流水线组织一组相关逻辑Node工位订阅、处理、发布、展示Wire传送带决定消息流向Message零件盒携带数据在节点间传递Context车间仓库保存跨消息的变量理解这张表之后再看右侧的调试窗口就不会懵。你点一下 inject 节点消息从 inject 流到 debug调试窗口出现msg.payload说明消息通道通了。接下来接 MQTT 输入调试窗口出现传感器数据说明 Broker 和主题对了。再接 Function 节点拆分字段最后接 dashboard页面出现数值说明展示链路也通了。每一步只验证一件事排错就不会乱。3. 十分钟跑起来三种安装方式与首次启动真正动手时我建议先选一种最顺手的安装方式不要同时折腾 npm 和 Docker。Windows 用户如果不想碰命令行可以用 npm 全局安装Linux 和 NAS 用户用 Docker 更干净树莓派用户如果已经装了桌面系统npm 也很方便。安装完成后第一件事不是拖节点而是确认 Node-Red 能启动、浏览器能打开、端口没有被占用。十分钟搭建的核心就是这三步。下面给出两种最常用的路径你按自己的环境选。3.1 npm 全局安装最直接适合有 Node.js 基础的人先确认 Node.js 和 npm 可用node -v npm -v然后全局安装 Node-Rednpm install -g --unsafe-perm node-red--unsafe-perm在 Linux 和 macOS 上能减少权限导致的安装问题。Windows 用户如果提示权限不足用管理员身份打开终端。安装完成后直接启动node-red启动日志里会看到Server now running at http://127.0.0.1:1880/。在浏览器输入这个地址就能看到编辑器。默认端口是 1880如果被占用可以用node-red -p 1881换端口。第一次启动会在用户目录下生成.node-red文件夹里面保存flows.json、settings.js和节点配置。这个文件夹就是你的项目本体备份它等于备份整个流程。3.2 Docker 安装环境干净适合反复折腾Docker 方式适合不想污染主机环境的人。一条命令拉取并启动docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red参数含义要拆开看-p 1880:1880把容器端口映射到主机-v node_red_data:/data把容器里的数据目录挂载到 Docker 卷删除容器后流不会丢--name mynodered给容器起名方便重启和查看日志。启动后访问http://主机IP:1880。如果你在群晖、威联通、Unraid 上玩图形化 Docker 界面里照着填端口和卷就行思路一样。注意Docker 卷一定要挂载/data否则每次重建容器你辛苦拖出来的流都会消失。这个坑我见过太多次尤其是用命令行临时跑起来的人。3.3 首次启动、端口与安全设置默认情况下Node-Red 只监听本机127.0.0.1局域网其他设备访问不了。如果你想让平板、手机、ESP32 所在网络访问需要改settings.js里的uiHost。更稳妥的做法是配置登录认证不要直接把 1880 端口暴露出去。生成密码哈希可以用node-red-admin hash-pw然后把输出填到settings.js的adminAuth里adminAuth: { type: credentials, users: [{ username: admin, password: $2b$08$替换成你生成的哈希, permissions: * }] }改完重启 Node-Red再访问 1880 就会要求登录。这里多花两分钟后面少操很多心。尤其是家里有智能家居控制、摄像头、门锁相关流程时认证不是可选项。3.4 验证安装是否真的成功验证分三层第一层浏览器能打开编辑器第二层拖一个inject和一个debug点部署点按钮调试窗口有输出第三层重启 Node-Red刚才的流还在。三层都通过说明安装、运行、持久化都没问题。如果第一层就失败优先看端口占用和防火墙第二层失败看消息是否连线和部署状态第三层失败看数据目录权限和 Docker 卷挂载。别急着装各种节点先把基础闭环跑通。4. 拖拽出第一个物联网流从 MQTT 温湿度到仪表盘基础跑通后我们做一条真正有用的流ESP32 通过 MQTT 发布温湿度 JSONNode-Red 订阅并解析dashboard 显示温度和湿度再做一个开关控制继电器。这条流覆盖了物联网原型最常见的“采集、传输、处理、展示、控制”五个环节。你把这套跑熟换成土壤湿度、光照、PM2.5、水位、电流电压只是主题和字段不同。下面我按实际操作顺序拆开讲每一步都说明为什么这么做。4.1 安装 dashboard 与 mqtt 节点在编辑器右上角菜单里找到“节点管理”搜索node-red-dashboard并安装。这个节点包提供仪表盘、开关、图表、文本等界面组件。再搜索node-red-node-serialport如果你要接串口设备就装不接可以先跳过。MQTT 节点通常内置在 Node-Red 里如果没有搜索node-red-node-mqtt。安装节点时终端会显示 npm 安装日志若失败常见原因是网络、权限、Node.js 版本不匹配。我的习惯是节点安装一次只装一个装完重启一次编辑器。一次性装十个节点报错时你不知道是谁的问题。dashboard 安装完成后左侧节点栏会出现 dashboard 分类里面有gauge、chart、switch、text等。mqtt 分类里有mqtt in和mqtt out。节点装好不等于页面自动出现还要拖出来、连线、部署、访问/ui才能看到界面。4.2 拖出 MQTT 订阅、调试与数据处理节点从左侧拖一个mqtt in双击配置 Broker。Broker 地址填你本地 Mosquitto 的 IP端口 1883。主题填esp32/sensorQoS 选 0 或 1。QoS 0 是发出去就不管适合高频传感器QoS 1 是至少送达一次适合控制指令。输出选择“自动解析 JSON 对象”这样msg.payload就是对象不用再手动JSON.parse。再拖一个debug节点连在mqtt in后面部署后看调试窗口有没有数据。如果 ESP32 发的是{temperature: 25.6, humidity: 58.2, deviceId: esp32-01}调试窗口应该显示一个对象。如果没有数据先检查主题是否一致、Broker 地址是否可达、ESP32 是否真的连上 WiFi 和 MQTT。可以在电脑上用命令行订阅同一主题mosquitto_sub -h 192.168.1.100 -t esp32/sensor -v命令行能看到消息说明 Broker 和 ESP32 没问题问题就在 Node-Red 配置命令行也看不到问题在发布端或 Broker。4.3 做一块仪表盘温度、湿度、开关拖一个function节点把对象拆成两个输出msg.temperature msg.payload.temperature; msg.humidity msg.payload.humidity; msg.deviceId msg.payload.deviceId; return [msg, msg];return [msg, msg]表示输出两份消息分别接温度仪表和湿度仪表。然后拖两个gauge节点一个绑定msg.temperature范围 0 到 50另一个绑定msg.humidity范围 0 到 100。再拖一个switch节点做继电器开关配置 payload 为true和false输出接mqtt out主题esp32/relay/set。部署后访问http://主机IP:1880/ui就能看到仪表盘。下面是一个简化流 JSON可以导入后自己改[ { id: mqtt-in-1, type: mqtt in, name: 订阅 esp32/sensor, topic: esp32/sensor, qos: 0, datatype: json, broker: mqtt-broker-1, wires: [[debug-1, func-1]] }, { id: func-1, type: function, name: 拆分温度湿度, func: msg.temperature msg.payload.temperature;\nmsg.humidity msg.payload.humidity;\nreturn [msg, msg];, outputs: 2, wires: [[gauge-temp], [gauge-hum]] }, { id: gauge-temp, type: ui_gauge, name: 温度, group: group-1, min: 0, max: 50, value: {{msg.temperature}}, wires: [] }, { id: gauge-hum, type: ui_gauge, name: 湿度, group: group-1, min: 0, max: 100, value: {{msg.humidity}}, wires: [] } ]导入后需要补上 Broker 配置和 dashboard 分组。重点不是照抄而是理解每个节点的输入输出。调试节点看数据Function 节点拆字段Gauge 节点显示字段Switch 节点发控制指令。链路清晰后面加数据库、加报警、加手机页面都容易。4.4 ESP32 端最小发布逻辑ESP32 端不用复杂连 WiFi、连 MQTT、定时读传感器、发布 JSON 就行。下面是一个最小示例DHT 库和 PubSubClient 库需要提前安装#include WiFi.h #include PubSubClient.h #include DHT.h #define DHTPIN 4 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); dht.begin(); WiFi.begin(你的WiFi名, 你的WiFi密码); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } client.setServer(192.168.1.100, 1883); } void loop() { if (!client.connected()) { client.connect(esp32-sensor-01); } client.loop(); float t dht.readTemperature(); float h dht.readHumidity(); if (isnan(t) || isnan(h)) return; String payload {\temperature\: String(t) ,\humidity\: String(h) ,\deviceId\:\esp32-01\}; client.publish(esp32/sensor, payload.c_str()); delay(5000); }这个例子里发布周期 5 秒适合调试。实际部署可以改成 30 秒或 60 秒减少消息量。设备 ID 建议写进 JSON后面多设备接入时Node-Red 可以用msg.payload.deviceId区分数据来源。主题也可以设计成home/room1/esp32-01/sensor层级越清楚后面维护越轻松。4.5 部署、验证与排错点右上角“部署”然后依次验证ESP32 串口有输出Mosquitto 命令行能订阅到消息Node-Red 调试窗口有 JSONdashboard 页面有数值开关点击后继电器有动作。哪一步断了就查哪一步不要把整条链路混在一起猜。我通常会在关键节点后面都挂一个 debug调试完再删掉。dashboard 页面没数据时先看部署状态是不是“已部署”再看/ui是不是被浏览器缓存最后看 gauge 的值绑定是不是{{msg.temperature}}。5. 我踩过的坑常见问题与排查技巧实录Node-Red 的坑大多不复杂但很磨人。最常见的是端口冲突、权限不足、节点装不上、MQTT 连不上、数据格式不对、dashboard 空白。每个问题背后都有原因盲目重启不一定管用。下面我把实际遇到过的现象、原因和处理方式整理成速查表再补几条独家避坑技巧。你按表排查能省很多搜索时间。5.1 端口、权限、后台运行问题1880 打不开先看 Node-Red 有没有启动。终端如果还在滚动日志说明进程活着如果终端关了进程可能也停了。Linux 下用ss -lntp | grep 1880看端口占用。Windows 下用netstat -ano | findstr 1880。端口被占用就换端口或者结束占用进程。想让 Node-Red 后台常驻可以用 pm2npm install -g pm2 pm2 start node-red --name node-red pm2 save pm2 startuppm2 startup会输出一条命令按提示执行开机自启就配好了。树莓派用户注意不要用 root 跑 Node-Red权限过大反而容易出问题。Docker 用户用--restart unless-stopped让容器自动重启docker update --restart unless-stopped mynodered5.2 节点安装失败与版本冲突节点安装失败时终端报错通常分三类网络超时、权限不足、编译工具缺失。网络问题可以换 npm 源权限问题加--unsafe-perm或用非 root 用户编译问题在 Linux 上装build-essential、python3、make、g。Node.js 版本太新也可能导致某些老节点不兼容这时可以降级到 LTS。我的建议是生产用的 Node-Red 不要频繁升级 Node.js 大版本先用当前版本把项目做完再考虑迁移。现象常见原因处理方式node-red命令找不到npm 全局路径没进 PATH重开终端或检查 npm prefix节点安装卡住网络慢或源不可达换源单个节点安装串口节点报错缺少编译工具或权限安装 build-essential加入 dialout 组dashboard 不显示未访问/ui或未部署检查 URL 和部署状态MQTT 连不上地址、端口、主题、认证错误用 mosquitto_sub 交叉验证5.3 MQTT 与串口通信问题MQTT 连不上先确认 Broker 是否允许匿名连接。Mosquitto 默认配置可能只监听本机需要改listener 1883 0.0.0.0和allow_anonymous true改完重启服务。生产环境不要匿名要加用户名密码。主题大小写敏感esp32/sensor和ESP32/Sensor是两个主题。QoS 和保留消息也要注意保留消息适合保存最后状态但如果不清理新订阅者会立刻收到旧数据容易误判。串口通信常见问题是权限。Linux 下串口设备通常是/dev/ttyUSB0或/dev/ttyACM0普通用户默认没权限。把用户加入dialout组sudo usermod -aG dialout $USER然后重新登录。Windows 下串口是COM3、COM4在设备管理器里确认端口号。串口节点配置要匹配波特率ESP32 常用 115200Arduino Uno 常用 9600。波特率不对收到的就是乱码。5.4 数据格式与 dashboard 显示问题ESP32 发 JSON 字符串Node-Red 的 MQTT 输入节点要选“解析 JSON 对象”否则msg.payload是字符串Function 里取.temperature会得到undefined。如果数据是数组比如[25.6, 58.2]可以用msg.payload[0]取值。Dashboard 的 gauge 节点值可以写{{msg.temperature}}也可以写msg.temperature不同版本略有差异。页面不刷新先看调试窗口有没有持续消息再看 gauge 是否配置了正确的范围和单位。注意dashboard 的 UI 页面默认在/ui不是/。很多人打开 1880 首页看不到仪表盘就以为节点没装好。其实首页是编辑器仪表盘在另一个地址。6. 从能跑到好用本地 Node-RED 的进阶改造一条流跑通只是开始。真正让本地 Node-Red 好用还要做备份、安全、持久化和项目扩展。你不可能每次都从零拖节点也不会希望设备一多就乱成一团。我的做法是把常用逻辑做成子流把设备配置集中管理把历史数据写进数据库把备份脚本挂到定时任务。这样即使换主机、重装系统也能快速恢复。6.1 流备份、迁移与版本管理Node-Red 的流保存在.node-red/flows.jsonDocker 里在/data/flows.json。你可以直接复制这个文件做备份也可以在编辑器里导出流 JSON。更好的方式是用 Git 管理导出文件每次大改前提交一次。子流适合封装重复逻辑比如“解析温湿度”“发送告警”“写入数据库”。设备多了以后建议主题命名规范home/room/device/type。例如home/livingroom/esp32-01/sensor。这样在 MQTT 输入节点里可以用通配符home///sensor订阅多个设备。6.2 安全加固别把 1880 端口裸奔到局域网本地不等于安全。局域网里如果有访客设备1880 端口开着认证才靠谱。Dashboard 如果涉及控制继电器也要加认证。可以在 settings.js 里配置adminAuth也可以在前面套一层反向代理并加 HTTPS。反向代理这个词在这里指用 Nginx 等工具转发请求不是别的东西。配置时注意只暴露必要端口MQTT 的 1883 也不要对公网开放。需要远程查看时优先用局域网内访问或加密隧道方案别图省事直接端口映射。6.3 上下文与数据持久化Node-Red 的 context 可以保存变量但默认存在内存重启就丢。要持久化可以在 settings.js 里配置contextStorage用 localfilesystem 保存到文件。历史数据建议写 SQLite、InfluxDB 或 PostgreSQL。SQLite 最省事适合家庭项目InfluxDB 适合时间序列数据PostgreSQL 适合复杂查询。写入数据库时给数据加时间戳和设备 ID后面做图表、统计、导出都方便。msg.topic INSERT INTO sensor_data(device_id, temperature, humidity, created_at) VALUES(?, ?, ?, ?); msg.payload [msg.payload.deviceId, msg.payload.temperature, msg.payload.humidity, new Date()]; return msg;上面是 SQL 节点的参数化写法。不要拼字符串避免注入和格式错误。数据库连接节点安装后先在小数据量下测通再上高频采集。6.4 五个适合练手的本地物联网小项目项目核心节点练手价值室内温湿度监测MQTT、Function、Gauge熟悉采集与展示土壤湿度自动浇水MQTT、Switch、Delay熟悉阈值控制智能插座定时开关Inject、Cron、MQTT Out熟悉定时任务门窗开合告警MQTT、Trigger、通知节点熟悉状态变化多设备数据入库MQTT、SQLite、Chart熟悉持久化与图表这些项目都不需要复杂硬件但能覆盖 Node-Red 的大部分常用能力。我建议从温湿度监测开始再加一个继电器控制最后加数据库。每加一层都先保证调试窗口能看到数据再动 dashboard。这样即使出错也能快速定位。我个人在实际操作中的体会是Node-Red 最值钱的地方不是“拖拽”而是让你把注意力放回业务逻辑。传感器怎么装、阈值怎么定、告警发给谁、数据留多久这些才是物联网项目真正要回答的问题。工具只是工具十分钟能搭起来后面十分钟又十分钟地改才是常态。我现在给自己定了个小规矩每加一个流先在 debug 里跑通 payload再往 dashboard 上搬。这个习惯帮我省了很多返工时间。
返回列表