Wi-Fi αž“αž·αž„αž’αž€αŸ’αžŸαžšαž€αžΆαžαŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ” αžšαž”αŸ€αž”αž‘αž‘αž½αž›αž”αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αŸ†αž–αžΈαžαŸ’αž“αžΆαŸ†αž„ Wi-Fi αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Android αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž αžΎαž˜

αžαŸ’αž„αŸƒαž˜αž½αž™αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαŸ’αž€αŸαž“αž”αžŽαŸ’αžαžΆαž‰ Wi-Fi αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Android αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαž…αŸ†αžŽαž»αž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžˆαž˜αž˜αž»αžαž“αžΉαž„αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž‡αžΆαž…αŸ’αžšαžΎαž“: off.Android αž―αž€αžŸαžΆαžš αžαŸ’αž“αžΆαž€αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžŠαž·αžŸαŸαž’ (αž€αž˜αŸ’αžšαž·αž API> 26) αžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž†αŸ’αž›αž»αŸ‡αž”αž‰αŸ’αž…αžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž‘αŸαŸ” αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžšαžΏαž„αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž‚αžΊαžαž·αž…αžαž½αž…αž”αŸ†αž•αž»αž (αž§αž‘αžΆαž αžšαžŽαŸ αžœαžΆαž›αžŸαž˜αžαŸ’αžαž—αžΆαž–αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ αž›αž‘αŸ’αž’αž•αž›αžŸαŸ’αž€αŸαž“ αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžš αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆ αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαžΆαž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž‡αžΆαž…αŸ’αžšαžΎαž“αž€αŸαžŠαŸ„αž™)αŸ” αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž‘αžΈαž”αžΈαž’αžΆαž…αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αžΌαž›αž‡αž·αž Wi-Fi αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„ αž€αŸ’αžšαŸ…αž–αžΈαž€αžΆαžšαž’αžΆαž“αž‘αŸ’αžšαžΉαžŸαŸ’αžαžΈ αž“αž·αž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžšαŸ‰αŸ„αžαž‘αŸαžšαžαžΆαž˜αžšαž™αŸˆ localhost αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž’αž€αŸ’αžŸαžšαž€αžΆαžαŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αž‘αžΆαž€αŸ‹αž‘αž„ αž“αž·αž„αžšαŸ€αž”αž…αŸ†αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αž½αž€αžœαžΆαž‘αŸ (αž€αžΆαžšαžœαž·αž“αž·αž…αŸ’αž†αŸαž™αž‚αžΊαž‡αžΆαž”αŸ’αžšαž’αžΆαž“αž”αž‘ αž“αž·αž„αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž–αžΈαž˜αž»αž“)αŸ”

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸαž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αž’αŸ†αž–αžΈαž”αžšαž·αžŸαŸ’αžαžΆαž“ Wi-Fi αž–αžΈαž€αžΌαžŠ Android αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“ NDK, hacks αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžΎαžαŸ‚ Android API αž αžΎαž™αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αž”αž€αžŸαŸ’αžšαžΆαž™αžœαžΆαŸ”

αž€αž»αŸ†αž”αž„αŸ’αž’αž„αŸ‹αž™αžΌαžš αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαžšαžŸαŸαžšαž€αžΌαžŠαŸ”

1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

αž€αŸ†αžŽαžαŸ‹αž…αŸ†αžŽαžΆαŸ†αž“αŸαŸ‡αž‚αžΊαž˜αžΆαž“αž‚αŸ„αž›αž”αŸ†αžŽαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„ Android αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž˜αž½αž™αžŠαž„ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž›αž»αž”αž…αŸ„αž›αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸƒαž’αžΆαžαž»αž“αŸαŸ‡αŸ” αž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž‡αžΆ Kotlin, minSdkVersion=23αŸ”

2. αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž…αžΌαž›αž”αŸ’αžšαžΎ

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Wi-Fi αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž‡αžΆαž…αŸ’αžšαžΎαž“αž–αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž’αž“αž»αž›αŸ„αž˜β€‹αžαžΆαž˜ αž―αž€αžŸαžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αž€αŸαž“αž”αžŽαŸ’αžαžΆαž‰αž“αŸ…αž›αžΎαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αžŽαŸ‚ OS αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈ 8.0 αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž”αžšαž·αžŸαŸ’αžαžΆαž“αž”αžŽαŸ’αžαžΆαž‰ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž˜αŸ‰αžΌαžŒαž»αž› Wi-Fi αžšαž”αžŸαŸ‹αž§αž”αž€αžšαžŽαŸ αž¬αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΌαž’αžšαžŠαŸ„αž“αŸ (αž”αŸ’αžšαž αžΆαž€αŸ‹αž”αŸ’αžšαž αŸ‚αž› αž¬αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠ) αŸ” αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž€αŸ†αžŽαŸ‚ 9.0 αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž–αžΈαžš αž αžΎαž™αžαŸ‚αž˜αž‘αžΆαŸ†αž„αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžΎαž€αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΈαžαžΆαŸ†αž„αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž•αž„αžŠαŸ‚αžšαŸ” αž€αž»αŸ†β€‹αž—αŸ’αž›αŸαž…β€‹αž–αž“αŸ’αž™αž›αŸ‹β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αžŠαŸ„αž™β€‹αž€αŸ’αž›αžΆαž αžΆαž“β€‹αžαžΆβ€‹αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž”αŸ†αžŽαž„β€‹αž”αŸ’αžšαžΆαžαŸ’αž“αžΆβ€‹αžšαž”αžŸαŸ‹ Google αž αžΎαž™β€‹αž˜αž·αž“β€‹αž˜αŸ‚αž“β€‹αž‡αžΆβ€‹αž”αŸ†αžŽαž„β€‹αž”αŸ’αžšαžΆαžαŸ’αž“αžΆβ€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αžŸαŸŠαžΎαž”β€‹αž’αž„αŸ’αž€αŸαžβ€‹αž›αžΎβ€‹αž‚αžΆαžαŸ‹β€‹αž‘αŸ :)

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ 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 αŸ” - Service Set Identifier αž‚αžΊαž‡αžΆαžˆαŸ’αž˜αŸ„αŸ‡αž”αžŽαŸ’αžαžΆαž‰

αž”αžΆαžŸαŸŠαžΈαžŠ - αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž€αŸ†αžŽαžαŸ‹αžŸαŸαžœαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ - αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ MAC αž“αŸƒαž’αžΆαžŠαžΆαž”αŸ‹αž‘αŸαžšαž”αžŽαŸ’αžαžΆαž‰ (αž…αŸ†αžŽαž»αž… Wi-Fi)

