Wi-Fi uye zvimwe zvipfupiso zvakawanda. Maitiro ekuwana data nezve Wi-Fi node mune Android application pasina kuzvimba

Rimwe zuva ndaida kuongorora maWi-Fi network kubva kuAroid application uye ndiwane ruzivo rwakadzama nezvenzvimbo dzekuwana.

Pano taifanira kutarisana nematambudziko akawanda: off.Android zvinyorwa mazhinji emakirasi akatsanangurwa akave akaderedzwa (API level> 26), iyo isina kuratidzwa mairi; tsananguro yezvimwe zvinhu muzvinyorwa ishoma (semuenzaniso, iyo yekugona ndima yekirasi ScanResult panguva yekunyora, zvinenge hapana chinotsanangurwa, kunyange zvazvo ine zvakawanda zvakakosha data). Dambudziko rechitatu rinogona kunge riri muchokwadi chekuti paunotanga kuswedera pedyo neWi-Fi, kunze kwekuverenga dzidziso uye kumisikidza router kuburikidza ne localhost, iwe unofanirwa kutarisana nenhamba yemapfupiso anoita seanonzwisisika ega. Asi zvinogona kunge zvisiri pachena kuti ungazvibatanidza sei uye nekuzvironga (kutonga kunoenderana uye zvinoenderana nezvakaitika kare).

Ichi chinyorwa chinokurukura nzira yekuwana yakazara data nezve Wi-Fi nharaunda kubva kuAndroid kodhi isina NDK, hacks, asi uchishandisa iyo Android API chete uye unonzwisisa nzira yekuidudzira.

Ngatisanonoke totanga kunyora kodhi.

1. Gadzira chirongwa

Ichi chinyorwa chakagadzirirwa avo vakagadzira Android chirongwa kanopfuura kamwe, saka isu tinosiya ruzivo rwechinhu ichi. Kodhi iri pazasi ichaunzwa muKotlin, minSdkVersion=23.

2. Mvumo yekuwana

Kuti ushande neWi-Fi kubva kuchishandiso, iwe unozofanirwa kuwana akati wandei mvumo kubva kumushandisi. Maererano ne zvinyorwa, kuitira kuti utarise network pamidziyo ine OS shanduro mushure me8.0, mukuwedzera pakuwana kuona mamiriro etiweki nharaunda, iwe unoda kana mukana wekushandura mamiriro eiyo mudziyo weWi-Fi module, kana kuwana kurodha (yakaenzana. kana chaizvo). Kutanga neshanduro 9.0, iwe unofanirwa kukurudzira mushandisi kune ese ari maviri, uye zvakare kukumbira zvakajeka mushandisi kubatidza nzvimbo masevhisi. Usakanganwa kutsanangurira mushandisi kuti uku ndiko kuda kweGoogle, uye kwete chishuwo chedu chekumusora :)

Saka, muAndroidManifest.xml tichawedzera:

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

Uye mune kodhi ine chinongedzo kune chazvino Chiitiko:

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. Gadzira BroadcastReceiver uye unyore kuzviitiko zvekuvandudza data pamusoro pekutarisa nzvimbo yetiweki yeWi-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
}

Nzira yeWiFiManager.startScan mune zvinyorwa inotaridzwa seyakanyimwa kubva paAPI vhezheni 28, asi yakadzimwa. tungamirira inokurudzira kushandisa.

Pakazara, takagamuchira runyoro rwezvinhu ScanResult.

4. Tarisa ScanResult uye unzwisise mazwi

Ngatitarisei mamwe minda yekirasi iyi uye titsanangure zvazvinoreva:

SSID -Sevhisi Seti Identifier izita retiweki

BSSID -Basic Service Set Identifier - MAC kero yetiweki adapta (Wi-Fi poindi)

terama - Yakagamuchira Chiratidzo Chakasimba Chiratidzo [dBm (Russian dBm) - Decibel, simba rekutaura 1 mW.] - Chiratidzo chekugamuchira simba rechiratidzo. Inotora kukosha kubva pa0 kusvika -100, iyo inoenderera kubva ku0, iyo yakawanda chiratidzo chesimba yakarasika munzira kubva paWi-Fi poindi kuenda kune yako kifaa. Mamwe mashoko anogona kuwanikwa, semuenzaniso, pa Wikipedia. Pano ini ndichakuudza kuti kushandisa Android kirasi WifiManager iwe unogona kuenzanisa chiyero chechiratidzo pachiyero kubva kune yakanakisa kusvika kune inotyisa munhanho yaunosarudza:

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

