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;

CBペリフェラル

/*!
 *  @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];

"didDiscoverPeripheral" は、Central (iPhone) が認識するすべての広告パケットに対して呼び出されます。このコールバックにルーチンを追加して、見つかった固有の周辺機器ごとに RSSI を平均化します。私の経験では、スキャン時間は 1 秒で十分でしたが、それは周辺機器がアドバタイズする頻度 (つまり、アドバタイズ間隔) によって異なります。

于 2012-10-06T20:56:28.617 に答える
1

接続されていなくても、didDiscoverPeripheralDelegateメソッドで各ペリフェラルの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 に答える