基于reTerminal DM、Node-RED与InfluxDB的工业物联网边缘监控方案
1. 项目概述当工业级触摸屏遇上可视化数据流如果你手头有一块reTerminal DM并且正在寻找一种方法让它不仅仅是显示静态信息而是成为一个能实时监控、处理并可视化数据的智能边缘终端那么将Node-RED和InfluxDB组合起来几乎是为你量身定做的方案。reTerminal DM是Seeed Studio推出的一款基于树莓派CM4的工业级触摸屏设备它集成了高性能计算、丰富的I/O接口和一块高清显示屏天生就是为工业物联网IIoT和人机交互HMI场景设计的。但硬件只是基础如何让数据流动起来并形成有意义的洞察才是发挥其价值的关键。Node-RED这个由IBM开源的可视化编程工具以其“连线即编程”的理念极大地降低了数据流编排的门槛。而InfluxDB作为专为时序数据优化的数据库则是存储和查询时间序列数据的利器。将这三者结合你就能在reTerminal DM上构建一个从数据采集、处理、存储到可视化展示的完整闭环。无论是监控车间设备的温度、压力还是追踪环境传感器的光照、湿度甚至是分析服务器的运行指标这套组合都能让你快速搭建起原型并稳定运行于生产环境。接下来我将以一个典型的工业环境监控项目为例拆解如何一步步实现这个方案并分享我在实际部署中积累的经验和踩过的坑。2. 整体架构设计与核心组件选型2.1 为什么是reTerminal DM Node-RED InfluxDB在开始动手之前我们先理清为什么这个组合如此契合。首先看硬件reTerminal DM搭载了树莓派Compute Module 4这意味着它拥有与树莓派4B相当的计算能力足以流畅运行Node-RED和InfluxDB这类服务。其自带的5英寸IPS触摸屏和工业级外壳让它能直接部署在车间、实验室等现场环境充当本地化的监控和操控面板。丰富的接口如GPIO、CSI、DSI、USB也便于连接各种传感器和执行器。Node-RED的核心价值在于“集成”与“编排”。它内置了海量的节点Node可以轻松连接MQTT、HTTP、串口、GPIO等数百种数据源和目标。你不需要编写复杂的代码来处理不同协议之间的转换只需在图形化界面上拖拽节点并用线连接就能定义数据流的处理逻辑比如过滤异常值、数据格式转换、条件触发等。这对于快速构建和迭代物联网应用至关重要。InfluxDB的专长则是“存储”与“查询”时间序列数据。与传统的MySQL或PostgreSQL不同InfluxDB的数据模型Measurement, Tag, Field, Timestamp是为时间戳数据优化的它在写入速度、数据压缩和按时间范围查询的效率上具有压倒性优势。对于每秒产生大量数据点的传感器网络InfluxDB能确保数据高效入库并支持强大的聚合查询如均值、最大值、百分位等为可视化提供实时数据支撑。因此这个架构的流程非常清晰传感器数据通过GPIO、串口或网络协议如MQTT进入Node-REDNode-RED进行必要的清洗、转换和逻辑判断处理后的数据被写入本地的InfluxDB数据库最后Node-RED的Dashboard节点从InfluxDB读取数据生成图表和控件并直接呈现在reTerminal DM的屏幕上。整个系统完全运行在单台设备上实现了边缘计算降低了网络依赖和云端延迟。2.2 软件栈版本与部署策略考量选择合适的软件版本是项目稳定的第一步。对于reTerminal DM我推荐使用基于Debian的官方Raspberry Pi OS64位Lite版因为它对树莓派硬件的支持最完善社区资源也最丰富。Node-RED建议通过官方脚本安装它会自动处理Node.js环境依赖并配置为系统服务。目前稳定版本在v3.x以上对Dashboard 3.0的支持更好。InfluxDB这里有个关键选择。InfluxDB有1.x和2.x两个主要版本两者在API和数据模型上有较大差异。对于新手和大多数边缘场景我强烈推荐使用InfluxDB 1.8。原因有三第一其HTTP API/write和/query简单直观与Node-RED的influxdb节点兼容性极佳第二查询语言InfluxQL类比SQL学习曲线平缓第三资源占用相对2.x版本更少更适合reTerminal DM这类资源有限的边缘设备。InfluxDB 2.x功能更强大但也更复杂引入了Flux查询语言和全新的UI在边缘端有些“杀鸡用牛刀”。数据库客户端虽然InfluxDB 1.8自带一个简单的管理界面8083端口但功能有限。我习惯在PC上安装InfluxDB Studio或Chronograf作为图形化管理工具通过局域网连接reTerminal DM上的InfluxDB服务进行管理这样不占用终端本身的资源。部署策略上我建议将InfluxDB和Node-RED都配置为系统服务systemd并设置开机自启。这样即使设备意外重启服务也能自动恢复。另外务必为InfluxDB的数据存储目录配置一个容量较大的MicroSD卡或外接USB存储设备因为时序数据积累起来速度很快。注意在reTerminal DM上请避免同时运行图形桌面环境如PIXEL和你的应用服务。这会消耗大量内存和CPU资源。我们的目标是将其作为无头服务器运行仅通过Node-RED Dashboard提供Web界面。因此安装Raspberry Pi OS Lite版本并通过SSH进行管理是最佳实践。3. 基础环境搭建与核心服务安装3.1 操作系统准备与基础配置首先你需要为reTerminal DM烧录操作系统。使用Raspberry Pi Imager工具选择“Raspberry Pi OS (64-bit) Lite”。烧录完成后在boot分区根目录下创建一个名为ssh的空文件启用SSH以及一个名为wpa_supplicant.conf的文件来配置Wi-Fi如果需要无线连接。完成后将MicroSD卡插入reTerminal DM并上电。通过SSH连接到设备后首先进行系统更新和基础配置sudo apt update sudo apt upgrade -y sudo raspi-config在raspi-config中我建议进行以下几项关键设置系统选项 - 主机名修改为一个有意义的名称如reterminal-dm-monitor。性能选项 - 内存分割由于我们不需要图形桌面可以将GPU内存GPU Memory设置为最低如16MB将更多内存留给应用。本地化选项设置正确的时区、区域和键盘布局这对于时间序列数据的时间戳至关重要。接口选项启用SSH如果之前没做、SPI、I2C等取决于你后续要连接的传感器。配置完成后重启设备。接下来安装一些必要的工具sudo apt install -y vim git curl wget htop3.2 Node-RED的安装与初步配置Node-RED的安装非常简便。官方提供了一键安装脚本它会自动安装合适的Node.js版本。bash (curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)当脚本询问“是否将Node-RED作为服务运行并开机自启”时选择“是”。脚本还会询问是否安装常用的Palette节点集我建议也选择“是”这会安装node-red-dashboard,node-red-node-serialport等实用节点。安装完成后Node-RED服务应该已经启动。默认运行在1880端口。你可以通过http://你的reTerminal DM IP:1880来访问其编辑器界面。为了安全我们需要设置一下密码cd ~/.node-red npm install node-red-admin node-red-admin hash-pw输入你想设置的密码会得到一段哈希值。然后编辑settings.js文件nano ~/.node-red/settings.js找到adminAuth部分取消注释并修改adminAuth: { type: credentials, users: [{ username: admin, // 你可以修改用户名 password: 刚才生成的哈希值, permissions: * }] },保存后重启Node-RED服务sudo systemctl restart nodered现在访问编辑器就需要输入用户名和密码了。3.3 InfluxDB 1.8的安装与关键配置如前所述我们安装InfluxDB 1.8。首先添加InfluxData的仓库并安装wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - echo deb https://repos.influxdata.com/debian $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/influxdb.list sudo apt update sudo apt install influxdb安装完成后启动服务并设为开机自启sudo systemctl start influxdb sudo systemctl enable influxdbInfluxDB 1.8默认使用8086端口用于HTTP API8083端口用于旧版管理界面默认未启用。我们主要使用8086端口。首先创建一个管理员用户并初始化数据库influx进入InfluxDB命令行后执行CREATE USER admin WITH PASSWORD 你的强密码 WITH ALL PRIVILEGES CREATE DATABASE sensor_data USE sensor_data为了安全我们禁用匿名写入生产环境必须做sudo nano /etc/influxdb/influxdb.conf找到[http]部分确保auth-enabled设置为true[http] enabled true bind-address :8086 auth-enabled true # 确保这是true保存后重启InfluxDBsudo systemctl restart influxdb现在任何对数据库的读写操作都需要提供用户名和密码了。你可以通过influx -username admin -password 你的密码来登录命令行。实操心得在资源有限的设备上调整InfluxDB的存储配置可以延长存储卡寿命并提升性能。在influxdb.conf的[data]部分可以调整cache-max-memory-size如256m和cache-snapshot-memory-size如64m避免内存使用过多。同时根据数据保留策略合理设置retention-period如52w表示保留52周并启用shard-precreation以平滑写入负载。4. Node-RED数据流编排实战4.1 连接数据源从传感器到Node-RED假设我们通过reTerminal DM的GPIO连接了一个DHT22温湿度传感器。我们需要先在Node-RED中安装对应的节点。进入编辑器点击右上角菜单 - “节点管理” - “控制板”搜索node-red-contrib-dht-sensor并安装。安装后在节点面板的“输入”分类下会出现“DHT22 Sensor”节点。将其拖入流中双击配置Name: 可以命名为“车间温湿度”。Sensor Type: 选择DHT22。GPIO Pin: 根据实际连接例如GPIO 4物理引脚7。Read Interval: 设置读取间隔如30000毫秒30秒一次避免频繁读取影响传感器寿命。这个节点会定期输出一个包含temperature和humidity字段的JSON消息。我们可以用一个debug节点连接它部署后查看“调试”侧边栏确认数据格式是否正确。对于其他数据源方法类似MQTT使用“mqtt in”节点订阅来自其他设备或网关的主题。HTTP请求使用“http in”和“http response”节点创建API端点接收数据。串口使用“serial in”节点读取PLC或老式设备的数据。4.2 数据处理与转换功能节点的灵活运用原始数据往往需要清洗和加工。Node-RED提供了丰富的处理节点。函数节点Function这是最强大的节点可以用JavaScript编写自定义逻辑。例如我们可以给DHT22的数据添加一个“感觉温度”字段并标记数据来源// 计算体感温度简化公式 let temp msg.payload.temperature; let humi msg.payload.humidity; let feelsLike temp 0.33 * humi - 0.7 * 2 - 4; // 构建新的payload符合InfluxDB行协议格式 msg.payload { measurement: environment, tags: { location: workshop_a, device: reterminal_dm_1 }, fields: { temperature: temp, humidity: humi, feels_like: feelsLike }, timestamp: Date.now() // 使用当前时间戳或使用传感器自带的时间 }; return msg;切换节点Switch用于条件路由。例如当温度超过40度时触发一个报警流。更改节点Change用于设置、移动或删除消息属性。例如将msg.topic设置为测量名称。JSON节点在JSON字符串和对象之间转换。一个常见的处理链是原始数据 -JSON解析 -Function节点加工计算、过滤-Switch节点判断 - 分别流向存储和报警。4.3 写入InfluxDB配置与优化处理好的数据需要写入InfluxDB。我们需要安装InfluxDB节点在节点管理中搜索node-red-contrib-influxdb并安装。拖入一个“influxdb out”节点双击配置。点击铅笔图标添加一个新的InfluxDB服务器配置Name: InfluxDB LocalHost:localhost或127.0.0.1Port:8086Database:sensor_dataUsername/Password: 填写之前创建的admin用户和密码。Precision: 时间戳精度选择s秒通常足够。关键点在于msg.payload的格式。influxdb out节点期望两种格式行协议字符串例如environment,locationworkshop_a temperature25.4,humidity60 1631234567890000000JSON对象就是我们之前在Function节点里构建的格式包含measurement,tags,fields,timestamp。使用JSON对象格式更易于在流中操作。将Function节点的输出连接到influxdb out节点部署后数据就会开始写入。注意事项写入频率不宜过高。对于变化缓慢的环境数据30秒到1分钟写入一次是合理的。高频写入如每秒数次会给reTerminal DM的存储和InfluxDB带来压力可能导致数据丢失或系统卡顿。可以通过“触发”节点或修改传感器节点的读取间隔来控制写入频率。另外建议在influxdb out节点前加入一个“延迟”节点或者在Function节点中做批量处理将多条数据组合成一个数组再写入以减少HTTP请求开销。5. 数据可视化构建本地监控仪表盘5.1 Node-RED Dashboard的布局与控件Node-RED Dashboard是一个独立的UI模块它通过一组节点如ui_template,ui_chart,ui_gauge来生成Web界面。这些节点本身不存储数据它们订阅msg.topic并渲染从上游节点接收到的数据。首先规划你的仪表盘布局。在Node-RED编辑器中点击右侧的“仪表盘”标签页一个小仪表图标。在这里你可以创建多个标签页Tabs在每个标签页内创建组Groups。组是控件的容器决定了控件在页面上的排列顺序水平或垂直流式布局。例如我可以创建一个名为“车间监控”的标签页然后在里面创建两个组“环境参数”和“设备状态”。“环境参数”组里放置温度、湿度、体感温度的图表和仪表盘“设备状态”组里放置一些开关或指示灯。5.2 从InfluxDB查询数据并动态刷新仪表盘需要从InfluxDB拉取数据来更新。这里我们使用“influxdb in”节点。将其拖入流中使用之前配置好的服务器连接。配置“influxdb in”节点的关键是编写InfluxQL查询语句。假设我们要显示最近一小时的温度曲线Query:SELECT mean(temperature) AS value FROM environment WHERE time now() - 1h AND locationworkshop_a GROUP BY time(1m)Output: 选择a time series of events。这个查询会每分钟计算一个平均温度值返回一个时间序列。输出结果是一个包含msg.payload数组的对象每个元素有time和value属性。但是“influxdb in”节点需要被触发才会执行查询。为了在仪表盘上实现自动刷新我们需要一个定时触发器。拖入一个“注入”节点将其设置为按固定间隔触发例如每10秒并将其输出连接到“influxdb in”节点。这样每隔10秒就会执行一次查询获取最新数据。接下来将“influxdb in”节点的输出连接到一个“ui_chart”节点。“ui_chart”节点需要配置Group: 选择之前创建的“环境参数”组。Size: 设置图表大小例如全宽。Chart Type: 选择line。X-Axis Label:时间。Y-Axis Label:温度(°C)。Legend: 可以显示图例。部署后访问http://你的reTerminal DM IP:1880/ui就能看到自动刷新的温度曲线图了。5.3 高级可视化技巧与交互设计基础的图表和仪表盘可能不够用这时ui_template节点就派上用场了。它允许你使用HTML、CSS和JavaScript创建完全自定义的控件。例如你想显示一个根据温度值改变颜色的动态卡片拖入一个“ui_template”节点配置到“环境参数”组。在“模板”编辑框中可以写入如下代码div stylepadding: 20px; border-radius: 10px; text-align: center; background-color: {{msg.payload.value 30 ? #ffcccc : #ccffcc}}; h3当前温度/h3 h1 stylefont-size: 3em;{{msg.payload.value.toFixed(1)}} °C/h1 p更新时间: {{new Date(msg.payload.time).toLocaleTimeString()}}/p /div在“脚本”标签页你可以写JavaScript来处理输入消息msg并设置scope变量供模板使用。为了让这个模板动态更新你需要创建一个独立的流定时触发 - InfluxDB查询当前最新温度 - 将结果发送到ui_template节点。此外Dashboard还支持交互。你可以添加“ui_button”或“ui_slider”节点当用户点击按钮或滑动滑块时节点会输出一个msg.payload。你可以将这个输出连接到“function”节点生成一个控制命令再通过“mqtt out”或“gpio out”节点发送给实际的设备从而实现通过网页界面控制物理设备。6. 系统优化、问题排查与维护实录6.1 性能调优与资源监控在reTerminal DM上长期运行多个服务资源管理至关重要。以下是我总结的几点优化经验限制历史数据量InfluxDB是吃存储的大户。务必为每个测量measurement设置合理的数据保留策略Retention Policy。对于监控数据保留30-90天通常足够分析趋势。USE sensor_data ALTER RETENTION POLICY autogen ON sensor_data DURATION 90d DEFAULT这条命令将默认RP的保留期改为90天超过90天的数据会自动删除。你还可以创建更精细的RP比如对高频数据保留7天对日均聚合数据保留1年。Node-RED流优化避免阻塞操作在Function节点中避免使用同步的、耗时的操作如复杂的循环、同步文件读写。使用异步模式或拆分成多个小节点。合理使用上下文存储对于需要跨流共享的、不常变的数据如设备配置使用context存储而不是用flow变量或全局变量反复传递。精简调试节点上线前移除或禁用不必要的debug节点。每个debug节点都会消耗CPU周期来格式化输出。系统级监控在Node-RED中创建一个简单的系统监控流使用“exec”节点定期运行top -bn1 | grep -E \(CPU|Mem)\或df -h命令获取CPU、内存和磁盘使用率并将其写入另一个InfluxDB数据库或直接显示在Dashboard上便于你及时发现资源瓶颈。6.2 常见问题与排查技巧在实际部署中你肯定会遇到各种问题。这里记录几个典型场景及其解决方法问题1Node-RED Dashboard访问非常慢或图表不更新。排查首先检查浏览器开发者工具F12的“网络”选项卡看获取/ui或相关API的请求是否长时间挂起或失败。可能原因与解决网络问题确保reTerminal DM的IP地址稳定最好设置为静态IP。资源不足通过SSH登录运行htop命令查看CPU和内存使用率。如果Node-RED或InfluxDB进程占用过高考虑优化数据流或调整InfluxDB配置。流逻辑错误检查触发图表更新的“注入”节点和“influxdb in”节点之间的流是否畅通查询语句是否正确。可以在“influxdb in”节点后添加debug节点查看是否收到了数据。问题2数据写入InfluxDB失败。排查查看Node-RED编辑器右侧的“调试”窗口看influxdb out节点是否有错误输出。同时查看InfluxDB服务日志sudo journalctl -u influxdb -f。可能原因与解决认证失败错误信息常包含401 Unauthorized。检查influxdb out节点的用户名密码配置并确认InfluxDB的auth-enabled为true。数据库不存在错误信息可能提示数据库找不到。确认influxdb out节点中配置的数据库名已创建。行协议格式错误如果使用字符串格式检查是否符合measurement,tagvalue fieldvalue timestamp的格式特别注意空格和逗号。使用JSON对象格式更不易出错。问题3InfluxDB磁盘空间增长过快。排查使用InfluxQL查询数据点数量和数据大小。SELECT COUNT(*) FROM environment -- 查看总数据点数 SHOW STATS WHERE databasesensor_data -- 查看数据库统计信息解决检查保留策略确认RP的DURATION设置是否合理。降低数据精度如果原始数据频率过高可以在Node-RED中使用“平滑”或“采样”节点或者写入InfluxDB前先做一次均值聚合。启用数据压缩InfluxDB默认启用压缩确保配置文件中[data]部分的compression为enabled。6.3 数据备份与系统恢复策略对于生产环境备份是生命线。我采用分层备份策略InfluxDB数据备份# 定期如每天凌晨2点使用cronjob执行备份 influxd backup -portable -database sensor_data -host localhost:8088 /path/to/backup/dir/$(date \%Y\%m\%d)注意InfluxDB备份需要使用8088端口备份端口需要在配置文件中启用。备份的是数据库的元数据和数据文件。Node-RED流备份Node-RED的流配置保存在~/.node-red目录下的flows.json文件。最简单的方法是定期复制这个文件。更好的方法是使用Node-RED的“项目”功能或版本控制工具如git来管理流。全系统镜像备份使用dd或Raspberry Pi Imager的“从设备读取”功能定期为整个MicroSD卡创建镜像。当系统崩溃时可以快速恢复到一个已知良好的状态。最后关于维护我建议建立一个简单的检查清单每周或每月执行一次[ ] 检查磁盘使用率df -h[ ] 检查服务状态sudo systemctl status nodered influxdb[ ] 检查最近的服务日志sudo journalctl -u nodered --since 1 day ago | tail -20[ ] 验证关键传感器数据是否持续写入在InfluxDB中执行SELECT last(*) FROM environment[ ] 访问Dashboard确认所有图表和控件工作正常。这套reTerminal DM Node-RED InfluxDB的方案其魅力在于将复杂性封装在了简单的“连线”背后。它可能不是处理海量数据的最优解但对于绝大多数边缘侧的数据采集、监控和可视化需求它提供了无与伦比的开发速度和灵活性。当你看到车间的温度曲线第一次在你自己搭建的屏幕上平稳跳动时那种成就感正是驱动我们不断折腾下去的动力。