V2 握手与状态
本页说明连接后的握手、绑定鉴权和业务状态门控。只有状态满足要求后,才能开放业务 JSON 命令。
标准握手顺序
- 连接 BLUFI Service
0xFFFF。 - 订阅通知特征
0xFF02。 - 发送
AT+BLE_READY。 - 收到
AT+BLE_READY_ACK后,在当前连接上发送AT+GETID,等待AT+ID=<device_id>。 - 等待完整的
BLE_MODE和NETSTATE状态快照。 - 只有
BLE_MODE=AUTH_REQUIRED时,才发送AT+APP_AUTH=<external_user_id>。 - 状态满足要求后,再开放业务 JSON 命令。
AT+GETID 是公开设备身份查询,不是会话鉴权。它不要求先发送 AT+APP_AUTH,也不因设备已经绑定而拒绝;小程序应在每次需要核验物理设备的 BLE 连接上获取并校验一次。
小程序与设备交互
| 步骤 | 小程序 | 设备 |
|---|---|---|
| 1 | 连接 BLUFI Service 0xFFFF | 接受连接 |
| 2 | 订阅通知 0xFF02 | 开始发送通知 |
| 3 | 发送 AT+BLE_READY | 返回 AT+BLE_MODE、AT+NETSTATE |
| 4 | 发送 AT+GETID,等待并校验 AT+ID | 返回 AT+ID=<device_id> |
| 5 | 等待完整状态快照 | 返回 AT+BLE_READY_ACK 以及 BLE_MODE、NETSTATE |
| 6 | 仅当 BLE_MODE=AUTH_REQUIRED 时发送 AT+APP_AUTH | 返回 AT+APP_AUTH_ACK 或 AT+ERR |
| 7 | 状态满足后发送业务 JSON | 返回 command_ack 和最终事件 |
状态门控
BLE_MODE | 可以做什么 | 业务命令行为 |
|---|---|---|
WIFI_PROVISION_ONLY | 仅配置 Wi-Fi | 其他业务命令拒绝 |
BIND_PENDING | 配置 Wi-Fi、建立绑定关系 | 返回 code=-2, message="device_unbound" |
AUTH_REQUIRED | 先完成 APP_AUTH | 未鉴权返回 AT+ERR=APP_AUTH_REQUIRED |
BOUND_OFFLINE | 仅配置 Wi-Fi | 返回 code=-2, message="network_unavailable";授权查询未完成时为 authorization_pending |
只有 AUTH_REQUIRED 才发送 APP_AUTH,不能仅凭 BLE Service Data 的 bit4 触发。
握手命令
| 命令 | 作用 | 前置状态 | 成功结果 |
|---|---|---|---|
AT+BLE_READY | 请求状态快照 | 已连接并完成通知订阅 | AT+BLE_MODE、AT+NETSTATE、AT+BLE_READY_ACK |
AT+GETID | 获取公开业务 device_id | 已连接并完成 BLE_READY;不要求 APP_AUTH,不受绑定状态限制 | AT+ID=<device_id> |
AT+APP_AUTH=<external_user_id> | 校验当前用户 | 仅 AUTH_REQUIRED | AT+APP_AUTH_ACK |
AT+BIND_FINISH | 完成设备侧绑定确认 | 仅 BIND_PENDING 且开放平台绑定成功、设备要求本地确认时发送 | AT+BIND_ACK,随后重启;AUTH_REQUIRED、BOUND_OFFLINE 不发送 |
获取设备码
device_id 是云端业务设备 ID,用于后续绑定、鉴权和业务关联;它不是微信蓝牙 API 返回的 deviceId。完成连接、通知订阅和 AT+BLE_READY 握手后,小程序发送 AT+GETID:
text
小程序 → 设备:AT+GETID
设备 → 小程序:AT+ID=<device_id>小程序收到 AT+ID= 后,取等号后面的内容并去除首尾空白,保存为云端业务 ID,再与目标设备或云端设备列表中的 device_id 做匹配。不要把它转换成或覆盖微信蓝牙连接使用的 deviceId。
设备已绑定、处于 AUTH_REQUIRED 或 BOUND_OFFLINE 时同样可以查询公开设备 ID。WIFI_PROVISION_ONLY 下,绑定页可以先完成 Wi-Fi 配网,待设备联网并进入后续状态后再获取;这只是小程序流程安排,不是设备拒绝 GETID。
ts
// 伪代码:实际写入仍需经过 BLUFI Custom Data 组帧和分包
await sendBlufiCustomData('AT+GETID');
function onCustomData(text: string) {
if (!text.startsWith('AT+ID=')) return;
const cloudDeviceId = text.slice('AT+ID='.length).trim();
saveCloudDeviceId(cloudDeviceId);
}如果设备没有返回 AT+ID=,先检查通知订阅、BLUFI 分包和设备固件版本。当前方案不应再把已绑定设备返回 GETID_FORBIDDEN 作为正常行为。
请求与响应示例
小程序:请求设备状态
text
AT+BLE_READY小程序:获取并核验公开设备身份
text
AT+GETID硬件:返回公开设备 ID、当前模式、网络状态和握手完成标记
text
AT+ID=<device_id>
AT+BLE_MODE=AUTH_REQUIRED
AT+NETSTATE=WIFI_CONNECTED
AT+BLE_READY_ACK小程序:提交当前用户的鉴权信息
text
AT+APP_AUTH=<external_user_id>硬件:返回鉴权结果
text
AT+APP_AUTH_ACK开放平台绑定成功后,只有设备处于 BIND_PENDING 且要求本地确认时,才发送 AT+BIND_FINISH 并接收 AT+BIND_ACK。已关联设备处于 AUTH_REQUIRED 或 BOUND_OFFLINE 时不发送 AT+BIND_FINISH,而是重新 GETID、等待状态刷新,再按需 APP_AUTH。AT+BIND_FINISH 不是获取设备 ID 的替代命令。
硬件返回值速查
前面的示例展示完整交互流程;本表只保留硬件返回值及其含义,方便查阅,不再重复说明发送顺序。
| 通知 | 含义 |
|---|---|
AT+BLE_MODE=<WIFI_PROVISION_ONLY|BIND_PENDING|AUTH_REQUIRED|BOUND_OFFLINE> | BLE 业务门控状态 |
AT+NETSTATE=<4G|WIFI_CONNECTED|OFFLINE|WIFI_PROVISIONING> | 网络状态或活动链路 |
AT+BLE_READY_ACK | 握手状态快照完成 |
AT+ID=<device_id> | 公开云端业务设备 ID;由 AT+GETID 请求返回,不代表已经完成用户绑定 |
AT+APP_AUTH_ACK | 会话鉴权成功 |
AT+BIND_ACK | 绑定结果已确认 |
AT+ERR=<...> | 握手或状态失败 |