ios - 蓝牙 LE,后台扫描外围设备服务,提高速度

标签 ios bluetooth core-bluetooth bluetooth-lowenergy ios-enterprise

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

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

  • 我在 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 外围设备的速率?由于我认为没有公共(public) API 可以执行此操作,因此我正在寻找 Apple 未发布的私有(private) API。这是针对内部企业应用程序的,因此私有(private) API 完全没问题。

最佳答案

后台模式对于扫描的工作方式不同。

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

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

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

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

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

关于ios - 蓝牙 LE,后台扫描外围设备服务,提高速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19471798/

相关文章:

ios - 连接到 iOS 的蓝牙外设在后台不工作

ios - 替换父 View Controller

iphone - 变量的类型不完整 'struct sockaddr_in'

bluetooth - 与 libbluetooth.so 链接

android - 如何确保 UUID 对于我的 BLE 服务或特性是唯一的?

iOS 7 CBCentral 标识符无法识别的选择器

iphone - 从 UIALertView 获取即时值(value)

ios - 为什么从不调用 updatedTransactions?

java - Android 蓝牙发现 API 无法在 Android 6.0 上运行

android - 如何检测连接的蓝牙外围设备(自拍杆)的点击事件?