feat(sdk): 重命名 owner→brand 并在硬绑前校验设备品牌

- DuooomiBleConfig.owner → brand(语义:设备品牌名),HTTP header x-owner 不变
- bind() 前置 verifyBrand:缺 deviceInfo 先 getDeviceInfo,与 config.brand 严格匹配,不一致主动断连并抛 .brandMismatch
- README 抹除软绑/对账/UpgradeRecord 等内部实现细节,仅保留厂商面向的公开 API(功能代码完全保留)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
km2023
2026-05-09 11:51:17 +08:00
parent d5729a1a41
commit 97e5b8359a
11 changed files with 81 additions and 109 deletions

View File

@@ -22,6 +22,48 @@ extension DuooomiBleSDK {
/// - Note: `bind` / `unbind` / `setPlayMode` `0x0F` / `0x12` opId ****
public func bind(userId: String, completion: @escaping (Result<BindingResponse, Error>) -> Void) {
guard ensureConnected(completion: completion) else { return }
verifyBrand { [weak self] result in
guard let self = self else { return }
switch result {
case .failure(let err):
completion(.failure(err))
case .success:
self.performHardBind(userId: userId, completion: completion)
}
}
}
/// brand SDK brand deviceInfo
/// `.brandMismatch`
private func verifyBrand(completion: @escaping (Result<Void, Error>) -> Void) {
if let cached = deviceInfo {
checkBrand(actual: cached.brand, completion: completion)
return
}
getDeviceInfo { [weak self] result in
guard let self = self else { return }
switch result {
case .failure(let err):
completion(.failure(err))
case .success(let info):
self.checkBrand(actual: info.brand, completion: completion)
}
}
}
private func checkBrand(actual: String, completion: @escaping (Result<Void, Error>) -> Void) {
let expected = config.brand
if actual == expected {
completion(.success(()))
return
}
BleLog.w("Brand mismatch: expected=\(expected), actual=\(actual); disconnecting", "Command")
disconnect { _ in
completion(.failure(DuooomiBleError.brandMismatch(expected: expected, actual: actual)))
}
}
private func performHardBind(userId: String, completion: @escaping (Result<BindingResponse, Error>) -> Void) {
BleLog.d("Sending bind (userId=\(userId))", "Command")
sendAsyncAndWait(commandType: .bindDevice, completion: { [weak self] result in