【问题标题】:CoreBluetooth doesn't discover services on reconnectCoreBluetooth 在重新连接时未发现服务
【发布时间】:2015-02-02 19:36:57
【问题描述】:

我们有一个应用程序正在与我们自己的 BLE 设备进行通信。当我们推送新固件时,我们会重新启动并获得centralManager: didDisconnectPeripheral: error:centralManager: didConnectPeripheral:,但是当我们调用[peripheral discoverServices:nil] 时,我们永远不会收到peripheral: didDiscoverServices: 的回调。我们在最初连接时得到它,但在重新连接时却没有。 CoreBluetooth 似乎知道服务和特征是什么,因为我们可以与设备进行交互,但我们希望能够在重启后立即编写特征,但找不到可靠的方法来判断何时是。

-= 编辑 =- 这是我们用来编写特征的代码。当我们尝试在第二次调用 didConnect 时调用它时,它会失败,因为外围设备没有任何服务:

+(void)writeData:(NSData*)data toPeripheral:(CBPeripheral*)peripheral service:(NSString*)sCBUUID characteristic:(NSString*)cCBUUID
{
    // Sends data to BLE peripheral to process HID and send EHIF command to PC
    for(CBService *service in peripheral.services)
    {
        if([service.UUID.stringValue isEqualToString:sCBUUID])
        {
            for(CBCharacteristic *characteristic in service.characteristics)
            {
                if([characteristic.UUID.stringValue isEqualToString:cCBUUID])
                {
                    /* EVERYTHING IS FOUND, WRITE characteristic ! */
                    [peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
                    return;
                }
            }
        }
    }
}

【问题讨论】:

  • 第二次打到didConnectPeripheral,你就不能看书吗?
  • 我们尝试过但失败了,因为此时外围设备不知道它的服务。我用更多信息更新了我的问题。
  • 我也遇到过类似的问题。原来,iOS 在内部缓存了特征描述符。固件更新后,外围设备中的描述符表发生了某种变化,手机无法再发现它们(直到手机重新启动)。我会向我的固件同事询问更多详细信息。
  • @MichałCiuba 非常酷!我期待听到您的回复。
  • 是的,我们做到了。我们调用NSArray * peripherals = [self.centralManager retrieveConnectedPeripheralsWithServices:self.allServices];,它返回CoreBluetooth 认为它连接到的设备列表。因为它有那些调用 discoverServices 的缓存,所以实际上并没有做任何事情。

标签: ios core-bluetooth


【解决方案1】:

我记得在我与 CoreBluetooth 的合作中,这种行为是有意的,因为它是以这种方式记录的。一旦断开连接,我们不应该重用相同的外围实例。 Instead we should ask CBCentralManager to give us a fresh CBPeripheral using its known peripheral UUID. 另见:CBCentralManager.retrievePeripheralsWithIdentifiers:

【讨论】:

  • 你能找出问题所在吗?
  • 是的,我已经重写了我的答案
  • 感谢@Lars 重写答案。那么,断开并重新连接后是否清除了服务和特征缓存?
  • 不,缓存没有被清除。事实上,iOS 会缓存服务和特征。它只会在你重启 iOS 时清除缓存。
  • 但是,一旦断开连接,您需要获得一个新的 CBPeripheral。只需在新实例上调用 connect 并等待它连接。一旦它在附近,它将连接。如果您还有其他问题,请告诉我。
猜你喜欢
  • 2012-10-14
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 2019-11-03
  • 2013-07-21
相关资源
最近更新 更多