αž€αž˜αŸ’αžšαž·αž β€” αž”αžΆαž“αž‘αž‘αž½αž› αžŸαžΌαž…αž“αžΆαž€αžšαž€αž˜αŸ’αž›αžΆαŸ†αž„αžŸαž‰αŸ’αž‰αžΆ [dBm (dBm αžšαž”αžŸαŸ‹αžšαž»αžŸαŸ’αžŸαŸŠαžΈ) β€” Decibel αžαžΆαž˜αž–αž›αž™αŸ„αž„ 1 mW αŸ”] β€” αžŸαžΌαž…αž“αžΆαž€αžšαž“αŸƒαž€αž˜αŸ’αž›αžΆαŸ†αž„αžŸαž‰αŸ’αž‰αžΆαžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αŸ” αž™αž€αžαž˜αŸ’αž›αŸƒαž–αžΈ 0 αž‘αŸ… -100 αžŠαŸ‚αž›αž›αžΎαžŸαž–αžΈ 0 αžαžΆαž˜αž–αž›αžŸαž‰αŸ’αž‰αžΆαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹αž“αŸ…αžαžΆαž˜αž•αŸ’αž›αžΌαžœαž–αžΈαž…αŸ†αžŽαž»αž… Wi-Fi αž‘αŸ…αž€αžΆαž“αŸ‹αž§αž”αž€αžšαžŽαŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αž§αž‘αžΆαž αžšαžŽαŸαž“αŸ… Wikipedia. αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžαžΆαž”αŸ’αžšαžΎαžαŸ’αž“αžΆαž€αŸ‹ Android αžœαŸ‰αžΆαž™αž αŸ’αžœαžΆαž™αž˜αŸ‰αžΆαž™αžŽαŸƒ αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ’αžšαž·αžαž€αž˜αŸ’αžšαž·αžαžŸαž‰αŸ’αž‰αžΆαž“αŸ…αž›αžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž˜αž½αž™ αž–αžΈαž›αŸ’αž’αž₯αžαžαŸ’αž…αŸ„αŸ‡αž‘αŸ…αž‚αž½αžšαž±αŸ’αž™αž—αŸαž™αžαŸ’αž›αžΆαž…αž€αŸ’αž“αž»αž„αž‡αŸ†αž αžΆαž“αžŠαŸ‚αž›αž’αŸ’αž“αž€αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαŸ–

        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 GHz αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ αž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž‡αžΌαž“αž–αŸαžαŸŒαž˜αžΆαž“αž‘αŸ…αž€αžΆαž“αŸ‹αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž”αŸ’αžšαŸαž€αž„αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž›αŸαžαž‡αž·αžαž“αžΉαž„αžˆαŸ’αž˜αŸ„αŸ‡αž˜αž½αž™αŸ” αž…αŸ†αž“αž½αž“αž”αŸ‰αž»αžŸαŸ’αžαž·αŸ αž“αž·αž„αž”αŸ’αžšαŸαž€αž„αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ” αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš. αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαžΆαž…αŸ†αžŽαž»αž…αž“αŸ…αž€αŸ’αž”αŸ‚αžšαž“αŸ„αŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž”αŸ’αžšαŸαž€αž„αŸ‹αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αžŠαŸ„αž™αž αŸαžαž»αž“αŸαŸ‡αž˜αž·αž“αž‡αŸ’αžšαŸ€αžαž‡αŸ’αžšαŸ‚αž€αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€ αž“αž·αž„αž˜αž·αž“αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž›αŸ’αž”αžΏαž“ αž“αž·αž„αž‚αž»αžŽαž—αžΆαž–αž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž…αŸ†αž“αž»αž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž·αž“αž“αŸ…αž”αŸ’αžšαŸαž€αž„αŸ‹αž˜αž½αž™αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž›αžΎαžŸαž–αžΈαž‡αž½αžšαž“αŸƒαž”αŸ’αžšαŸαž€αž„αŸ‹ (αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš αž‘αž‘αžΉαž„αž†αžΆαž“αŸ‚αž›) αžŠαŸ‚αž›αž αŸ…αžαžΆαž‘αž‘αžΉαž„αž†αžΆαž“αŸ‚αž›αŸ” αž“αŸ„αŸ‡αž‚αžΊαž‡αžΆαž…αŸ†αžŽαž»αž…αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž‡αžΆαž”αŸ‹αž‚αŸ’αž“αžΆ (αž αžΎαž™αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž“αŸ…αž‡αžΆαž”αŸ‹αž‚αŸ’αž“αžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚ 3 αž–αžΈαžαŸ’αž›αž½αž“αž‚αŸ) αž”αžŽαŸ’αžαžΆαž‰αžšαŸ†αžαžΆαž“αžŠαž›αŸ‹αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αžƒαžΎαž‰αž€αžΌαžŠαžŸαžΆαž˜αž‰αŸ’αž‰αž“αŸαŸ‡αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž‚αžŽαž“αžΆαž›αŸαžαž†αžΆαž“αŸ‚αž›αž–αžΈαžαž˜αŸ’αž›αŸƒαž”αŸ’αžšαŸαž€αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž·αž“αŸ’αž‘αž»αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαŸαž€αž„αŸ‹ 2.4 αž“αž·αž„ 5 GhzαŸ–


    /* ΠΏΠΎ частотС опрСдСляСм Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π° */
    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. РазбираСмся Π² Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°Ρ… ΠΈ парсим capabilities

αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαž€αŸ’αž“αž»αž„αž€αžΆαžšαž“αž·αž™αžΆαž™αžαžΆαžαŸ’αž“αžΆαž€αŸ‹αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹ android.net.wifi.* αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αžšαŸ„αž˜αž€αŸ’αžšαžŽαžΆαžαŸ‹αžŠαŸ„αž™αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž›αžΈαž“αž»αž… wpa_suplicant αž αžΎαž™αž›αž‘αŸ’αž’αž•αž›αž›αž‘αŸ’αž’αž•αž›αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž›αžŸαž˜αžαŸ’αžαž—αžΆαž–αž‚αžΊαž‡αžΆαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž“αŸƒαžœαžΆαž›αž‘αž„αŸ‹αž“αŸ…αž–αŸαž›αžŸαŸ’αž€αŸαž“αŸ”

αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‡αžΆαž”αŸ‹αž›αžΆαž”αŸ‹αŸ” αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ‚αž›αž’αžΆαžαž»αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž„αŸ‹αž€αŸ’αžšαž…αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž”αŸ‚αž€αžŠαŸ„αž™αžŸαž‰αŸ’αž‰αžΆ "-"αŸ–

[WPA-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]

αž’αžαŸ’αžαž“αŸαž™αž‘αžΈαž˜αž½αž™αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αŸαž αŸ…αžαžΆαŸ” αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹. αž“αŸ„αŸ‡αž‚αžΊαž‡αžΆαž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαŸ‚αž›αž§αž”αž€αžšαžŽαŸ αž“αž·αž„αž…αŸ†αžŽαž»αž…αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž’αž“αž»αžœαžαŸ’αž αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž…αŸ†αžŽαž»αž…αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž”αŸ’αžšαžΎαžαŸ’αž›αž½αž“αžœαžΆ αž“αž·αž„αžšαž”αŸ€αž”αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αž”αž“αŸ’αž‘αž»αž€αŸ” αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžšαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΌαž‘αŸ…αž”αŸ†αž•αž»αžαž‚αžΊ WPA αž“αž·αž„ WPA2 αžŠαŸ‚αž›αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αž§αž”αž€αžšαžŽαŸαž“αžΈαž˜αž½αž™αŸ—αžŠαŸ‚αž›αž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž¬αžαžΆαž˜αžšαž™αŸˆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αŸαž αŸ…αžαžΆαŸ” αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ RADIUS (WPA-Enterprice) αž•αŸ’αžαž›αŸ‹αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž›αžΎαž†αžΆαž“αŸ‚αž›αžŠαŸ‚αž›αž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αŸ” αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž‘αŸ†αž“αž„αž‡αžΆαž…αŸ†αžŽαž»αž…αž…αžΌαž›αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αŸ” αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„αž€αŸ†αžŽαŸ‚αž‘αžΈαž–αžΈαžš αž“αž·αž„αž‘αžΈαž˜αž½αž™αž‚αžΊαžαžΆαžœαžΆαž˜αžΆαž“αž›αŸαžαž€αžΌαžŠαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžαŸ’αž›αžΆαŸ†αž„αž‡αžΆαž„: AES αž’αŸ€αž”αž“αžΉαž„ TKIP αž’αžŸαž“αŸ’αžαž·αžŸαž»αžαŸ” WPA3 αžŠαŸ‚αž›αžŸαŸ’αž˜αž»αž‚αŸ’αžšαžŸαŸ’αž˜αžΆαž‰ αž“αž·αž„αž‡αžΏαž“αž›αžΏαž“αž‡αžΆαž„αž“αŸαŸ‡ αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αž‡αžΆαž”αžŽαŸ’αžαžΎαžšαŸ—αž•αž„αžŠαŸ‚αžšαŸ” αžαžΆαž˜αž‘αŸ’αžšαžΉαžŸαŸ’αžαžΈ αžœαžΆαž’αžΆαž…αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ enterprice CCKM (Cisco Centralized Key Management) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αžŠαŸ‚αž›αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžœαžΆαž‘αŸαŸ”

αž…αŸ†αžŽαž»αž…αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžŠαŸ„αž™αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ MAC αŸ” αž¬αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αŸ†αžŽαž»αž…αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αŸ’αžαž›αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ WEP αž αž½αžŸαžŸαž˜αŸαž™αž“αŸ„αŸ‡ αžαžΆαž˜αž–αž·αžαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž‘αŸ (αžŸαŸ„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŸαŸ„αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”)αŸ” αž™αžΎαž„αž…αžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αž‡αž˜αŸ’αžšαžΎαžŸαžŠαžΌαž…αž‡αžΆ OTHER αŸ”
αžœαžΆαž€αŸαž˜αžΆαž“αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž˜αž½αž™αžŠαŸ‚αž›αž–αŸαž‰αž“αž·αž™αž˜αž“αŸ…αž€αŸ’αž“αž»αž„ wi-fi αžŸαžΆαž’αžΆαžšαžŽαŸˆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž›αžΆαž€αŸ‹αž”αžΆαŸ†αž„ Captive Portal Detection - αžŸαŸ†αžŽαžΎαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžαžΆαž˜αžšαž™αŸˆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αŸ” αž…αŸ†αžŽαž»αž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ‚αž”αž“αŸαŸ‡αž›αŸαž…αž‘αžΎαž„αž…αŸ†αž–αŸ„αŸ‡αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŸαŸ’αž€αŸαž“αžαžΆαž”αžΎαž€αž…αŸ†αž  (αžŠαŸ‚αž›αžœαžΆαž˜αž€αž–αžΈαž…αŸ†αžŽαž»αž…αž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžšαžΆαž„αž€αžΆαž™) αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αž…αžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αž–αž½αž€αžœαžΆαž‡αžΆ OPENαŸ”

