90 lines
4.3 KiB
Markdown
90 lines
4.3 KiB
Markdown
# 蓝牙配网与账号绑定:简版说明
|
|||
|
|
|
||
|
|
通信方式:手机/电脑与设备之间使用 **BLE GATT(低功耗蓝牙)**。
|
||
|
|
|
||
|
|
本文只说明发现设备、设备端准备和发送配置三个部分,供前端、固件与后台约定功能。报文为拟定的业务数据格式,不代表现有固件已经支持。
|
||
|
|
|
||
|
|
## 1. 我怎么发现设备
|
||
|
|
|
||
|
|
**用户操作:** 登录平台,长按设备配网键,再点击页面上的“添加设备”。
|
||
|
|
|
||
|
|
**设备动作:** 进入配网模式,开启蓝牙广播,名称显示为 `EchoEar-000001`。末尾编号与设备外壳编号一致,方便用户认出自己的设备。
|
||
|
|
|
||
|
|
**页面动作:** 调用蓝牙发现功能,用约定的“配网服务 UUID”筛选你们的设备。这个 UUID 是一个固定的服务标识,由前端和固件使用同一个值。浏览器弹出设备选择框,用户选择编号对应的设备。
|
||
|
|
|
||
|
|
连接并完成设备身份校验后,页面读取设备信息,例如:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"device_id": "KP01-000000000001",
|
||
|
|
"model": "ECHOEAR-S3"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
页面显示“设备型号:ECHOEAR-S3,编号:000001”。型号和编号由设备固件提供;蓝牙名称只用于辅助选择。
|
||
|
|
|
||
|
|
网页需要在支持 Web Bluetooth 的浏览器中通过 HTTPS 打开,发现设备由用户点击触发。
|
||
|
|
|
||
|
|
## 2. 设备应该做什么
|
||
|
|
|
||
|
|
设备固件需要实现以下功能:
|
||
|
|
|
||
|
|
| 功能 | 设备要做的事 |
|
||
|
|
|---|---|
|
||
|
|
| 进入配网 | 长按配网键后开启蓝牙广播,保持约 5 分钟 |
|
||
|
|
| 提供身份 | 保存并返回自己的设备编号和型号 |
|
||
|
|
| 接收配置 | 提供 BLE 配置写入入口,收到写入后交给固件接收函数处理 |
|
||
|
|
| 连接网络 | 解析收到的 Wi-Fi 名称和密码,调用 Wi-Fi 驱动连接路由器 |
|
||
|
|
| 绑定账号 | 联网后携带自身认证凭据和绑定令牌请求平台,等待绑定结果 |
|
||
|
|
| 返回进度 | 让页面能够查询“已收到、连接 Wi-Fi、绑定中、成功或失败” |
|
||
|
|
|
||
|
|
前端与固件统一约定“读取设备信息、写入配置、查询状态”这三个操作。蓝牙收发模块负责加密和分包,业务代码只处理下面的完整数据。
|
||
|
|
|
||
|
|
## 3. 我怎么给设备发送 Wi-Fi 和绑定信息
|
||
|
|
|
||
|
|
**第一步:页面申请绑定令牌。**
|
||
|
|
|
||
|
|
用户已经登录,页面把选中的 device_id 提交给平台后台。后台根据当前登录账号和目标设备生成一个 bind_token。它表示“允许这台设备绑定到当前账号”,有效期约 5 分钟,只能完成一次绑定。
|
||
|
|
|
||
|
|
**第二步:用户输入 Wi-Fi,页面通过蓝牙发送。**
|
||
|
|
|
||
|
|
页面填写 Wi-Fi 名称和密码,连同后台返回的令牌一起发送:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"wifi_ssid": "MyHome",
|
||
|
|
"wifi_password": "example-password",
|
||
|
|
"bind_token": "后台生成的一次性绑定令牌"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
这就是设备需要接收的三项核心信息。平台账号由 bind_token 对应,用户不用再次输入平台账号和密码。
|
||
|
|
|
||
|
|
上面的 JSON 展示业务内容;实际发送时先通过通信模块加密、分包,再写入设备的 BLE 配置入口。设备的接收函数重组、解密后解析这三个字段。双方必须使用相同的字段名和编码,JSON 使用 UTF-8。
|
||
|
|
|
||
|
|
**第三步:设备连接 Wi-Fi,再向平台提交绑定。**
|
||
|
|
|
||
|
|
设备检查配置并执行本次操作的实体确认,然后使用 wifi_ssid、wifi_password 连接路由器。当前 EchoEar 使用 2.4GHz Wi-Fi。
|
||
|
|
|
||
|
|
联网后,设备通过已有的设备认证方式向平台发送自己的身份与 bind_token。后台验证设备身份和令牌,查到令牌对应的账号,保存“账号—设备”的绑定关系。Wi-Fi 密码只给设备,不提交到平台后台。
|
||
|
|
|
||
|
|
设备已有其他有效归属时,后台拒绝新绑定;重复提交同一次已成功的绑定,返回原结果。
|
||
|
|
|
||
|
|
**第四步:页面读取结果。**
|
||
|
|
|
||
|
|
页面每隔约 2 秒查询一次设备状态。成功示例:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{"status":"success"}
|
||
|
|
```
|
||
|
|
|
||
|
|
失败示例:
|
||
|
|
|
||
|
|
```json
|
||
|
|
{"status":"failed","message":"Wi-Fi连接失败,请检查网络名称和密码"}
|
||
|
|
```
|
||
|
|
|
||
|
|
status 约定为 received、wifi_connecting、binding、success、failed。message 仅在失败时返回可展示的原因,不回传密码或令牌。success 必须表示 Wi-Fi 已连上、平台已确认绑定、设备已保存结果,不能在仅收到数据时就返回成功。
|
||
|
|
|
||
|
|
如果蓝牙断开,页面通过后台查询这台设备是否已绑定;断开本身不代表绑定失败。
|