我们走到了哪一步
这个连载的目标,是把"从一块开发板到一朵云"的全链路走通。前四篇已经打完地基:
-
① 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 架构实践"要展开的方向。
往期回顾: