Skip to content

About

IoT project for dorm

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

14 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

IoT_Project(IoTDA 寝室管理系统)

一个基于 华为云 IoTDA 的“寝室设备管理平台”项目:支持 真实 ESP32 设备接入 + 批量模拟设备,并提供一个带登录鉴权的 Web 控制台(Flask)用于查看环境数据、控制设备开关、场景联动、告警提示与简单评分/日报。


1. 项目的基本功能

1) 设备侧(ESP32)

  • 连接 Wi-Fi 与 IoTDA MQTT Broker
  • 按周期上报环境数据(包含:温度 Temperature、湿度 Humidity、光照 Lux)
  • 上报/维护三类可控开关状态(0/1):
    • Light
    • Window
    • Door
  • 订阅 IoTDA 下行命令,收到命令后更新状态,并可立即上报最新状态

代码位置:ESP32/esp32_smart.ino

2) 云端 Web 平台(Flask)

  • 用户系统:注册/登录/退出(Flask-Login)
  • 权限分离:
    • 管理员:可查看全部设备、给普通用户分配设备
    • 普通用户:仅能看到并控制被分配的设备
  • 设备列表页(index):
    • 展示设备在线状态、最新数据、简单评分
    • 支持“场景列表/一键应用”(如默认的“回寝/离寝”)
    • 支持自然语言控制入口(如“把灯打开”“离寝”等)
  • 设备详情页(device_detail):
    • 设备开关控制:Light / Window / Door
    • 最近数据可视化(Chart.js)
    • 告警/提示(例如:白天光照很亮还开灯等)
    • 日报/评分相关接口(项目中已实现对应数据表与 API)

