API Permintaan Jaringan Wi-Fi untuk konektivitas peer-to-peer

Pada perangkat Android 10 (level API 29) dan yang lebih tinggi, Anda dapat menggunakan API peer to peer baru untuk melakukan bootstrap konfigurasi untuk perangkat sekunder, seperti Chromecast dan perangkat keras Google Home. Fitur ini memungkinkan aplikasi Anda untuk meminta pengguna mengubah titik akses yang terhubung dengan perangkat menggunakan WifiNetworkSpecifier untuk menggambarkan properti dari jaringan yang diminta.

Untuk menggunakan API ini, lakukan hal berikut:

  1. Buat specifier jaringan Wi-Fi menggunakan WifiNetworkSpecifier.Builder.

  2. Tetapkan filter jaringan untuk mencocokkan jaringan yang akan dihubungkan, bersama dengan kredensial yang diperlukan.

  3. Putuskan pada kombinasi SSID, SSID pattern, BSSID, dan BSSID pattern untuk menyetel filter jaringan dalam setiap permintaan, berdasarkan persyaratan berikut:

    • Setiap permintaan harus menyediakan setidaknya salah satu dari SSID, SSID pattern, BSSID, atau BSSID pattern
    • Setiap permintaan hanya dapat menyetel salah satu SSID atau SSID pattern
    • Setiap permintaan hanya dapat menyetel salah satu BSSID atau BSSID pattern
  4. Tambahkan specifier ke permintaan jaringan bersama dengan instance NetworkCallback untuk melacak status permintaan.

    Jika pengguna menerima permintaan dan koneksi ke jaringan berhasil, NetworkCallback.onAvailable() dipanggil pada objek callback. Jika pengguna menolak permintaan atau jika koneksi ke jaringan tidak berhasil, NetworkCallback.onUnavailable() dipanggil pada objek callback.

Memulai permintaan untuk terhubung ke perangkat peer akan membuka kotak dialog pada perangkat yang sama, di mana pengguna perangkat dapat menerima permintaan koneksi.

Mem-bypass persetujuan pengguna

Setelah pengguna menyetujui jaringan untuk terhubung dalam menanggapi permintaan dari aplikasi tertentu, perangkat menyimpan persetujuan untuk titik akses tertentu. Jika aplikasi membuat permintaan khusus untuk menghubungkan ke titik akses tersebut lagi, perangkat melewatkan fase persetujuan pengguna dan secara otomatis terhubung ke jaringan. Jika pengguna memilih untuk melupakan jaringan saat terhubung ke jaringan yang diminta oleh API, maka persetujuan yang tersimpan ini untuk kombinasi aplikasi dan jaringan tersebut akan dihapus, dan permintaan apa pun di masa mendatang dari aplikasi harus disetujui oleh pengguna lagi. Jika aplikasi membuat permintaan non-spesifik, seperti dengan pola SSID atau BSSID, maka pengguna harus menyetujui permintaan tersebut.

Contoh kode

Contoh kode berikut menunjukkan cara menyambung ke jaringan terbuka dengan awalan SSID "test" dan OUI BSSID "10:03:23":

Kotlin

val specifier = WifiNetworkSpecifier.Builder()
    .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
    .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    ...
    override fun onAvailable(network: Network?) {
        // do success processing here..
    }

    override fun onUnavailable() {
        // do failure processing here..
    }
    ...
}
connectivityManager.requestNetwork(request, networkCallback)
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback)

Java

final NetworkSpecifier specifier =
  new WifiNetworkSpecifier.Builder()
  .setSsidPattern(new PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
  .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
  .build();

final NetworkRequest request =
  new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .setNetworkSpecifier(specifier)
  .build();

final ConnectivityManager connectivityManager = (ConnectivityManager)
  context.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkCallback networkCallback = new NetworkCallback() {
  ...
  @Override
  void onAvailable(...) {
      // do success processing here..
  }

  @Override
  void onUnavailable(...) {
      // do failure processing here..
  }
  ...
};
connectivityManager.requestNetwork(request, networkCallback);
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback);