基于Node-RED的边缘网关

本项目是一套基于 Quectel Pi H1 智能主控板构建的 Node-RED 边缘网关

以Quectel Pi H1 作为边缘侧计算与协议汇聚节点,在本地局域网内完成端侧设备接入、数据采集汇聚、规则编排与可视化展示,并将数据落地存储至本地数据库,实现“采集—处理—存储—展示”的闭环架构,适用于对实时性、可靠性与本地化部署要求较高的工业现场与边缘计算场景。

开发资源汇总

开发配件清单

开发配件只是作为参考,不同的开发环境可能会有所差异,比如通过ssh远程连接进行开发,可以不使用usb拓展板,显示屏也可以根据需要进行替换。

配件名称 数量 规格参数
Quectel Pi H1智能主控板 2 Quectel Pi H1智能主控板
Environment Sensor HAT 1 环境传感器扩展板
USB摄像头模块 1 OV5693 USB摄像头模块
USB-C 电源线充电器 1 27W USB Type-C接口充电器 1.2米线长中规电源PD电源 适用于树莓派5代
CPU 散热风扇 1 树莓派5代官方原装散热器带导热贴
HDMI 线 1 规格:HDMI 2.0;线长:1m;接口:HDMI-A(公头)-HDMI-D(公头)
网线 1 线长:1m;传输速率:千兆;
显示屏 1 24英寸HDMI显示器

配件实物参考

快速上手

开发准备

Quectel Pi H1智能主控板出厂默认搭载 Debian 13 系统镜像,因此无需再次烧录镜像,仅需按照如下步骤操作即可。

硬件连接

网关端(H1-A)

1.显示连接

将HDMI线一端接入智能主控板的HDMI接口,另一端接入显示器的HDMI接口。

2.输入设备连接

将USB键盘、鼠标接入智能主控板的两个USB-A接口上,若用无线输入设备,将接收器插入USB口即可。

3.网络连接

将网线一端接入智能主控板的千兆网口,另一端接入路由器的网口

平替方案:WiFi连接同一局域网网络。

4.跳线帽连接

智能主控板左上角标有AUTO_POWER_ON丝印的排针,确保已经用跳线帽短接。

5.供电连接

将USB-A电源线的USB-A端接入电源适配器,USB-C端接入智能主控板的电源口(标注POWER IN)。

6.连接完成参考

采集端(H1-B)

1.网络连接

将网线一端接入智能主控板的千兆网口,另一端接入路由器的网口

平替方案:使用WiFi连接同一局域网网络。

2.跳线帽连接

智能主控板左上角标有AUTO_POWER_ON丝印的排针,确保已经用跳线帽短接。

3.环境传感器扩展板连接

将环境传感器扩展版与Quectel Pi H1 40Pin引脚相接

4.摄像头连接

USB摄像头连接上USB-A接口即可。

5.供电连接

将USB-A电源线的USB-A端接入电源适配器,USB-C端接入智能主控板的电源口(标注POWER IN)。

6.连接完成参考

项目实现

本节按“网关端 / 采集端”拆分,便于部署。

网关端(H1-A)

1.更新软件源

sudo apt update

2.安装Node-RED