代码位置:Cloud/app.py、Cloud/templates/*、Cloud/iotda_client.py

3) 批量设备模拟器(可选)

  • 用 paho-mqtt + 多线程 同时模拟多台设备
  • 支持上报抖动(避免 50 台同秒上报)
  • 支持响应 IoTDA 命令并立即上报

代码位置:IoTDA_sim/sim_fleet.py,配置:IoTDA_sim/devices.yaml


2. 运行代码的方法(安装环境 / 启动命令)

A. 准备依赖

1) 基础依赖

  • Python 3.10+(推荐 3.10/3.11)
  • MySQL(默认使用 MySQL 连接串)
  • 一个已开通 IoTDA 的华为云账号/项目(需要可访问 IoTDA API、设备与命令已创建)

2) Python 依赖(Cloud 平台)

安装以下依赖:

pip install Flask Flask-SQLAlchemy Flask-Login Werkzeug PyMySQL gevent
pip install huaweicloudsdkcore huaweicloudsdkiotda

3) Python 依赖(模拟器,可选)

cd IoTDA_sim
pip install -r requirements.txt

B. 配置项目(必须)

1) 配置 IoTDA API 访问(Cloud/iotda_client.py)

Cloud/iotda_client.py 中包含 IoTDA 的 AK / SK / PROJECT_ID / REGION_ID / ENDPOINT 等信息。

  • 请替换为你自己的账号与项目配置
  • 建议不要在代码里硬编码 AK/SK,本地可用环境变量/配置文件方式管理(避免泄露)

2) 配置数据库(Cloud/app.py)

Cloud/app.py 里默认是:

  • SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:11223344@localhost/db_root"

你需要:

  1. 确保 MySQL 可连接(用户名/密码/host 正确)
  2. 创建数据库 db_root(或改成你自己的库名)

示例:

CREATE DATABASE db_root DEFAULT CHARACTER SET utf8mb4;

提示:项目在启动时会 db.create_all() 自动建表。


C. 启动云端平台(Flask)

cd Cloud
python app.py

默认启动地址:

  • http://0.0.0.0:5000(本机访问一般用 http://127.0.0.1:5000)

首次启动会做这些事(代码内置逻辑):

  • 自动建表
  • 创建默认管理员账号:
    • 用户名:admin
    • 密码:admin123
  • 从 IoTDA 拉取设备列表并同步到本地 Device 表
  • 初始化默认系统场景:回寝、离寝

D. 启动设备侧(ESP32)

使用 Arduino IDE / PlatformIO 打开 ESP32/esp32_smart.ino,完成:

  • 配置 Wi-Fi:WIFI_AP / WIFI_PASSWORD
  • 配置 IoTDA MQTT:
    • MqttServer
    • client_id / mqttUserName / mqttPassword
    • 上报 topic:$oc/devices/<device_id>/sys/properties/report
  • 安装依赖库(Arduino Library Manager):
    • PubSubClient
    • ArduinoJson
    • DHT sensor library(或项目使用的 DHT 驱动)

烧录后保持设备在线,平台即可在 Web 上看到数据/进行控制。


E. 启动批量模拟器(可选)

  1. 编辑 IoTDA_sim/devices.yaml,配置:
  • MQTT host/port(IoTDA device endpoint)
  • 每台设备的 device_id / client_id / username / password
  1. 运行:
cd IoTDA_sim
python sim_fleet.py --config devices.yaml

3. 简要的使用说明

1) 登录/注册

  • 访问 /login 登录
  • 新用户可在 /register 注册
  • 默认管理员:admin / admin123

2) 管理员:设备分配

  • 管理员可进入管理页:/admin/devices
  • 把某设备分配给某普通用户后,该用户在首页就能看到并控制该设备

3) 首页(设备列表)

  • 查看设备在线状态与最新温湿度/光照等数据
  • 一键应用场景(如“回寝/离寝”)
  • 自然语言控制入口(例如输入“离寝”“把灯打开”等)

4) 设备详情页

  • 控制 Light / Window / Door 的开关(0/1)
  • 查看最近数据曲线(Chart.js)
  • 查看告警/提示与评分/日报类信息(如果设备持续上报数据会逐步出现)

4. 代码目录结构说明

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

5. 常见问题(FAQ)

Q1:启动 Cloud/app.py 报数据库连接失败(pymysql / access denied / unknown database)

  • 检查 Cloud/app.py 里的 SQLALCHEMY_DATABASE_URI 是否与你本机 MySQL 一致
  • 确认数据库已创建(例如默认 db_root)
  • 确认已安装 PyMySQL:pip show pymysql

Q2:登录不了 / 忘记管理员密码怎么办?

  • 默认管理员为:admin / admin123
  • 若你改过数据库或表数据混乱:
    • 最简单的方式是删除并重建数据库,再重启 app.py 让它自动建表并重建默认管理员

Q3:首页看不到设备 / 设备列表为空

  • Cloud/app.py 启动时会调用 list_all_devices() 从 IoTDA 同步设备 若 IoTDA 配置不对,会导致同步不到设备:
    • 检查 Cloud/iotda_client.py 的 AK/SK/PROJECT_ID/REGION_ID/ENDPOINT
    • 确认 IAM 用户对 IoTDA 有权限
    • 确认网络可以访问对应 region 的 IoTDA endpoint

Q4:能看到设备但没有数据曲线(历史数据为空)

  • 需要设备持续上报属性(温度/湿度/光照等)
  • 确认设备上报 topic 与属性名正确(项目按影子属性读取,示例属性名为 Temperature/Humidity/Lux/LED/Window/Door)
  • 确认设备在线且 MQTT 连接稳定

Q5:控制开关后设备没反应

  • 确认 IoTDA 上已创建对应命令(例如 switch_light / switch_window / switch_door 或项目封装使用的命令名)
  • 确认设备订阅了 IoTDA 下行命令 topic(模拟器与 esp32_smart.ino 都有相关订阅逻辑)
  • 确认设备处于 online 状态

Q6:50+ 设备同时跑时出现 429 / 请求太频繁

  • Cloud 端后台同步线程可能频繁拉取影子导致触发限流
  • 可在 Cloud/app.py 中调大:
    • loop_interval(同步周期)
    • per_device_delay(每台设备之间延迟)
  • 模拟器侧也可通过 devices.yaml 增大 report.interval_sec 与 jitter_sec

License

见 LICENSE。

About

IoT project for dorm

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages