我如何写入蓝牙设备。我遇到以下错误。
可选(错误域= CBATTErrorDomain代码= 3“写的不是 允许。“ UserInfo = {NSLocalizedDescription =写的不是 允许。})
Optional(Error Domain = CBATTErrorDomain Code = 13“该值的长度为 无效。“ UserInfo = {NSLocalizedDescription =值的长度是 无效。}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
if let characteristics = service.characteristics {
for char in characteristics {
str.append("10,") str.append("323232323323232")
var message = #"32,48,89,"#
str.append(message)
var sks = String()
sks = str.toString()
print(sks.byteArray)
peripheral.writeValue(sks.byteArray.data(using: .utf8), for: char, type: .withResponse)
}
}
}
extension String {
var byteArray : [UInt8] {
return Array(utf8)
}
}
答案 0 :(得分:0)
我在您的代码中看到了三个潜在的问题:
您正在写服务的所有特征。但是,GATT服务具有几个特征(一些只是其他特征的描述)。并非所有人都可写。因此,请检查相关的特征UUID并仅向其中写入数据。
您正在写入外围设备的所有服务。但是,外围设备可能具有许多服务,例如它通常包括提供完整设备和制造商名称的服务。因此,请检查相关的服务UUID,并仅继续对其进行处理。
要发送的数据很长。蓝牙设备每个消息的有效载荷只能限制为23个字节。建立连接后,协商有效的最大长度。使用CBPeripheral.maximumWriteValueLength(for:)检查最大长度并分几块发送数据。如果您必须将消息分成几个块,则必须在每个块之后等待peripheral(_:didWriteValueFor:error:)回调。
更新
可能不需要等待回调。