Wi-Fi me te maha atu o nga whakapoto. Me pehea te tiki raraunga mo nga pona Wi-Fi i roto i te tono Android me te kore e pupuhi

I tetahi ra i hiahia ahau ki te matawai i nga whatunga Wi-Fi mai i nga tono Android me te tiki raraunga taipitopito mo nga waahi uru.

I konei ka pa ki a matou etahi raruraru: off.Tuhinga Android he maha nga karaehe kua whakaahuatia kua kore e whakamahia (taumata API > 26), kaore i kitea ki roto; he iti noa te whakaahuatanga o etahi mea i roto i nga tuhinga (hei tauira, te mara kaha o te karaehe Hua Matawai i te wa e tuhi ana, kaore he mea e whakaahuahia ana, ahakoa he maha nga korero nui). Ko te toru o nga uaua kei roto i te meka ka tata koe ki te Wi-Fi, i tua atu i te panui i te ariā me te whakatu i te pouara ma te localhost, me mahi koe ki te maha o nga whakapototanga e ahua marama ana takitahi. Engari kare pea i te tino marama me pehea te hono me te hanga i aua mea (he mea whai take te whakawakanga me te whakawhirinaki ki nga wheako o mua).

Ko tenei tuhinga e korero ana me pehea te whiwhi raraunga matawhānui mo te taiao Wi-Fi mai i te waehere Android me te kore NDK, hacks, engari ma te whakamahi noa i te API Android me te mohio ki te whakamaori.

Kaua e whakaroa ka timata ki te tuhi waehere.

1. Hangaia he kaupapa

Ko tenei tuhipoka mo te hunga kua hanga i tetahi kaupapa Android neke atu i te kotahi, na ka waiho e matou nga korero mo tenei mea. Ko te waehere i raro nei ka whakaatuhia ki Kotlin, minSdkVersion=23.

2. Whakaaetanga uru

Hei mahi me Wi-Fi mai i te tono, me whiwhi koe i nga whakaaetanga maha mai i te kaiwhakamahi. E ai ki tuhinga, hei matawai i te whatunga i runga i nga taputapu me nga putanga OS i muri i te 8.0, i tua atu i te uru ki te tiro i te ahua o te taiao whatunga, me uru koe ki te whakarereke i te ahua o te waahanga Wi-Fi o te taputapu, te uru ranei ki nga taunga (tata tika ranei). Ka timata mai i te putanga 9.0, me akiaki koe i te kaiwhakamahi mo nga mea e rua, me te tono ano hoki ki te kaiwhakamahi ki te whakahoe i nga ratonga waahi. Kaua e wareware ki te whakamaarama maia ki te kaiwhakamahi ko te hiahia tenei a Google, ehara i te hiahia ki te tutei i a ia :)

Na, i roto i te AndroidManifest.xml ka taapirihia e matou:

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

I roto i te waehere kei roto he hono ki te Mahi o naianei:

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. Waihangahia he BroadcastReceiver me te ohauru ki nga huihuinga whakahou raraunga mo te matawai i te taiao whatunga 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
}

Ko te tikanga WiFiManager.startScan i roto i nga tuhinga kua tohua kua whakakorehia mai i te putanga API 28, engari kua mutu. ārahi e whakaaro ana kia whakamahia.

I te katoa, i whiwhi matou i te rarangi o nga taonga Hua Matawai.

4. Tirohia te ScanResult ka mohio ki nga kupu

Ka titiro tatou ki etahi mara o tenei karaehe me te whakaahua he aha te tikanga:

SSID — Ko te Tautuhi Tautuhi Ratonga te ingoa o te whatunga

BSSID – Tautuhi Tautuhi Ratonga Taketake – Wāhitau MAC o te urutau whatunga (Whi-Fi tohu)

taumata — Tohu Tohu Tohu Kua riro [dBm (Russian dBm) — Decibel, mana tohutoro 1 mW.] — He tohu mo te kaha tohu kua riro. Ka tangohia te uara mai i te 0 ki te -100, ka neke atu i te 0, ka nui ake te mana tohu i ngaro i te huarahi mai i te tohu Wi-Fi ki to taputapu. Ka kitea etahi atu korero, hei tauira, i Wikipedia. I konei ka korero ahau ki a koe ma te whakamahi i te akomanga Android Kaiwhakahaere Wifi Ka taea e koe te whakatika i te taumata tohu i runga i te tauine mai i te pai ki te whakamataku i roto i te taahiraa e whiriwhiria e koe:

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

