10

Low Energy Bluetooth の仕様では、周辺機器が一度に複数のセントラルに接続できるかどうかについてはあまり言及されていませんが、私の経験によると、接続できないことがわかっています。

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

scanForPeripheralsWithServices メソッドは、一定の間隔でスキャンを行った後、停止するように見えます。私の最善の策は、一度に 3 秒間スキャンし、スキャンを停止し、(数秒) 待ってからスキャンを再開することだと思います。繰り返す。

誰かがそれを行うためのより良い方法を指摘できますか? たとえば、複数の Central に接続するようにペリフェラルを構成しますか?

4

3 に答える 3

8

ペリフェラルは、複数のセントラルに接続できません。ただし、RSSI を取得するだけであれば、接続する必要さえありません。デバイスのスキャンでは、次の関数を使用して RSSI を取得できます。

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
于 2013-05-16T08:56:40.860 に答える
5

前の回答と同様に、RSSI のみに関心がある場合は、単純にデリゲート メソッドに入れることができます。

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

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

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

厳密に必要でない限り、Apple はこのオプションの使用を推奨していないことに注意してください。

参照: iOS 開発者ライブラリ - リモート周辺機器と対話するためのベスト プラクティス

于 2015-08-31T14:35:40.530 に答える
2

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

(に設定CBCentralManagerScanOptionAllowDuplicatesKeyして@YESも問題は完全には解決しませんでした。)

クラスが CBCentralManagerDelegate を実装すると仮定します。

- (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];
}
于 2016-11-22T16:20:58.713 に答える