超広帯域無線(UWB)通信

超広帯域無線通信は、正確な距離測定に重点を置いた無線技術です。 (位置を 10 cm の精度で測定)する。 この無線技術は、短距離測定に低エネルギー密度を使用できる 無線スペクトルの大部分で高帯域幅のシグナリングを行います UWB の帯域幅が 500 MHz より大きい(またはフラクショナル 帯域幅の 20% を超える) です。

データ管理者/イニシエータと被制御者/応答者

UWB 通信は 2 つのデバイス間で行われます。1 台はコントローラ、 もう 1 つは被管理者です。コントローラが複雑なチャネルを決定 (UwbComplexChannel) 2 つのデバイスが共有して開始側となり、制御側は できます。

コントローラは複数の管理者に対応できますが、管理者は コントローラに割り当てられています。データ管理者/イニシエータと被制御者/対応者の両方 構成はサポートされています。

範囲設定パラメータ

データ管理者と被管理当事者は、お互いを識別し、 距離測定を開始します。この交換は、 次のような任意の安全な帯域外(OOB)メカニズムを使用して実装できます。 Bluetooth Low Energy(BLE)。

範囲パラメータ ローカル アドレス、複合チャネル、セッションキーなどがあります。備考 距離測定セッション後にこれらのパラメータがローテーションまたは 距離測定を再開するには、再度通信する必要があります。

バックグラウンドでの距離測定

デバイスが次の場合、バックグラウンドで実行されているアプリは UWB 圏内のセッションを開始できます。 サポートしています。デバイスの機能を確認するには、RangingCapabilities を参照してください。

アプリがバックグラウンドで動作している場合、圏内のレポートを受信しません。アプリ フォアグラウンドに移行すると、距離測定レポートを受信します。

STS の構成

アプリまたはサービスは、スクランブルされたキーを使用してセッションごとにセッションキーをプロビジョニングします。 タイムスタンプ シーケンス(STS)。プロビジョニングされた STS は静的 STS よりも安全である できます。プロビジョニングされた STS は、以下を搭載したすべての UWB 対応デバイスでサポートされています。 Android 14 以降。

脅威のカテゴリ 静的 STS プロビジョニング済み STS
Air: パッシブ オブザーバー 軽減済み 軽減済み
Air: 信号増幅 軽減済み 軽減済み
空中: リプレイ/リレー攻撃 影響を受けやすい 軽減済み

プロビジョニングされた STS の場合:

  1. プロビジョニングされた STS をサポートする RangingParametersuwbConfigType を使用します。

  2. sessionKeyInfo フィールドに 16 バイトの鍵を指定します。

静的 STS の場合:

  1. 静的 STS をサポートする RangingParametersuwbConfigType を使用します。

  2. sessionKeyInfo フィールドに 8 バイトの鍵を入力します。

手順

UWB API を使用する手順は次のとおりです。

  1. Android デバイスが Android 12 以降で動作していることを確認します。 UWB をサポートするには、 PackageManager#hasSystemFeature("android.hardware.uwb")
  2. IoT デバイスを対象とする場合は、FiRa MAC 1.3 であることを確認します。 準拠しているからです
  3. 選択した OOB メカニズムを使用して、UWB 対応のピアデバイスを検出します。 BluetoothLeScanner
  4. 任意の安全な OOB メカニズムを使用して距離測定パラメータを交換します。 BluetoothGatt など。
  5. ユーザーがセッションの停止をご希望の場合は、セッションのスコープをキャンセルします。

使用制限

UWB API の使用には、次の制限が適用されます。

  1. 新しい UWB 圏内のセッションを開始するアプリがフォアグラウンドであること (図のようにバックグラウンド範囲がサポートされていない場合を除く) 挙げられます
  2. (セッションの進行中に)アプリがバックグラウンドに移行すると、 は、さまざまなレポートを受け取れなくなります。ただし、UWB セッションは 下位レイヤで引き続き保持されます。アプリが 圏内の報告が再開されます。

コードサンプル

サンプルアプリ

UWB Jetpack ライブラリの使用方法に関するエンドツーエンドの例については、GitHub にあるサンプルアプリをご覧ください。このサンプルアプリでは、Android デバイスでの UWB 互換性の検証、OOB メカニズムを使用した検出プロセスの有効化、2 つの UWB 対応デバイス間の UWB 範囲の設定について説明します。このサンプルは、デバイス コントロールとメディア共有のユースケースにも対応しています。

UWB 距離測定

次のコードサンプルは、Controlee の UWB 距離測定を開始および終了します。

// The coroutineScope responsible for handling uwb ranging.
// This will be initialized when startRanging is called.
var job: Job?

