Wi-Fi iyo soo gaabinta kale oo badan. Sida loo helo xogta ku saabsan Wi-Fi nodes ee codsiga Android adigoon bararin

Maalin maalmaha ka mid ah waxaan u baahday inaan iskaan ka qaado shabakadaha Wi-Fi ee barnaamijyada Android oo aan helo xog faahfaahsan oo ku saabsan meelaha laga galo.

Halkan waxa ay ahayd in aan la kulanno dhibaatooyin dhowr ah: off.Android dukumeenti qaar badan oo ka mid ah fasallada lagu sharraxay waxay noqdeen kuwo laga gooyay (heerka API> 26), taas oo aan ka muuqan; Sharaxaadda waxyaabaha qaar ee dukumeentigu waa mid aad u yar (tusaale ahaan, goobta kartida ee fasalka ScanResult waqtiga qorista, ku dhawaad ​​waxba lama sifayn, inkastoo ay ka kooban tahay xog badan oo muhiim ah). Dhibaatada saddexaad waxay ku jiri kartaa xaqiiqda ah in marka ugu horeysa ee aad u dhowaato Wi-Fi, marka laga reebo akhrinta aragtida iyo dejinta router iyada oo loo marayo localhost, waa inaad wax ka qabataa tiro soo gaabinta ah oo u muuqda mid shakhsi ahaan la fahmi karo. Laakin waxa laga yaabaa in aanay si cad u muuqan sida loo xidhiidhiyo oo loo qaabeeyo (xukunku waa shakhsi waxayna ku xidhan tahay waayo-aragnimadii hore).

Maqaalkani waxa uu ka hadlayaa sida loo helo xog dhamaystiran oo ku saabsan deegaanka Wi-Fi ka Android code iyada oo aan NDK, hacks, laakiin la isticmaalayo oo kaliya API Android iyo fahmaan sida loo fasiro.

Yaynaan dib u dhigin oo bilaabin kood qorista.

1. Abuur mashruuc

Qoraalkan waxaa loogu talagalay kuwa sameeyay mashruuc Android ka badan hal mar, marka waxaan ka tagnay faahfaahinta shaygan. Koodhka hoose waxa lagu soo bandhigi doonaa Kotlin, minSdkVersion=23.

2. Ogolaanshaha gelitaanka

Si aad Wi-Fi ugala shaqeyso arjiga, waxaad u baahan doontaa inaad dhawr ogolaansho ka hesho isticmaalaha. Sida waafaqsan dukumeenti, si aad u sawirto shabakada aaladaha leh noocyada OS ka dib 8.0, marka lagu daro marin u helka daawashada xaalada deegaanka shabakada, waxaad u baahan tahay inaad gasho si aad u bedesho xaalada qalabka Wi-Fi-ga, ama marin u helka isku-duwayaasha (qiyaastii). ama sax). Laga bilaabo nooca 9.0, waa inaad u sheegtaa isticmaalaha labadaba, iyo sidoo kale si cad u codsato isticmaalaha inuu daaro adeegyada goobta. Ha iloobin inaad si xushmad leh ugu sharaxdo isticmaalaha in tani ay tahay rabitaanka Google, oo aanu ahayn rabitaankeena ah inaan basaaso isaga :)

Marka, gudaha AndroidManifest.xml waxaan ku dari doonaa:

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

Iyo koodka ka kooban xidhiidhka Hawsha hadda:

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. Abuur BroadcastReceiver oo ku biir dhacdooyinka cusboonaysiinta xogta ee ku saabsan iskaanka deegaanka shabakadda 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
}

Habka WiFiManager.startScan ee dukumeentigu waxa loo calaameeyay mid ka go'ay tan iyo nooca API 28, laakiin off hanuuniyo waxay soo jeedinaysaa isticmaalkeeda.

Guud ahaan, waxaan helnay liiska walxaha ScanResult.

