首页 > 解决方案 > CBService /CB 特性在 RTOS 管理器写入 RXMqtt 消息时返回 nil

问题描述

我们的 react native 应用程序通过蓝牙与 ESP 32 设备交互并传输 mqtt 消息。在设备之间将重新启动多次。这会导致应用程序崩溃并在 RTOS 库中出现错误 CBService/CBcharacteristics 在写入 RXMqttMessage 时返回 null

应用程序崩溃的 RTOSManager 文件

internal func writeValueToRXMessage(peripheral: CBPeripheral, characteristic: CBCharacteristic, data: Data) {
        DispatchQueue.main.async {
            guard let mtu = self.devices[peripheral.identifier]?.mtu else {
                self.debugPrint("[\(peripheral.identifier.uuidString)][ERROR] Mtu unknown")
                return
            }
            if data.count > mtu - 3 {
                guard let characteristic = characteristic.service.characteristicOf(uuid: AmazonFreeRTOSGattCharacteristic.RXLargeMqttMessage) ?? characteristic.service.characteristicOf(uuid: AmazonFreeRTOSGattCharacteristic.RXLargeNetworkMessage) else {
                    self.debugPrint("[\(peripheral.identifier.uuidString)][ERROR] RXLargeMqttMessage or RXLargeNetworkMessage characteristic doesn't exist")
                    return
                }
                if self.devices[peripheral.identifier]?.rxLotDataQueues[characteristic.service.uuid.uuidString] == nil {
                    self.devices[peripheral.identifier]?.rxLotDataQueues[characteristic.service.uuid.uuidString] = [data]
                } else {
                    self.devices[peripheral.identifier]?.rxLotDataQueues[characteristic.service.uuid.uuidString]?.append(data)
                }
                if self.devices[peripheral.identifier]?.rxLotDataQueues[characteristic.service.uuid.uuidString]?.count == 1 {
                    self.writeValueToRXLargeMessage(peripheral: peripheral, characteristic: characteristic)
                }
                return
            }
            guard let characteristic = characteristic.service.characteristicOf(uuid: AmazonFreeRTOSGattCharacteristic.RXMqttMessage) ?? characteristic.service.characteristicOf(uuid: AmazonFreeRTOSGattCharacteristic.RXNetworkMessage) else {
                self.debugPrint("[\(peripheral.identifier.uuidString)][ERROR] RXMqttMessage or RXNetworkMessage characteristic doesn't exist")
                return
            }

            peripheral.writeValue(data, for: characteristic, type: .withResponse)
        }
    }

 

来自应用程序 currentDevice = UUID(uuidString: deviceid) 的本机代码 let device: AmazonFreeRTOSDevice = AmazonFreeRTOSManager.shared.devices[currentDevice!]!

device.connect(reconnect: true, credentialsProvider: provider)

标签: swiftreact-nativecore-bluetoothfreertos

解决方案


推荐阅读