Wi-Fi STA / STA の同時実行

Android 12 では、Wi-Fi STA / STA の同時実行が導入され、デバイスが 2 つの Wi-Fi ネットワークに同時に接続できるようになりました。このオプションの機能により、以下の機能が有効になります。

  • make-before-break: デバイスは、新しい Wi-Fi ネットワークに接続した後で既存の接続を切断します。これにより、Wi-Fi ネットワーク間の切り替えがよりスムーズになります。
  • ローカル専用接続とインターネット接続の同時実行: デバイスは、プライマリ インターネット提供接続を中断することなく、ローカル専用ネットワークに接続します。
  • 制限付き接続とインターネット接続の同時実行: デバイスは、プライマリ インターネット提供接続を中断することなく、(特定の特権アプリのみが利用できる)制限付きネットワークに接続します。
  • (Android 13 以降)複数のネットワーク接続とインターネット接続の同時実行: デバイスは、どちらも無制限ですべてのアプリが利用できるインターネット接続付きの 2 つのネットワークに接続します。

このページでは、デバイス メーカーとベンダー向けに、この機能を有効にした場合のデバイスの動作と実装の詳細について説明します。

実装

Wi-Fi STA / STA の同時実行を実装するには、デバイスが以下をサポートしている必要があります。

  • Wi-Fi チップまたはファームウェアは、2 つの同時 STA 接続をサポートする必要があります。ファームウェアは、両方の接続ですべてのチャネルと帯域の組み合わせをサポートする必要があります。パフォーマンスの問題を回避するため、2x2 + 2x2 DBS 対応の Wi-Fi チップを使用することをおすすめします。

  • デバイスは IWifiChip の AIDL または HIDL 実装で以下の API をサポートする必要があります。

    • IWifiChip.setMultiStaPrimaryConnection(String ifName)
    • IWifiChip.setMultiStaUseCase(MultiStaUseCase useCase)
  • HAL Wi-Fi インターフェースの組み合わせには、[{STA} <= 2, ...] などの指定形式を使用して公開される 2 つの同時実行 STA インターフェースが必要です。詳しくは、Wi-Fi マルチインターフェースの同時実行をご覧ください。

上記の前提条件が満たされている場合は、次の手順で Wi-Fi STA / STA の同時実行を実装できます。

  1. ランタイム リソース オーバーレイを使用して、1 つ以上の機能を個別に有効にします(デフォルトでは無効になっています)。

    • make-before-break: config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled
    • ローカル専用接続とインターネット接続の同時実行: config_wifiMultiStaLocalOnlyConcurrencyEnabled
    • 制限付き接続とインターネット接続の同時実行: config_wifiMultiStaRestrictedConcurrencyEnabled
    • 複数のネットワーク接続とインターネット接続の同時実行: config_wifiMultiStaMultiInternetConcurrencyEnabled
  2. 下記の各セクションの説明に沿って、個々の実装を検証します。

Wi-Fi STA / STA の同時実行をより適切にサポートするには、OEM がカスタマイズするフレームワークとアプリで、1 つのネットワークに対して WifiInfo のみを返す WifiManager#getConnectionInfo() メソッド(Android 12 でサポートが終了)の代わりに、NetworkCallback#onCapabilitiesChanged() を使用することをおすすめします。詳しくは、ピアツーピア接続のための Wi-Fi ネットワーク リクエスト API をご覧ください。

make-before-break

make-before-break 機能を使用すると、デバイスは既存の Wi-Fi ネットワーク接続を維持したまま新しい Wi-Fi ネットワークに接続できます。新しい Wi-Fi ネットワークへの接続が成功してインターネット アクセスが確立された場合にのみ、元のネットワークを切断します。

make-before-break のユースケースでは、デバイスが新しいネットワークに接続する前に既存の Wi-Fi ネットワークを切断する(break-before-make を行う)必要があった、Android 11 以前で発生する以下の問題に対処しています。

  • デバイスが新しいネットワークに接続する際、デバイスに誤った Wi-Fi パスワードが保存されていることや、新しいネットワークにインターネット アクセスがないことが判明する場合があります。その場合、デバイスは強制的に元のネットワークに戻され、その結果 Wi-Fi 接続がない時間がかなり長く続きます。

  • 元のネットワークが突然切断されます。つまり、すべてのソケットが閉じられます。接続が突然失われると、多くの場合、アプリは適切に反応しません。その結果、新しい接続が完全に確立されるまで、ユーザーのインターネット接続がない時間が数秒間続きます。

  • デフォルトのネットワークが 2 回(最初は元の Wi-Fi ネットワークからモバイル ネットワークに、次はモバイル ネットワークから新しい Wi-Fi ネットワークに)変更されます。したがって、アプリはネットワークの変更に 2 回対応することになります。また、デバイスはモバイルデータを短時間を使用する必要があります。

make-before-break フローは、OS によって開始される自動 Wi-Fi ネットワーク切り替えにのみ使用されます。ユーザーによって開始されるネットワーク切り替えでは、従来の break-before-make フローが使用されます。つまり、新しいネットワークに接続する前に、元のネットワークは完全に切断されます。特定のケースでは、OS によって開始される自動切り替えでも break-before-make フローが使用されます。たとえば、工場出荷時の MAC アドレスを使用するように構成された 2 つのネットワーク間で切り替えを行う場合などです。

アプリは、WifiManager#isMakeBeforeBreakWifiSwitchingSupported() API を使用して、このユースケースがデバイスでサポートされているかどうかを確認できます。

make-before-break の検証

実装を検証するには、自動 Wi-Fi ネットワーク切り替えをトリガーし(そのためには、現在接続中のネットワークより強い信号強度を持つネットワークを利用可能にします)、デバイスが新しいネットワークに接続している間も既存の接続を維持するかどうかを確認します。両方の Wi-Fi インターフェースのステータスを表示して両方とも接続していることを確認するには、次のコマンドを使用します。

adb shell wpa_cli -i wlan0 status ; echo ; adb shell wpa_cli -i wlan1 status

新しいネットワークへの接続がない場合、デバイスは既存のネットワークとの接続を維持したまま新しいネットワークへの接続を試行し、新しいネットワークにインターネット アクセスがないことを検出した場合は試行を中止します。その後、デバイスは引き続き既存の接続をプライマリ Wi-Fi ネットワークとして使用します。

ローカル専用接続とインターネット接続の同時実行

「ローカル専用接続とインターネット接続の同時実行」機能を使用すると、デバイスはローカル専用接続(IoT デバイスへの接続など)とプライマリ インターネット提供ネットワークに同時に接続できます。この機能により、Android 10 で追加された WifiNetworkSpecifier API を通じて可能になった、IoT デバイス(カメラなど)への直接接続の際のユーザー エクスペリエンスが向上します。

Android 11 以前では、デバイスを IoT デバイスに接続するとプライマリ Wi-Fi ネットワークから切断されるため、インターネット接続が失われます(ただし、デバイスでモバイルデータなどの別のトランスポート タイプが利用できる場合は例外です)。

アプリは、WifiManager#isStaConcurrencyForLocalOnlyConnectionsSupported() API を使用して、この機能がデバイスでサポートされているかどうかを確認できます。

Android 12 におけるローカル専用接続とインターネット接続の同時実行機能の変更について詳しくは、ピアツーピア接続のための Wi-Fi ネットワーク リクエスト API をご覧ください。

ローカル専用接続とインターネット接続の同時実行の検証

この機能を検証するには、以下の CTS テストと ACTS テストを使用します。

  • CTS: MultiStaConcurrencyWifiNetworkSpecifierTest
  • ACTS: WifiStaConcurrencyNetworkRequestTest

制限付き接続とインターネット接続の同時実行

「制限付き接続とインターネット接続の同時実行」機能を使用すると、デバイスはユーザー用のプライマリ Wi-Fi ネットワークと、特定のアプリのみが使用できる制限付き Wi-Fi ネットワークに同時に接続できます。

アプリは、WifiManager#isStaConcurrencyForRestrictedConnectionsSupported() API を使用して、この機能がデバイスでサポートされているかどうかを確認できます。

デバイスがセカンダリ制限付き Wi-Fi ネットワークに接続できるようにする手順は次のとおりです。

  1. setOemPaid または setOemPrivate を true に設定して、Wi-Fi ネットワーク候補を追加します。

  2. ConnectivityManager で、対応する機能を備えた NetworkRequest を送信します。

デバイスは、ネットワークで OEM 有料候補または OEM 限定公開候補と一致するスキャン結果を検出すると、自動的にセカンダリ ネットワークとして接続します。

制限付き接続とインターネット接続の同時実行の検証

この機能を検証するには、以下の CTS テストと ACTS テストを使用します。

  • CTS: MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest
  • ACTS: WifiStaConcurrencyNetworkRequestTest

複数のネットワーク接続とインターネット接続の同時実行

Android 13 以降では、複数のネットワーク接続とインターネット接続の同時実行を利用できます。この機能を使用すると、デバイスは、どちらも無制限な(つまりすべてのアプリが利用できる)インターネット アクセス付きの 2 つのネットワーク(AP)に同時に接続できます。

アプリは、WifiManager#isStaConcurrencyForMultiInternetSupported() メソッドを使用して、この機能がデバイスでサポートされているかどうかを確認できます。

この機能がサポートされている場合、特権アプリは WifiManager#setStaConcurrencyForMultiInternetMode(int mode) メソッドを使用してこの機能を有効にできます。この機能には以下のモードがあります。

