Wi-Fi ug uban pang mga minubo. Giunsa pagkuha ang datos bahin sa mga node sa Wi-Fi sa usa ka aplikasyon sa Android nga dili mohubag

Usa ka adlaw kinahanglan nako nga i-scan ang mga Wi-Fi network gikan sa mga aplikasyon sa Android ug makakuha og detalyado nga datos bahin sa mga access point.

Dinhi kinahanglan namon nga atubangon ang daghang mga kalisud: off.Android nga dokumentasyon daghan sa gihulagway nga mga klase nahimong wala na magamit (API level > 26), nga wala makita niini; ang paghulagway sa pipila ka mga butang sa dokumentasyon gamay ra (pananglitan, ang mga kapabilidad nga natad sa klase ScanResulta sa panahon sa pagsulat, halos walay gihulagway, bisan tuod kini adunay daghang importante nga datos). Ang ikatulo nga kalisud mahimo’g naa sa kamatuoran nga kung una ka nga nakaduol sa Wi-Fi, gawas sa pagbasa sa teorya ug pag-set up sa router pinaagi sa localhost, kinahanglan nimo nga atubangon ang daghang mga minubo nga ingon masabtan nga tinagsa. Apan dili kini klaro kung giunsa kini pag-asoy ug istruktura (ang paghukom kay suhetibo ug nagdepende sa miaging kasinatian).

Gihisgutan sa kini nga artikulo kung giunsa pagkuha ang komprehensibo nga datos bahin sa palibot sa Wi-Fi gikan sa code sa Android nga wala’y NDK, mga hack, apan gigamit ra ang Android API ug nasabtan kung giunsa kini paghubad.

Dili na ta maglangan ug sugod sa pagsulat og code.

1. Paghimo og proyekto

Kini nga nota gituyo alang sa mga naghimo sa usa ka proyekto sa Android labaw pa sa kausa, mao nga wala namon ang mga detalye niini nga butang. Ang code sa ubos ipresentar sa Kotlin, minSdkVersion=23.

2. Mga permiso sa pag-access

Aron magamit ang Wi-Fi gikan sa aplikasyon, kinahanglan nimo nga makakuha daghang mga pagtugot gikan sa tiggamit. Subay sa dokumentasyon, aron ma-scan ang network sa mga aparato nga adunay mga bersyon sa OS pagkahuman sa 8.0, dugang sa pag-access sa pagtan-aw sa kahimtang sa palibot sa network, kinahanglan nimo ang pag-access aron mabag-o ang kahimtang sa module sa Wi-Fi sa aparato, o pag-access sa mga coordinate (gibanabana nga o eksakto). Sugod sa bersyon 9.0, kinahanglan nimo nga i-aghat ang tiggamit alang sa duha, ug klaro usab nga hangyoon ang tiggamit nga i-on ang mga serbisyo sa lokasyon. Ayaw kalimti ang maisugon nga pagpatin-aw sa tiggamit nga kini ang kapritso sa Google, ug dili ang among tinguha sa pagpaniid kaniya :)

Busa, sa AndroidManifest.xml atong idugang:

    <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"/>

Ug sa code nga adunay usa ka link sa karon nga Kalihokan:

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. Paghimo og BroadcastReceiver ug pag-subscribe sa mga panghitabo sa pag-update sa datos mahitungod sa pag-scan sa palibot sa Wi-Fi network

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
}

Ang pamaagi sa WiFiManager.startScan sa dokumentasyon gimarkahan nga gitangtang sukad sa bersyon sa API 28, apan wala. sa paggiya nagsugyot sa paggamit niini.

Sa kinatibuk-an, nakadawat kami usa ka lista sa mga butang ScanResulta.

4. Tan-awa ang ScanResult ug sabta ang mga termino

Atong tan-awon ang pipila ka mga natad niini nga klase ug ihulagway kung unsa ang gipasabut niini:

SSID β€” Ang Service Set Identifier mao ang ngalan sa network

BSSID - Basic Service Set Identifier - MAC address sa network adapter (Wi-Fi point)

nga ang-ang β€” Nadawat nga Signal Strength Indicator [dBm (Russian dBm) β€” Decibel, reference power 1 mW.] β€” Usa ka timailhan sa nadawat nga kusog sa signal. Nagkuha usa ka kantidad gikan sa 0 hangtod -100, labi pa gikan sa 0, mas daghang gahum sa signal ang nawala sa dalan gikan sa punto sa Wi-Fi hangtod sa imong aparato. Dugang nga mga detalye makita, pananglitan, sa Wikipedia. Dinhi isulti ko kanimo nga gamit ang klase sa Android WifiManager mahimo nimong i-calibrate ang lebel sa signal sa usa ka sukod gikan sa maayo hangtod sa makalilisang sa lakang nga imong gipili:

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

