2

我希望我的用户能够使用我的应用程序跟踪他们的心率。所以我用CBCentralManager它。如果没有其他应用程序连接到心率传感器,一切正常。我遇到的问题是,如果我先开始使用 Strava 或 Endomondo。然后我就再也找不到任何设备了。反过来,一切正常,所以我想我在某处缺少选项?

我目前在做什么:

CBCentralManager像这样实例化我的

centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)

这将导致触发连接的委托方法

 func centralManagerDidUpdateState(_ central: CBCentralManager) {

    let heartRateServiceUUID = CBUUID(string: "180D")
    let services = [heartRateServiceUUID]

    switch central.state {

    case .poweredOn:
        centralManager.scanForPeripherals(withServices: services, options: nil)

从那里没有找到外围设备。

但同样,当我强制退出 Endomondo 或 Strava 等其他应用程序,然后启动我的应用程序时,一切正常。

4

3 回答 3

3

好的,我自己找到了主要问题的解决方案。所以任何可能有同样问题的人:

  1. 连接到设备后,请记住它的 UUID
  2. 当您想重新连接到它时,您不需要扫描,只需使用centralManager.retrievePeripherals(withIdentifiers: [the id's of the devices you know])
  3. 这将为您返回一个列表,CBPeripherals并且您可以像搜索它们后一样简单地连接到它们。

我唯一不知道的是:即使我卸载了 Endomondo,先启动我的应用程序,他们仍然可以发现我的心率监测器......而且我想即使他们记得 UUID,UserDefaults我想它也会在里面,所以他们无法重新连接使用centralManager.retrievePeripherals(...)。所以我仍然想知道我需要改变什么才能让它工作......

于 2017-03-24T12:36:44.747 回答
2

更新: BLE4.0 芯片组似乎只支持一个连接,因此当中央管理器连接到 BLE4.0 设备时,它停止广告并建立连接层。

借助 BLE4.1 芯片组,它增加了对多角色连接的支持。心率传感器可能使用支持多个连接的更新的 BLE 技术。 https://e2e.ti.com/blogs_/b/connecting_wireless/archive/2016/11/30/bluetooth-low-energy-multi-role-demystified

目前尚不清楚为什么如果其他应用程序已连接,您的应用程序将无法连接。您可以发布所有代码吗?

我的旧答案: “核心蓝牙和低功耗蓝牙只能为每个外围设备处理一个连接,这意味着如果您的应用程序(CBCentralManager)与外围设备(UUID)建立连接,它会在中央和外围设备之间建立一个消息层,以便其他应用程序除非您断开第一个应用程序,否则不能干扰与该外围设备的连接。这就是低功耗蓝牙的工作原理。

Apple 指南和示例: https ://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/AboutCoreBluetooth/Introduction.html#//apple_ref/doc/uid/TP40013257-CH1-SW1

Apple Core 蓝牙 API: https ://developer.apple.com/reference/corebluetooth

于 2017-03-24T08:42:45.250 回答
2

有关如何连接到您已经知道的设备的完整详细信息,请参阅与远程外围设备交互的最佳实践。

您遇到的主要问题是大多数 BLE 设备一旦建立连接就会停止广告。由于它们不是广告,因此您无法在扫描中看到它们。在这种特殊情况下,BLE 设备连接到您正在运行的 iPhone,但这并没有改变任何东西。它仍然不是广告。

为了解决这个问题,您想向 iPhone 询问具有所需服务的连接设备,使用retrieveConnectedPeripherals(withServices:). 这是一个非常快速的同步调用,您通常应该在调用scan​For​Peripherals(with​Services:​options:​).

您通常应该执行其他几个步骤。确切的顺序和逻辑在一定程度上取决于您的情况,但上面的链接流程图将引导您完成一种方法。基本上它看起来像这样:

  • 调用retrieve​Peripherals(with​Identifiers:​)以查找您已经知道其标识符的外围设备。请注意,这只是告诉您系统知道外围设备;这并不意味着它目前就在附近。调用connect它可能永远不会成功。

  • 调用retrieveConnectedPeripherals(withServices:)以查找已连接到此 iPhone 并宣传您的服务的外围设备。您仍然需要connect为您的流程调用它,但它应该会成功。

  • 如果其余的都失败了,那么调用scan​For​Peripherals(with​Services:​options:​).

于 2017-03-28T15:04:45.813 回答