4. Fiiri ScanResult oo fahan shuruudaha

Aynu eegno qaybo ka mid ah fasalkan oo aynu qeexno waxay ula jeedaan:

SSID - Aqoonsiga Set Service waa magaca shabakada

BSSID - Aqoonsiga Dejinta Adeegga Aasaasiga ah - Cinwaanka MAC ee adabtarada shabakadda (barta Wi-Fi)

heerka - Tusiyaha Xoogga La Helay [dBm (DBm Ruush) - Decibel, awoodda tixraaca 1 mW.] - Tusiyaha xoogga calaamada ee la helay. Wuxuu qiimeeyaa 0 ilaa -100, marka uu ka sii socdo 0, inta badan ee awooda calaamaduhu way luntay jidka laga bilaabo barta Wi-Fi ilaa aaladdaada. Faahfaahin dheeraad ah ayaa laga heli karaa, tusaale ahaan, at Wikipedia. Halkan waxaan kuu sheegi doonaa inaad isticmaasho fasalka Android WifiManager waxaad ku qiyaasi kartaa heerka signalka miisaan ka mid heer sare ah ilaa mid cabsi leh talaabada aad doorato:

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

inta jeer - inta jeer ee hawlgalka ee barta Wi-Fi [Hz]. Marka lagu daro inta jeer ee lafteeda, waxaa laga yaabaa inaad xiisaynayso waxa loogu yeero kanaalka. Dhibc kastaa wuxuu leeyahay daahir hawleed u gaar ah. Waqtiga qorista, tirada ugu caansan ee dhibcaha Wi-Fi waa 2.4 GHz. Laakin, si aad u noqoto mid sax ah, bartu waxa ay macluumaadka ugu gudbisaa talefankaaga iyada oo la adeegsanayo inta jeer ee lambar leh ee u dhaw midka la magacaabay. Tirada kanaalada iyo inta jeer ee u dhiganta habaysan. Tan waxaa loo sameeyaa si ay dhibcaha u dhow u shaqeeyaan si isdaba joog ah, taas oo aan la faragelin midba midka kale oo aan hoos u dhigin xawaaraha iyo tayada gudbinta. Xaaladdan oo kale, dhibcuhu kuma shaqeeyaan hal jeer oo soo noqnoqda, laakiin waxay ku shaqeeyaan tiro tamar ah (parameter channelWidth), oo loo yaqaan ballaca kanaalka. Taasi waa, dhibcooyinka ku shaqeeya agagaarka (oo kaliya maaha kuwo ku xiga, laakiin xitaa 3 naftooda) kanaalada ayaa farageliya midba midka kale. Waxaad ka heli kartaa koodhkan fudud oo faa'iido leh, kaas oo kuu ogolaanaya inaad xisaabiso lambarka kanaalka qiimaha soo noqnoqda ee dhibcaha leh soo noqnoqda 2.4 iyo 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
            }
        }

Awoodaha - goobta ugu xiisaha badan ee falanqaynta, shaqada oo u baahan waqti badan. Halkan "awoodaha" barta waxay ku qoran yihiin laynka. Xaaladdan oo kale, uma baahnid inaad ka raadiso faahfaahinta tarjumaada xargaha dukumeentiga. Waa kuwan tusaalayaal waxa laga yaabaa in sadarkan:

