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

运行与验证

  1. 访问http://<网关IP>:1880,确认Node-RED界面中四个节点已自动部署且无红色错误标记。
  2. 在终端发布模拟数据:
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}'
  1. 订阅输出主题验证:
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查看日志。