sudo apt install build-essential git curl
bash <(curl -sL https://github.com/node-red/linux-installers/releases/latest/download/update-nodejs-and-nodered-deb)

设置开机时自启动:

sudo systemctl enable nodered.service

要禁用该服务,请运行以下命令:

sudo systemctl disable nodered.service
sudo systemctl restart nodered

3.安装 Mosquitto和sqlite3

sudo apt install -y sqlite3 mosquitto mosquitto-clients

设置开机自启动

sudo systemctl enable --now mosquitto

创建并编辑 Mosquitto 的配置

sudo nano /etc/mosquitto/conf.d/edge-listener.conf

配置如下,ctrl+o,enter,ctrl+x保存退出

listener 1883 0.0.0.0
allow_anonymous true

重启服务

sudo systemctl restart mosquitto

4.初始化 SQLite 数据库

Node-RED SQLite 节点使用的数据库路径为:/home/pi/edge_db/edge.db

请先创建目录并初始化表结构:

mkdir -p ~/edge_db
sqlite3 ~/edge_db/edge.db << 'SQL'
CREATE TABLE IF NOT EXISTS telemetry (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  deviceId   TEXT    NOT NULL,
  ts         INTEGER,
  gatewayTs  INTEGER,
  temperature REAL,
  humidity    REAL,
  pressure    REAL
);

CREATE INDEX IF NOT EXISTS idx_telemetry_device_ts ON telemetry(deviceId, ts);
SQL

Node-RED 写库字段为 (deviceId, ts, gatewayTs, temperature, humidity, pressure),并通过解析主题 edge/v1/<deviceId>/telemetry 获取 deviceId。

5.访问Dashboard

如果你在Pi桌面上使用浏览器,可以打开地址:http://localhost:1880

在从另一台机器浏览时,使用Pi的主机名或IP地址:你可以通过在Pi上运行hostname -I来找到IP地址。http://<hostname>:1880

进去网页界面如下图:

安装必要节点:

进入编辑器后,依次点击右上角、SettingsPaletteInstall进入到节点安装界面,搜索下面节点安装。

node-red-node-sqlite
node-red-dashboard

6.导入Node-RED流程

1.将flow.json文件放置在.node-red/lib/flows/下。

cd ~/.node-red/lib/flows/

2.在编辑器界面依次点击右上角,ImportLocal、然后选择flow.jsonImport

3.将流程导入后点击Deploy使流程生效。

采集端(H1-B)

采集端使用 Python + paho-mqtt + smbus2,并调用 mjpg-streamer 输出 MJPEG:

1.安装基础组件

sudo apt update
sudo apt install -y git python3-venv v4l-utils

2.安装 mjpg-streamer(用于输出 MJPEG 视频流)

安装编译依赖:

sudo apt install -y git cmake build-essential libjpeg-dev

拉取源码并编译:

cd ~
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make

3.获取代码和创建Python虚拟环境

代码文件夹(edge_h1_sensor)放置于用户目录/home/pi下,

cd ~/edge_h1_sensor
python3 -m venv venv
source venv/bin/activate

4.更新pip 并安装 OpenCV 与 paho-mqtt

pip install --upgrade pip opencv-python paho-mqtt
pip install -U smbus2

5.配置40Pin接口配置文件

使能40Pin的I2C,在终端输入sudo qpi-config 40pin set,之后重启Quectel Pi H1主板使配置生效。

6.启动程序

回到项目代码目录下启动python虚拟环境运行程序:

cd ~/edge_h1_sensor
source venv/bin/activate
sudo -E ~/edge_h1_sensor/venv/bin/python h1_sensor_agent.py

注:需要修改代码,将网关端IP改成实际IP地址

应用演示

Node-RED界面

Node-RED编辑器界面:http://<hostname>:1880

Node-RED UI界面:http://<hostname>:1880/ui

数据库数据查询示例

本项目网关端将遥测数据写入 SQLite 数据库,默认路径为:

  • 数据库文件:/home/pi/edge_db/edge.db
  • 数据表:telemetry
  • 字段:deviceId, ts, gatewayTs, temperature, humidity, pressure

进入数据库

sqlite3 /home/pi/edge_db/edge.db

查看表与表结构

.tables
.schema telemetry

查看最新数据

h1-sensecam-001 替换为实际设备 ID:

SELECT deviceId, ts, gatewayTs, temperature, humidity, pressure
FROM telemetry
WHERE deviceId = 'h1-sensecam-001'
ORDER BY ts DESC
LIMIT 20;

将时间戳转换为可读时间

ts 为毫秒

SELECT
  deviceId,
  datetime(ts/1000, 'unixepoch', 'localtime') AS time_local,
  temperature, humidity, pressure
FROM telemetry
WHERE deviceId = 'h1-sensecam-001'
ORDER BY ts DESC
LIMIT 20;