แแ แ แแฆแแก แแแแญแแ แแ Android แแแแแแแชแแแแแแแ Wi-Fi แฅแกแแแแแแก แกแแแแแ แแแ แแ แฌแแแแแแก แฌแแ แขแแแแแแก แจแแกแแฎแแ แแแขแแแฃแ แ แแแแแชแแแแแแก แแแฆแแแ.
แแฅ แ แแแแแแแแ แกแแ แแฃแแแก แฌแแแแจแ แแแแแแฅแแ:
แแก แกแขแแขแแ แแแแแฎแแแแแก, แแฃ แ แแแแ แฃแแแ แแแแฆแแ แงแแแแแกแแแแชแแแแ แแแแแชแแแแแ Wi-Fi แแแ แแแแก แจแแกแแฎแแ แแแแ แแแแแก แแแแแแแ NDK-แแก, แฐแแแแ แแแแก แแแ แแจแ, แแแแ แแ แแฎแแแแ Android API-แแก แแแแแงแแแแแแ แแ แแแแกแแแแแก, แแฃ แ แแแแ แฃแแแ แแแแแแแ แขแแก แแแ.
แแ แแแแแแแแแแแ แแ แแแแแฌแงแแ แแแแแก แฌแแ แ.
1. แจแแฅแแแแแ แแ แแแฅแขแ
แแก แจแแแแจแแแ แแแแแฃแแแแแแแ แแแแแแแก, แแแแช แจแแฅแแแ Android แแ แแแฅแขแ แแ แแแ แแฎแแ, แแแแขแแ แฉแแแ แแแแแแขแแแแแ แแ แแแแแแแขแแก แแแขแแแแแก. แฅแแแแแ แแแชแแแฃแแ แแแแ แฌแแ แแแแแแแแแ แแฅแแแแ Kotlin-แจแ, minSdkVersion=23.
2. แฌแแแแแแก แแแแแ แแแแแ
แแแแแแแชแแแแแ Wi-Fi-แแแ แแฃแจแแแแแกแแแแก, แแฅแแแ แฃแแแ แแแแฆแแ แแแแฎแแแ แแแแแกแแแ แ แแแแแแแแ แแแแแ แแแ. แฒจแแกแแแแแแกแแ
แแกแ แ แแ, AndroidManifest.xml-แจแ แแแแแแแขแแแ:
<uses-permission android_name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android_name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android_name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android_name="android.permission.ACCESS_FINE_LOCATION"/>
แแ แแแแจแ, แ แแแแแแช แจแแแชแแแก แแแแแแแแ แ แแฅแขแแแแแแก แแแฃแแก:
import android.app.Activity
import android.content.Context
import android.location.LocationManager
import androidx.core.app.ActivityCompat
....
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE),
1
)
makeEnableLocationServices(activity.applicationContext)
} else {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.CHANGE_WIFI_STATE),
1
)
}
/* ะฒะบะปััะฐะตั ัะบัะฐะฝ ะฒะบะปััะตะฝะธั ัะปัะถะฑั ะฟะพ ะพะฟัะตะดะตะปะตะฝะธั ะผะตััะพะฟะพะปะพะถะตะฝะธั */
fun makeEnableLocationServices(context: Context) {
// TODO: ะฟะตัะตะด ะฒัะทะพะฒะพะผ ััะพะน ััะฝะบัะธะธ ะฝะฐะดะพ ัะฐััะบะฐะทะฐัั ะฟะพะปัะทะพะฒะฐัะตะปั, ะทะฐัะตะผ ะะฐะผ ะดะพัััะฟ ะบ ะผะตััะพะฟะพะปะพะถะตะฝะธั
val lm: LocationManager =
context.applicationContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val gpsEnabled: Boolean = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
val networkEnabled: Boolean = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!gpsEnabled && !networkEnabled) {
context.startActivity(Intent(ACTION_LOCATION_SOURCE_SETTINGS));
}
}
3. แจแแฅแแแแแ BroadcastReceiver แแ แแแแแแฌแแ แแ แแแแแชแแแแ แแแแแฎแแแแแก แฆแแแแกแซแแแแแแ Wi-Fi แฅแกแแแแก แแแ แแแแก แกแแแแแ แแแแก แจแแกแแฎแแ
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
val wifiScanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
if (success) {
scanSuccess()
}
}
}
val intentFilter = IntentFilter()
/* ะฟะพะดะฟะธััะฒะฐะตะผัั ะฝะฐ ัะพะพะฑัะตะฝะธั ะพ ะฟะพะปััะตะฝะธะธ ะฝะพะฒัั
ัะตะทัะปััะฐัะพะฒ ัะบะฐะฝะธัะพะฒะฐะฝะธั */
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wifiScanReceiver, intentFilter)
val success = wifiManager.startScan()
if (!success) {
/* ััะพ-ัะพ ะฝะต ะฟะพะปััะธะปะพัั ะฟัะธ ะทะฐะฟััะบะต ัะบะฐะฝะธัะพะฒะฐะฝะธั, ะฟัะพะฒะตัััะต ะฒัะดะฐะฝัะต ัะฐะทัะตัะตะฝะธั */
}
....
private fun scanSuccess() {
/* ะฒะพั ะพะฝะธ, ัะตะทัะปััะฐัั ัะบะฐะฝะธัะพะฒะฐะฝะธั */
val results: List<ScanResult> = wifiManager.scanResults
}
แแแแฃแแแแขแแชแแแจแ WiFiManager.startScan แแแแแแ แแแแแจแแฃแแแ, แ แแแแ แช แแแฎแแแ แแแฃแแ API 28 แแแ แกแแแแแ, แแแแ แแ แแแแแ แแฃแแแ.
แแแแแแแแแแจแ แแแแแฆแแ แแแแแฅแขแแแแก แกแแ
4. แจแแฎแแแแ ScanResult-แก แแ แแแแแแ แแแ แแแแแ
แแแแแ แแแแแแฎแแแแ แแ แแแแกแแก แแแแแแ แ แแแแก แแ แแฆแแฌแแ แแ แ แแก แแแจแแแแก แแกแแแ:
SSID โ แกแแ แแแกแแก แแแแ แแแแก แแแแแขแแคแแแแขแแ แ แแ แแก แฅแกแแแแก แกแแฎแแแ
BSSID โ แซแแ แแแแแ แกแแ แแแกแแก แแแแ แแแแก แแแแแขแแคแแแแขแแ แ โ แฅแกแแแแก แแแแแขแแ แแก MAC แแแกแแแแ แแ (Wi-Fi แฌแแ แขแแแ)
แแแแ โ แแแฆแแแฃแแ แกแแแแแแแก แกแแซแแแแ แแก แแแแแแแขแแ แ [dBm (แ แฃแกแฃแแ dBm) โ แแแชแแแแแ, แกแแชแแแแแ แ แกแแแซแแแแ แ 1 แแแข.] โ แแแฆแแแฃแแ แกแแแแแแแก แกแแซแแแแ แแก แแแฉแแแแแแแแ. แแฆแแแก แแแแจแแแแแแแแก 0-แแแ -100-แแแ, แ แแช แฃแคแ แ แจแแ แก แแ แแก 0-แแแ, แแแ แแแขแ แกแแแแแแแก แกแแแซแแแแ แ แแแแ แแแแ Wi-Fi แฌแแ แขแแแแแแ แแฅแแแแก แแแฌแงแแแแแแแแแแ แแแแแ. แแแแแขแแแแแ แแแขแแแแแ แจแแแแซแแแแ แแฎแแแแ, แแแแแแแแแ, แแแกแแแแ แแแ
val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
val numberOfLevels = 5
val level = WifiManager.calculateSignalLevel(level, numberOfLevels)
แกแแฎแจแแ แ โ Wi-Fi แฌแแ แขแแแแก แแฃแจแแแแแก แกแแฎแจแแ แ [Hz]. แแแ แแ แแแแแ แกแแฎแจแแ แแกแ, แจแแกแแซแแแ แแแแแแแขแแ แแกแแ แแ แฎแ แ.แฌ. แแแแแแฃแ แฌแแ แขแแแก แแฅแแก แกแแแฃแแแ แ แแแแ แแชแแฃแแ แกแแกแฃแคแแแแ. แฌแแ แแก แแ แแก, Wi-Fi แฌแแ แขแแแแแแก แงแแแแแแ แแแแฃแแแ แฃแแ แแแแแแแแแ แแ แแก 2.4 แแฐแช. แแแแ แแ, แฃแคแ แ แแฃแกแขแแ แ แแ แแแฅแแแ, แฌแแ แขแแแ แแแแแกแชแแแก แแแคแแ แแแชแแแก แแฅแแแแก แขแแแแคแแแก แแแแแแ แแแ แกแแฎแจแแ แแ, แแแกแแฎแแแแแฃแแแแ แแฎแแแก. แแ แฎแแแแก แ แแแแแแแแ แแ แจแแกแแแแแแกแ แกแแฎแจแแ แแแแ
/* ะฟะพ ัะฐััะพัะต ะพะฟัะตะดะตะปัะตะผ ะฝะพะผะตั ะบะฐะฝะฐะปะฐ */
val channel: Int
get() {
return if (frequency in 2412..2484) {
(frequency - 2412) / 5 + 1
} else if (frequency in 5170..5825) {
(frequency - 5170) / 5 + 34
} else {
-1
}
}
แจแแกแแซแแแแแแแแแ - แแแแแแแแกแแแแก แงแแแแแแ แกแแแแขแแ แแกแ แกแคแแ แ, แ แแแแแแแแแช แแฃแจแแแแ แแแ แแ แแก แแแแแฎแแแแ. แแฅ แฌแแ แขแแแแก "แจแแกแแซแแแแแแแแแ" แแฌแแ แแแ แฎแแแจแ. แแ แจแแแแฎแแแแแจแ, แแฅแแแ แแ แแญแแ แแแแแ แกแขแ แแฅแแแแแแก แแแขแแ แแ แแขแแชแแแก แแแขแแแแแแก แซแแแแ แแแแฃแแแแขแแชแแแจแ. แแฅ แแแชแแแฃแแแ แ แแแแแแแแ แแแแแแแแ แแแแกแ, แแฃ แ แ แจแแแซแแแแ แแงแแก แแ แฎแแแจแ:
[WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][WPS][ESS]
[WPA2-PSK-CCMP][ESS]
[WPA2-PSK-CCMP+TKIP][ESS]
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]
[ESS][WPS]
5. แแแ แแแแแขแฃแ แแแแก แแแแแ แแแ แแ แแแแแแแแแแก แจแแกแแซแแแแแแแแแ
แแฆแกแแแแจแแแแแ, แ แแ android.net.wifi.* แแแแแขแแก แแแแกแแแ แแแแแแงแแแแแ แแแแฃแฅแกแแก แแ แแแ แแแแก แแแแ .
แฉแแแ แแแแแฅแแแแแแ แแแแแแแแแแ แฃแแแ. แฏแแ แแแแแแฎแแแแ แคแแ แแแขแแก แแแแแกแแแแแ, แ แแแแแจแแช แคแ แฉแฎแแแแแแก แจแแแแแ แแแแแแแขแแแ แแแแแงแแคแแแแ โ-โ แแแจแแแ:
[WPA-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]
แแแ แแแแ แแแแจแแแแแแแ แแฆแฌแแ แก แ.แฌ. แแแแแแขแแคแแแแชแแแก แแแแแแ. แแแฃ แแแฅแแแแแแแแแก แ แ แแแแแแแแแแ แแแ แฃแแแ แจแแแกแ แฃแแแก แแแฌแงแแแแแแแแ แแ แฌแแแแแแก แฌแแ แขแแแแ, แ แแแ แฌแแแแแแก แฌแแ แขแแแแ แแแแแกแแแแแ แแแแแแงแแแแก แแ แ แแแแ แแแจแแคแ แแก แขแแแ แแแก แแแขแแแ แแแ. แแ แแแกแขแแก แแแฌแแ แแก แแ แแก แงแแแแแแ แแแแ แชแแแแแฃแแ แแแ แแแแขแแแแ WPA แแ WPA2, แ แแแแแแจแแช แแ แงแแแแแ แแแแแแจแแ แแแฃแแ แแแฌแงแแแแแแแ แแแ แแแแแ แแ แ.แฌ. RADIUS แกแแ แแแ แ (WPA-Enterprice) แฃแแ แฃแแแแแงแแคแก แแแ แแแก แแแจแแคแ แฃแ แแ แฎแแ. แกแแแแ แแฃแแแ, แแฅแแแแก แกแแฎแแจแ แฌแแแแแแก แฌแแ แขแแแ แฃแแ แฃแแแแแงแแคแก แแแแจแแ แก แแ แกแฅแแแแก แแแฎแแแแแ. แแแแกแฎแแแแแแ แแแแ แ แแแ แกแแแกแ แแ แแแ แแแแก แจแแ แแก แแ แแก แแก, แ แแ แแแก แแฅแแก แฃแคแ แ แซแแแแ แ แจแแคแ แ: AES แแแฃแชแแแแ TKIP-แแก แฌแแแแแฆแแแแ. WPA3, แ แแแแแแช แฃแคแ แ แ แแฃแแ แแ แแแฌแแแแแแ, แแกแแแ แแแแแแแแแแแแ แแแแ แแแแ. แแแแ แแฃแแแ, แจแแแซแแแแ แแ แกแแแแแแแก แแแ แแแแขแ แกแแฌแแ แแแก แแแแแฌแงแแแขแแ CCKM (Cisco Centralized Key Management), แแแแ แแ แแ แแ แแกแแแแก แจแแแฎแแแแ แแ.
แฌแแแแแแก แฌแแ แขแแแ แจแแกแแซแแแ แแแแคแแแฃแ แแ แแแฃแแ แแงแแก MAC แแแกแแแแ แแแ แแแแแแขแแคแแแแชแแแกแแแแก. แแ, แแฃ แฌแแแแแแก แฌแแ แขแแแ แแแแฌแแแแก แแแแแชแแแแแก แแแซแแแแแแฃแแ WEP แแแแแ แแแแแก แแแแแงแแแแแแ, แแแจแแ แ แแแแฃแ แแ แแ แแ แแก แแแแแแขแแคแแแแชแแ (แแฅ แกแแแแฃแแแ แแแกแแฆแแแ แแ แแก แแแจแแคแแ แแก แแแกแแฆแแแ). แฉแแแ แแแฎแแ แแกแฎแแแ แแกแแ แแแ แแแแขแแแก, แ แแแแ แช แกแฎแแ.
แแกแแแ แแ แกแแแแแก แแแแแแ, แ แแแแแแช แแแแฃแแแ แฃแแแ แกแแฏแแ แ wi-fi-แจแ แคแแ แฃแแ Captive Portal Detection-แแ - แแแแแแขแแคแแแแชแแแก แแแแฎแแแแ แแ แแฃแแแ แแก แแแจแแแแแแ. แแกแแแ แฌแแแแแแก แฌแแ แขแแแแแ แกแแแแแ แก แฆแแแ แแฉแแแแแแ (แ แแแแแแแช แแกแแแ แแ แแแ แคแแแแแฃแ แ แแแแจแแ แแก แแแแแกแแแ แแกแแ). แแแแขแแ, แฉแแแ แแแ แแแฎแแ แแกแฎแแแ แ แแแแ แช แฆแแ.
แแแแ แ แแแแจแแแแแแแ แจแแแซแแแแ แแฆแแแแจแแแก แ แแแแ แช แแแกแแฆแแแแก แแแ แแแแก แแแแแ แแแแ. แแก แแ แแก แแแแแ แแฆแฌแแ แแแ แแแแแแขแแคแแแแชแแแก แแแแแแแก แแแ แแแแขแ แ. แกแแฃแแแ แแ แแแแแ, แแฃ แ แแแแ แฎแแแแ แแแจแแคแแ แแก แแแกแแฆแแแแแแก แแแชแแแ. แแแแแแฎแแแแ แจแแกแแซแแ แแแ แแแแขแแแ. EAP - แแแแแแงแแแแแ แแฆแแแจแแฃแ WPA-Enterprice-แจแ, แแงแแแแแก แแแแแชแแแแ แแแแแก แจแแงแแแแแแ แแแแแแขแแคแแแแชแแแก แแแแแชแแแแแแก แจแแกแแแแฌแแแแแแ. SAE - แแแแแแงแแแแแ แแแฌแแแแแ WPA3-แจแ, แฃแคแ แ แแแแ แแแแ แฃแฎแแจแ แซแแแแก แแแแแ แ. PSK - แงแแแแแแ แแแแ แชแแแแแฃแแ แแแ แแแแขแ, แแฃแแแกแฎแแแแก แแแ แแแแก แจแแงแแแแแก แแ แแแจแแคแ แฃแแ แคแแ แแแ แแแแแชแแแแก. IEEE8021X - แกแแแ แแแจแแ แแกแ แกแขแแแแแ แขแแก แแแฎแแแแแ (แแแแกแฎแแแแแแฃแแ WPA แแฏแแฎแแก แแฎแแ แแแญแแ แแกแแแ). OWE (แแแแ แขแฃแแแกแขแฃแแ แฃแกแแแแแ แแแจแแคแแ แ) แแ แแก IEEE 802.11 แกแขแแแแแ แขแแก แแแคแแ แแแแแ แแ แฌแแ แขแแแแแแกแแแแก, แ แแแแแแแช แฉแแแ แแแแกแแคแแชแแ แแแฃแแแ แ แแแแ แช OPEN. OWE แฃแแ แฃแแแแแงแแคแก แแแฃแชแแแ แฅแกแแแจแ แแแแแชแแแฃแแ แแแแแชแแแแแแก แฃแกแแคแ แแฎแแแแแก แแแกแ แแแจแแคแแ แแก แแแแ. แแแ แแแแขแ แแกแแแ แจแแกแแซแแแแแแแ, แ แแแแกแแช แแ แแ แแก แฌแแแแแแก แแแกแแฆแแแแแ, แแแแแ แแฃแฌแแแแ แแ แแแ แแแแขแก NONE.
แแแกแแแ แแแ แแแแขแ แ แแ แแก แ.แฌ. แแแจแแคแแ แแก แกแฅแแแแแ โ แแฃแกแขแแ แ แแแแ แแแแแแงแแแแแ แจแแคแ แ แแแแแชแแแฃแแ แแแแแชแแแแแแก แแแกแแชแแแแ. แแแแแ แฉแแแแแแแแแแ แแแ แแแแขแแแ. WEP - แแงแแแแแก RC4 แแแแแแแก แจแแคแ แก, แกแแแแฃแแแ แแแกแแฆแแแ แแ แแก แแแจแแคแแ แแก แแแกแแฆแแแ, แ แแแแแแช แแแฃแฆแแแแแ แแแแแแแ แแแแแแแแ แแแ แแ แแแขแแแ แแคแแแก แกแแแงแแ แแจแ. TKIP - แแแแแแงแแแแแ WPA-แจแ, CKIP - WPA2-แจแ. TKIP+CKIP - แจแแแซแแแแ แแแแแแแแฃแแ แแงแแก แฌแแ แขแแแแแจแ, แ แแแแแแกแแช แจแแฃแซแแแแ WPA แแ WPA2 แฃแแแแ แแแแกแแแแแแแแกแแแแก.
แกแแแ แแแแแแแขแแก แแแชแแแแ, แจแแแแซแแแแ แแแแแแ แแแ แขแแฎแแแ WEP แแแจแแแ:
[WEP]
แ แแแแ แช แแแแแ แแแแแแฎแแแแ, แแก แกแแแแแ แแกแแ แแแแกแแแแก, แ แแ แแ แแแฃแแแแแ แแแกแแฆแแแแแแก แแแแแงแแแแแแก แแแแแ แแแแ, แ แแแแแแช แแ แแ แกแแแแแก แแ แแแจแแคแแ แแก แแแแแแ, แ แแแแแแช แแแแฃแแแกแฎแแแแแ แแแแแแ.
แแฎแแ แแแแแฎแแแแ แแก แคแ แฉแฎแแแ:
[ESS]
แแแ Wi-Fi แแแแ แแชแแฃแแ แ แแแแแ แแ Wi-Fi แฅแกแแแแก แขแแแแแแแแ. แจแแแซแแแแ แจแแฎแแแแ BSS (Basic Service Set) แ แแแแแก - แ แแแแกแแช แแ แแก แแ แแ แฌแแแแแแก แฌแแ แขแแแ, แ แแแแแก แแแจแแแแแแแแช แแแแแแจแแ แแแฃแแ แแแฌแงแแแแแแแแแ แฃแ แแแแ แแแแแ. แจแแแแซแแแแ แแแแแแ แแแแแแแแ แแ แฅแกแแแแแจแ. แ แแแแ แช แฌแแกแ, แฌแแแแแแก แฌแแ แขแแแแแ แกแแญแแ แแ แกแฎแแแแแกแฎแแ แแแแแแฃแ แ แฅแกแแแแแแแแ แแแฌแงแแแแแแแแแแก แแแกแแแแแจแแ แแแแแ, แแแแขแแ แแกแแแ แแแคแแ แแแแแฃแแ แกแแ แแแกแแแแก แแแแ แแแแก - ESS-แแก แแแฌแแแแ. IBSSs (แแแแแฃแแแแแแแแ แซแแ แแแแแ แกแแ แแแกแแแแก แแแแ แแแ) แขแแแ แแแฃแแแแแแก, แ แแ แแแฌแงแแแแแแแ แแ แแก Peer-to-Peer แฅแกแแแแก แแแฌแแแ.
แแฅแแแ แแกแแแ แจแแแแซแแแแ แแแฎแแ WPS แแ แแจแ:
[WPS]
WPS (Wi-Fi Protected Setup) แแ แแก แแ แแขแแแแแ Wi-Fi แฅแกแแแแก แแแฎแแแ แแ แแแขแแแแขแฃแ แ แแแแชแแแแแแแชแแแกแแแแก. แแแแชแแแแแแแชแแแกแแแแก แแแแฎแแแ แแแแแ แแ แจแแแฅแแก 8-แกแแแแแแแแแ แแแ แแแก แแ แแญแแ แก แฆแแแแแก แ แแฃแขแแ แแ. แแฃ แแฅแแแแ แฌแแแแแแก แฌแแ แขแแแ แแ แแก แแแ แแแแ แขแแแแก แแ แแก แแแแ แแแแแฉแแแแแ แแฅแแแแ แฌแแแแแแก แฌแแ แขแแแแก แกแแฎแแแแก แแแแ แแแ, แแแ แฉแแแ แแแแแฎแแแแแ แแแแแแแกแขแ แแชแแฃแ แแแแแแแ แแ แแแแแ แแแ WPS แฌแแแแแ. แคแแฅแขแแ, แ แแ แฎแจแแ แแ 8-แแแจแแ PIN-แแก แแแ แแแแแ แจแแกแแซแแแแแแแ MAC แแแกแแแแ แแแ, แแ แจแแกแแซแแแแแแแ แแแกแ แแแแแแแแ แแแแแกแแฉแแแ แแ แแจแ, แ แแแแช แแแแแแก แแ แแแแแแแกแแแแแกแแแ แแ แจแแฃแซแแแ แแกแแ แแแแแแก.
6. แแแแแแแก แแ แแแ แฉแแแแก แคแฃแแฅแชแแแก แจแแฅแแแ
แแแแก แกแแคแฃแซแแแแแ, แ แแช แแแแแ แแแแแ แแแแแ, แฉแแแ แแฆแแฌแแ แ แ แ แแแฎแแ แแแแแชแแแแ แแแแกแแแแก แแแแแงแแแแแแ:
/* ัั
ะตะผะฐ ะฐััะตะฝัะธัะธะบะฐัะธะธ */
enum class AuthMethod {
WPA3,
WPA2,
WPA, // Wi-Fi Protected Access
OTHER, // ะฒะบะปััะฐะตั ะฒ ัะตะฑั Shared Key Authentication ะธ ะดั. ะธัะฟะพะปัะทัััะธะต mac-address-based ะธ WEP
CCKM, // Cisco
OPEN // Open Authentication. ะะพะถะตั ะฑััั ัะพ ัะบััััะผ Captive Portal Detection - ะทะฐะฟัะพั ะฐััะตะฝัะธัะธะบะฐัะธะธ ัะตัะตะท ะฑัะฐัะทะตั
}
/* ะฐะปะณะพัะธัะผ ะฒะฒะพะดะฐ ะบะปััะตะน */
enum class KeyManagementAlgorithm {
IEEE8021X, // ะฟะพ ััะฐะฝะดะฐััั
EAP, // Extensible Authentication Protocol, ัะฐััะธััะตะผัะน ะฟัะพัะพะบะพะป ะฐััะตะฝัะธัะธะบะฐัะธะธ
PSK, // Pre-Shared Key โ ะบะฐะถะดัะน ัะทะตะป ะฒะฒะพะดะธั ะฟะฐัะพะปั ะดะปั ะดะพัััะฟะฐ ะบ ัะตัะธ
WEP, // ะฒ WEP ะฟะฐัะพะปั ัะฒะปัะตััั ะบะปััะพะผ ัะธััะพะฒะฐะฝะธั (No auth key)
SAE, // Simultaneous Authentication of Equals - ะผะพะถะตั ะฑััั ะฒ WPA3
OWE, // Opportunistic Wireless Encryption - ะฒ ัะพััะตัะฐั
ะฝะพะฒัั
ะฟะพะบะพะปะตะฝะธะน, ะฟัะฑะปะธัะฝัั
ัะตััั
ัะธะฟะฐ OPEN
NONE // ะผะพะถะตั ะฑััั ะฑะตะท ัะธััะพะฒะฐะฝะธั ะฒ OPEN, OTHER
}
/* ะผะตัะพะด ัะธััะพะฒะฐะฝะธั */
enum class CipherMethod {
WEP, // Wired Equivalent Privacy, ะะฝะฐะปะพะณ ัะธััะพะฒะฐะฝะธั ััะฐัะธะบะฐ ะฒ ะฟัะพะฒะพะดะฝัั
ัะตััั
TKIP, // Temporal Key Integrity Protocol
CCMP, // Counter Mode with Cipher Block Chaining Message Authentication Code Protocol,
// ะฟัะพัะพะบะพะป ะฑะปะพัะฝะพะณะพ ัะธััะพะฒะฐะฝะธั ั ะบะพะดะพะผ ะฐััะตะฝัะธัะฝะพััะธ ัะพะพะฑัะตะฝะธั ะธ ัะตะถะธะผะพะผ ััะตะฟะปะตะฝะธั ะฑะปะพะบะพะฒ ะธ ััะตััะธะบะฐ
// ะฝะฐ ะพัะฝะพะฒะต AES
NONE // ะผะพะถะตั ะฑััั ะฑะตะท ัะธััะพะฒะฐะฝะธั ะฒ OPEN, OTHER
}
/* ะฝะฐะฑะพั ะผะตัะพะดะพะฒ ัะธััะพะฒะฐะฝะธั ะธ ะฟัะพัะพะบะพะปะพะฒ, ะฟะพ ะบะพัะพััะผ ะผะพะถะตั ัะฐะฑะพัะฐัั ัะพัะบะฐ */
data class Capability(
var authScheme: AuthMethod? = null,
var keyManagementAlgorithm: KeyManagementAlgorithm? = null,
var cipherMethod: CipherMethod? = null
)
/* ะ ะตะถะธะผ ัะฐะฑะพัั WiFi (ะธะปะธ ัะพะฟะพะปะพะณะธั ัะตัะตะน WiFi) */
enum class TopologyMode {
IBSS, // ะญะฟะธะทะพะดะธัะตัะบะฐั ัะตัั (Ad-Hoc ะธะปะธ IBSS โ Independent Basic Service Set).
BSS, // ะัะฝะพะฒะฝะฐั ะทะพะฝะฐ ะพะฑัะปัะถะธะฒะฐะฝะธั Basic Service Set (BSS) ะธะปะธ Infrastructure Mode.
ESS // ะ ะฐััะธัะตะฝะฝะฐั ะทะพะฝะฐ ะพะฑัะปัะถะธะฒะฐะฝะธั ESS โ Extended Service Set.
}
แแฎแแ แแแแฌแแ แแ แคแฃแแฅแชแแ, แ แแแแแแช แแแแแแแแแแแแก แจแแกแแซแแแแแแแแแแก แแแแก:
private fun parseCapabilities(capabilitiesString: String): List < Capability > {
val capabilities: List < Capability > = capabilitiesString
.splitByBrackets()
.filter {
!it.isTopology() && !it.isWps()
}
.flatMap {
parseCapability(it)
}
return
if (!capabilities.isEmpty()) {
capabilities
} else {
listOf(Capability(AuthMethod.OPEN, KeyManagementAlgorithm.NONE, CipherMethod.NONE))
}
}
private fun parseCapability(part: String): List < Capability > {
if (part.contains("WEP")) {
return listOf(Capability(
AuthMethod.OTHER,
KeyManagementAlgorithm.WEP,
CipherMethod.WEP
))
}
val authScheme = when {
part.contains("WPA3") - > AuthMethod.WPA3
part.contains("WPA2") - > AuthMethod.WPA2
part.contains("WPA") - > AuthMethod.WPA
else - > null
}
val keyManagementAlgorithm = when {
part.contains("OWE") - > KeyManagementAlgorithm.OWE
part.contains("SAE") - > KeyManagementAlgorithm.SAE
part.contains("IEEE802.1X") - > KeyManagementAlgorithm.IEEE8021X
part.contains("EAP") - > KeyManagementAlgorithm.EAP
part.contains("PSK") - > KeyManagementAlgorithm.PSK
else - > null
}
val capabilities = ArrayList < Capability > ()
if (part.contains("TKIP") || part.contains("CCMP")) {
if (part.contains("TKIP")) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.TKIP
))
}
if (part.contains("CCMP")) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.CCMP
))
}
} else if (authScheme != null || keyManagementAlgorithm != null) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.NONE
))
}
return capabilities
}
private fun parseTopologyMode(capabilitiesString: String): TopologyMode ? {
return capabilitiesString
.splitByBrackets()
.mapNotNull {
when {
it.contains("ESS") - > TopologyMode.ESS
it.contains("BSS") - > TopologyMode.BSS
it.contains("IBSS") - > TopologyMode.IBSS
else - > null
}
}
.firstOrNull()
}
private fun parseWPSAvailable(capabilitiesString: String): Boolean {
return capabilitiesString
.splitByBrackets()
.any {
it.isWps()
}
}
private fun String.splitByBrackets(): List < String > {
val m = Pattern.compile("[(.*?)]").matcher(this)
val parts = ArrayList < String > ()
while (m.find()) {
parts.add(m.group().replace("[", "").replace("]", ""))
}
return parts
}
private fun String.isTopology(): Boolean {
return TopologyMode.values().any {
this == it.name
}
}
private fun String.isWps(): Boolean {
return this == "WPS"
}
8. แแฎแแแแ แจแแแแแ
แฅแกแแแก แแแแแแแแแแแ แแ แแ แแแฉแแแแแแ แ แแช แแแแแแ. แแแฉแแแแแแแ Log.d-แแก แกแแจแฃแแแแแแ แแแ แขแแแ แแแแแขแแแแก แจแแแแแแแ:
Capability of Home-Home [WPA2-PSK-CCMP][ESS][WPS]
...
capabilities=[Capability(authScheme=WPA2, keyManagementAlgorithm=PSK, cipherMethod=CCMP)], topologyMode=ESS, availableWps=true
แแแแแแแชแแแก แแแแแแแ แฅแกแแแแแ แแแแแแจแแ แแแแก แกแแแแแฎแ แแแแแฃแแแแแแแแ แแแ แฉแ. แแ แแฎแแแแ แแแขแงแแ, แ แแ แแแแแแฃแ แ แแแฌแงแแแแแแแแก OS-แแแ แจแแแแฎแฃแแ แแแ แแแแแแก แฌแแกแแแแแฎแแ, แแญแแ แแแแแ root แฃแคแแแแแแ แแ แคแแแแฃแ แ แกแแกแขแแแแก แซแแแแแก แกแฃแ แแแแ, แ แแ แฌแแแแแแฎแแ wpa_supplicant.conf. แแฃ แแแแแแแชแแแก แแแแแแ แแแแแฎแแแก แแแ แแแแก แจแแงแแแแแก แแแ แแแแ, แแแแจแแ แ แจแแแซแแแแ แแแแฎแแ แชแแแแแแก แแแแกแแก แแแจแแแแแแ
แแแแแแแ
แแฃ แคแแฅแ แแแ, แ แแ แ แแแแแก แแแแแขแแแ แแ แแแแแกแฌแแ แแแแ แกแแญแแ แ, แแแฌแแ แแ แแแแแแขแแ แแแจแ :)
แฌแงแแ แ: www.habr.com