frequency β€” frequency sa pag-operate sa Wi-Fi point [Hz]. Gawas pa sa frequency mismo, mahimong interesado ka sa gitawag nga channel. Ang matag punto adunay kaugalingon nga kaputli sa operasyon. Sa panahon sa pagsulat, ang labing popular nga range sa Wi-Fi points mao ang 2.4 GHz. Apan, aron mahimong mas tukma, ang punto nagpadala sa impormasyon sa imong telepono sa usa ka numero nga frequency duol sa usa nga ginganlan. Gidaghanon sa mga kanal ug katugbang nga mga frequency gi-standardize. Gihimo kini aron ang duol nga mga punto molihok sa lain-laing mga frequency, sa ingon dili makabalda sa usag usa ug dili mutually pagkunhod sa gikusgon ug kalidad sa transmission. Sa kini nga kaso, ang mga punto naglihok dili sa usa ka frequency, apan sa usa ka lain-laing mga frequency (parameter channelWidth), gitawag nga channel width. Kana mao, ang mga punto nga naglihok sa kasikbit (ug dili lamang kasikbit, apan bisan ang 3 gikan sa ilang kaugalingon) nga mga kanal makabalda sa usag usa. Mahimo nimong makit-an nga mapuslanon kining yano nga code, nga nagtugot kanimo sa pagkalkulo sa numero sa channel gikan sa frequency nga kantidad alang sa mga punto nga adunay frequency nga 2.4 ug 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
            }
        }

Kapabilidad - ang labing makapaikag nga natad alang sa pagtuki, pagtrabaho nga nanginahanglan daghang oras. Dinhi ang "kapabilidad" sa punto gisulat sa linya. Sa kini nga kaso, dili nimo kinahanglan pangitaon ang mga detalye sa paghubad sa string sa dokumentasyon. Ania ang pipila ka mga pananglitan kung unsa ang mahimo sa kini nga linya:

