跳转到正文

V2 握手与状态 ​

本页说明连接后的握手、绑定鉴权和业务状态门控。只有状态满足要求后,才能开放业务 JSON 命令。

标准握手顺序 ​

  1. 连接 BLUFI Service 0xFFFF。
  2. 订阅通知特征 0xFF02。
  3. 发送 AT+BLE_READY。
  4. 收到 AT+BLE_READY_ACK 后,在当前连接上发送 AT+GETID,等待 AT+ID=<device_id>。
  5. 等待完整的 BLE_MODE 和 NETSTATE 状态快照。
  6. 只有 BLE_MODE=AUTH_REQUIRED 时,才发送 AT+APP_AUTH=<external_user_id>。
  7. 状态满足要求后,再开放业务 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_REQUIREDAT+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=<...>握手或状态失败

文档中心 · docs.jimitu.top