maitikiro - kushanda frequency yeWi-Fi point [Hz]. Pamusoro peiyo frequency pachayo, unogona kufarira iyo inonzi chiteshi. Imwe neimwe pfungwa ine yayo yekushanda kuchena. Panguva yekunyora, iyo inonyanya kufarirwa huwandu hweWi-Fi mapoinzi ndeye 2.4 GHz. Asi, kunyatsojeka, iyo poindi inoendesa ruzivo kufoni yako nenhamba frequency pedyo neiyo yakatumidzwa. Nhamba yezviteshi uye mafambiro anoenderana standardized. Izvi zvinoitwa kuitira kuti mapoinzi ari padyo ashande pane akasiyana mafrequency, nekudaro asingakanganise mumwe nemumwe uye kwete kudzikisira kukurumidza uye kunaka kwekutapurirana. Muchiitiko ichi, mapoinzi anoshanda kwete panguva imwe chete, asi pamusoro pehuwandu hwema frequency (parameter channelWidth), inonzi upamhi hwegwara. Ndiko kuti, mapoinzi anoshanda pane yakatarisana (uye kwete chete padyo, asi kunyange 3 kubva pachavo) nzira dzinopindirana. Unogona kuwana iyi kodhi yakapfava inobatsira, iyo inokutendera kuti uverenge nhamba yechiteshi kubva kune frequency kukosha kwemapoinzi ine frequency ye2.4 uye 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
            }
        }

zvigone - iyo inonyanya kunakidza munda wekuongorora, shanda iyo inoda nguva yakawanda. Pano "mano" epfungwa akanyorwa mumutsara. Muchiitiko ichi, haufanirwe kutsvaga ruzivo rwekududzirwa kwetambo mune zvinyorwa. Heino mimwe mienzaniso yezvingave mumutsara uyu:

