rebase
This commit is contained in:
321
DEVICE_BINDING_GUIDE.md
Executable file
321
DEVICE_BINDING_GUIDE.md
Executable file
@@ -0,0 +1,321 @@
|
||||
# ESP32设备绑定功能使用指南
|
||||
|
||||
## 📋 功能概述
|
||||
|
||||
ESP32音乐播放器现在支持绑定到用户账号,实现个性化功能:
|
||||
- ✅ 设备与用户账号绑定
|
||||
- ✅ 安全的Token认证机制
|
||||
- ✅ 通过语音命令完成绑定
|
||||
- ✅ 为后续歌单功能奠定基础
|
||||
|
||||
---
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### **第1步:启动服务器**
|
||||
|
||||
```powershell
|
||||
cd d:\esp32-music-server\Meow\MeowEmbeddedMusicServer
|
||||
go run .
|
||||
```
|
||||
|
||||
服务器将在 `http://localhost:2233` 启动
|
||||
|
||||
---
|
||||
|
||||
### **第2步:用户登录**
|
||||
|
||||
访问:`http://localhost:2233`
|
||||
|
||||
使用测试账号登录:
|
||||
- 用户名:`test`
|
||||
- 密码:`123456`
|
||||
|
||||
---
|
||||
|
||||
### **第3步:生成绑定码**
|
||||
|
||||
**方式1:使用命令行工具(临时)**
|
||||
|
||||
```powershell
|
||||
# 向服务器请求生成绑定码
|
||||
curl -X POST http://localhost:2233/api/device/generate-code `
|
||||
-H "Content-Type: application/json" `
|
||||
-H "Cookie: session_token=YOUR_SESSION_TOKEN"
|
||||
```
|
||||
|
||||
**方式2:使用浏览器控制台(推荐)**
|
||||
|
||||
1. 登录后按 `F12` 打开开发者工具
|
||||
2. 切换到 **Console** 标签
|
||||
3. 输入以下代码:
|
||||
|
||||
```javascript
|
||||
fetch('/api/device/generate-code', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'}
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
console.log('绑定码:', data.code);
|
||||
alert('绑定码:' + data.code + '\n有效期:5分钟');
|
||||
});
|
||||
```
|
||||
|
||||
4. 记下显示的6位数字绑定码,例如:`123456`
|
||||
|
||||
---
|
||||
|
||||
### **第4步:ESP32端绑定**
|
||||
|
||||
对ESP32说:
|
||||
|
||||
```
|
||||
"小智,绑定设备,绑定码123456"
|
||||
```
|
||||
|
||||
或者:
|
||||
|
||||
```
|
||||
"小智,bind device, binding code is 123456"
|
||||
```
|
||||
|
||||
ESP32会回复:
|
||||
|
||||
```
|
||||
✅ 设备绑定成功!
|
||||
已绑定到用户: test
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **第5步:验证绑定状态**
|
||||
|
||||
对ESP32说:
|
||||
|
||||
```
|
||||
"小智,查询设备状态"
|
||||
```
|
||||
|
||||
ESP32会显示:
|
||||
|
||||
```
|
||||
📱 设备信息:
|
||||
|
||||
MAC地址: AA:BB:CC:DD:EE:FF
|
||||
绑定状态: ✅ 已绑定
|
||||
绑定用户: test
|
||||
服务器验证: ✅ 通过
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 高级功能
|
||||
|
||||
### **解绑设备**
|
||||
|
||||
对ESP32说:
|
||||
|
||||
```
|
||||
"小智,解绑设备"
|
||||
```
|
||||
|
||||
### **自定义设备名称**
|
||||
|
||||
对ESP32说:
|
||||
|
||||
```
|
||||
"小智,绑定设备,绑定码123456,设备名称客厅音响"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 数据存储
|
||||
|
||||
### **服务器端**
|
||||
|
||||
设备信息存储在:`d:\esp32-music-server\Meow\MeowEmbeddedMusicServer\devices.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"devices": {
|
||||
"AA:BB:CC:DD:EE:FF": {
|
||||
"mac": "AA:BB:CC:DD:EE:FF",
|
||||
"username": "test",
|
||||
"device_name": "ESP32音乐播放器",
|
||||
"token": "a1b2c3d4e5f6...",
|
||||
"bind_time": "2025-11-24T16:00:00Z",
|
||||
"last_seen": "2025-11-24T16:30:00Z",
|
||||
"is_active": true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **ESP32端**
|
||||
|
||||
Token存储在NVS(非易失性存储)中:
|
||||
- 命名空间:`device`
|
||||
- Key: `token` - 设备Token
|
||||
- Key: `username` - 绑定的用户名
|
||||
|
||||
---
|
||||
|
||||
## 🔌 API文档
|
||||
|
||||
### **1. 生成绑定码**
|
||||
|
||||
```
|
||||
POST /api/device/generate-code
|
||||
Authorization: 需要登录
|
||||
```
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"code": "123456",
|
||||
"expires_in": 300
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **2. ESP32绑定设备**
|
||||
|
||||
```
|
||||
POST /api/esp32/bind
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"mac": "AA:BB:CC:DD:EE:FF",
|
||||
"binding_code": "123456",
|
||||
"device_name": "ESP32音乐播放器"
|
||||
}
|
||||
```
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "设备绑定成功",
|
||||
"token": "a1b2c3d4e5f6...",
|
||||
"username": "test"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### **3. 验证设备Token**
|
||||
|
||||
```
|
||||
GET /api/esp32/verify
|
||||
X-Device-Token: a1b2c3d4e5f6...
|
||||
```
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"device": {
|
||||
"mac": "AA:BB:CC:DD:EE:FF",
|
||||
"username": "test",
|
||||
"device_name": "ESP32音乐播放器",
|
||||
"bind_time": "2025-11-24T16:00:00Z",
|
||||
"last_seen": "2025-11-24T16:30:00Z"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 测试流程
|
||||
|
||||
### **完整测试步骤**
|
||||
|
||||
1. **启动服务器**
|
||||
```powershell
|
||||
go run .
|
||||
```
|
||||
|
||||
2. **生成绑定码**(使用浏览器控制台)
|
||||
|
||||
3. **ESP32绑定**
|
||||
- 对ESP32说:"小智,绑定设备,绑定码123456"
|
||||
- 观察ESP32日志:
|
||||
```
|
||||
[DeviceManager] Starting device binding with code: 123456
|
||||
[DeviceManager] Sending bind request to: http://...
|
||||
[DeviceManager] Bind request status code: 200
|
||||
[DeviceManager] Device successfully bound to user: test
|
||||
```
|
||||
|
||||
4. **查询状态**
|
||||
- 对ESP32说:"小智,查询设备状态"
|
||||
|
||||
5. **验证服务器数据**
|
||||
- 检查 `devices.json` 文件是否包含设备信息
|
||||
|
||||
6. **测试解绑**
|
||||
- 对ESP32说:"小智,解绑设备"
|
||||
- 再次查询状态,应显示未绑定
|
||||
|
||||
---
|
||||
|
||||
## 🐛 故障排除
|
||||
|
||||
### **问题1:绑定码无效**
|
||||
|
||||
**现象**:ESP32提示"绑定失败"
|
||||
|
||||
**解决方案**:
|
||||
- 检查绑定码是否输入正确
|
||||
- 绑定码有效期为5分钟,请重新生成
|
||||
- 确认网络连接正常
|
||||
|
||||
---
|
||||
|
||||
### **问题2:设备已绑定**
|
||||
|
||||
**现象**:提示"设备已绑定到用户XXX"
|
||||
|
||||
**解决方案**:
|
||||
- 先解绑设备:对ESP32说"小智,解绑设备"
|
||||
- 或者在服务器端删除 `devices.json` 中的设备记录
|
||||
|
||||
---
|
||||
|
||||
### **问题3:网络连接失败**
|
||||
|
||||
**现象**:ESP32无法连接到服务器
|
||||
|
||||
**解决方案**:
|
||||
- 检查ESP32是否连接到WiFi
|
||||
- 确认服务器地址是否正确:`http://http-embedded-music.miao-lab.top:2233`
|
||||
- 检查防火墙设置
|
||||
|
||||
---
|
||||
|
||||
## 📝 下一步
|
||||
|
||||
绑定功能完成后,可以继续开发:
|
||||
|
||||
✅ **阶段1:基础绑定** - 已完成
|
||||
⏳ **阶段2:歌单系统** - 待开发
|
||||
⏳ **阶段3:Web管理界面** - 待开发
|
||||
|
||||
---
|
||||
|
||||
## 💡 提示
|
||||
|
||||
- 绑定码每次生成后只能使用一次
|
||||
- 一个设备只能绑定到一个用户
|
||||
- Token存储在ESP32的NVS中,断电不丢失
|
||||
- 可以通过解绑并重新绑定来更换用户
|
||||
|
||||
---
|
||||
|
||||
**🎉 享受您的个性化ESP32音乐播放器!**
|
||||
Reference in New Issue
Block a user