我在 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/