auau — auau mahi o te ira Wi-Fi [Hz]. I tua atu i te auau ake, ka aro pea koe ki te hongere e kiia nei. Kei ia waahi tona ake maatanga whakahaere. I te wa e tuhi ana, ko te awhe tino rongonui o nga tohu Wi-Fi ko 2.4 GHz. Engari, kia tika ake, ka tukuna e te tohu nga korero ki to waea i te auau tau tata ki te ingoa kua whakaingoatia. Te maha o nga hongere me nga iarere e rite ana kua whakaritea. Ka mahia tenei kia mahi nga waahi tata ki nga iarere rereke, kia kore ai e pokanoa tetahi ki tetahi me te kore e whakaiti i te tere me te kounga o te tuku. I tenei keehi, kaore nga tohu e mahi i te waa kotahi, engari i runga i te whānuitanga o nga iarere (tawhā hongereWidth), ka kiia ko te whanui hongere. Arā, ko nga tohu e mahi ana i runga i te taha (kaore i te taha tata, engari ko te 3 mai i a raatau ano) ka raru tetahi ki tetahi. Ka whai hua pea tenei waehere ngawari, ka taea e koe te tatau i te tau hongere mai i te uara auau mo nga tohu 2.4 me te 5 Ghz te auau:


    /* по частоте определяем номер канала */
    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
            }
        }

āheinga - te mara tino pai mo te tātaritanga, mahi me te roa o te waa. I konei ka tuhia nga "kaha" o te tohu ki te rarangi. I tenei keehi, kaore koe e rapu mo nga korero mo te whakamaori aho i roto i nga tuhinga. Anei etahi tauira o nga mea kei roto i tenei rarangi:

