Edge AI 全栈实战 ⑤:云边协同收尾——MQTT 桥接 + 云端看板管 N 台边缘设备

我们走到了哪一步

这个连载的目标,是把"从一块开发板到一朵云"的全链路走通。前四篇已经打完地基:

  • ① ESP32 传感器采集 → 云端推理:打通"端能采、云能算";

  • ② MQTT + Flink IoT 数据管道:让数据流式汇聚,不再手工 POST;

  • ③ Flink 联动云端大模型生成诊断:云不只是存,还能"想";

  • ④ 向量数据库 + RAG 让 IoT 诊断拥有记忆:设备历史故障可检索、可引用。

但前四篇都是单设备视角 。真实工厂是 100 台、1000 台设备同时在线。本篇做最后一块拼图:规模化云边协同------一套云端,统管 N 台边缘设备。

一、目标架构

复制代码
[ESP32 ×N] --MQTT(pub)--> [EMQX Broker] --订阅--> [云端服务]
                                    │                    │
                                    │                    ├─ 规则引擎 / Flink:异常判定(接 ②/③)
                                    │                    ├─ 向量库 RAG 记忆(接 ④)
                                    │                    └─ 看板(WebSocket 实时推) + 命令下发(sub)
[云端命令] <--MQTT(sub)-- [EMQX] <--下发--> [ESP32 ×N]

核心思想一句话:MQTT 做"神经",云端做"大脑",边缘做"手脚"。端侧负责采和快反,云负责聚合、记忆、决策、可视化。

二、核心实现一:设备遥测上报(端侧 Python 模拟)

真实 ESP32 用 PubSubClient,这里用 Python 模拟网关,逻辑完全一致:

python 复制代码
import paho.mqtt.client as mqtt
import json, random, time
​
client = mqtt.Client()
client.connect("emqx", 1883, 60)
​
DEVICE_ID = "motor-07"
while True:
    payload = {
        "deviceId": DEVICE_ID,
        "ts": int(time.time() * 1000),
        "temp": round(40 + random.uniform(-3, 8), 2),
        "vibration": round(random.uniform(0.1, 2.5), 3),
    }
    # 主题分层:telemetry/{设备ID},便于云端按设备精确订阅
    client.publish(f"telemetry/{DEVICE_ID}", json.dumps(payload))
    time.sleep(0.5)

三、核心实现二:云端订阅 + 实时看板(Flask + WebSocket)

python 复制代码
from flask import Flask, render_template
from flask_sock import Sock
import paho.mqtt.client as mqtt, json
from collections import defaultdict
​
app = Flask(__name__)
sock = Sock(app)
clients = set()
latest = defaultdict(dict)
​
def on_message(c, u, msg):
    data = json.loads(msg.payload)
    latest[data["deviceId"]] = data
    # 把最新遥测推给所有看板连接
    for ws in list(clients):
        try: ws.send(json.dumps(dict(latest)))
        except: clients.discard(ws)
​
mqttc = mqtt.Client()
mqttc.on_message = on_message
mqttc.connect("emqx", 1883, 60)
mqttc.subscribe("telemetry/+")          # 通配订阅所有设备
mqttc.loop_start()
​
@sock.route("/stream")
def stream(ws):
    clients.add(ws)
    while True: ws.receive()             # 保持连接
​
@app.route("/")
def index(): return render_template("dashboard.html")   # 前端用 ECharts 画实时曲线

前端 dashboard.html 用 ECharts 把 latest 里的 N 台设备温度/振动画成多条实时曲线------一个页面,统管全厂设备,这就是云边协同的"上帝视角"。

四、核心实现三:命令下发(云 → 端)

看板发现某台设备异常,点"降速"按钮,云端把指令发回 MQTT:

python 复制代码
def send_command(device_id, cmd):
    mqttc.publish(f"command/{device_id}", json.dumps({"op": cmd}))
    # 端侧订阅 command/{自身ID},收到后调 API 降速 / 重启采集

端侧 ESP32 同时订阅 command/{DEVICE_ID},实现云端反向控制------完整的"感知→决策→执行"闭环。

五、一键部署:docker-compose

python 复制代码
services:
  emqx:    { image: emqx/emqx:5.7, ports: ["1883:1883","18083:18083"] }
  cloud:   { build: ./cloud, ports: ["5000:5000"] }
  # 可选:接 Tuesday 的 Flink 做异常检测,接 ④ 的向量库做记忆检索

六、系列收尾:你现在已经拥有的能力

走完 ①→⑤,你已经能独立搭出一个生产雏形的 Edge AI 系统:

python 复制代码
端:ESP32 采 + 轻推理        →  云:MQTT 汇聚 + Flink 判异常
                              →  云:大模型诊断 + 向量库记忆
                              →  云:看板可视化 + 命令回写

这恰好闭环了本系列"数据→智能→硬件"的三条主线------大数据(Flink/Kafka)、AI(大模型/RAG)、硬件(ESP32/边缘)。

还没解决两个工程真问题:设备身份与证书安全(OTA 签名、防伪造) ,以及断网续传(边缘自治)。这正是第二月收官 W8 之后、第三月"嵌入式安全加固 / AIoT 架构实践"要展开的方向。

往期回顾:

相关推荐
令狐少侠20119 小时前
centos7 下,使用docker 部署IOT 调试平台,ThingsBoard 并完美启动
java·spring boot·iot
J_bean10 小时前
多实例 MQTT 消费下「累计差值」重复累加问题与消息级幂等去重
mqtt·幂等去重·消息去重
QQ142207844912 小时前
从 C# WinForms 到 Flask + SQLite:期刊出版 XML 生成器(JATS)重构实践
sqlite·flask·c#
xhy_070713 小时前
AI 读了 .env,密钥会原样发给大模型吗?WES Code 的密钥打码(附实测)
人工智能·python·数据挖掘·flask·ai编程·wes code
黑妹天下第一乖1 天前
小智改造实战解读-首 token 延迟去哪了:云端与端侧大模型的分段对照
开发语言·人工智能·python·嵌入式硬件·自然语言处理·iot
vx_Biye_Design1 天前
flask学生课程笔记共享系统29026-计算机课程设计、毕业设计
java·javascript·spring boot·后端·elasticsearch·flask·课程设计
小羊没烦恼!1 天前
Windows Azure Platform体验(1):Windows Azure
java·大数据·后端·python·flask·word·.net
黑妹天下第一乖2 天前
第09讲 · 多媒体与音频 SDK:硬件编解码与端侧语音
人工智能·嵌入式硬件·深度学习·机器人·音视频·iot
请输入蚊子2 天前
CVE-2026-8260 D-Link DCS-935L缓冲区溢出漏洞 复现
网络·安全·web安全·iot