4. 边缘计算框架选型与部署
任务目标
为工业IoT边缘智能网关选择并部署合适的边缘计算框架,实现数据接入、规则处理与云端转发的最小闭环。本案例聚焦于框架选型对比与轻量级部署验证,不涉及具体业务算法。
框架选型结论
| 框架 | 适用场景 | 资源占用 | 选型建议 |
|---|---|---|---|
| Node-RED | 快速原型、流式编排 | ~80MB RAM | 适合中小型网关,开发效率高 |
| EdgeX Foundry | 复杂设备接入、协议转换 | ~500MB RAM | 适合大型网关,功能全但偏重 |
| EMQX + eKuiper | 高并发MQTT + SQL规则处理 | ~120MB RAM | 适合工业实时数据处理场景 |
本案例选用Node-RED作为部署对象,原因:资源占用低、内置MQTT与HTTP节点、可视化流编辑降低维护成本,且可通过Docker实现分钟级部署。
环境依赖
- 操作系统:Linux x86_64 / ARM64(树莓派4B及以上)
- Docker Engine ≥ 20.10
- Docker Compose ≥ 2.0
- 内存 ≥ 512MB(建议1GB)
完整实现
创建docker-compose.yml,一次性启动Node-RED与Eclipse Mosquitto(MQTT Broker),形成数据采集→规则处理→转发的最小链路:
version: "3.8"
services:
mosquitto:
image: eclipse-mosquitto:2.0
container_name: iot-mqtt-broker
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- mosquitto-data:/mosquitto/data
- mosquitto-log:/mosquitto/log
restart: unless-stopped
node-red:
image: nodered/node-red:3.1.9
container_name: iot-node-red
depends_on:
- mosquitto
ports:
- "1880:1880"
environment:
- TZ=Asia/Shanghai
volumes:
- ./node-red-data:/data
restart: unless-stopped
volumes:
mosquitto-data:
mosquitto-log:
创建Mosquitto配置文件mosquitto/config/mosquitto.conf:
listener 1883
allow_anonymous true
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
启动服务并导入Node-RED流(flows.json),实现:订阅sensor/data主题 → 提取温度值 → 超过50℃则发送告警到alarm/notice,同时将原始数据转发至cloud/upload:
[
{
"id": "mqtt-in-1",
"type": "mqtt in",
"topic": "sensor/data",
"broker": "mqtt-broker-1",
"name": "Sensor Data",
"qos": "1",
"datatype": "auto"
},
{
"id": "mqtt-broker-1",
"type": "mqtt-broker",
"broker": "mosquitto",
"port": "1883",
"clientid": "node-red-gateway",
"usetls": false,
"protocol": "mqtt"
},
{
"id": "function-1",
"type": "function",
"name": "Threshold Check",
"func": "const payload = JSON.parse(msg.payload);\nif (payload.temperature > 50) {\n msg.topic = 'alarm/notice';\n msg.payload = { deviceId: payload.deviceId, temp: payload.temperature, ts: Date.now() };\n return msg;\n}\nreturn null;"
},
{
"id": "mqtt-out-1",
"type": "mqtt out",
"broker": "mqtt-broker-1",
"topic": "cloud/upload",
"qos": "1",
"name": "Cloud Upload"
},
{
"id": "mqtt-out-2",
"type": "mqtt out",
"broker": "mqtt-broker-1",
"topic": "alarm/notice",
"qos": "1",
"name": "Alarm Output"
},
{
"id": "link-1",
"type": "link out",
"name": "To Alarm"
},
{
"id": "link-2",
"type": "link in",
"name": "From Function"
}
]
将上述JSON保存为node-red-data/flows.json后重启Node-RED容器:
docker compose up -d
docker restart iot-node-red
运行与验证
- 访问
http://<网关IP>:1880,确认Node-RED界面中四个节点已自动部署且无红色错误标记。 - 在终端发布模拟数据:
mosquitto_pub -h localhost -t sensor/data -m '{"deviceId":"dev-001","temperature":48.5}'
mosquitto_pub -h localhost -t sensor/data -m '{"deviceId":"dev-001","temperature":55.2}'
- 订阅输出主题验证:
mosquitto_sub -h localhost -t cloud/upload -v
mosquitto_sub -h localhost -t alarm/notice -v
预期输出(由代码逻辑直接推出):
cloud/upload收到两条原始数据(48.5和55.2均转发)alarm/notice仅收到第二条(55.2 > 50触发告警)
通过条件:上述两条预期均满足,且Node-RED日志无异常报错,即判定框架部署成功且规则链路工作正常。
常见问题
- 端口冲突:若1880或1883被占用,修改docker-compose.yml中映射端口后重新
docker compose up -d。 - 流未自动加载:确认
flows.json位于node-red-data/目录且文件名正确,重启容器后生效。 - MQTT连接失败:检查Mosquitto容器是否健康运行,执行
docker logs iot-mqtt-broker查看日志。