蓝牙低功耗,在后台扫描服务,提高速度。

10

我正在使用iPhone 5S上的蓝牙LE,并已经完成了以下步骤:

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

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

  • 我已经开始扫描PeripheralsWithServices,如下所示

代码:

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可以做到这一点,所以我正在寻找一个苹果未公开发布的私有API。这是针对一个内部企业应用程序,因此使用私有API完全可以接受。


@jesnolsson 如何在启动应用程序时找到CBUUID?我想在我的项目中实现它。 - Nag Raja
你可能应该在SO上写一个新问题。但是为了让你开始,只需按照我上面的代码即可。服务的实际UUID取决于您拥有的蓝牙LE配件的类型,因此您需要查找实际数字。我建议使用App Store上的LightBlue来完成这个目的。 - www.jensolsson.se
1个回答

6

在扫描方面,后台模式有不同的工作方式。

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

  • 您可以发起与未在范围内的外设的连接请求,并在外设变得可用时完成连接。不必为此主动扫描(除了初始发现,以便知道要连接的UUID)。

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

根据您的目标,采取不同的方法可能会更好:通过将iPhone置于外设模式并将当前LE外设用于中央模式来反转连接。看起来有些hackish,但如果能解决您的问题,为什么不呢 :)

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


1
谢谢回复,这非常有趣。如果我将iPhone外围设备和配件设置为中央模式,那么iPhone会多久广告一次?广告在后台是否有效或者像扫描一样速度缓慢?Connect并不是很适合我的需求,因为我想从多个外围设备获取信息。如果iPhone是一个外围设备,那么只有一个中央设备可以与之通信,这可能也是一个问题。 - www.jensolsson.se
1
iPhone的广告间隔取决于它启动的频率(随着时间的推移变得更慢)以及您的应用程序是否在后台运行。它应该在后台工作(需要在Info.plist中添加另一个后台模式键),不确定连接延迟(但是,您可以使用蓝牙数据包嗅探器进行测量-请注意,您必须扫描所有3个广告通道,因为iPhone无法配置为仅使用一个)。iPhone外围模式不符合标准,并允许多个中央连接。 - Etan
@Etan,关于您回答中的第一个观点。CBCentralManager可以在外设处于后台时监听(和NSLog)centralManager:didDiscoverPeripheral:advertisementData:RSSI:,我得到了RSSI。您是指readRSSI吗?那有什么不同吗?谢谢 - Khaled Barazi
在后台模式下,每个设备只有一次 centralManager:didDiscoverPeripheral:advertisementData:RSSI: 的机会,除非您连接并再次断开连接。 - Etan
或者您可以停止扫描并重新开始。每次新的扫描,所有外围设备都将被重新发现(包括RSSI)。 - user1169629

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接