現在アクティブな機能モードをクエリするには、WifiManager#getStaConcurrencyForMultiInternetMode() メソッドを使用します。

この機能が有効になっている場合、インターネット接続を提供する追加の Wi-Fi ネットワークをリクエストするには、次の手順を実施します。

  1. WifiNetworkSpecifier.Builder を使用して、Wi-Fi ネットワーク指定子を作成します。setBand() メソッドを使用して、指定子の帯域を選択します。指定した帯域の追加ネットワークは Wi-Fi フレームワークによって選択されるため、SSID または BSSID を指定しないでください。

  2. ConnectivityManager を使用して、NET_CAPABILITY_INTERNET 機能を含む NetworkRequest を作成します。

  3. NetworkCallback インスタンスとともに指定子をネットワーク リクエストに追加してリクエストのステータスをトラッキングし、ConnectivityManager へのリクエストを発行します。リクエストされた帯域を持つ利用可能な保存済みネットワークがスキャン結果に表示され、そのネットワークへの接続が成功した場合、コールバック オブジェクトで NetworkCallback.onAvailable() が呼び出されます。

複数のネットワーク接続とインターネット接続の同時実行の検証

この機能を検証するには、以下の CTS テストを使用します。

  • CTS: MultiStaConcurrencyMultiInternetWifiNetworkTest

ベンダーの Wi-Fi チップに関するガイドライン

Wi-Fi チップベンダーは、Wi-Fi STA / STA の同時実行をサポートする場合、以下のガイドラインを使用してください。

Wi-Fi チップは、デュアル同時 STA 接続をサポートする必要があります。つまり、以下をサポートしなければなりません。

  • 各 STA インターフェースに、フレームワークによるプログラミングが可能な一意の MAC がある。
  • セカンダリ STA インターフェースを動的に作成および破棄できる。
  • 各 STA を(同じ帯域内または別の帯域内の)異なる SSID に接続できる。
  • 各 STA を(同じ帯域内または別の帯域内の)同じ SSID に接続できる。2 つの STA は決して同じ BSSID に接続されない

重要な機能は、インターフェースごとに動作し、プライマリ インターフェースで利用できることが必要です。そうした重要な機能を次のリストに示します。

  • ローミングは、少なくともプライマリ インターフェース(IWifiChip.setMultiStaPrimaryConnection() を使用して設定)でサポートされている必要があります。両方のインターフェースでローミングがサポートされている場合は、一方の接続での決定がもう一方の同時接続と競合しないようにする必要があります。たとえば、一方のインターフェースがもう一方の接続の BSSID にローミングしないようにします。

  • APF(および ARP や NS などの他のオフロード)は、少なくともプライマリ インターフェース(IWifiChip.setMultiStaPrimaryConnection() を使用して設定)でサポートされている必要があります。

  • リンクレイヤ統計はインターフェースごとに動作する必要があります。

さまざまな同時実行シナリオで推奨される Wi-Fi チップ実装を次に示します。

  • Wi-Fi チップは、フレームワークが以下の定数のいずれかを使用して IWifiChip.setMultiStaUseCase() を呼び出し、現在の機能を指定できるようにする必要があります。

    • DUAL_STA_TRANSIENT_PREFER_PRIMARY: make-before-break 機能を指定します。プライマリ接続の品質をセカンダリ接続より優先する必要があります。
    • DUAL_STA_NON_TRANSIENT_UNBIASED: ローカル専用接続とインターネット接続の同時実行機能または制限付き接続とインターネット接続の同時実行機能を指定します。両方の接続の品質の優先度を同じにする必要があります。
  • デュアル同時接続 STA は MCC、SCC、および DBS オペレーション モードにつながる可能性があるため、ベンダー実装では、フレームワークが機能を示す IWifiChip.setMultiStaUseCase() を呼び出す際に最適な無線構成を選択する必要があります。一般的なガイドラインは次のとおりです。

    • 可能であれば 2x2 + 2x2 DBS を使用します。
    • 1x1 + 1x1 DBS の使用は、接続品質に過度の影響が生じるため、可能であれば避けます。代わりに MCC を使用してください。
    • MCC のデューティ サイクルは、さまざまな機能についてドライバまたはファームウェアで構成できることが必要です。フレームワークは MCC のデューティ サイクルを直接設定しませんが、StaLinkLayerIfaceStats.timeSliceDutyCycleInPercent を使用してこの情報をクエリします。
    • MCC を使用する場合は、プライマリ接続とセカンダリ接続の間で以下のデューティ サイクルを設定することをおすすめします。

      • DUAL_STA_TRANSIENT_PREFER_PRIMARY: 70% プライマリ、30% セカンダリ。
      • DUAL_STA_NON_TRANSIENT_UNBIASED: 50% プライマリ、50% セカンダリ。