7

低エネルギーBluetooth仕様では、周辺機器が一度に複数のセントラルに接続できるかどうかについてはあまり言及していませんが、私の経験テストでは不可能であることがわかります。iOS CoreBluetooth Central Managerの連続スキャンですか?

私のアプリケーションは周辺機器との非所有関係(他人をブロックする接続がない)が必要で、常にRSSI値を更新する必要があるため、周辺機器を連続的にスキャンしてRSSI値を取得する方法を模索しています。

scanForPeripheralsWithServicesメソッドが特定の間隔でスキャンして停止するように見えます。私は一番良いのは、一度に3秒間スキャンすること、stopScanを待つこと(数秒間)、次にスキャンを再開することだと考えています。繰り返す。

誰かがそれを行う良い方法を指摘できますか?たとえば、複数のセントラルに接続するようにペリフェラルを設定しますか?

答えて

7

周辺機器は複数の中央に接続できません。しかし、RSSIをキャプチャする必要がある場合は、接続する必要はありません。デバイスのスキャンには、この機能を使用してRSSIを取得できます。

前の回答については
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
+2

、私は継続的に更新RSSIを取得する必要があります:クラスを想定し

(。@YESCBCentralManagerScanOptionAllowDuplicatesKeyを設定すると、完全に私のために問題を解決していない)

はCBCentralManagerDelegateを実装しています。私の知見は、Central Managerが周辺機器を数回発見して再検出した後、スキャンが続行されてもそれを発見しなくなります(約3秒のようです)。私が残しているのは、更新されたRSSI値を取得しようと試みるためにスキャンを再開する必要があるということです。 – Jonathan

+3

ええと、didDiscoverPeripheral関数の中でスキャンを再開することができます。そうすれば、RSSIをすばやく得ることができます。 – Aboelseoud

+1

ありがとうございます。それは動作します。電源を節約するために、私は実際に100ms後にスキャンを停止し、毎秒100msのバーストを行います。よく働く。 – Jonathan

5

、あなただけのRSSIに興味がある場合は、単にデリゲートメソッドにそれを得ることができます:BTW

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

、デフォルトではCBCentralManagerはこのメソッドを1回だけ呼び出します。あなたはCBCentralManagerが広告パケットを受信するたびに呼び出されるこのコールバックが必要な場合は、YESにオプションCBCentralManagerScanOptionAllowDuplicatesKeyセットしてスキャンを開始する必要があります。

NSDictionary *scanningOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}; 
[centralManager scanForPeripheralsWithServices:nil options:scanningOptions]; 

厳密には必要ではない場合、Appleは、このオプションの使用を阻止することに注意してください。

参照してください:iOS Developer Library -Best Practices for Interacting with a Remote Peripheral Device

1

私は基本的にはスキャンに広告が処理されるたびに再起動し、このコードでこの種の問題を解決しました。私は、CBCentralManagerインスタンスが周辺機器のリッスンを停止する同じ問題に直面していました。はい

- (id) init { 
    self.central = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; 
    [self initScan]; 
} 

- (void) initScan { 
    [self.central stopScan]; 
    [self.central scanForPeripheralsWithServices:nil 
             options:[NSDictionary dictionaryWithObjectsAndKeys:@NO, CBCentralManagerScanOptionAllowDuplicatesKey, nil]]; 
} 

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

    // 
    // Do stuff here 
    // 

    [self initScan]; 
} 
関連する問題