【第五篇】InfluxDB 数据存储
为什么需要这一步
回想一下我们之前聊的 MQTT 特性——它不存储历史数据,消息发完即丢。现在你的温度数据虽然能实时显示在折线图上,但是:
- 关掉浏览器再打开,之前的数据全没了
- 没法回看"昨天下午3点的温度是多少"
- 没法做统计分析(比如"过去一周平均温度")
InfluxDB 是一个专门为这种"带时间戳的连续数据"设计的数据库(叫时序数据库),正好补上 MQTT 这个短板:MQTT 负责"实时搬运",InfluxDB 负责"持久记忆"。
目标流程
mqtt in → switch ─┬─→ chart(实时显示)
├─→ 报警模块(你刚做的)
└─→ influxdb out(写入数据库,永久保存)
第一步:安装 InfluxDB
SSH 到虚拟机,执行:
sudo apt install -y influxdb influxdb-client
sudo systemctl enable influxdb
sudo systemctl start influxdb
sudo systemctl status influxdb # 确认 active (running)

InfluxDB 安装成功,active (running),监听在 HTTP 端口 8086,没有问题
第二步:创建数据库
继续在终端执行:
influx
进入 InfluxDB 的命令行交互界面后,依次输入:
CREATE DATABASE edgebox
SHOW DATABASES
SHOW DATABASES 这条会列出当前所有数据库,确认列表里出现了 edgebox,说明创建成功。
最后退出:
exit

edgebox 数据库已经创建成功,列表里能看到 _internal 和 edgebox 两个库,完全正确。
先输入 exit 退出 InfluxDB 命令行。
第三步:安装 Node-RED 的 InfluxDB 节点
cd ~/.node-red
npm install node-red-contrib-influxdb
pm2 restart node-red
等重启完成后,执行:
pm2 status
确认 node-red 状态

两条命令粘贴时拼在一起了,所以报错,
重新执行一次,这次只输这一条:
npm install node-red-contrib-influxdb
等安装完成后再执行:pm2 restart node-red
安装成功,node-red 重启后状态 online,一切正常。
第四步:去 Node-RED 接入 influxdb out 节点
打开浏览器,进入 Node-RED 编辑器(http://192.168.112.130:1880),找到之前做的那个流程(有 mqtt in → switch → chart )。
操作步骤
- 左侧节点面板,往下滚动到 storage(存储) 分组,找到
influxdb out节点,拖到画布上 - 从 switch 节点的输出2(otherwise那条,也就是接到 chart 的同一个口) 再拉一条线,连到
influxdb out节点 - 双击
influxdb out节点,配置:- 点击 Server 旁边的 「+」 新建连接
- Host:
192.168.112.130 - Port:
8086 - Database:
edgebox - 其他留空,点「添加」
- 回到节点配置,Measurement(表名) 填:
temperature
- 点「完成」,点「部署」



一直不生效,一开始host是192.168.112.130也不起效果,于是查找问题,改成了localhost也是不行,一开始MQTT是因为你在 mqtt in 节点里必须填 IP 地址(Node-RED 要连接 broker),而 Mosquitto 默认不对外开放,所以只能去改 Mosquitto 配置
但 InfluxDB 这里,Node-RED 和 InfluxDB 装在同一台虚拟机上,直接填 localhost 走本机内部通信就行,根本不需要经过网卡,是最干净的方式,不用动 InfluxDB 的配置文件。
还有一个右侧调试窗体报错了一个,No measurement specified
influxdb out 节点的 Measurement(表名)字段没有保存成功
解决步骤
双击 influxdb out 节点,检查配置面板里的 「Measurement」 字段:
- 如果是空的,填入:
temperature - 如果已经有值,先清空再重新填入:
temperature
然后点「完成」→「部署」。
同时还有一个问题需要修复,
MQTT 发过来的数据是字符串类型(比如 "65"),但 InfluxDB 需要数字类型(65)才能正常存储和后续做统计分析。
需要在 switch → influxdb out 之间加一个 function 节点,做类型转换:
msg.payload = parseFloat(msg.payload);
return msg;
这样 "65" 就会变成 65,InfluxDB 才能把它当数值存进去。
试了各种验证数据都没有流向InfluxDB,半天是配置出错了。
正确的连线方式应该是:
switch(输出2) ──┬──→ chart
└──→ function → influxdb out
是我连接错了,switch → chart → function → influxdb out
chart 节点没有输出口,数据到 chart 就停了,所以 function 和 influxdb out 永远收不到数据。


ok 结束
当前已完成的完整链路
MQTT发布 → Node-RED订阅(mqtt in)
↓
switch判断
↙ ↘
>80 报警 正常数据
↙ ↘
chart function(类型转换)
实时显示 ↓
influxdb out
永久存储

浙公网安备 33010602011771号