如何快速向蓝牙设备发送消息?

时间:2019-09-04 12:01:25

标签: swift bluetooth

我如何写入蓝牙设备。我遇到以下错误。

  

可选(错误域= 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)
    }
}

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到了三个潜在的问题:

  1. 您正在写服务的所有特征。但是,GATT服务具有几个特征(一些只是其他特征的描述)。并非所有人都可写。因此,请检查相关的特征UUID并仅向其中写入数据。

  2. 您正在写入外围设备的所有服务。但是,外围设备可能具有许多服务,例如它通常包括提供完整设备和制造商名称的服务。因此,请检查相关的服务UUID,并仅继续对其进行处理。

  3. 要发送的数据很长。蓝牙设备每个消息的有效载荷只能限制为23个字节。建立连接后,协商有效的最大长度。使用CBPeripheral.maximumWriteValueLength(for:)检查最大长度并分几块发送数据。如果您必须将消息分成几个块,则必须在每个块之后等待peripheral(_:didWriteValueFor:error:)回调。

更新

可能不需要等待回调。