1

我正在寻找一种连接到基于 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;

CBP外设

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

3 回答 3

2

这对我来说最有效。我最初扫描了外围设备,然后只选择了具有最高 RSSI 的外围设备。(是的,这确实会报告每个设备的 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 秒的扫描时间就足够了,但这取决于您的外围设备广告的频率(即广告间隔)

于 2012-10-06T20:56:28.617 回答
1

您可以在没有蜜蜂连接的情况下在 didDiscoverPeripheral Delegate Method 中读取每个外围设备的 rssi 值。

于 2012-08-27T15:21:43.657 回答
0

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

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

这是示例代码,它将扫描外围设备 4 秒并按 RSSI 对其进行排序

于 2014-02-17T17:53:26.740 回答