一个基于 华为云 IoTDA 的“寝室设备管理平台”项目:支持 真实 ESP32 设备接入 + 批量模拟设备,并提供一个带登录鉴权的 Web 控制台(Flask)用于查看环境数据、控制设备开关、场景联动、告警提示与简单评分/日报。
- 连接 Wi-Fi 与 IoTDA MQTT Broker
- 按周期上报环境数据(包含:温度 Temperature、湿度 Humidity、光照 Lux)
- 上报/维护三类可控开关状态(0/1):
- Light
- Window
- Door
- 订阅 IoTDA 下行命令,收到命令后更新状态,并可立即上报最新状态
代码位置:
ESP32/esp32_smart.ino
- 用户系统:注册/登录/退出(Flask-Login)
- 权限分离:
- 管理员:可查看全部设备、给普通用户分配设备
- 普通用户:仅能看到并控制被分配的设备
- 设备列表页(index):
- 展示设备在线状态、最新数据、简单评分
- 支持“场景列表/一键应用”(如默认的“回寝/离寝”)
- 支持自然语言控制入口(如“把灯打开”“离寝”等)
- 设备详情页(device_detail):
- 设备开关控制:Light / Window / Door
- 最近数据可视化(Chart.js)
- 告警/提示(例如:白天光照很亮还开灯等)
- 日报/评分相关接口(项目中已实现对应数据表与 API)
代码位置:
Cloud/app.py、Cloud/templates/*、Cloud/iotda_client.py
- 用 paho-mqtt + 多线程 同时模拟多台设备
- 支持上报抖动(避免 50 台同秒上报)
- 支持响应 IoTDA 命令并立即上报
代码位置:
IoTDA_sim/sim_fleet.py,配置:IoTDA_sim/devices.yaml
- Python 3.10+(推荐 3.10/3.11)
- MySQL(默认使用 MySQL 连接串)
- 一个已开通 IoTDA 的华为云账号/项目(需要可访问 IoTDA API、设备与命令已创建)
安装以下依赖:
pip install Flask Flask-SQLAlchemy Flask-Login Werkzeug PyMySQL gevent
pip install huaweicloudsdkcore huaweicloudsdkiotdacd IoTDA_sim
pip install -r requirements.txtCloud/iotda_client.py 中包含 IoTDA 的 AK / SK / PROJECT_ID / REGION_ID / ENDPOINT 等信息。
- 请替换为你自己的账号与项目配置
- 建议不要在代码里硬编码 AK/SK,本地可用环境变量/配置文件方式管理(避免泄露)
Cloud/app.py 里默认是:
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:11223344@localhost/db_root"
你需要:
- 确保 MySQL 可连接(用户名/密码/host 正确)
- 创建数据库
db_root(或改成你自己的库名)
示例:
CREATE DATABASE db_root DEFAULT CHARACTER SET utf8mb4;提示:项目在启动时会
db.create_all()自动建表。
cd Cloud
python app.py默认启动地址:
http://0.0.0.0:5000(本机访问一般用http://127.0.0.1:5000)
首次启动会做这些事(代码内置逻辑):
- 自动建表
- 创建默认管理员账号:
- 用户名:
admin - 密码:
admin123
- 用户名:
- 从 IoTDA 拉取设备列表并同步到本地
Device表 - 初始化默认系统场景:
回寝、离寝
使用 Arduino IDE / PlatformIO 打开 ESP32/esp32_smart.ino,完成:
- 配置 Wi-Fi:
WIFI_AP / WIFI_PASSWORD - 配置 IoTDA MQTT:
MqttServerclient_id / mqttUserName / mqttPassword- 上报 topic:
$oc/devices/<device_id>/sys/properties/report
- 安装依赖库(Arduino Library Manager):
- PubSubClient
- ArduinoJson
- DHT sensor library(或项目使用的 DHT 驱动)
烧录后保持设备在线,平台即可在 Web 上看到数据/进行控制。
- 编辑
IoTDA_sim/devices.yaml,配置:
- MQTT host/port(IoTDA device endpoint)
- 每台设备的
device_id / client_id / username / password
- 运行:
cd IoTDA_sim
python sim_fleet.py --config devices.yaml- 访问
/login登录 - 新用户可在
/register注册 - 默认管理员:
admin / admin123
- 管理员可进入管理页:
/admin/devices - 把某设备分配给某普通用户后,该用户在首页就能看到并控制该设备
- 查看设备在线状态与最新温湿度/光照等数据
- 一键应用场景(如“回寝/离寝”)
- 自然语言控制入口(例如输入“离寝”“把灯打开”等)
- 控制 Light / Window / Door 的开关(0/1)
- 查看最近数据曲线(Chart.js)
- 查看告警/提示与评分/日报类信息(如果设备持续上报数据会逐步出现)
IoT_Project/
├── Cloud/ # 云端平台(Flask)
│ ├── app.py # 主程序:路由、数据库模型、后台同步线程、场景/告警/NL 等
│ ├── iotda_client.py # IoTDA SDK 封装:列设备、读影子、下发命令(灯/窗/门)
│ ├── templates/ # 前端模板(Jinja2)
│ │ ├── index.html
│ │ ├── device_detail.html
│ │ ├── admin_devices.html
│ │ ├── login.html
│ │ └── register.html
│ └── static/
│ └── js/jquery-3.7.1.min.js
│
├── ESP32/ # 真实设备侧(Arduino)
│ ├── esp32_smart.ino # 推荐使用:温湿度/光照上报 + LED/Window/Door 命令处理
│ └── ESP32.ino # 另一个版本/历史版本
│
├── IoTDA_sim/ # 批量设备模拟器(可选)
│ ├── sim_fleet.py # 多设备模拟(paho-mqtt + threads)
│ ├── devices.yaml # 模拟设备配置(含多台设备账号)
│ └── requirements.txt
│
├── LICENSE
└── README.md
- 检查
Cloud/app.py里的SQLALCHEMY_DATABASE_URI是否与你本机 MySQL 一致 - 确认数据库已创建(例如默认
db_root) - 确认已安装
PyMySQL:pip show pymysql
- 默认管理员为:
admin / admin123 - 若你改过数据库或表数据混乱:
- 最简单的方式是删除并重建数据库,再重启
app.py让它自动建表并重建默认管理员
- 最简单的方式是删除并重建数据库,再重启
Cloud/app.py启动时会调用list_all_devices()从 IoTDA 同步设备 若 IoTDA 配置不对,会导致同步不到设备:- 检查
Cloud/iotda_client.py的AK/SK/PROJECT_ID/REGION_ID/ENDPOINT - 确认 IAM 用户对 IoTDA 有权限
- 确认网络可以访问对应 region 的 IoTDA endpoint
- 检查
- 需要设备持续上报属性(温度/湿度/光照等)
- 确认设备上报 topic 与属性名正确(项目按影子属性读取,示例属性名为
Temperature/Humidity/Lux/LED/Window/Door) - 确认设备在线且 MQTT 连接稳定
- 确认 IoTDA 上已创建对应命令(例如
switch_light / switch_window / switch_door或项目封装使用的命令名) - 确认设备订阅了 IoTDA 下行命令 topic(模拟器与 esp32_smart.ino 都有相关订阅逻辑)
- 确认设备处于 online 状态
- Cloud 端后台同步线程可能频繁拉取影子导致触发限流
- 可在
Cloud/app.py中调大:loop_interval(同步周期)per_device_delay(每台设备之间延迟)
- 模拟器侧也可通过
devices.yaml增大report.interval_sec与jitter_sec
见 LICENSE。