MilladAnsari/esp32s3-thingsboard-mqtts-onboarding
GitHub: MilladAnsari/esp32s3-thingsboard-mqtts-onboarding
该项目演示了 ESP32-S3 通过 MQTTS 安全连接 ThingsBoard 平台,实现遥测传输、设备认领与自动配置的完整 IoT 设备上线流程。
Stars: 0 | Forks: 0
# 物联网作业 4 – 与 ThingsBoard 的安全 [ESP32-S3-Touch](https://www.waveshare.com/esp32-s3-touch-lcd-5.htm) 通信
本仓库包含了**物联网基础**课程**作业 4** 的实现。
该项目演示了 **ESP32-S3** 设备与本地 **ThingsBoard CE** 服务器之间使用 **MQTT over TLS** 的安全 IoT 通信。它还包括设备认领、自动配置、基于证书的安全设置,以及用于显示设备认领码的可选 LCD/LVGL 界面。
## 概述
该项目的主要目标是了解安全机制如何应用于物联网系统。
在此项目中,ESP32-S3 通过安全的 TLS 通道连接到 ThingsBoard 服务器,并发送温度、湿度和计数器值等遥测数据。该项目还探讨了重要的物联网生命周期功能,例如设备认领和自动配置。
ThingsBoard 服务器使用 Docker Compose 在本地部署,并配置了通过自定义 PKI 设置生成的 TLS 证书。
## 功能特性
* ESP32-S3 连接到 ThingsBoard
* 使用端口 `8883` 的 MQTT over TLS
* 单向 TLS 认证
* 使用 Docker Compose 的本地 ThingsBoard CE 部署
* 用于 ThingsBoard 的 PostgreSQL 数据库
* 自定义 CA 和服务器证书设置
* 安全的遥测数据传输
* 设备认领工作流
* 自动配置工作流
* ThingsBoard 认领仪表板 JSON
* 用于显示认领码的可选 LCD/LVGL 界面
* 包含 CA、服务器和客户端证书材料的 PKI 文件夹
## 技术与工具
* ESP32-S3
* Arduino Framework
* C++
* ThingsBoard CE
* MQTT
* TLS / SSL
* Docker Compose
* PostgreSQL
* WiFiClientSecure
* ThingsBoard Arduino SDK
* Arduino MQTT Client
* PubSubClient
* ArduinoJson
* LVGL
* ESP Display Panel
## 仓库结构
```
.
├── one-way-TLS.ino
├── Claiming.ino
├── Auto-Provisioning.ino
├── docker-compose.yml
├── claiming.json
├── certs/
│ ├── root-ca.pem
│ ├── server.pem
│ └── server.key
├── pki/
│ ├── ca/
│ ├── server/
│ └── client/
├── lcd/
│ └── sketch_jul6a/
│ ├── sketch_jul6a.ino
│ ├── lvgl_v8_port.cpp
│ ├── lvgl_v8_port.h
│ └── esp_panel_board_custom_conf.h
└── lv_conf.h
```
## 主要部分
### 1. 单向 TLS
文件:
```
one-way-TLS.ino
```
此示例演示了使用 MQTT over TLS 从 ESP32-S3 到 ThingsBoard 的安全遥测传输。
ESP32-S3 使用根 CA 证书验证 ThingsBoard 服务器证书,然后安全地发送遥测数据。
遥测值包括:
* 温度
* 湿度
* 计数值
常规流程如下:
```
ESP32-S3
↓
Wi-Fi
↓
WiFiClientSecure
↓
MQTT over TLS
↓
ThingsBoard CE
```
### 2. 设备认领
文件:
```
Claiming.ino
```
此示例实现了 ThingsBoard 设备认领工作流。
ESP32-S3 生成一个随机认领码,并向 ThingsBoard 发送认领请求。然后,用户可以在 ThingsBoard UI 中输入此代码,以认领该设备的所有权。
此功能在物联网系统中非常重要,因为它允许在部署后将物理设备安全地分配给特定用户或客户。
### 3. 自动配置
文件:
```
Auto-Provisioning.ino
```
此示例实现了设备自动配置。
ESP32-S3 使用配置凭据连接到 ThingsBoard 并请求设备 token。成功配置后,设备使用接收到的 token 连接并发送遥测数据。
这模拟了真实的物联网设备上线流程,无需在平台中手动创建每个设备即可自动注册设备。
### 4. 启用 TLS 的 ThingsBoard
文件:
```
docker-compose.yml
```
该项目包含一个 Docker Compose 配置,用于运行带有 PostgreSQL 的 ThingsBoard CE。
ThingsBoard MQTT TLS 监听器使用 PEM 证书文件在端口 `8883` 上启用。
主要暴露的端口包括:
```
8080 → ThingsBoard Web UI
1883 → MQTT
8883 → MQTT over TLS
5432 → PostgreSQL
```
### 5. PKI 与证书
文件夹:
```
certs/
pki/
```
该项目包含用于 TLS 配置的证书材料。
PKI 结构包括:
* 根 CA 证书
* 服务器密钥和证书
* 客户端证书文件
* CSR 和配置文件
这些文件用于配置 ThingsBoard,并允许 ESP32-S3 验证服务器身份。
### 6. LCD / LVGL 认领演示
文件夹:
```
lcd/sketch_jul6a/
```
此可选部分使用 LVGL 添加了一个显示界面。
ESP32-S3 直接在 LCD 上显示 ThingsBoard 认领状态和认领码,使设备认领过程更加用户友好。
显示的信息包括:
* 连接状态
* ThingsBoard 连接结果
* 认领码
* 认领说明
## 在本地运行 ThingsBoard
启动 ThingsBoard 服务器:
```
docker compose up -d
```
然后在浏览器中打开 ThingsBoard UI:
```
http://localhost:8080
```
安全的 MQTT endpoint 可通过以下地址访问:
```
mqtts://:8883
```
## ESP32-S3 设置
在上传示例之前,请根据您的本地设置更新以下值:
```
constexpr char WIFI_SSID[] = "YOUR_WIFI_SSID";
constexpr char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";
constexpr char THINGSBOARD_SERVER[] = "YOUR_THINGSBOARD_SERVER_IP";
constexpr uint16_t THINGSBOARD_PORT = 8883U;
```
对于基于 token 的示例:
```
constexpr char TOKEN[] = "YOUR_DEVICE_TOKEN";
```
对于认领示例:
```
constexpr char DEVICE_TOKEN[] = "YOUR_DEVICE_TOKEN";
```
对于配置示例:
```
constexpr char PROVISION_KEY[] = "YOUR_PROVISION_KEY";
constexpr char PROVISION_SECRET[] = "YOUR_PROVISION_SECRET";
```
## 所需的 Arduino 库
在 Arduino IDE 中安装以下库:
```
ThingsBoard
Arduino_MQTT_Client
PubSubClient
ArduinoJson
```
对于 LCD/LVGL 版本,还需要安装并配置:
```
LVGL
ESP Display Panel
```
## 安全说明
该项目演示了几个重要的物联网安全概念:
* TLS 可防止遥测数据以明文形式发送。
* ESP32-S3 使用根 CA 验证服务器证书。
* MQTT 通信通过 `WiFiClientSecure` 进行保护。
* 设备 token 用于设备身份验证。
* 设备认领有助于分配已部署设备的所有权。
* 自动配置简化了大规模设备上线流程。
对于公开仓库,请勿提交真实的凭据、Wi-Fi 密码、token、配置密钥或私钥。
## 作者
该项目的实现者:
* **Millad Ansari(MiladAnsari)**
* **Seyed Sadra Mousavi (SMousavi7)**
## 教育目的
本仓库是作为物联网课程的一部分出于教育目的而开发的。旨在演示使用 ESP32-S3 和 ThingsBoard 的安全物联网通信、TLS 配置、设备认领和配置概念。
标签:测试用例, 版权保护