[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. Fahamka soo gaabinta iyo awoodaha falanqaynta

Waxaa xusid mudan in fasalada xirmada android.net.wifi.* lagu isticmaalo daboolka hoostiisa utility Linux ah. wpa_ducsado iyo natiijada wax soo saarka ee goobta kartida waa nuqul ka mid ah goobta calanka marka la sawirayo.

Waxaan u dhaqmi doonaa si joogto ah. Aan marka hore tixgelinno soo saarista qaab kaas oo walxaha ku jira khaanadaha ay kala soocaan calaamad "-":

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

Macnaha kowaad wuxuu qeexayaa waxa loogu yeero. habka xaqiijinta. Taasi waa, waa maxay taxanaha ficillada ay tahay in aaladda iyo barta gelitaanka ay fuliyaan si barta gelitaanka ay u oggolaato in la isticmaalo iyo sida loo xafido culeyska lacag bixinta. Waqtiga qorista boostada, fursadaha ugu caansan waa WPA iyo WPA2, kuwaas oo qalab kasta oo ku xiran si toos ah ama iyada oo loo marayo waxa loogu yeero. Adeegga RADIUS (WPA-Enterprice) waxa uu siinaya erayga sirta ah kanaalka sir ah. Inta badan, barta gelitaanka ee gurigaaga ayaa ku siinaysa xiriir sida nidaamkan qabo. Farqiga u dhexeeya nooca labaad iyo kan koowaad waa inuu leeyahay xaraf ka xoog badan: AES oo ka soo horjeeda TKIP-da aan ammaan ahayn. WPA3, oo aad u adag oo horumarsan, ayaa sidoo kale si tartiib tartiib ah loo soo bandhigay. Aragti ahaan, waxaa jiri kara ikhtiyaar ah xalka ganacsiga ee CCKM (Maareynta Muhiimka ah ee Cisco Central), laakiin waligey lama kulmin.

Meesha gelitaanka ayaa laga yaabaa in loo habeeyey si loogu xaqiijiyo ciwaanka MAC. Ama, haddii barta gelitaanka ay bixiso xogta iyadoo la adeegsanayo algorithm WEP ee duugoobay, markaa dhab ahaantii ma jiraan wax caddayn ah (furaha sirta ah ee halkan waa furaha sirta ah). Waxaan u kala saarnaa xulashooyinka sida kuwa KALE.
Waxa kale oo jira hab caan ku ah wi-fi-ga guud oo leh Qarsoodi Xariirka Qabashada - Codsiga xaqiijinta ee browserka. Qodobbada gelitaanka noocan oo kale ah waxay u muuqdaan iskaanka si furan (kuwaas oo ka soo jeeda aragtida xiriirka jireed). Sidaa darteed, waxaan u kala saarnay inay yihiin FURAN.

Qiimaha labaad waxaa lagu tilmaami karaa sida algorithm maamulka muhiimka ah. Kani waa halbeegga habka xaqiijinta ee kor lagu tilmaamay. Waxa uu ka hadlayaa sida saxda ah ee furayaasha sirta la isu weydaarsado. Aynu tixgelinno fursadaha suurtogalka ah. EAP - oo lagu isticmaalo WPA-Enterprice-ka la sheegay, waxay isticmaashaa xog ururin si loo xaqiijiyo xogta aqoonsiga ee la geliyey. SAE - loo isticmaalo WPA3 horumarsan, oo aad u adkeysi badan u leh xoogga caasinimada. PSK - ikhtiyaarka ugu badan, waxay ku lug leedahay gelida erayga sirta ah iyo gudbinta qaab sir ah. IEEE8021X - marka loo eego heerka caalamiga ah (oo ka duwan kan ay taageeraan qoyska WPA). OWE (Opportunistic Wireless Encryption) waa kordhinta heerka IEEE 802.11 ee dhibcaha aan u kala saarnay OPEN. OWE waxay hubisaa amniga xogta lagu gudbiyo shabakad aan ammaan ahayn iyadoo sir siraysa. Ikhtiyaarka sidoo kale waa suurtogal marka aysan jirin furayaal gelitaan, aynu u yeedhno doorashadan MAYA.

Halbeegga saddexaad waa waxa loogu yeero. nidaamyada sirta - sida saxda ah ee xarafka loo isticmaalo si loo ilaaliyo xogta la gudbiyo. Aan liis gareeyno xulashooyinka. WEP - waxay isticmaashaa xariiqda qulqulka RC4, furaha sirta ah waa furaha sirta ah, kaas oo loo arko inaan la aqbali karin aduunka casriga casriga ah. TKIP - loo isticmaalo WPA, CKIP - gudaha WPA2. TKIP+CKIP - waxaa lagu qeexi karaa dhibco awood u leh WPA iyo WPA2 ee ku habboonaanta gadaal.

Halkii laga heli lahaa saddex walxood, waxaad heli kartaa calaamad WEP ah oo keli ah:

[WEP]

Sida aan kor uga soo hadalnay, tani waa ku filan tahay in aan la cayimin algorithm ee isticmaalka furayaasha, oo aan jirin, iyo habka sirta ah, taas oo la mid ah sida caadiga ah.

Hadda ka fiirso garabkan:

[ESS]

this Habka hawlgalka Wi-Fi ama Wi-Fi network topology. Waxaa laga yaabaa inaad la kulanto qaabka BSS (Adeegyada Aasaasiga ah) - marka ay jirto hal meel oo laga galo oo ay ku wada xiriiraan aaladaha ku xiran. Waxaa laga heli karaa shabakadaha maxalliga ah. Sida caadiga ah, dhibcaha gelitaanka ayaa loo baahan yahay si loogu xiro aaladaha shabakadaha maxalliga ah ee kala duwan, sidaa darteed waxay qayb ka yihiin Adeegga Dheeraadka ah - ESS. Nooca IBSS-yada (Madax-bannaanida Adeegga Aasaasiga ah) ayaa tilmaamaya in qalabku uu qayb ka yahay isku-xidhka Peer-to-Peer.

Waxa kale oo aad arki kartaa calanka WPS:

[WPS]

WPS (Wi-Fi Protected Setup) waa borotokoolka bilawga nus toos ah ee shabakada Wi-Fi. Si loo bilaabo, isticmaaluhu wuxuu galayaa 8-dabeecadood erayga sirta ah ama wuxuu riixaa badhanka router-ka. Haddii barta gelitaankaagu ay tahay nooca koowaad oo sanduuqan uu ka soo muuqdo magaca ku xiga magaca barta gelitaankaaga, waxaa si xoog leh lagugula talinayaa inaad tagto guddiga maamulka oo aad joojiso gelitaanka WPS. Xaqiiqdu waxay tahay in inta badan PIN-ka 8-god ah laga heli karo cinwaanka MAC, ama waxaa lagu xalin karaa wakhti la filan karo, taas oo qof si daacadnimo ah uga faa'iidaysan karo.

6. Samee qaab iyo hawl falanqeyn

Iyada oo ku saleysan waxa aan kor ku ogaannay, waxaan ku tilmaami doonaa waxa dhacay anagoo adeegsanayna fasalada xogta:

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

Hadda aynu qorno hawl kala saari doonta goobta kartida:


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. eeg natiijada

Waan iskaan doonaa shabakada oo waxaan ku tusi doonaa waxaan helay. Waxaa lagu muujiyay natiijooyinka wax soo saarka fudud ee Log.d:

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

Arrinka ku xidhidhiyaha shabakadda ee koodhka codsiga ayaa ahaa mid aan la baadhin. Kaliya waxaan dhihi doonaa si aad u akhrido furaha sirta ah ee la keydiyay ee OS ee aaladda moobiilka, waxaad u baahan tahay xuquuqaha xididka iyo rabitaanka inaad ku dhex gasho nidaamka faylka si aad u akhrido wpa_supplicant.conf. Haddii macquulka codsigu u baahan yahay ka soo gelida erayga sirta ah ee dibadda, xidhiidhka waxaa la samayn karaa iyada oo loo marayo fasalka android.net.wifi.WifiManager.

Бпасибо Egor Ponomarev wax ku kordhin qiimo leh.

Haddii aad u malaynayso in wax loo baahan yahay in lagu daro ama la saxo, ku qor faallooyinka :)

Source: www.habr.com

Add a comment