Saat pengenalan Android Q versi beta ke publik, pihak develeoper android mengklaim bahwa mereka meningkatkan keamanan dan performa konektivitas Wi-Fi di android. Serta meningkatkan kemudahan untuk terhubung dengan device IoT.

Setelah banyak keluhan di https://issuetracker.google.com/ tentang API Wi-Fi mereka yang tidak optimal untuk penggunaan konektivitas machine-to-machine, akhirnya mereka merefactor Wi-Fi stack-nya dan memperkenalkan API baru untuk konektivitas Wi-Fi.

WifiNetworkSpecifier untuk menginisasi koneksi dengan prefernsi SSID yang dinginkan. Proses scanning otomatis dilakukan, lalu hasilnya dimunculkan sebagai list di Wi-Fi picker beserta kekuatan sinyalnya. Kemudian user tinggal mengklik SSID yang diinginkan untuk langsung terkoneksi.

WifiNetworkSuggestion untuk menyajikan list Wi-Fi yang disarankan terkoneksi ke user. List ditampilkan berdasarkan preferensi yang telah ditetapkan. Aplikasi dapat menambahkan SSID yang disarankan di list tersebut melalui API ini juga.

Implementasi

Untuk terkoneksi ke SSID diawali dengan membuat instance WifiNetworkSpecifier melalui WifiNetworkSpecifier.Builder dan set filternya berdasarkan SSID, SSID Pattern, BSSID, atau BSSID Pattern.

Setelah itu tambahkan instance WifiNetworkSpecifier yang telah dibuat tersebut ke APINetworkRequest dan juga buat instance dari ConnectivityManager.NetworkCallback untuk mentrack status request koneksi.

Jika koneksi berhasil maka NetworkCallback.onAvailable() yang terpanggil, sedangkan jika gagal maka NetworkCallback.onUnavailable()yang terpanggil.

Contoh:

    val specifier =  WifiNetworkSpecifier.Builder()
		.setSsidPattern(PatternMatcher("efishery_", PatternMatcher.PATTERN_PREFIX))
		.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)

Hasil

Saat pengujian dengan menggunakan Google Pixel 2, proses koneksi Wi-Fi android ke device IoT menggunakan API ini cukup memuaskan. Proses yang sebelumnya bisa memakan waktu 30-60 detik, sekarang kurang lebih 5 detik bisa terkoneksi. Namun sayangnya API ini tidak backward-compatible. Sehingga handphone Android dari OS Pie (9) ke bawah tidak bisa menggunakan API ini, tetap dengan WifiManager yang PAYAH!!!!.