我可以测量iPhone 范围内蓝牙设备的信号强度吗?
基本上我想做的是扫描范围内的设备列表,然后查看哪个设备的信号强度最高。
在iOS中是否有可能,如果可以,我该怎么做?
我可以测量iPhone 范围内蓝牙设备的信号强度吗?
基本上我想做的是扫描范围内的设备列表,然后查看哪个设备的信号强度最高。
在iOS中是否有可能,如果可以,我该怎么做?
是的,有一种方法可以测量低功耗蓝牙 (4.0) 的信号强度,它是 RSSI 编号。当您扫描外围设备时,您会将标志 CBCentralManagerScanOptionAllowDuplicatesKey 设置为 YES,如下所示:
NSDictionary * dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@YES, CBCentralManagerScanOptionAllowDuplicatesKey, nil];
// Start scanning for peripherals
[cmanager scanForPeripheralsWithServices:nil options:dictionary];
如果您想在不编写任何代码的情况下查看 RSSI 编号,您应该查看 iTunes 中的应用程序LightBlue。当您连接到外围设备时,它会在连接时每秒向您显示更新的 RSSI 编号。
- (void)centralManager:(CBCentralManager *)central
didDiscoverPeripheral:(CBPeripheral *)peripheral
advertisementData:(NSDictionary *)advertisementData
RSSI:(NSNumber *)RSSI
{ ... }
RSSI是您正在寻找的。免责声明:核心蓝牙仅适用于蓝牙 4 LE。
如果确切的范围无关紧要,但您对扫描一般可用的设备感兴趣,您可以查看 github 项目BeeTee,它允许您扫描您周围的所有蓝牙设备(不仅仅是蓝牙 LE)。再次免责声明:我是 BeeTee 的作者。;-)
当您使用 CBCentralManager 编写“中央”代码时,您最终将连接到您正在寻找的 CBPeripheral。连接到外围设备后,请保留对它的引用,将您的对象设置为外围设备的委托并在外围设备上调用“ readRSSI ”。您将获得一个委托回调外围设备:didReadRSSI: 错误:如果您编写了一个调用“readRSSI”的方法,您可以使用performSelector: withObject: afterDelay:来调用它。
这个问题的另一个建议答案是在扫描时提供“允许重复”键。字典键CBCentralManagerScanOptionAllowDuplicatesKey的文档在传递给scanForPeripheralsWithServices:options:时表示“禁用此过滤可能会对电池寿命产生不利影响,只有在必要时才应使用”。
如果您选择编写延迟调用,则可以调整调用频率以帮助您管理对用户电池的影响。