CoreBluetooth仅连接到最近的RSSI(BLE)

时间:2012-08-23 04:33:07

标签: ios core-bluetooth rssi cbcentralmanager cbperipheral

我正在寻找一种基于RSSI连接 最近外围设备的方法。我的目标是列出其他外围设备,但只有最接近的外围设备连接。

由于RSSI仅在设备连接时可用,是否有意义等待所有设备连接,然后根据RSSI确定最接近的外设,然后断开其余设备?

连接

- (void) connectToPeripheral:(CBPeripheral *)peripheral
{
    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE],CBConnectPeripheralOptionNotifyOnDisconnectionKey,nil];
    [myCBCentralManager connectPeripheral:peripheral options:options];
}

代表使用

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral;

CBPeripheral

/*!
 *  @property RSSI
 *
 *  @discussion While connected, the RSSI of the link in decibels.
 */
@property(retain, readonly) NSNumber *RSSI;

3 个答案:

答案 0 :(得分:2)

这对我来说最有效。我最初扫描了Peripherals,然后选择了RSSI最高的那个。 (是的,这个DOES报告每个设备的RSSI。你不需要先连接它。)

然而,我发现这是不可靠的。 RSSI值波动太大。所以我做了以下事情。

我用过:

NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];//allow duplicates with YES
[self.CM scanForPeripheralsWithServices:uuidArray options:options]; 

回调是:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 

在您调用方法之前,这将继续报告每个外设的RSSI:

[self.CM stopScan];

您将为中央(您的iPhone)看到的每个广告数据包调用“didDiscoverPeripheral”。在此回调中添加例程,以平均发现的每个唯一外设的RSSI。我的经验是,1秒的扫描时间就足够了,但这取决于外围设备的广告发布频率(即广告时间间隔)

答案 1 :(得分:1)

您可以在didDiscoverPeripheral Delegate方法中读取每个外设的rssi值,而无需连接。

答案 2 :(得分:0)

使用https://github.com/LGBluetooth/LGBluetooth/ 它通过平均RSSI扫描外围设备和排序。

[[LGCentralManager sharedInstance] scanForPeripheralsByInterval:4
                                                     completion:^(NSArray *peripherals)
 {
 }];

以下是扫描外围设备4秒并按RSSI对其进行排序的示例代码