[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. Te mohio ki nga whakapoto me te kaha ki te poroporoaki

He mea tika kia whakahuahia ko nga karaehe o te kete android.net.wifi.* kei te whakamahia i raro i te awhi e tetahi taputapu Linux. wpa_supplicant a ko te hua putanga i roto i te mara kaha he kape o te mara haki ina matawai.

Ka mahi tonu tatou. Me whakaaro tuatahi tatou ki te whakaputanga o te whakatakotoranga e wehea ai nga huānga o roto reu ma te tohu “-“:

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

Ko te tikanga tuatahi e whakaatu ana i nga mea e kiia nei. tikanga motuhēhēnga. Arā, he aha te raupapa o nga mahi e tika ana kia mahia e te taputapu me te waahi uru kia taea ai e te waahi uru te whakamahi me pehea te whakamuna i te utu. I te wa e tuhi ana i tenei panui, ko nga whiringa tino noa ko te WPA me te WPA2, kei roto i ia taputapu hono tika, ma roto ranei i nga mea e kiia nei. Ko te tūmau RADIUS (WPA-Enterprice) e whakarato ana i te kupuhipa i runga i te hongere whakamunatia. Ko te nuinga o te waa, ko te waahi uru ki to kaainga ka tuku hononga e ai ki tenei kaupapa. Ko te rereketanga i waenga i te putanga tuarua me te tuatahi, he kaha ake tana cipher: AES me te TKIP kore haumaru. Ko te WPA3, he uaua ake, he matatau hoki, kei te whakauru haeretia. Ko te tikanga, tera pea he whiringa me te otinga hinonga CCKM (Cisco Centralized Key Management), engari kare ano au i kite.

I whirihora pea te waahi uru ki te whakamotuhēhē mā te wāhitau MAC. Ranei, ki te whakarato raraunga te waahi uru ma te whakamahi i te WEP algorithm tawhito, karekau he motuhēhēnga (ko te kī ngaro kei konei ko te kī whakamunatanga). Ka whakarōpūtia e matou nga whiringa penei i ATU.
He tikanga ano e rongonui ana i roto i te wi-fi a te iwi me te hunanga Captive Portal Detection - he tono motuhēhēnga mā te pūtirotiro. Ko enei waahi uru ka puta ki te matawai he tuwhera (he mea mai i te tirohanga o te hononga tinana). Na reira, ka whakarōpūtia e matou hei OPEN.

Ko te uara tuarua ka taea te tohu hei hātepe whakahaere matua. He tawhā tenei o te tikanga motuhēhēnga i whakaahuatia i runga ake nei. Ka korero mo te ahua o te whakawhiti i nga taviri whakamunatanga. Kia whakaarohia nga whiringa ka taea. EAP - ka whakamahia i roto i te WPA-Enterprice kua whakahuahia, ka whakamahi i te papaunga raraunga hei manatoko i nga raraunga whakamotuhēhēnga kua whakauruhia. SAE - whakamahia i roto i te WPA3 matatau, he kaha ake ki te kaha kaha. PSK - te kōwhiringa tino noa, ko te whakauru i te kupuhipa me te tuku i te puka whakamunatia. IEEE8021X - e ai ki te paerewa o te ao (he rereke ki tera e tautokohia ana e te whanau WPA). Ko te OWE (Opportunistic Wireless Encryption) he toronga o te paerewa IEEE 802.11 mo nga tohu i tohua e matou hei OPEN. Ka whakarite a OWE i te haumarutanga o nga raraunga ka tukuna i runga i te whatunga kore haumaru ma te whakamuna. Ka taea hoki te kowhiri ina karekau he taviri uru, me karanga tenei kowhiria KORE.

Ko te tawhā tuatoru ko te mea e kiia ana. kaupapa whakamunatanga — me pehea te whakamahi o te cipher hei tiaki i nga raraunga tuku. Kia whakarārangihia ngā kōwhiringa. WEP - ka whakamahi i te RC4 stream cipher, ko te matua huna ko te matua whakamunatanga, e kiia ana kaore e whakaaetia i roto i te ao o te whakamunatanga hou. TKIP - whakamahia i WPA, CKIP - i WPA2. TKIP+CKIP - ka taea te tohu ki nga tohu e kaha ana ki te WPA me te WPA2 mo te hototahi whakamuri.

Engari i nga huānga e toru, ka kitea e koe he tohu WEP mokemoke:

[WEP]

Ka rite ki ta maatau korero i runga ake nei, he nui noa tenei kia kaua e tohu i te algorithm mo te whakamahi i nga taviri, kaore i te noho, me te tikanga whakamunatanga, he rite tonu te taunoa.

Inaianei whakaarohia tenei taiapa:

[ESS]

tenei Aratau mahi Wi-Fi ranei Topology whatunga Wi-Fi. Ka tupono pea koe ki te aratau BSS (Tautuhi Ratonga Taketake) - ina kotahi te waahi uru e whakawhiti ai nga taputapu hono. Ka kitea i runga i nga whatunga rohe. Hei tikanga, ka hiahiatia nga waahi uru ki te hono i nga taputapu mai i nga hononga rereke o te rohe, no reira he waahanga o nga Tautuhinga Ratonga Whakaroa - ESS. Ko te momo IBSSs (Tautuhi Ratonga Motuhake Motuhake) e tohu ana ko te taputapu he waahanga o te whatunga Peer-to-Peer.

Ka kite pea koe i te haki WPS:

[WPS]

Ko te WPS (Wi-Fi Protected Setup) he kawa mo te arawhiti-aunoa o te whatunga Wi-Fi. Hei arawhiti, ka uru te kaiwhakamahi ki te kupuhipa 8-puāhua, ka pehi ranei i te paatene ki te pouara. Mena ko to waahi urunga no te momo tuatahi ka puta tenei pouakataki ki te taha o te ingoa o to waahi uru, ka tino tūtohu koe kia haere ki te papa whakahaere me te whakakore i te uru WPS. Ko te meka he maha nga wa ka kitea te PIN 8-mati e te wahitau MAC, ka taea ranei te whakariterite i roto i te waa e kitea ana, ka taea e te tangata te whakamahi tinihanga.

6. Waihangahia he tauira me te mahi poroporoaki

I runga i nga mea i kitea i runga ake nei, ka whakaahuahia e matou nga mea i tupu ma te whakamahi i nga karaehe raraunga:

/* схема аутентификации */
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.
}

Inaianei me tuhi he mahi hei tarai i te mara kaha:


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. Tirohia te hua

Ka matawai ahau i te whatunga ka whakaatu ki a koe nga mea i kitea e au. Ka whakaatuhia nga hua o te putanga ngawari ma te Log.d:

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

Ko te take o te hono ki te whatunga mai i te waehere tono kaore i tirohia. Ka kii noa ahau ki te panui i nga kupuhipa kua tiakina mai i te OS o te taputapu pūkoro, me hiahia koe ki nga mana pakiaka me te hiahia ki te rumi i te punaha konae ki te panui wpa_supplicant.conf. Mena ka hiahia te arorau tono ki te whakauru kupuhipa mai i waho, ka taea te hono ma te akomanga android.net.wifi.WifiManager.

Tuhinga Egor Ponomarev mo nga taapiri utu nui.

Ki te whakaaro koe me taapiri, me whakatika ranei tetahi mea, tuhia ki nga korero :)

Source: will.com

Tāpiri i te kōrero