10

我在 iPhone 5S 上使用蓝牙 LE,我做了以下事情:

  • 我有一个蓝牙外围设备,我已将其配置为在所有三个蓝牙广告通道(37、38 和 39)上每 20 毫秒进行一次广告。

  • 我在 Info.plist 中使用 UIBacgroundModes = bluetooth-central 配置了我的应用程序

  • 我已经开始了如下所示的 scanForPeripheralsWithServices

代码:

NSDictionary *options = @{
    CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier",
    CBCentralManagerScanOptionAllowDuplicatesKey:[NSNumber numberWithBool:YES]
};
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options];    
[self.manager scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"<uuid removed>"]] options:options];

目前的状态是:

  • 在前台模式下,当我启动外围设备时(在一秒钟内),应用程序会快速接收广告消息

  • 在后台模式下,应用程序有时会在启动外围设备后 10 秒内收到广告消息(即使它很糟糕也是可以接受的),但它通常很长时间(几分钟或更长时间)都没有收到广告,这不会为应用程序工作。

问题是:

当扫描应用程序处于后台时,是否可以通过某种方式提高 iOS 扫描蓝牙 4.0 LE 外围设备的速率?由于我认为没有公共 API 可以执行此操作,因此我正在寻找 Apple 未发布的私有 API。这适用于内部企业应用程序,因此私有 API 完全可以。

4

1 回答 1

6

背景模式对扫描的工作方式不同。

  • 每个外围设备仅在第一次被观察到时才被报告(在后台模式下,如果不连接它,您将无法通过 RSSI 跟踪接近度)。

  • 您可以向不在范围内的外围设备发起连接请求,当外围设备可用时,连接将完成。不必主动扫描(初始发现除外,因此您知道要连接哪个 UUID)。

也许,您可以通过在后台发送连接请求而不是扫描来解决问题。通过这种方式,iOS 知道您对特定外围设备真正感兴趣,我可以想象这会影响发现时间。

根据您的目标,另一种方法可能是将 iPhone 置于外围模式并在中央模式下使用当前的 LE 外围设备来反转连接。看起来很hackish,但如果它解决了你的问题:为什么不:)

关于私有 API:抱歉,我不知道会影响扫描参数的 API。

于 2013-10-26T10:47:19.933 回答