[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. Pagsabot sa mga minubo ug mga kapabilidad sa pag-parse

Angay nga hisgutan nga ang mga klase sa android.net.wifi.* nga pakete gigamit sa ilawom sa hood sa usa ka utility sa Linux wpa_supplicant ug ang resulta sa output sa kapabilidad field usa ka kopya sa flags field sa dihang mag-scan.

Kita molihok nga makanunayon. Atong hisgotan una ang output sa usa ka format diin ang mga elemento sa sulod sa parentesis gibulag sa usa ka "-" nga timaan:

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

Ang unang kahulogan naghulagway sa gitawag nga. pamaagi sa pag-authenticate. Sa ato pa, unsa nga pagkasunod-sunod sa mga aksyon ang kinahanglan nga buhaton sa aparato ug ang access point aron ang access point tugutan ang kaugalingon nga magamit ug kung giunsa ang pag-encrypt sa payload. Sa panahon sa pagsulat niini nga post, ang labing komon nga mga kapilian mao ang WPA ug WPA2, diin ang matag konektado nga device direkta o pinaagi sa gitawag nga. Ang RADIUS server (WPA-Enterprice) naghatag sa password sa usa ka encrypted channel. Lagmit, ang access point sa imong balay naghatag og koneksyon sumala niini nga laraw. Ang kalainan tali sa ikaduha nga bersyon ug sa una mao nga kini adunay mas lig-on nga cipher: AES batok sa dili sigurado nga TKIP. Ang WPA3, nga mas komplikado ug abante, anam-anam usab nga gipaila. Sa teoriya, mahimo nga adunay usa ka kapilian sa solusyon sa enterprice CCKM (Cisco Centralized Key Management), apan wala pa nako kini makit-an.

Ang access point mahimong na-configure aron ma-authenticate pinaagi sa MAC address. O, kung ang access point naghatag ug data gamit ang outdated WEP algorithm, nan walay tinuod nga authentication (ang sekreto nga yawe dinhi mao ang encryption key). Giklasipikar namo ang ingon nga mga kapilian ingon UBAN.
Adunay usab usa ka pamaagi nga sikat sa publiko nga wi-fi nga adunay gitago nga Captive Portal Detection - usa ka hangyo sa pag-authenticate pinaagi sa usa ka browser. Ang ingon nga mga access point makita sa scanner nga bukas (nga gikan sa punto sa pagtan-aw sa pisikal nga koneksyon). Busa, giklasipikar namo sila isip OPEN.

Ang ikaduha nga kantidad mahimong itudlo ingon yawe sa pagdumala algorithm. Kini usa ka parameter sa pamaagi sa pag-authenticate nga gihulagway sa ibabaw. Naghisgot bahin sa eksakto kung giunsa pagbaylo ang mga yawe sa pag-encrypt. Atong tagdon ang posibleng mga kapilian. EAP - gigamit sa nahisgutang WPA-Enterprice, naggamit ug database aron mapamatud-an ang gisulod nga data sa pag-authenticate. SAE - gigamit sa advanced WPA3, mas makasugakod sa brute force. PSK - ang labing komon nga kapilian, naglakip sa pagsulod sa usa ka password ug sa pagpadala niini sa encrypted nga porma. IEEE8021X - sumala sa internasyonal nga sumbanan (lahi sa gisuportahan sa pamilyang WPA). Ang OWE (Opportunistic Wireless Encryption) usa ka extension sa IEEE 802.11 nga sumbanan alang sa mga punto nga among giklasipikar nga OPEN. Gisiguro sa OWE ang seguridad sa datos nga gipasa sa usa ka dili sigurado nga network pinaagi sa pag-encrypt niini. Posible usab ang usa ka kapilian kung wala’y mga yawe sa pag-access, tawgon naton kini nga kapilian nga WALA.

Ang ikatulo nga parameter mao ang gitawag nga. mga laraw sa pag-encrypt β€” kung unsa gyud ang gigamit sa cipher aron mapanalipdan ang gipasa nga datos. Atong ilista ang mga kapilian. WEP - naggamit sa RC4 stream cipher, ang sekreto nga yawe mao ang encryption key, nga giisip nga dili madawat sa kalibutan sa modernong cryptography. TKIP - gigamit sa WPA, CKIP - sa WPA2. TKIP+CKIP - mahimong espesipiko sa mga punto nga makahimo sa WPA ug WPA2 alang sa atras nga pagkaangay.

Imbis nga tulo ka elemento, makit-an nimo ang usa ka kamingaw nga marka sa WEP:

[WEP]

Sama sa atong gihisgutan sa ibabaw, kini igo nga dili itakda ang algorithm sa paggamit sa mga yawe, nga wala maglungtad, ug ang pamaagi sa pag-encrypt, nga parehas sa default.

Karon hunahunaa kini nga bracket:

[ESS]

kini Wi-Fi operating mode o Topolohiya sa Wi-Fi network. Mahimo nimong masugatan ang BSS (Basic Service Set) mode - kung adunay usa ka access point diin ang konektado nga mga aparato nakigsulti. Makita sa mga lokal nga network. Ingon sa usa ka lagda, ang mga access point gikinahanglan aron makonektar ang mga device gikan sa lain-laing mga lokal nga network, mao nga sila kabahin sa Extended Service Sets - ESS. Ang tipo sa IBSS (Independent Basic Service Sets) nagpakita nga ang device kabahin sa usa ka Peer-to-Peer network.

Mahimo usab nimo makita ang bandila sa WPS:

[WPS]

Ang WPS (Wi-Fi Protected Setup) usa ka protocol alang sa semi-awtomatikong pagsugod sa usa ka Wi-Fi network. Sa pagsugod, ang user mahimong mosulod sa usa ka 8-character nga password o mopilit sa usa ka buton sa router. Kung ang imong access point mao ang una nga tipo ug kini nga checkbox makita sunod sa ngalan sa imong access point, kusganon ka nga girekomenda nga moadto sa admin panel ug i-disable ang WPS access. Ang kamatuoran mao nga sa kasagaran ang 8-digit nga PIN mahimong makit-an pinaagi sa MAC address, o mahimo kini nga masulbad sa usa ka makit-an nga panahon, nga mahimong mapahimuslan sa usa ka tawo nga dili matinud-anon.

6. Paghimo ug modelo ug parsing function

Base sa among nahibal-an sa ibabaw, among ihulagway kung unsa ang nahitabo gamit ang mga klase sa datos:

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

Karon magsulat kita og usa ka function nga mag-parse sa mga kapabilidad nga field:


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. Tan-awa ang resulta

I-scan ko ang network ug ipakita kanimo kung unsa ang akong nakit-an. Gipakita ang mga resulta sa yano nga output pinaagi sa Log.d:

Capability of Home-Home [WPA2-PSK-CCMP][ESS][WPS]
...
capabilities=[Capability(authScheme=WPA2, keyManagementAlgorithm=PSK, cipherMethod=CCMP)], topologyMode=ESS, availableWps=true

Ang isyu sa pagkonektar sa network gikan sa aplikasyon code nagpabilin nga wala masusi. Isulti ra nako nga aron mabasa ang mga na-save nga password gikan sa OS sa usa ka mobile device, kinahanglan nimo ang mga katungod sa gamut ug kaandam sa pag-usisa sa file system aron mabasa ang wpa_supplicant.conf. Kung ang lohika sa aplikasyon nanginahanglan pagsulod sa usa ka password gikan sa gawas, ang koneksyon mahimo pinaagi sa klase android.net.wifi.WifiManager.

Бпасибо Egor Ponomarev alang sa bililhon nga mga pagdugang.

Kung sa imong hunahuna adunay kinahanglan nga idugang o gitul-id, isulat sa mga komento :)

Source: www.habr.com

Idugang sa usa ka comment