5

iOS7 での BLE プロトコルの実装は、起動段階で非常に遅いことがわかりました。起動シーケンスは、アプリの実行時間全体の約 68% に達します。

高速化するにはどうすればよいですか?

私はそれを計りました、そしてこれが私が得たものです。

     t     dt   
37.598          [BLE] Discovered peripheral at RSSI -27 with UUID:XYZ
37.599  0.001   [BLE] Connecting to peripheral                                                                            
37.602  0.003   [BLE] Scanning stopped                                                                                           
37.685  0.083   [BLE] Peripheral connected                                                                                
38.48   0.795   [BLE] Discovered service  
38.599  0.119   [BLE] Discovered characteristic    

ご覧のとおり、サービスを発見する前に大きなボトルネックがあります。

私のスタートアップコードは単純化されました:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    switch (central.state) {
        case CBCentralManagerStatePoweredOn:
            [central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUuid]]
                                            options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @YES}];
            break;
        case CBCentralManagerStatePoweredOff:
            [central stopScan];
            break;
        default:
            break;
    }
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    if (self.discoveredPeripheral != peripheral) {
        self.discoveredPeripheral = peripheral; // Save a local copy of the peripheral, so CoreBluetooth doesn't get rid of it
        [central connectPeripheral:peripheral options:nil];
        [central stopScan];
    }
}

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    [peripheral discoverServices:@[[CBUUID UUIDWithString:kServiceUuid]]];
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
    for (CBService *service in peripheral.services) {
        [peripheral discoverCharacteristics:@[array of characteristics]
                                 forService:service];
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error {
    ...
}

編集

Android の同様のアプリはこれを 10 倍高速に実行することを知ったので (Android アプリをより快適に感じさせる -> ユーザー エクスペリエンスを向上させる)、私の実装、BLE レイヤー、またはハードウェアがボトルネックであるかどうかに興味があります。iPhone 4Sでテストされています。

4

2 に答える 2

4

接続を暗号化すると、iOS は GATT データベースをキャッシュする必要があります。したがって、最初のディスカバリ コールの後の後続のディスカバリ コールは、即座に発生するはずです。

iOS 7 以降では、特性値もキャッシュされます。つまり、特性の値プロパティを通じて「デバイス名」などの静的な値を読み取ることができます。それらを更新したい場合は、Read Characteristic Value リクエストを発行する必要があります。

キャッシュ動作の詳細については、スライド 48 のWWDC 2013 セッション 703を確認してください (ビデオの対応する部分を参照してください)。

接続時間と検出時間については、主にアドバタイズ間隔です。Apple 製品の Bluetooth アクセサリ デザイン ガイドライン(セクション 3.5 広告間隔)で最高のパフォーマンスを得るために Apple が推奨する広告間隔がいくつかあります。また、スキャンを行うと接続プロセスが約 55 倍遅くなるため、接続時にスキャンを無効にする必要があります。

接続イベントごとに送信されるパケット数に対する iOS ベースの制限は、検出時間に顕著な影響を与えないことに注意してください (巨大な GATT データベースがあり、すべてをクエリしている場合を除きます)。これらの制限は、LE プロトコルの設計に従って、「応答なしの書き込み」および「特性値通知」に対してのみ表示される必要があります。

于 2013-10-26T11:58:20.913 に答える
1

検出速度を向上させるためのフレームワーク レベルの API はありません。BTLE は Classic Bluetooth (システム フレームワーク レベル) および Wi-Fi (アンテナ レベル) と共存するため、アンテナの最大時間はシステムによって制限されます。

于 2013-10-24T01:41:19.653 に答える