# 蓝牙配网 BSSID

BLE 模式（`mode: 3`）会按设备广播状态的 bit 3 (`support5GConfig`) 选择协议。

- 未声明支持新版协议的设备：保持原来的 `0x0001` 报文，不调用 Wi-Fi 查询。
- 支持新版协议：优先使用调用方提供的有效 `bssid`；否则调用原生 `wx.startWifi`，成功后 `wx.getConnectedWifi({ partialInfo: false })`。
- 只有返回 SSID 与目标 SSID 完全一致时才使用当前 BSSID。查询不触发主动授权，不调用 `stopWifi`，不会关闭页面共享的 Wi-Fi 模块。
- 缺少 API、权限拒绝、查询失败、SSID 不同、BSSID 无效或占位地址、1.5 秒内无回调，均降级为原来的报文，继续配网。
- 有有效 BSSID 且设备支持时，使用与 App SDK 一致的 `0x0100` 报文：Unix 秒时间戳（大端）、SSID、去除冒号的 12 字符 BSSID、密码及原有扩展信息。字符串使用 UTF-8 字节长度。
- 新报文匹配 `0x0101` 且状态为 0 的 ACK；旧报文仍匹配 `0x0002`。使用 BLE 层拼接后的完整帧，避免超过单包大小的 ACK 被误判。
- `WIFI_CONFIG_PROTOCOL` 日志仅记录是否使用 BSSID 和获取/降级原因，不新增 BSSID 或密码日志。

SDK 内部自动获取，不需要调用方增加 BSSID 参数。本次仅修改 SDK 源码及构建产物，不自动修改其他小程序项目的依赖版本，也不发布 npm。

## 验证

`npm run test:bssid` 覆盖协议字节、广播能力解析、回调式 Wi-Fi API、超时与迟到回调、降级及真实 BLE 配网流程的协议选择和 ACK 清理。

真机验收需分别测试支持新版协议的设备和旧设备：同 SSID、不同 SSID、关闭 Wi-Fi、拒绝定位权限，以及 Android / iOS / HarmonyOS；获取不到 BSSID 时应仍能按原方式配网。

## 真机查看日志

测试工程已经通过 `src/utils/sdk.ts` 引用这个本地 SDK。重新编译并真机调试后，执行一次 BLE 配网，在控制台筛选 `[BLE_CONFIG]`。
如果应用调整过 SDK 日志级别，在初始化后执行 `sdk.setLogLevel('info')`（也可以用 `'debug'`）。

- `bssid_lookup`：开始查询；超时上限为 1500 ms。
- `bssid_result`：`reason`、`hasBssid`、`ssidMatched`、耗时；失败时包含 `api`、`errCode`、`errno`（如有）。
- `protocol_selected`：设备的 `support5GConfig`、是否实际使用 BSSID、选择原因、命令和报文长度。
- `send_start` / `write_result` / `write_retry`：实际请求命令、首次写入返回及重发次数。
- `ack_received`：收到的命令、状态（新版 ACK）、期望命令、`accepted` 是否通过 ACK 校验。
- `ack_timeout`：等待 ACK 超时和写入次数。
- `send_end`：是否收到有效 ACK、耗时，以及 SDK 主动请求断开连接。

典型成功路径：`bssid_result` 的 `reason=current_wifi`、`hasBssid=true` → `protocol_selected` 的 `command=0x0100`、`usesBssid=true` → `ack_received` 的 `command=0x0101`、`state=0`、`accepted=true`。

降级路径：`hasBssid=false` 或设备不支持新版协议 → `command=0x0001`、`usesBssid=false` → 期望 ACK 为 `0x0002`。降级本身不是配网失败。

新日志不打印 SSID、完整 BSSID、密码或完整配网报文。`accepted=true` 只表示配置 ACK 校验通过，不代表设备已经联网成功。
