Wi-Fi ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ ΡΡŠΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΡ. Как Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π·Π° Wi-Fi възли Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Android, Π±Π΅Π· Π΄Π° сС ΠΏΠΎΠ΄ΡƒΠ²Π°Ρ‚Π΅

Π•Π΄ΠΈΠ½ Π΄Π΅Π½ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° сканирам Wi-Fi ΠΌΡ€Π΅ΠΆΠΈ ΠΎΡ‚ Android прилоТСния ΠΈ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° Ρ‚ΠΎΡ‡ΠΊΠΈΡ‚Π΅ Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ.

Π’ΡƒΠΊ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° сС сблъскамС с няколко трудности: ΠΈΠ·ΠΊΠ».ДокумСнтация Π·Π° Android ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚ описанитС класовС станаха остарСли (API Π½ΠΈΠ²ΠΎ > 26), ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ бСшС ΠΎΡ‚Ρ€Π°Π·Π΅Π½ΠΎ Π² Π½Π΅Π³ΠΎ; описаниСто Π½Π° някои Π½Π΅Ρ‰Π° Π² докумСнтацията Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π½Π° класа ScanResult към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‰ΠΎ Π½Π΅ Π΅ описано, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΈ Π΄Π°Π½Π½ΠΈ). Π’Ρ€Π΅Ρ‚Π°Ρ‚Π° трудност ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΊΡ€ΠΈΠ΅ във Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π·Π° ΠΏΡŠΡ€Π²ΠΈ ΠΏΡŠΡ‚ сС Π΄ΠΎΠ±Π»ΠΈΠΆΠΈΡ‚Π΅ Π΄ΠΎ Wi-Fi, освСн Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ тСорията ΠΈ Π΄Π° настроитС Ρ€ΡƒΡ‚Π΅Ρ€Π° Ρ‡Ρ€Π΅Π· localhost, трябва Π΄Π° сС справитС с Ρ€Π΅Π΄ΠΈΡ†Π° ΡΡŠΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΡ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠΈ ΠΏΠΎΠΎΡ‚Π΄Π΅Π»Π½ΠΎ. Но ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ ΠΈ структурирамС (ΠΏΡ€Π΅Ρ†Π΅Π½ΠΊΠ°Ρ‚Π° Π΅ субСктивна ΠΈ зависи ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ΅Π½ ΠΎΠΏΠΈΡ‚).

Π’Π°Π·ΠΈ статия обсъТда ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΈΠ·Ρ‡Π΅Ρ€ΠΏΠ°Ρ‚Π΅Π»Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° Wi-Fi срСдата ΠΎΡ‚ Android ΠΊΠΎΠ΄ Π±Π΅Π· NDK, Ρ…Π°ΠΊΠΎΠ²Π΅, Π½ΠΎ само с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Android API ΠΈ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€Π°Ρ‚Π΅.

НСка Π½Π΅ ΠΎΡ‚Π»Π°Π³Π°ΠΌΠ΅ ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ Π΄Π° пишСм ΠΊΠΎΠ΄.

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

Π’Π°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ° Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са създали ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π·Π° Android ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ вСднъТ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ пропускамС подробноститС Π·Π° Ρ‚ΠΎΠ·ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚. ΠšΠΎΠ΄ΡŠΡ‚ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Ρ‰Π΅ бъдС прСдставСн Π² Kotlin, minSdkVersion=23.

2. Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ

Π—Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с Wi-Fi ΠΎΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Ρ‰Π΅ трябва Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ няколко Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΎΡ‚ потрСбитСля. Π’ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ със докумСнтация, Π·Π° Π΄Π° сканиратС ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π½Π° устройства с вСрсии Π½Π° ОБ слСд 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, Π½ΠΎ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½. Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ.

ΠšΠ°Ρ‚ΠΎ цяло ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ списък с ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ScanResult.

4. ΠŸΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ScanResult ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ условията

НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ някои ΠΏΠΎΠ»Π΅Ρ‚Π° ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ клас ΠΈ Π΄Π° опишСм ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°Ρ‚:

SSID β€” Service Set Identifier Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°

BSSID – Basic Service Set Identifier – MAC адрСс Π½Π° мрСТовия Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ (Wi-Fi Ρ‚ΠΎΡ‡ΠΊΠ°)

