Wi-Fi ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€. Как Π² Android ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± ΡƒΠ·Π»Π°Ρ… Wi-Fi ΠΈ Π½Π΅ ΠΎΠΏΡƒΡ…Π½ΡƒΡ‚ΡŒ

ΠžΠ΄Π½Π°ΠΆΠ΄Ρ‹ ΠΌΠ½Π΅ понадобилось ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· Android прилоТСния сСти Wi-Fi ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ Π²Ρ‹ΠΊΠ»Π°Π΄ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… доступа.

Π’ΡƒΡ‚ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с нСсколькими трудностями: Π² ΠΎΡ„Ρ„.Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Android ΠΌΠ½ΠΎΠ³ΠΈΠ΅ описанныС классы стали deprecated (API level > 26), Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π±Ρ‹Π»ΠΎ Π² Π½Π΅ΠΉ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ; описаниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π΅Ρ‰Π΅ΠΉ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ минимально (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»Π΅ capabilities класса ScanResult Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания Π½Π΅ описано ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠ°ΠΊ, хотя содСрТит ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…). Π’Ρ€Π΅Ρ‚ΡŒΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ близости с Wi-Fi, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΡ‚ чтСния Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΈ настройки Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π° ΠΏΠΎ localhost, приходится ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ с рядом Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ каТутся понятными ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Но ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡ… соотнСсти ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (суТдСниС ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈ зависит ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΎΠΏΡ‹Ρ‚Π°).

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассмотрСно ΠΊΠ°ΠΊ ΠΈΠ· Android ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Wi-Fi ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Π±Π΅Π· 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"/>

А Π² ΠΊΠΎΠ΄Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ ссылка Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Activity:

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 Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ depricated с вСрсии API 28, Π½ΠΎ ΠΎΡ„Ρ„. guide ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

Π˜Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ScanResult.

4. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ScanResult ΠΈ разбираСмся Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ…

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ поля этого класса ΠΈ опишСм, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚:

SSID β€” Service Set Identifier – это Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сСти

BSSID – Basic Service Set Identifier – MAC адрСс сСтСвого Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Π° (Wi-Fi Ρ‚ΠΎΡ‡ΠΊΠΈ)

level β€” Received Signal Strength Indicator [dBm (русскоС Π΄Π‘ΠΌ) β€” Π”Π΅Ρ†ΠΈΠ±Π΅Π», опорная ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ 1 ΠΌΠ’Ρ‚.] β€” ΠŸΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ уровня ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ³ΠΎ сигнала. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ 0 Π΄ΠΎ -100, Ρ‡Π΅ΠΌ дальшС ΠΎΡ‚ 0, Ρ‚Π΅ΠΌ большС мощности сигнала ΠΏΠΎΡ‚Π΅Ρ€ΡΠ»ΠΎΡΡŒ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ ΠΎΡ‚ Wi-Fi Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ устройству. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ. Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ расскаТу, Ρ‡Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Android класса WifiManager ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°Π΄ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ сигнала ΠΏΠΎ шкалС ΠΎΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π΄ΠΎ уТасного с Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ Π²Π°ΠΌΠΈ шагом:

        val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val numberOfLevels = 5
        val level = WifiManager.calculateSignalLevel(level, numberOfLevels)

frequency β€” частота Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ Wi-Fi [Π“Ρ†]. Помимо самой частоты вас ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠ°Π½Π°Π». Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ Π΅ΡΡ‚ΡŒ своя рабочая чистота. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания тСкста Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярным Π΄ΠΈΠ°ΠΏΠΎΠ·ΠΎΠ½ΠΎΠΌ Wi-Fi Ρ‚ΠΎΡ‡Π΅ΠΊ являСтся 2.4 GHz. Но, Ссли Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½Π΅Π΅, Ρ‚ΠΎΡ‡ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π° ваш Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ Π½Π° ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ частотС, Π±Π»ΠΈΠ·ΠΊΠΎΠΉ ΠΊ Π½Π°Π·Π²Π°Π½Π½ΠΎΠΉ. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ значСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… частот стандартизованы. Π­Ρ‚ΠΎ сдСлано для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ поблизости Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… частотах, Ρ‚Π΅ΠΌ самым Π½Π΅ создавая ΠΏΠΎΠΌΠ΅Ρ…ΠΈ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎ Π½Π΅ пониТая ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ качСство ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ. ΠŸΡ€ΠΈ этом Ρ‚ΠΎΡ‡ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π΅ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ частотС, Π° Π½Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ частот (ΠΏΠ°Ρ€Π΅ΠΌΠ΅Ρ‚Ρ€ channelWidth), Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌ ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ ΠΊΠ°Π½Π°Π»Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° сосСдних (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сосСдних, Π° Π΄Π°ΠΆΠ΅ Π½Π° 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
            }
        }

