向自定义BLE外设写入数据时出现CBATTErrorDomain Code=6错误求助
解决BLE写入时CBATTErrorDomain Code=6 "请求不支持"的问题
嘿,我帮你找到了问题的核心!你遇到的Error Domain=CBATTErrorDomain Code=6错误,是因为你的自定义BLE外设没有实现处理写入请求的关键代理方法。当中心设备用.withResponse类型发起写入时,外设必须给中心设备返回响应,没有对应的处理逻辑的话,系统就会抛出“请求不支持”的错误。
问题出在哪?
看你的外设端代码,你已经实现了didReceiveRead来处理读请求,但完全漏掉了peripheralManager(_:didReceiveWriteRequests:)这个专门处理写入请求的代理方法。中心设备发了带响应的写入请求,外设却不知道怎么处理,自然就报错了。
怎么修复?
在外设端的CBPeripheralManagerDelegate实现里,加上处理写入请求的方法,还要记得给每个请求返回响应。
补上缺失的代理方法
把这段代码加到你的外设端代理类里:
func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveWrite requests: [CBATTRequest]) { // 遍历所有写入请求(可能多个) for request in requests { // 先确认请求的特征是我们自己定义的那个 guard request.characteristic.uuid == characteristic.uuid else { peripheral.respond(to: request, withResult: .requestNotSupported) continue } // 检查请求有没有携带合法数据 guard let newValue = request.value else { peripheral.respond(to: request, withResult: .invalidAttributeValueLength) continue } // 更新我们的特征值 characteristic.value = newValue // 给中心设备返回成功响应 peripheral.respond(to: request, withResult: .success) // 如果需要的话,还可以给订阅了这个特征的设备发通知 if characteristic.properties.contains(.notify) { peripheral.updateValue(newValue, for: characteristic, onSubscribedCentrals: nil) } } }
额外的小检查
- 你创建
CBMutableCharacteristic时,permissions已经设置了.writeable,这部分没问题。 - 如果不想用带响应的写入,中心设备端也可以改成
.withoutResponse,但还是建议实现上面的方法,这样数据写入的可靠性更高。
这样修改后,你的外设就能正确处理中心设备的写入请求,那个烦人的Code=6错误就会消失啦!
内容的提问来源于stack exchange,提问作者Ahil
相关产品推荐
相关产品推荐