Π½ΠΈΠ²ΠΎ β€” Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π° силата Π½Π° получСния сигнал [dBm (Π½Π° руски dBm) β€” Π”Π΅Ρ†ΠΈΠ±Π΅Π», Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π½Π° мощност 1 mW.] β€” Π˜Π½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π·Π° силата Π½Π° получСния сигнал. ΠŸΡ€ΠΈΠ΅ΠΌΠ° стойност ΠΎΡ‚ 0 Π΄ΠΎ -100, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΠΎ-Π΄Π°Π»Π΅Ρ‡Π΅ ΠΎΡ‚ 0, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ мощност Π½Π° сигнала сС Π³ΡƒΠ±ΠΈ ΠΏΠΎ ΠΏΡŠΡ‚Ρ ΠΎΡ‚ Wi-Fi Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π΄ΠΎ Π²Π°ΡˆΠ΅Ρ‚ΠΎ устройство. ΠŸΠΎΠ²Π΅Ρ‡Π΅ подробности ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Wikipedia. Π’ΡƒΠΊ Ρ‰Π΅ Π²ΠΈ ΠΊΠ°ΠΆΠ°, Ρ‡Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ класа Π½Π° Android Wifi Manager ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΈΡ€Π°Ρ‚Π΅ Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° сигнала ΠΏΠΎ скала ΠΎΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Π΄ΠΎ уТасно Π² ΡΡ‚ΡŠΠΏΠΊΠ°Ρ‚Π°, която ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅:

        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. Π Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π½Π° ΡΡŠΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΡΡ‚Π° ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·

Π‘Ρ‚Ρ€ΡƒΠ²Π° си Π΄Π° сС спомСнС, Ρ‡Π΅ класовСтС Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° android.net.wifi.* сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠ°ΠΊΠ° ΠΎΡ‚ ΠΏΠΎΠΌΠΎΡ‰Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π½Π° Linux wpa_supplicant ΠΈ изходният Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π² ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π΅ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° Ρ„Π»Π°Π³ΠΎΠ²Π΅ ΠΏΡ€ΠΈ сканиранС.

Π©Π΅ дСйствамС послСдоватСлно. НСка ΠΏΡŠΡ€Π²ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΈΠ·Ρ…ΠΎΠ΄Π° Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π² скоби са Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈ със Π·Π½Π°ΠΊ β€ž-β€œ:

[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 (Opportunistic Wireless Encryption) Π΅ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π½Π° стандарта IEEE 802.11 Π·Π° Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ класифицирахмС ΠΊΠ°Ρ‚ΠΎ ΠžΠ’Π’ΠžΠ Π•ΠΠ˜. OWE Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π° сигурността Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅, ΠΏΡ€Π΅Π΄Π°Π²Π°Π½ΠΈ ΠΏΡ€Π΅Π· Π½Π΅Π·Π°Ρ‰ΠΈΡ‚Π΅Π½Π° ΠΌΡ€Π΅ΠΆΠ°, ΠΊΠ°Ρ‚ΠΎ Π³ΠΈ ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°. Π’ΡŠΠ·ΠΌΠΎΠΆΠ½Π° Π΅ ΠΈ опция, ΠΊΠΎΠ³Π°Ρ‚ΠΎ няма ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ, Π½Π΅ΠΊΠ° Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ Ρ‚Π°Π·ΠΈ опция НЯМА.

ВрСтият ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π΅ Ρ‚.Π½Π°Ρ€. схСми Π·Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ β€” ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡˆΠΈΡ„ΡŠΡ€ΡŠΡ‚ Π·Π° Π·Π°Ρ‰ΠΈΡ‚Π° Π½Π° ΠΏΡ€Π΅Π΄Π°Π²Π°Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ. НСка ΠΈΠ·Π±Ρ€ΠΎΠΈΠΌ ΠΎΠΏΡ†ΠΈΠΈΡ‚Π΅. WEP - ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° RC4 ΠΏΠΎΡ‚ΠΎΡ‡Π΅Π½ ΡˆΠΈΡ„ΡŠΡ€, сСкрСтният ΠΊΠ»ΡŽΡ‡ Π΅ ΠΊΠ»ΡŽΡ‡ΡŠΡ‚ Π·Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ сС счита Π·Π° Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π² свСта Π½Π° ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ‚Π° криптография. TKIP - ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° сС Π² WPA, CKIP - Π² WPA2. TKIP+CKIP - ΠΌΠΎΠΆΠ΅ Π΄Π° сС посочи Π² Ρ‚ΠΎΡ‡ΠΊΠΈ с Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° WPA ΠΈ WPA2 Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚.

ВмСсто Ρ‚Ρ€ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ самотСн WEP Π·Π½Π°ΠΊ:

[WEP]

ΠšΠ°ΠΊΡ‚ΠΎ ΠΎΠ±ΡΡŠΠ΄ΠΈΡ…ΠΌΠ΅ ΠΏΠΎ-Π³ΠΎΡ€Π΅, Ρ‚ΠΎΠ²Π° Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ, Π·Π° Π΄Π° Π½Π΅ сС ΡƒΠΊΠ°Π·Π²Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΡŠΡ‚ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°, ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΡΡŠΡ‰ΠΈΡΡ‚ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅.

Π‘Π΅Π³Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΉΡ‚Π΅ Ρ‚Π°Π·ΠΈ скоба:

[ESS]

Π’ΠΎ Wi-Fi Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΈΠ»ΠΈ Вопология Π½Π° Wi-Fi ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π°. МоТС Π΄Π° срСщнСтС Ρ€Π΅ΠΆΠΈΠΌ BSS (ОсновСн Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ услуги) - ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠΌΠ° Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ, Ρ‡Ρ€Π΅Π· която ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈΡ‚Π΅ устройства ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠΈΡ€Π°Ρ‚. МоТС Π΄Π° сС Π½Π°ΠΌΠ΅Ρ€ΠΈ Π² Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ‚Π΅ ΠΌΡ€Π΅ΠΆΠΈ. По ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈΡ‚Π΅ Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° устройства ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΌΡ€Π΅ΠΆΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‚Π΅ са част ΠΎΡ‚ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ‚Π΅ Π½Π°Π±ΠΎΡ€ΠΈ ΠΎΡ‚ услуги - ESS. Π’ΠΈΠΏΡŠΡ‚ IBSS (нСзависими основни Π½Π°Π±ΠΎΡ€ΠΈ ΠΎΡ‚ услуги) ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ устройството Π΅ част ΠΎΡ‚ ΠΌΡ€Π΅ΠΆΠ° Peer-to-Peer.

МоТС ΡΡŠΡ‰ΠΎ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ WPS Ρ„Π»Π°Π³Π°:

[WPS]

WPS (Wi-Fi Protected Setup) Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° ΠΏΠΎΠ»ΡƒΠ°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½Π° инициализация Π½Π° Wi-Fi ΠΌΡ€Π΅ΠΆΠ°. Π—Π° Π΄Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°, потрСбитСлят ΠΈΠ»ΠΈ въвСТда ΠΏΠ°Ρ€ΠΎΠ»Π° ΠΎΡ‚ 8 Π·Π½Π°ΠΊΠ°, ΠΈΠ»ΠΈ натиска Π±ΡƒΡ‚ΠΎΠ½ Π½Π° Ρ€ΡƒΡ‚Π΅Ρ€Π°. Ако Π²Π°ΡˆΠ°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΅ ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΈΡ Ρ‚ΠΈΠΏ ΠΈ Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ»Π΅ Π·Π° ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° сС ΠΏΠΎΠΊΠ°Π·Π²Π° Π΄ΠΎ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° Π΄ΠΎΡΡ‚ΡŠΠΏ, силно сС ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π° Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π² административния ΠΏΠ°Π½Π΅Π» ΠΈ Π΄Π° Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ‚Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ WPS. Π€Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ чСсто 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

Π’ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ към ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΎΡ‚ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ остана Π½Π΅Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π½. Π©Π΅ ΠΊΠ°ΠΆΠ° само, Ρ‡Π΅ Π·Π° Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° систСма Π½Π° ΠΌΠΎΠ±ΠΈΠ»Π½ΠΎ устройство, ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΏΡ€Π°Π²Π° Π½Π° root ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄Π° сС Ρ€ΠΎΠ²ΠΈΡ‚Π΅ във Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма, Π·Π° Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ wpa_supplicant.conf. Ако Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ изисква въвСТданС Π½Π° ΠΏΠ°Ρ€ΠΎΠ»Π° ΠΎΡ‚Π²ΡŠΠ½, Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΠΈ ΠΏΡ€Π΅Π· класа android.net.wifi.WifiManager.

Благодаря Π•Π³ΠΎΡ€ ΠŸΠΎΠ½ΠΎΠΌΠ°Ρ€Π΅Π² Π·Π° Ρ†Π΅Π½Π½ΠΈ допълнСния.

Ако смятатС, Ρ‡Π΅ Π½Π΅Ρ‰ΠΎ трябва Π΄Π° сС Π΄ΠΎΠ±Π°Π²ΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°, Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ :)

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€