// A code snippet that initiates uwb ranging for a Controlee.
suspend fun startRanging() {

    // Get the ranging parameter of a partnering Controller using an OOB mechanism of choice.
    val partnerAddress : Pair<UwbAddress, UwbComplexChannel> = listenForPartnersAddress()

    // Create the ranging parameters.
    val partnerParameters = RangingParameters(
        uwbConfigType = UwbRangingParameters.UWB_CONFIG_ID_1,
        // SessionKeyInfo is used to encrypt the ranging session.
        sessionKeyInfo = null,
        complexChannel = partnerAddress.second,
        peerDevices = listOf(UwbDevice.createForAddress(partnerAddress.first)),
        updateRateType = UwbRangingParameters.RANGING_UPDATE_RATE_AUTOMATIC
    )

    // Initiate a session that will be valid for a single ranging session.
    val clientSession = uwbManager.clientSessionScope()

    // Share the localAddress of the current session to the partner device.
    broadcastMyParameters(clientSession.localAddress)

    val sessionFlow = clientSession.prepareSession(partnerParameters)

    // Start a coroutine scope that initiates ranging.
    CoroutineScope(Dispatchers.Main.immediate).launch {
        sessionFlow.collect {
            when(it) {
                is RangingResultPosition -> doSomethingWithPosition(it.position)
                is RangingResultPeerDisconnected -> peerDisconnected(it)
            }
        }
    }
}

// A code snippet that cancels uwb ranging.
fun cancelRanging() {

    // Canceling the CoroutineScope will stop the ranging.
    job?.let {
        it.cancel()
    }
}

RxJava3 のサポート

Java との相互運用性の実現に役立つ Rxjava3 のサポートを開始 できます。このライブラリを使用すると、距離測定の結果を Observable または UwbClientSessionScope を単一のオブジェクトとして取得します。

private final UwbManager uwbManager;

// Retrieve uwbManager.clientSessionScope as a Single object
Single<UwbClientSessionScope> clientSessionScopeSingle =
                UwbManagerRx.clientSessionScopeSingle(uwbManager);
UwbClientSessionScope uwbClientSessionScope = clientSessionScopeSingle.blockingGet();

// Retrieve uwbClientSessionScope.prepareSession Flow as an Observable object
Observable<RangingResult> rangingResultObservable =
                UwbClientSessionScopeRx.rangingResultsObservable(clientSessionScope,
                        rangingParameters);

// Consume ranging results from Observable
rangingResultObservable.subscribe(
   rangingResult -> doSomethingWithRangingResult(result), // onNext
   (error) -> doSomethingWithError(error), // onError
   () -> doSomethingOnResultEventsCompleted(), //onCompleted
);
// Unsubscribe
rangingResultObservable.unsubscribe();
   

// Retrieve uwbClientSessionScope.prepareSession Flow as a Flowable object
Flowable<RangingResult> rangingResultFlowable =
                UwbClientSessionScopeRx.rangingResultsFlowable(clientSessionScope,
                        rangingParameters);

// Consume ranging results from Flowable using Disposable
Disposable disposable = rangingResultFlowable
   .delay(1, TimeUnit.SECONDS)
   .subscribeWith(new DisposableSubscriber<RangingResult> () {
      @Override public void onStart() {
          request(1);
      }
      
      @Override public void onNext(RangingResult rangingResult) {
             doSomethingWithRangingResult(rangingResult);
             request(1);
      }


      @Override public void onError(Throwable t) {
             t.printStackTrace();
      }


         @Override public void onComplete() {
            doSomethingOnEventsCompleted();
         }
   });

// Stop subscription
disposable.dispose();

エコシステムのサポート

サポートされているパートナー デバイスとサードパーティ SDK は次のとおりです。

UWB 対応のモバイル デバイス

2024 年 3 月現在、以下のデバイスは Android UWB Jetpack ライブラリをサポートしています。

ベンダー デバイスのモデル
Google Google Pixel 6 Pro、Google Pixel 7 Pro、Google Pixel 8 Pro、Google Pixel Fold、Tablet
Samsung Galaxy Note 20、S21+、S22+、S23+、S24+ Z Fold 2、3、4、5

サードパーティの SDK

2023 年 4 月現在、これらのパートナー ソリューションは 最新の Jetpack ライブラリをダウンロードします。

既知の問題: MAC アドレスと静的 STS ベンダー ID フィールドのバイト順が逆になる

Android 13 以前では、Android UWB スタックが誤ってバイトを反転している 並べ替える必要があります

  • デバイスの MAC アドレス
  • 宛先 MAC アドレス
  • 静的 STS ベンダー ID

バイト順の逆転は、Android スタックがこれらのフィールドを処理するためです。 値として認識しています。Google は FiRa と協力して UCI 仕様の更新に取り組んでいます (CR-1112)。 これらのフィールドを配列として扱うよう明示的に記述する必要があります。

この問題は、2320XXXX リリースの GMS Core アップデートで修正される予定です。 それ以降、IoT ベンダーは Android デバイスに準拠するために、 これらのフィールドのバイト順が逆にならないようにする必要があります。