[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. Kunzwisisa zvipfupiso uye kugona kupatsanura

Zvakakodzera kuti titaure kuti makirasi eiyo android.net.wifi.* package anoshandiswa pasi pehood neLinux utility. wpa_supplicant uye chinobuda mhedzisiro mumunda kugona ikopi yemireza munda kana scanning.

Tichaita nguva dzose. Ngatitangei titarise mabudiro efomati iyo zvinhu zviri mukati memaparenthesis zvinopatsanurwa ne β€œ-β€œ sign:

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

Chirevo chekutanga chinotsanangura chinonzi. nzira yechokwadi. Ndokureva kuti, ndeapi anoteedzana ezviito izvo mudziyo uye nzvimbo yekupinda iite kuitira kuti nzvimbo yekupinda izvibvumire kushandiswa uye sei encrypt iyo payload. Panguva yekunyora iyi positi, sarudzo dzakajairika ndeye WPA neWPA2, umo imwe neimwe yakabatana mudziyo wakananga kana kuburikidza neinodaidzwa. Iyo RADIUS server (WPA-Enterprice) inopa password pamusoro peiyo encrypted chiteshi. Zvingangodaro, nzvimbo yekupinda mumba mako inopa chinongedzo zvinoenderana nechirongwa ichi. Musiyano uripo pakati peyechipiri vhezheni neyekutanga ndeyekuti ine cipher yakasimba: AES maringe neTKIP isina kuchengeteka. WPA3, iyo yakanyanya kuoma uye yepamusoro, zvakare iri kuiswa zvishoma nezvishoma. Nechepfungwa, panogona kunge paine sarudzo ine bhizinesi mhinduro CCKM (Cisco Centralized Key Management), asi ini handisati ndambosangana nazvo.

Nzvimbo yekupinda inogona kunge yakagadziridzwa kuti ive chokwadi neMAC kero. Kana, kana nzvimbo yekuwana ichipa data uchishandisa yekare WEP algorithm, saka hapana chaicho chechokwadi (kiyi yakavanzika pano ndiyo kiyi yekuvharira). Isu tinoisa sarudzo dzakadai seZVIMWE.
Kune zvakare nzira inozivikanwa mune yeruzhinji wi-fi ine yakavanzika Captive Portal Detection - chikumbiro chechokwadi kuburikidza nebrowser. Mapoinzi ekuwana akadai anoonekwa kune scanner seakavhurika (izvo zvavari kubva pakuona kwekubatana kwemuviri). Naizvozvo, tinoaronga seVAKAZARURWA.

Chechipiri kukosha kunogona kutsanangurwa se key management algorithm. Iyi ndiyo parameter yenzira yechokwadi inotsanangurwa pamusoro apa. Inotaura nezve chaizvo makiyi encryption anotsinhaniswa. Ngationei zvingasarudzwa. EAP - inoshandiswa mune yakataurwa WPA-Enterprice, inoshandisa dhatabhesi kuratidza yakapinda yechokwadi data. SAE - inoshandiswa mune yepamberi WPA3, yakanyanya kurwisa kune brute force. PSK - iyo yakajairika sarudzo, inosanganisira kuisa password uye kuitumira mune encrypted fomu. IEEE8021X - zvinoenderana neyakajairwa pasi rose (yakasiyana neinotsigirwa nemhuri yeWPA). OWE (Opportunistic Wireless Encryption) ndeyekuwedzeredzwa kweIEEE 802.11 mwero wemapoinzi atakaisa OPEN. OWE inova nechokwadi chekuchengetedza data inofambiswa pane isina kuchengetedzwa network nekuinyora. Sarudzo inogoneka zvakare kana pasina makiyi ekupinda, ngatifonere iyi sarudzo HAPANA.

Yechitatu parameter ndiyo inonzi. encryption zvirongwa - sei chaizvo cipher inoshandiswa kuchengetedza data rakafambiswa. Ngatinyorei zvingasarudzwa. WEP - inoshandisa RC4 rukova cipher, kiyi yakavanzika ndeye encryption kiyi, iyo inonzi isingagamuchirwe munyika yemazuva ano cryptography. TKIP - inoshandiswa muWPA, CKIP - muWPA2. TKIP+CKIP - inogona kutsanangurwa mumapoinzi anokwanisa WPA neWPA2 yekudzokera kumashure.

Panzvimbo pezvinhu zvitatu, unogona kuwana wakasurukirwa WEP mamaki:

[WEP]

Sezvatakakurukura pamusoro apa, izvi zvakakwana kuti tisatsanangure algorithm yekushandisa makiyi, iyo isipo, uye iyo encryption nzira, iyo yakafanana neyakagadzika.

Zvino funga chibatiso ichi:

[ESS]

ichi Wi-Fi inoshanda mode kana Wi-Fi network topology. Unogona kusangana neBSS (Basic Service Set) modhi - kana paine imwe nzvimbo yekuwana iyo yakabatana michina inotaurirana. Inogona kuwanikwa pamanetiweki emuno. Semutemo, nzvimbo dzekuwana dzinodiwa kubatanidza zvishandiso kubva kune akasiyana ma network, saka iwo ari chikamu cheAkawedzera Service Sets - ESS. Iyo IBSSs (Independent Basic Service Sets) mhando inoratidza kuti chishandiso chikamu chePeer-to-Peer network.

Iwe unogona zvakare kuona iyo WPS mureza:

[WPS]

WPS (Wi-Fi Protected Setup) iprotocol yehafu-otomatiki yekutanga yeWi-Fi network. Kuti utange, mushandisi anoisa 8-character password kana kudzvanya bhatani pane router. Kana nzvimbo yako yekupinda iri yerudzi rwekutanga uye bhokisi iri rekutarisa richioneka padivi pezita renzvimbo yako yekuwana, unokurudzirwa zvikuru kuti uende kune admin panel uye wodzima kupinda kweWPS. Icho chokwadi ndechekuti kazhinji iyo 8-manhamba PIN inogona kuwanikwa neMAC kero, kana inogona kugadziriswa munguva inofanoona, iyo mumwe munhu asina kutendeseka anogona kutora mukana.

6. Gadzira muenzaniso uye kupatsanura basa

Kubva pane zvatakawana pamusoro, tichatsanangura zvakaitika tichishandisa makirasi edata:

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

Zvino ngatinyorei basa rinozoparura nzvimbo yekugona:


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. Ona mhedzisiro

Ini ndichatarisa network uye ndikuratidze zvandawana. Inoratidzwa mhedzisiro yekubuda nyore kuburikidza neLog.d:

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

Nyaya yekubatanidza kune network kubva kukodhi yekushandisa yakaramba isina kuongororwa. Ini ndinongotaura kuti kuti uverenge mapassword akachengetwa kubva kuOS yenharembozha, iwe unoda kodzero dzemidzi uye kuda kutsvagurudza kuburikidza nefaira system kuverenga wpa_supplicant.conf. Kana iyo logic yekushandisa ichida kuisa password kubva kunze, kubatana kunogona kuitwa kuburikidza nekirasi android.net.wifi.WifiManager.

Бпасибо Egor Ponomarev pakuwedzera kwakakosha.

Kana iwe uchifunga kuti chimwe chinhu chinoda kuwedzerwa kana kugadziriswa, nyora mumashoko :)

Source: www.habr.com

Voeg