1. 为什么选择 reTerminal DM 作为工业边缘数据网关在工业物联网和边缘计算的项目里选对硬件平台是成功的一半。很多朋友一开始会纠结是用树莓派加个屏幕还是用传统的工控机或者干脆买个现成的工业平板我折腾过不少方案最后发现对于需要本地交互、数据采集和逻辑控制的场景像 reTerminal DM 这样的设备往往是最省心、也最“对味”的选择。reTerminal DM 本质上是一台基于树莓派 CM4 计算模块的工业级触控终端。它吸引我的地方首先在于其“工业级”的定位。这意味着它能在更宽的温度范围通常是0°C到50°C内稳定运行接口有ESD静电防护电源设计也更可靠能应对车间、实验室里常见的电压波动和电气干扰。你总不希望设备运行到一半因为一个静电或者电压不稳就宕机导致产线数据丢失吧其次它集成了一个5英寸的电容触摸屏分辨率是720x1280。这个尺寸和分辨率对于显示实时数据、趋势曲线、简单的控制按钮来说刚刚好。你不需要再外接一个笨重的显示器整个系统可以做得非常紧凑直接壁挂或者嵌入到控制柜里。但最核心的优势在于它的“网关”属性。它预装了基于 Debian 的 Raspberry Pi OS拥有完整的 Linux 环境。这意味着你可以用任何你熟悉的 Linux 工具和编程语言Python、Node.js、Bash等来开发应用。更重要的是它的 GPIO 接口、RS485、RS232 等工业通讯接口是直接可用的。你可以通过 Python 脚本用pymodbus库去读取一台 PLC 的温度数据也可以通过串口解析一个传感器的报文。所有的数据采集逻辑都可以在这台设备上本地完成然后再通过以太网或者 Wi-Fi 上传到云端或者本地服务器。这种“边缘侧完成数据清洗和初步处理再上报”的模式极大地减轻了中心服务器的压力也提升了系统的实时性和可靠性——即使网络暂时中断本地数据也不会丢失逻辑控制也能继续。所以当你有一个项目需要连接几种不同的现场设备比如通过 Modbus RTU 的温控器、通过串口自定义协议的仪表并且需要有一个本地的人机界面来显示状态和进行简单操作时reTerminal DM 就是一个非常理想的硬件载体。它把计算、显示和工业接口集成在了一个坚固的盒子里让你可以专注于上层应用的开发而不是底层硬件的适配和稳定性调试。2. Node-RED在 reTerminal DM 上实现零代码/低代码数据流编排硬件平台确定了接下来就是软件层面的核心如何高效、灵活地处理从各个接口采集上来的数据流这就是 Node-RED 大显身手的地方。Node-RED 是一个基于流的编程工具它用可视化的方式通过连接不同的“节点”来创建应用程序。对于工控、物联网开发者尤其是那些更熟悉硬件和工艺而非纯软件编程的工程师来说Node-RED 极大地降低了开发门槛。在 reTerminal DM 上安装 Node-RED 非常简单。因为系统是 Raspberry Pi OS我们可以直接用 apt 包管理器安装。但这里有个细节需要注意官方源的版本可能不是最新的。我通常更推荐使用 Node.js 的包管理器 npm 来安装这样可以获得更新的版本和更多的节点模块。# 首先确保系统已更新 sudo apt update sudo apt upgrade -y # 安装 Node.js 和 npm如果尚未安装 # 这里建议安装 Node.js 16.x 或 18.x 的 LTS 版本稳定性更好 curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt install -y nodejs # 验证安装 node -v npm -v # 全局安装 Node-RED sudo npm install -g --unsafe-perm node-red # 将 Node-RED 设置为系统服务开机自启 sudo systemctl enable node-red.service # 启动 Node-RED sudo systemctl start node-red.service安装完成后在 reTerminal DM 的浏览器里访问http://localhost:1880就能看到 Node-RED 的编辑界面了。它的界面分为三部分左侧是节点面板中间是工作流编辑区右侧是信息/调试面板。那么Node-RED 在 reTerminal DM 上具体能做什么我举几个最典型的应用场景场景一Modbus TCP/RTU 数据采集。从左侧面板安装node-red-contrib-modbus节点包。然后你可以拖拽一个modbus-read节点配置好 reTerminal DM 连接的串口如/dev/ttyUSB0对应 RS485 转 USB 适配器或目标设备的 IP 地址、从站地址、功能码、寄存器地址等信息。设定一个定时触发器inject节点就能周期性地读取数据。读上来的数据是一个包含payload的对象你可以直接用function节点写几行 JavaScript 代码将其转换成有意义的工程值比如寄存器值 2050 对应温度 20.5°C。场景二数据预处理与报警逻辑。采集到的原始数据往往需要处理。比如你可以用function节点判断温度是否超过阈值。如果超限可以触发两个分支一个分支用email节点需配置 SMTP发送报警邮件另一个分支用rpi-gpio节点需安装node-red-node-pi-gpio控制 reTerminal DM 上的一个 GPIO 引脚输出高电平点亮一个报警灯或者驱动一个继电器。整个逻辑链条在编辑器里一目了然调试起来非常直观——点击节点上的调试按钮消息流经时数据内容会实时显示在右侧调试窗口。场景三与本地服务交互。Node-RED 有exec节点可以执行 shell 命令。这意味着你可以轻松地集成现有的命令行工具或脚本。例如当某个传感器数据异常时触发一个 Python 脚本进行更复杂的分析或者调用fs相关节点将数据临时写入本地文件。注意在 reTerminal DM 上运行 Node-RED由于资源相对有限相比于服务器要避免创建过于复杂、节点数量巨大的流。特别是要小心循环引用和高速率消息注入这可能导致内存消耗过快。对于需要复杂计算或高频处理的逻辑建议还是用function节点调用外部 Python 脚本或编译好的程序来完成。Node-RED 的核心价值在于“连接”和“快速原型”。它让你在几个小时内就能搭建起一个可工作的数据采集与处理系统并且这个系统的逻辑是清晰可见、易于修改的。这对于项目前期的验证和后期运维时的逻辑调整帮助巨大。3. InfluxDB为时序数据而生构建高效存储与查询引擎数据采集并初步处理好了接下来就要考虑存储。为什么不用传统的 MySQL 或 SQLite因为对于物联网、工业场景下产生的数据——比如每秒一次的温度、压力、转速——它们有着鲜明的特点数据按时间顺序产生、海量写入、极少更新、按时间范围查询频繁。这类数据我们称之为“时间序列数据”。专门为处理这类数据而设计的数据库就是时序数据库TSDB而 InfluxDB 是其中的佼佼者。InfluxDB 的核心概念和传统关系型数据库不同理解这些概念是正确使用它的关键Measurement测量 相当于关系型数据库中的“表”。例如你可以创建一个名为temperature的 measurement 来存储所有温度数据。Tags标签 索引字段。它们是键值对用来存储元数据会被索引查询效率高。例如device_id“sensor_01”,location“boiler_room”。Tags 通常用来描述数据的来源和属性且值是可枚举的、不常变化的。合理的 Tag 设计能极大提升查询速度。Fields字段 实际存储的数值数据。它们是键值对不会被索引。例如value25.6。Fields 的值是随时间变化的测量值。Timestamp时间戳 每条数据点都必须有的时间戳。如果写入时不提供InfluxDB 会自动分配服务器接收时的纳秒级时间戳。Point数据点 一个由 Measurement, Tags, Fields, Timestamp 组成的完整数据记录。一个典型的数据点看起来像这样temperature,device_idsensor_01,locationboiler_room value25.6 1625097600000000000。它表示在时间戳16250976000000000002021年7月1日0点0分0秒 UTC位于锅炉房的 sensor_01 设备温度值为 25.6。在 reTerminal DM 上安装 InfluxDB 2.x目前的主流版本也很直接。InfluxDB 提供了 ARM64 的安装包完美兼容树莓派 CM4 的架构。# 下载并安装 InfluxDB 2.x 的 deb 包 wget https://dl.influxdata.com/influxdb/releases/influxdb2_2.7.4_arm64.deb sudo dpkg -i influxdb2_2.7.4_arm64.deb # 启动 InfluxDB 服务 sudo systemctl start influxdb sudo systemctl enable influxdb安装完成后首次访问http://localhost:8086会引导你进行初始化设置创建组织Organization、存储桶Bucket相当于数据库、管理员用户和密码。完成这些后你就拥有了一个运行在本地的时序数据库。InfluxDB 的强大之处在于其查询语言 Flux或类 SQL 的 InfluxQL和连续查询、任务等功能。例如你可以轻松地查询“过去24小时内锅炉房所有传感器的平均温度并按每5分钟聚合”from(bucket: my_bucket) | range(start: -24h) | filter(fn: (r) r._measurement temperature and r.location boiler_room) | aggregateWindow(every: 5m, fn: mean)对于 Node-RED 来说向 InfluxDB 写入数据非常简单。安装node-red-contrib-influxdb节点包然后在流程中添加一个influxdb out节点。配置好连接信息服务器地址、组织、桶、认证令牌然后在msg.payload中构造符合 InfluxDB 行协议格式的数据字符串或者直接传递一个包含 measurement, tags, fields 属性的 JavaScript 对象节点会自动帮你格式化并写入。实操心得在设计 Tag 和 Field 时一个常见的误区是把所有信息都塞进 Tags因为 Tags 查询快。但这会导致索引膨胀反而降低写入和查询效率。一个基本原则是用于分组GROUP BY和筛选WHERE的、值域有限的属性适合作为 Tag实际测量的、值域无限或变化频繁的数值作为 Field。例如device_id设备ID有限个作为 Tagtemperature_value温度值连续变化作为 Field。4. 实战集成构建从设备到仪表盘的完整数据管道现在我们把 reTerminal DM、Node-RED 和 InfluxDB 串联起来构建一个完整的边缘数据系统。这个系统的目标是从工业设备采集数据在边缘进行预处理和报警将清洗后的数据存入本地时序数据库并提供一个实时监控仪表盘。4.1 硬件连接与数据采集层假设我们通过 reTerminal DM 的 RS485 接口连接了一个支持 Modbus RTU 协议的温湿度传感器。我们需要一个 USB 转 RS485 的适配器。在 reTerminal DM 上这个适配器通常会被识别为/dev/ttyUSB0。在 Node-RED 中我们使用node-red-contrib-modbus节点。首先在 Node-RED 编辑器中从左侧面板拖入一个inject节点将其配置为间隔触发器比如每10秒触发一次。拖入一个modbus-read节点。双击配置Serial port:/dev/ttyUSB0Baud rate:9600 (根据传感器手册设定)Slave ID:1 (传感器的从站地址)Function Code:03 (读保持寄存器)Address:0 (温度寄存器起始地址需查手册)Quantity:2 (读取两个寄存器可能分别代表温度和湿度)连接inject到modbus-read。4.2 数据解析与格式化层modbus-read节点输出的msg.payload是一个 Buffer 或数组包含了原始的寄存器值。我们需要一个function节点来解析它。// 假设传感器手册说明 // 地址0: 温度值单位0.1°C例如 255 表示 25.5°C // 地址1: 湿度值单位0.1%RH例如 600 表示 60.0%RH let rawData msg.payload.buffer ? Buffer.from(msg.payload) : msg.payload; // 解析两个16位寄存器大端序 let temperatureRaw rawData.readUInt16BE(0); let humidityRaw rawData.readUInt16BE(2); let temperature temperatureRaw / 10.0; // 转换为°C let humidity humidityRaw / 10.0; // 转换为%RH // 构建符合 InfluxDB 行协议的数据对象 msg.payload { measurement: environment, tags: { device_id: th_sensor_01, location: workshop_a, interface: modbus_rtu }, fields: { temperature: temperature, humidity: humidity } // 时间戳可选不设置则由InfluxDB自动生成 }; return msg;4.3 边缘逻辑处理与报警层在数据存入数据库之前我们可以加入业务逻辑。再添加一个function节点进行阈值判断。let data msg.payload; let temp data.fields.temperature; // 温度报警逻辑 if (temp 30.0) { // 触发高级别报警 msg.alarm { level: high, type: over_temperature, value: temp }; // 可以复制一份消息用于控制GPIO输出 let gpioMsg {...msg}; gpioMsg.payload 1; // 高电平点亮报警灯 node.send([msg, gpioMsg]); // 输出到两个端口 } else if (temp 28.0) { // 触发低级别报警 msg.alarm { level: low, type: over_temperature, value: temp }; node.send([msg, null]); // 只输出原始数据消息 } else { // 正常状态 msg.alarm null; node.send([msg, null]); }然后我们可以将第二个输出端口连接到一个rpi-gpio out节点配置为控制某个 GPIO 引脚例如 GPIO17的输出实现声光报警。同时第一个输出端口继续流向 InfluxDB。4.4 数据持久化层将处理后的数据消息第一个输出端口连接到一个influxdb out节点。配置该节点填入你的 InfluxDB 服务器地址http://localhost:8086、Token、Organization 和 Bucket。节点会自动识别msg.payload中的 measurement, tags, fields 结构并写入。4.5 可视化与监控层数据存入 InfluxDB 后我们可以用多种方式可视化。最简单的是使用 InfluxDB 自带的Data Explorer和Dashboards功能。在 InfluxDB 的 Web UIhttp://localhost:8086中可以创建看板添加图表选择我们刚刚写入的environmentmeasurement绘制温度和湿度的实时曲线图、仪表盘等。对于更定制化的界面或者需要集成到现有系统中Node-RED 本身也提供了强大的 UI 能力。安装node-red-dashboard节点包你可以在 Node-RED 里拖拽出图表chart、仪表gauge、文本标签text等控件并绑定到数据流上。这样直接在 reTerminal DM 的屏幕上通过浏览器访问 Node-RED 提供的 Dashboard 地址通常是http://reterminal-ip:1880/ui就能看到一个专业的本地监控界面。整个数据流如下图所示文字描述周期性触发 - Modbus读取 - 数据解析 - 报警判断 - (分支1: GPIO控制) (分支2: 写入InfluxDB)。InfluxDB 的数据又可被 Node-RED Dashboard 或 InfluxDB 原生看板查询展示。5. 性能调优、安全与运维考量当这个系统在 reTerminal DM 上7x24小时运行时一些工程上的细节就变得至关重要。5.1 资源管理与性能调优reTerminal DM 的算力和内存有限取决于你选的 CM4 版本。需要监控系统资源使用htop或nodered-admin命令 观察 Node-RED 和 InfluxDB 进程的内存和 CPU 占用。InfluxDB 是比较吃内存的尤其是在数据量变大后。InfluxDB 配置调整 编辑/etc/influxdb/influxdb.conf可以调整一些参数。对于边缘设备可以考虑适当减少cache-max-memory-size缓存大小和max-series-per-database每数据库最大序列数来限制内存使用。但调整前务必理解其含义。数据保留策略Retention Policy 这是 InfluxDB 的核心功能之一。你肯定不想让磁盘很快被历史数据塞满。在创建 Bucket 时就设置一个合理的保留期限比如30天30d或90天90d。超过期限的数据会自动删除。对于需要长期归档的数据可以配合 InfluxDB 的任务Task定期将聚合后的数据如每小时平均值写入另一个保留期更长的 Bucket。Node-RED 流优化 避免在function节点中进行非常耗时的同步操作如复杂的循环计算、大的文件读写。对于这类操作考虑用exec节点调用外部优化过的二进制程序或脚本。合理使用context存储全局变量避免重复计算。5.2 系统安全加固一个暴露在工业网络中的边缘设备必须考虑安全。更改默认密码 首先更改 Raspberry Pi OS 的默认pi用户密码。为 Node-RED 和 InfluxDB 设置强密码。防火墙配置 使用ufw等工具配置防火墙只开放必要的端口如 SSH的22 Node-RED的1880 InfluxDB的8086。最好将 Node-RED 和 InfluxDB 的监听地址从0.0.0.0改为127.0.0.1这样它们只能从本机访问。然后通过 Nginx 反向代理并配置 HTTPS 和身份验证来对外提供服务。InfluxDB 令牌管理 不要使用初始的管理员令牌all-access token在应用中使用。为 Node-RED 专门创建一个只写特定 Bucket 的令牌最小化权限原则。Node-RED 项目备份 定期通过 Node-RED 的“项目”功能导出你的流或者直接备份~/.node-red目录下的flows.json等文件。5.3 可靠性与故障恢复看门狗与自恢复 可以利用 systemd 的服务管理能力。为 Node-RED 和 InfluxDB 创建 systemd 服务单元文件安装包通常已经创建好并配置Restarton-failure这样服务意外退出时会自动重启。日志排查 熟悉日志位置。Node-RED 的日志可以通过journalctl -u node-red -f查看。InfluxDB 的日志在/var/log/influxdb/。当数据写入失败或查询异常时首先查看日志。磁盘健康监控 reTerminal DM 使用 microSD 卡或 eMMC 存储。长期频繁写入可能影响寿命。建议将 InfluxDB 的数据目录挂载到外置的 USB SSD 硬盘上以获得更好的性能和可靠性。同时监控磁盘使用率df -h。5.4 版本升级与兼容性在升级任何组件Node.js, Node-RED, InfluxDB之前务必在测试环境进行验证。特别是 InfluxDB不同大版本如 1.x 和 2.x的 API 和概念差异巨大。Node-RED 的社区节点包也可能存在版本依赖问题。维护一个清晰的软件版本清单是保证长期稳定运维的好习惯。这套基于 reTerminal DM Node-RED InfluxDB 的技术栈其魅力在于它用相对轻量的资源和可视化的方式构建了一个功能完备、专业可靠的工业边缘数据中台。它降低了实施门槛加快了开发速度并且所有组件都是开源、可深度定制的。从我实际部署的几个项目来看只要前期架构设计合理注意好资源限制和安全配置这套方案在中小型数据采集和监控场景下表现得非常稳定和高效。