capabilities β€” Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ интСрСсноС ΠΏΠΎΠ»Π΅ для Π°Π½Π°Π»ΠΈΠ·Π°, Ρ€Π°Π±ΠΎΡ‚Π° с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ΡƒΡ‚ Π² строку Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ «возмоТности» Ρ‚ΠΎΡ‡ΠΊΠΈ. ΠŸΡ€ΠΈ этом подробности ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€ΠΈΡ‚Π°Ρ†ΠΈΠΈ строки Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ. Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π² этой строкС:

[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.* ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ linux-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ wpa_supplicant ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΏΠΎΠ»Π΅ capabilities являСтся ΠΊΠΎΠΏΠΈΠ΅ΠΉ поля flags ΠΏΡ€ΠΈ сканировании.

Π‘ΡƒΠ΄Π΅ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Рассмотрим сначала Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ скобок элСмСнты ΠΎΡ‚Π΄Π΅Π»Π΅Π½Ρ‹ Π·Π½Π°ΠΊΠΎΠΌ «-«:

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

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ описываСт Ρ‚.Π½. ΠΌΠ΅Ρ‚ΠΎΠ΄ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ (authentication). Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий Π΄ΠΎΠ»ΠΆΠ½Ρ‹ произвСсти устройство ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° доступа, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠ° доступа ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° собой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания поста самыС частыС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ это WPA ΠΈ WPA2, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ΅ устройство Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ€Π΅Π· Ρ‚.Π½. RADIUS-сСрвСр (WPA-Enterprice) прСдоставляСт ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΏΠΎ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго Ρƒ вас Π΄ΠΎΠΌΠ° Ρ‚ΠΎΡ‡ΠΊΠ° доступа прСдоставляСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ этой схСмС. ΠžΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ вСрсии ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π² Π±ΠΎΠ»Π΅Π΅Π΅ стойком ΡˆΠΈΡ„Ρ€Π΅: AES ΠΏΡ€ΠΎΡ‚ΠΈΠ² нСбСзопасного TKIP. Π’Π°ΠΊΠΆΠ΅ постСпСнно внСдряСтся WPA3, Π±ΠΎΠ»Π΅Π΅ слоТный ΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΉ. ВСоритичСски ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с enterprice-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ CCKM (Cisco Centralized Key Managment), Π½ΠΎ ΠΌΠ½Π΅ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ встрСтился.

Π’ΠΎΡ‡ΠΊΠ° доступа ΠΌΠΎΠ³Π»Π° Π±Ρ‹Ρ‚ΡŒ настроСна Π½Π° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΏΠΎ MAC-адрСсу. Или, Ссли Ρ‚ΠΎΡ‡ΠΊΠ° доступа прСдоставляСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ WEP, Ρ‚ΠΎ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ фактичСски Π½Π΅Ρ‚ (сСкрСтный ΠΊΠ»ΡŽΡ‡ Ρ‚ΡƒΡ‚ ΠΈ являСтся ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ). Π’Π°ΠΊΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ отнСсСм ΠΊ Ρ‚ΠΈΠΏΡƒ OTHER.
Π•Ρ‰Ρ‘ Π΅ΡΡ‚ΡŒ полюбившийся Π² общСствСнных wi-fi ΠΌΠ΅Ρ‚ΠΎΠ΄ со скрытым Captive Portal Detection β€” запрос Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€. Π’Π°ΠΊΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ доступа выглядят для сканСра ΠΊΠ°ΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ (ΠΊΠ°ΠΊΠΈΠΌΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зраСния физичСского ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ отнСсСм ΠΈΡ… ΠΊ Ρ‚ΠΈΠΏΡƒ OPEN.

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ использования ΠΊΠ»ΡŽΡ‡Π΅ΠΉ (key management). ЯвляСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ написано Π²Ρ‹ΡˆΠ΅. Π“ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ происходит ΠΎΠ±ΠΌΠ΅Π½ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ. Рассмотрим Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. EAP β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² упомянутом WPA-Enterprice, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… для свСрки Π²Π²Π΅Π΄Π΅Π½Ρ‹Ρ… Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. SAE β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΌ WPA3, Π±ΠΎΠ»Π΅Π΅ устойчива ΠΊ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Ρƒ. PSK β€” самый частый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π²Π²ΠΎΠ΄ пароля ΠΈ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ Π² Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. IEEE8021X β€” ΠΏΠΎ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½ΠΎΠΌΡƒ стандарту (ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ ΠΎΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹ΠΌ сСмСйством WPA). OWE (Opportunistic Wireless Encryption) являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ стандарта IEEE 802.11, для Ρ‚ΠΎΡ‡Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ отнСсли ΠΊ Ρ‚ΠΈΠΏΡƒ OPEN. OWE обСспСчиваСт Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΠΎ Π½Π΅Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΉ сСти, Π·Π° счСт ΠΈΡ… ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π²Π°Ρ€ΠΈΠ½Π°Π½Ρ‚ ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΡŽΡ‡Π΅ΠΉ доступа Π½Π΅Ρ‚, Π½Π°Π·ΠΎΠ²Π΅ΠΌ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ NONE.

Π’Ρ€Π΅Ρ‚ΡŒΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ являСтся Ρ‚.Π½. ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ (encryption schemes) β€” ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡˆΠΈΡ„Ρ€ для Π·Π°ΡˆΠΈΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. WEP β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΡˆΠΈΡ„Ρ€ RC4, сСкрСтный ΠΊΠ»ΡŽΡ‡ являСтся ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ, Ρ‡Ρ‚ΠΎ Π² ΠΌΠΈΡ€Π΅ соврСмСнной ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ считаСтся Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹ΠΌ. TKIP β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² WPA, CKIP β€” Π² WPA2. TKIP+CKIP β€” ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ Π² Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… ΡƒΠΌΠ΅ΡŽΡ‰ΠΈΡ… WPA ΠΈ WPA2 для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости.

ВмСсто Ρ‚Ρ€Π΅Ρ… элСмСнтов ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ΠΎΠΊΡƒΡŽ ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΡƒ WEP:

[WEP]

Как ΠΌΡ‹ обсудили Π²Ρ‹ΡˆΠ΅, этого достаточно Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ использования ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Ρ‚, ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ΄Π½ΠΎ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Ρ‚Π°ΠΊΡƒΡŽ скобочку:

[ESS]

Π­Ρ‚ΠΎ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Wi-Fi ΠΈΠ»ΠΈ топология сСтСй Wi-Fi. Π’Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ Π Π΅ΠΆΠΈΠΌ BSS (Basic Service Set) β€” ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° доступа, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ±Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ устройства. МоТно Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ доступа Π½ΡƒΠΆΠ½Ρ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ устройства ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтСй, поэтому ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ Extended Service Sets β€” ESS. Π’ΠΈΠΏ IBSSs (Independent Basic Service Sets) Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ устройство являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Peer-to-Peer сСти.

Π•Ρ‰Ρ‘ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒΡΡ Ρ„Π»Π°Π³ WPS:

[WPS]

WPS (Wi-Fi Protected Setup) β€” ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» полуавтоматичСской ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСти Wi-Fi. Для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π»ΠΈΠ±ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ 8-ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Π»ΠΈΠ±ΠΎ Π·Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π° Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π΅. Если ваша Ρ‚ΠΎΡ‡ΠΊΠ° доступа относится ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΈ этот Ρ„Π»Π°ΠΆΠΎΠΊ высвСтился Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ² ΠΈΠΌΠ΅Π½ΠΈ вашСй Ρ‚ΠΎΡ‡ΠΊΠΈ доступа, Π²Π°ΠΌ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся Π·Π°ΠΉΡ‚ΠΈ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΡƒ ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ доступ ΠΏΠΎ WPS. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ часто 8-Π·Π½Π°Ρ‡Π½Ρ‹ΠΉ PIN ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠΎ MAC-адрСсу, Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ Π·Π° ΠΎΠ±ΠΎΠ·Ρ€ΠΈΠΌΠΎΠ΅ врСмя, Ρ‡Π΅ΠΌ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ нСчистый Π½Π° Ρ€ΡƒΠΊΡƒ смоТСт Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

6. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ модСль ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ парсинга

На основС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ выяснили Π²Ρ‹ΡˆΠ΅ опишСм data-классами Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

/* схСма Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ */
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.
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π΅ capabilities:


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.

Бпасибо Π•Π³ΠΎΡ€Ρƒ ΠŸΠΎΠ½ΠΎΠΌΠ°Ρ€Π΅Π²Ρƒ Π·Π° Ρ†Π΅Π½Π½Ρ‹Π΅ дополнСния.

Если считаСтС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ, ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ πŸ™‚

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