αžαž˜αŸ’αž›αŸƒαž‘αžΈαž–αžΈαžšαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αžŽαžΆαž„αžαžΆαž‡αžΆ αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‚αž“αŸ’αž›αžΉαŸ‡. αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž“αŸƒαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαŸ” αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžŸαŸ„αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž™αŸ‰αžΆαž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ” αž…αžΌαžšαž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αŸ” EAP - αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„ WPA-Enterprice αžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹ αž”αŸ’αžšαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αŸ” SAE - αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„ WPA3 αž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹ αž’αž“αŸ‹αž“αžΉαž„αž€αž˜αŸ’αž›αžΆαŸ†αž„ brute αŸ” PSK - αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΌαž‘αŸ…αž”αŸ†αž•αž»αžαžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αŸ” IEEE8021X - αž™αŸ„αž„αžαžΆαž˜αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž’αž“αŸ’αžαžšαž‡αžΆαžαž· (αžαž»αžŸαž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αžΆαŸ†αž‘αŸ’αžšαžŠαŸ„αž™αž‚αŸ’αžšαž½αžŸαžΆαžš WPA)αŸ” OWE (Opportunistic Wireless Encryption) αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αž“αŸƒαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš IEEE 802.11 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αŸ†αžŽαž»αž…αžŠαŸ‚αž›αž™αžΎαž„αž…αžΆαžαŸ‹αžαžΆαž‡αžΆ OPENαŸ” OWE αž’αžΆαž“αžΆαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αžαžΆαž˜αž”αžŽαŸ’αžαžΆαž‰αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžŠαŸ„αž™αž€αžΆαžšαž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžœαžΆαŸ” αž‡αž˜αŸ’αžšαžΎαžŸαž˜αž½αž™αž€αŸαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαŸ‚αžš αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αžŸαŸ„αž…αžΌαž› αžŸαžΌαž˜αž αŸ…αž‡αž˜αŸ’αžšαžΎαžŸαž“αŸαŸ‡αžαžΆ NONEαŸ”

αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αžΈαž”αžΈαž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αŸαž αŸ…αžαžΆαŸ” αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž” β€” αžšαž”αŸ€αž”β€‹αžŠαŸ‚αž›β€‹αž›αŸαžαžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž€αžΆαžšαž–αžΆαžšβ€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αž‰αŸ’αž‡αžΌαž“αŸ” αž…αžΌαžšαž™αžΎαž„αžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαž‡αž˜αŸ’αžšαžΎαžŸαŸ” WEP - αž”αŸ’αžšαžΎ RC4 stream cipher αž‚αž“αŸ’αž›αžΉαŸ‡αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‚αžΊαž‡αžΆαžŸαŸ„αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž” αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž˜αž·αž“αž’αžΆαž…αž‘αž‘αž½αž›αž™αž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž·αž—αž–αž“αŸƒαž€αžΆαžšαž‚αŸ’αžšαžΈαž”αž‘αŸ†αž“αžΎαž”αŸ” TKIP - αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„ WPA, CKIP - αž€αŸ’αž“αž»αž„ WPA2 αŸ” TKIP + CKIP - αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž– WPA αž“αž·αž„ WPA2 αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž–αž†αž”αž‚αŸ’αž“αžΆαžαž™αž€αŸ’αžšαŸ„αž™αŸ”

αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž’αžΆαžαž»αž”αžΈ αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αžƒαžΎαž‰αžŸαž‰αŸ’αž‰αžΆ WEP αž―αž€αŸ„αŸ–

