1

いくつかのBluetooth周辺機器からiOS(BLE付き6)のRSSIインジケーターを測定しようとしています。scanForPeripheral で RSSI を取得できます。

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil];

[_manager scanForPeripheralsWithServices:nil
                                 options:options];

と相まって:

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

これは機能しますが、パケットの受信速度を制御できず、結果が不確実に見えます。

私は読んだ:https ://stackoverflow.com/a/12486927/270209しかし、私のレートは100ミリ秒にまったく近くありません(1〜2秒以上)

デバイスに接続している場合、readRSSI の結果はより信頼できるようです。

スキャンモードでより頻繁に更新するために周辺機器を「刺激」する方法、または一度に複数の周辺機器に接続する方法を探しています。

ありがとう

編集:スキャンをすばやく開始/停止しようとしましたが、スキャンを開始すると、より多くのデバイスが検出され、更新がより頻繁に行われるようです

4

4 に答える 4

5

あなたはすでにこれを理解していると確信していますが、誰かがこれに出くわした場合に備えて(私がやったように)、他の情報を探しています.coreLocationで他のiOSデバイスを使用していない場合は、peripheralDidUpdateRSSI:デリゲートを使用して呼び出す必要があります[self.myPeripheral readRSSI];.

updateValue デリゲートで 1 回、 RSSI データの更新を何度でも呼び出すことができますdidUpdateValueForCharacteristic:

これは viewDidLoad では必要ありません。 NSDictionary *options = etc...この NSDictionary はdidDiscoverPeripheral:デリゲートで作成されます。

したがって、全体の流れは次のようになります。

RSSI データを取得した NSLog で RSSI を受信して​​いることを確認します...

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

NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey];

 if ([localName length] > 0){
    NSLog(@"Discovered: %@ RSSI: %@", peripheral.name, RSSI);
    // your other needs ...
}

peripheralDidUpdateRSSI:通知値をYESに設定した場合、ここで更新が継続的に発生するため、ここで呼び出します[peripheral setNotifyValue:YES forCharacteristic:characteristic];

- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{

//Call the peripheralDidUpdateRSSI delegate ..
[self.myPeripheral readRSSI];

// do all of your other characteristic value updates here 
}

readRSSI以前の特性値を更新するたびに、UILabel (または使用しているもの) で RSSI 更新を実行するデリゲートを呼び出します。

- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(NSError *)error;
{
_rssiLabel.text = [self.myPeripheral.RSSI stringValue];
NSLog(@"RSSI Method”);   
}

アプリに特性値が必要ない場合は、RSSI 値を更新する必要があるタイミングでループを実行するだけです。

于 2014-03-12T12:05:23.070 に答える
2

(iOS デバイスを使用していると仮定して:) CoreBluetooth は、アンテナでアクティブになる速度を意図的に制限している可能性があります。Bluetooth LE、Bluetooth Classic、および Wi-Fi はすべて iOS デバイスの同じアンテナ上にあるため、無線は不要な雑談を最小限に抑えようとします。CoreBluetooth にバグを報告して、更新頻度を制御するオプションまたは方法を追加することもできますが、主な設計目標は次のとおりであるため、実装するとは思いません。1.デバイスのバッテリーを不必要に消耗させないこと。 . 他のアンテナの無線と共存します。(彼らはまた、Apple devforums の投稿で、たとえば、iOS BTLE 実装よりも高いデータ レートが必要な場合は、Bluetooth Classic またはそのために設計されたものを使用する必要があると述べています。BTLE は低いことを意図しています-何よりもまず力、そして彼らは」

于 2013-10-24T01:31:19.413 に答える
0

ペリフェラルは、ペリフェラルのファームウェアに基づいてアドバタイズします。これは、100 ミリ秒の最小値からほぼ 2 秒の最大値まで設定できます。iOS デバイスを Bluetooth ペリフェラルとして使用している場合、それを変更する方法が見つかりません。Apples のドキュメントは次のとおりです。セクション 3.5 を参照してください... https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf

于 2016-06-02T22:13:52.640 に答える
0

peripheral.readRSSI()実際、との間の遅延peripheralDidUpdateRSSIは 1 秒のようです!

BLE デバイス自体で RSSI 値を読み取り、iOS デバイスに送信するのが最善の方法だと思います。

于 2015-03-09T19:29:25.397 に答える