[WEP]

αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαžαžΆαž„αž›αžΎ αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž˜αž·αž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž’αŸ†αž–αžΈαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸ„ αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“ αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž” αžŠαŸ‚αž›αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŠαžΌαž…αž‚αŸ’αž“αžΆαžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ”

αž₯αž‘αžΌαžœαž–αž·αž…αžΆαžšαžŽαžΆαžαž„αŸ’αž€αŸ€αž”αž“αŸαŸ‡αŸ–

[ESS]

αž“αŸαŸ‡ αžšαž”αŸ€αž”αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš Wi-Fi ឬ αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αžŽαŸ’αžαžΆαž‰ Wi-Fi. αž’αŸ’αž“αž€αž’αžΆαž…αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αžšαž”αŸ€αž” BSS (Basic Service Set) - αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αž…αŸ†αžŽαž»αž…αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αžαžΆαž˜αžšαž™αŸˆαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αŸ” αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αŸ” αžαžΆαž˜αž€αŸ’αž”αž½αž“ αž…αŸ†αžŽαž»αž…αž…αžΌαž›αž”αŸ’αžšαžΎαž‚αžΊαžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αž§αž”αž€αžšαžŽαŸαž–αžΈαž”αžŽαŸ’αžαžΆαž‰αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αž½αž€αžœαžΆαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒαžŸαŸ†αžŽαž»αŸ†αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž”αž“αŸ’αžαŸ‚αž˜ - ESS αŸ” αž”αŸ’αžšαž—αŸαž‘ IBSSs (Independent Basic Service Sets) αž”αž„αŸ’αž αžΆαž‰αžαžΆαž§αž”αž€αžšαžŽαŸαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαž”αžŽαŸ’αžαžΆαž‰ Peer-to-Peer αŸ”

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αžƒαžΎαž‰αž‘αž„αŸ‹ WPSαŸ–

[WPS]

WPS (Wi-Fi Protected Setup) αž‚αžΊαž‡αžΆαž–αž·αž’αžΈαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αžΆαž€αŸ‹αž€αžŽαŸ’αžαžΆαž›αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒαž”αžŽαŸ’αžαžΆαž‰ Wi-Fi αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αž‰αŸ’αž…αžΌαž›αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹ 8 αžαž½αž’αž€αŸ’αžŸαžš αž¬αž…αž»αž…αž”αŸŠαžΌαžαž»αž„αž“αŸ…αž›αžΎαžšαŸ‰αŸ„αžαž‘αŸαžšαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αŸ†αžŽαž»αž…αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‡αžΆαž”αŸ’αžšαž—αŸαž‘αž‘αžΈαž˜αž½αž™ αž αžΎαž™αž”αŸ’αžšαž’αž”αŸ‹αž’αžΈαž€αž“αŸαŸ‡αž›αŸαž…αž‘αžΎαž„αž“αŸ…αž‡αžΆαž”αŸ‹αž“αžΉαž„αžˆαŸ’αž˜αŸ„αŸ‡αž…αŸ†αžŽαž»αž…αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αž±αŸ’αž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž αžΎαž™αž”αž·αž‘αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ WPS αŸ” αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆ αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž€αžΌαžŠ PIN 8 αžαŸ’αž‘αž„αŸ‹αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰αžŠαŸ„αž™αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ 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 αž“αž·αž„αž†αž“αŸ’αž‘αŸˆαž€αŸ’αž“αž»αž„αž€αžΆαžš rummage αžαžΆαž˜αžšαž™αŸˆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“ wpa_supplicant.conf αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž”αž‰αŸ’αž…αžΌαž›αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ… αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αžαžΆαž˜αžšαž™αŸˆαžαŸ’αž“αžΆαž€αŸ‹ android.net.wifi.WifiManager.

αžŸαŸ’αž‘αŸ’αžšαžΈαž˜ Egor Ponomarev αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžŠαŸαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž‚αž·αžαžαžΆαž˜αžΆαž“αž’αŸ’αžœαžΈαžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜ αž¬αž€αŸ‚αžαž˜αŸ’αžšαžΌαžœ αžŸαžΌαž˜αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„αž˜αžαž·αž™αŸ„αž”αž›αŸ‹ :)

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