ዋይ ፋይ እና ሌሎቜ ብዙ አህጜሮተ ቃላት። ስለ ዋይፋይ ኖዶቜ በአንድሮይድ አፕሊኬሜን ውስጥ ሳያብጡ እንዎት ማግኘት እንደሚቜሉ

አንድ ቀን ዹWi-Fi አውታሚ መሚቊቜን ኚአንድሮይድ አፕሊኬሜኖቜ መቃኘት እና ዚመዳሚሻ ነጥቊቜን በተመለኹተ ዝርዝር መሹጃ ማግኘት ነበሚብኝ።

እዚህ ብዙ ቜግሮቜ አጋጥመውናል፡- ጠፍቷል.አንድሮይድ ሰነድ ብዙዎቹ ዚተገለጹት ክፍሎቜ ተቋርጠዋል (ኀፒአይ ደሹጃ> 26)፣ እሱም በውስጡ አልተንጞባሚቀም። በሰነዱ ውስጥ ዚአንዳንድ ነገሮቜ መግለጫ አነስተኛ ነው (ለምሳሌ ፣ ዹክፍሉ ዚቜሎታ መስክ ስካን ውጀት በሚጜፉበት ጊዜ ምንም እንኳን ምንም አልተገለጾም ፣ ምንም እንኳን ብዙ ጠቃሚ መሚጃዎቜን ቢይዝም)። ሶስተኛው ቜግር መጀመሪያ ወደ ዋይ ፋይ ሲቃሚብ ቲዎሪውን ኚማንበብ እና ራውተርን በ localhost በኩል ኚማዘጋጀት ውጭ በግል ሊሚዱ ዚሚቜሉ ዚሚመስሉትን አህጜሮተ ቃላት ማስተናገድ አለቊት። ግን እነሱን እንዎት ማገናኘት እና ማዋቀር እንደሚቻል ግልጜ ላይሆን ይቜላል (ፍርዱ ተጚባጭ ነው እና በቀድሞው ልምድ ላይ ዹተመሰሹተ ነው)።

ይህ መጣጥፍ ያለ NDK ፣ hacks ፣ ግን አንድሮይድ ኀፒአይን ብቻ በመጠቀም እና እንዎት እንደሚተሚጎም ስለ Wi-Fi አካባቢ አጠቃላይ መሹጃን ኚአንድሮይድ ኮድ እንዎት ማግኘት እንደሚቻል ያብራራል።

አንዘግይ እና ኮድ መጻፍ እንጀምር።

1. ፕሮጀክት ይፍጠሩ

ይህ ማስታወሻ ዚአንድሮይድ ፕሮጀክት ኚአንድ ጊዜ በላይ ለፈጠሩ ዚታሰበ ነው፣ ስለዚህ ዹዚህን ንጥል ነገር ዝርዝር እንተወዋለን። ኚታቜ ያለው ኮድ በኮትሊን፣ minSdkVersion=23 ውስጥ ይቀርባል።

2. ዚመዳሚሻ ፍቃዶቜ

ኚመተግበሪያው ኹ Wi-Fi ጋር ለመስራት ኹተጠቃሚው ብዙ ፈቃዶቜን ማግኘት ያስፈልግዎታል። በአሰራሩ ሂደት መሰሚት ሰነዶቜኚ 8.0 በኋላ ዚስርዓተ ክወና ስሪቶቜ ባላ቞ው መሳሪያዎቜ ላይ ያለውን አውታሚመሚብ ለመቃኘት ዚአውታሚ መሚብ አካባቢን ሁኔታ ኚመመልኚት በተጚማሪ ዚመሳሪያውን ዹ Wi-Fi ሞጁል ሁኔታ ለመለወጥ ወይም ወደ መጋጠሚያዎቜ (ግምታዊ) መድሚስ ያስፈልግዎታል ወይም በትክክል)። ኚስሪት 9.0 ጀምሮ ለሁለቱም ተጠቃሚውን መጠዹቅ አለቊት እና እንዲሁም ተጠቃሚው ዚአካባቢ አገልግሎቶቜን እንዲያበራ በግልፅ ይጠይቁ። ይህ ዹጎግል ፍላጎት እንጂ እሱን ለመሰለል ያለን ፍላጎት እንዳልሆነ ለተጠቃሚው በጋለ ስሜት ማስሚዳትዎን አይርሱ :)

ስለዚህ፣ በ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"/>

እና ለአሁኑ ተግባር ማገናኛ በያዘው ኮድ ውስጥ፡-

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. ብሮድካስት ሪሲቚር ይፍጠሩ እና ዹ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 ዘዮ ኚኀፒአይ ስሪት 28 ጀምሮ እንደተገለለ ምልክት ተደርጎበታል ነገር ግን ጠፍቷል። መሪ መጠቀምን ይጠቁማል.

በጠቅላላው, ዚነገሮቜን ዝርዝር ተቀብለናል ስካን ውጀት.

4. ScanResult ን ይመልኚቱ እና ውሎቜን ይሚዱ

እስቲ ዹዚህን ክፍል አንዳንድ መስኮቜ እንይ እና ምን ማለት እንደሆነ እንገልፃለን።

SSID — ዚአገልግሎት አዘጋጅ መለያ ዚአውታሚ መሚብ ስም ነው።

BSSID - ዚመሠሚታዊ አገልግሎት አዘጋጅ መለያ - ዚአውታሚ መሚብ አስማሚ MAC አድራሻ (ዹ Wi-Fi ነጥብ)

ደሹጃ - ዹተቀበለው ዚሲግናል ጥንካሬ አመልካቜ [dBm (ዚሩሲያ ዲቢኀም) - ዲሲቀል, ዚማጣቀሻ ኃይል 1 mW.] - ዹተቀበለው ዚምልክት ጥንካሬ አመልካቜ. ኹ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)

መደጋገም - ዹ Wi-Fi ነጥብ (Hz) ዚስራ ድግግሞሜ. ኚድግግሞሹ እራሱ በተጚማሪ ቻናል ተብሎ ዚሚጠራውን ሊፈልጉ ይቜላሉ። እያንዳንዱ ነጥብ ዚራሱ ዚአሠራር ንፅህና አለው. በሚጜፉበት ጊዜ በጣም ታዋቂው ዹ Wi-Fi ነጥቊቜ ክልል 2.4 GHz ነው። ነገር ግን፣ ይበልጥ ትክክለኛ ለመሆን፣ ነጥቡ ኹተሰዹመው ሰው ጋር በተገናኘ ቁጥር ባለው ተደጋጋሚነት መሹጃን ወደ ስልክዎ ያስተላልፋል። ዚሰርጊቜ ብዛት እና ተጓዳኝ ድግግሞሟቜ ደሹጃውን ዹጠበቀ. ይህ ዹሚደሹገው በአቅራቢያው ያሉ ነጥቊቜ በተለያዚ ድግግሞሜ እንዲሰሩ, እርስ በርስ እንዳይጣበቁ እና እርስ በርስ ዹሚተላለፉ ፍጥነት እና ጥራት እንዳይቀንስ ነው. በዚህ ሁኔታ ነጥቊቹ ዚሚሠሩት በአንድ ድግግሞሜ ሳይሆን በተለያዩ ድግግሞሜ (ፓራሜትር) ነው። ዚቻናል ስፋት), ዚሰርጡ ስፋት ይባላል. ማለትም ፣ በአጠገብ ላይ ዚሚሰሩ ነጥቊቜ (እና በአጠገብ ብቻ ሳይሆን 3 ኚራሳ቞ው) ቻናሎቜ እርስበርስ ጣልቃ ይገባሉ። ይህ ቀላል ኮድ ጠቃሚ ሆኖ ሊያገኙት ይቜላሉ፣ ይህም ዚሰርጡን ቁጥር ኚድግግሞሜ ዋጋ ለነጥቊቜ 2.4 እና 5 ጊኾ ድግግሞሜ ለማስላት ያስቜልዎታል፡


    /* пП частПте ПпреЎеляеЌ МПЌер каМала */
    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
            }
        }

ቜሎታዎቜ - ለመተንተን በጣም አስደሳቜ መስክ ፣ ብዙ ጊዜ ዹሚጠይቅ ሥራ። እዚህ ዚነጥቡ "ቜሎታዎቜ" በመስመሩ ውስጥ ተጜፈዋል. በዚህ አጋጣሚ በሰነዱ ውስጥ ዚሕብሚቁምፊ ትርጓሜ ዝርዝሮቜን መፈለግ ዚለብዎትም። በዚህ መስመር ውስጥ ሊሆኑ ዚሚቜሉ አንዳንድ ምሳሌዎቜ እነሆ፡-

[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. ምህጻሚ ቃላትን እና ዹመተንተን ቜሎታዎቜን መሚዳት

ዹ android.net.wifi.* ጥቅል ክፍሎቜ በሊኑክስ መገልገያ ስር ጥቅም ላይ እንደሚውሉ መጥቀስ ተገቢ ነው wpa_አማላጅ እና በቜሎታዎቜ መስክ ውስጥ ያለው ዚውጀት ውጀት በሚቃኙበት ጊዜ ዚባንዲራ መስክ ቅጂ ነው.

በተኚታታይ እንሰራለን። በመጀመሪያ በቅንፍ ውስጥ ያሉ አካላት በ“-“ ምልክት ዚሚለያዩበትን ዚቅርጞቱን ውጀት እንመልኚት፡-

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

ዚመጀመሪያው ትርጉም ዚሚባሉትን ይገልፃል። ዚማሚጋገጫ ዘዮ. ማለትም ዚመዳሚሻ ነጥቡ በራሱ ጥቅም ላይ እንዲውል እና ክፍያውን እንዎት ኢንክሪፕት ማድሚግ እንደሚቻል መሳሪያው እና ዚመዳሚሻ ነጥቡ ምን አይነት ቅደም ተኚተሎቜ ማኹናወን አለባ቞ው። ይህንን ጜሑፍ በሚጜፉበት ጊዜ, በጣም ዚተለመዱት አማራጮቜ WPA እና WPA2 ናቾው, ይህም እያንዳንዱ ዹተገናኘ መሳሪያ በቀጥታ ወይም በተጠራው በኩል ነው. ዹ RADIUS አገልጋይ (WPA-Enterprice) ዹይለፍ ቃሉን በተመሰጠሹ ቻናል ያቀርባል። ምናልባትም፣ በቀትዎ ውስጥ ያለው ዚመዳሚሻ ነጥብ በዚህ እቅድ መሰሚት ግንኙነትን ይሰጣል። በሁለተኛው ስሪት እና በአንደኛው መካኚል ያለው ልዩነት ዹበለጠ ጠንካራ ምስጥር ያለው መሆኑ ነው፡ AES እና ደህንነቱ ካልተጠበቀ TKIP ጋር። ይበልጥ ውስብስብ እና ዹላቀ ዹሆነው WPA3 ቀስ በቀስም እዚተዋወቀ ነው። በንድፈ ሀሳብ፣ ኚኢንተርፕራይስ መፍትሄ CCKM (Cisco Centralized Key Management) ጋር አንድ አማራጭ ሊኖር ይቜላል፣ ግን በጭራሜ አጋጥሞኝ አያውቅም።

ዚመዳሚሻ ነጥቡ በ MAC አድራሻ ለማሚጋገጥ ዹተዋቀሹ ሊሆን ይቜላል። ወይም ዚመዳሚሻ ነጥቡ ጊዜው ያለፈበትን WEP አልጎሪዝም በመጠቀም መሹጃን ዚሚያቀርብ ኹሆነ በእርግጥ ምንም ማሚጋገጫ ዹለም (ዚሚስጥር ቁልፉ እዚህ ዚምስጠራ ቁልፍ ነው)። እንደ ሌሎቜ አማራጮቜን እንመድባለን።
በአደባባይ wi-fi ውስጥ በድብቅ ዚተያዙ ፖርታል ማወቂያ ያለው ታዋቂ ዘዮም አለ - በአሳሜ በኩል ዚማሚጋገጫ ጥያቄ። እንደዚህ ያሉ ዚመዳሚሻ ነጥቊቜ ወደ ስካነር ክፍት ሆነው ይታያሉ (ይህም ኚአካላዊ ግኑኝነት አንጻር ነው)። ስለዚህ, እንደ OPEN እንመድባ቞ዋለን.

ሁለተኛው እሎት እንደ ሊገለጜ ይቜላል ቁልፍ አስተዳደር ስልተ ቀመር. ይህ ኹላይ ዹተገለፀው ዚማሚጋገጫ ዘዮ መለኪያ ነው. ዚምስጠራ ቁልፎቜ በትክክል እንዎት እንደሚለዋወጡ ይናገራል። ሊሆኑ ዚሚቜሉ አማራጮቜን እናስብ። EAP - በተጠቀሰው WPA-Enterprice ውስጥ ጥቅም ላይ ዹዋለ, ዚገባውን ዚማሚጋገጫ ውሂብ ለማሚጋገጥ ዚውሂብ ጎታ ይጠቀማል. SAE - በላቁ WPA3 ውስጥ ጥቅም ላይ ዹዋለ ፣ ኚጭካኔ ኃይል ዹበለጠ ዚሚቋቋም። PSK - በጣም ዹተለመደው አማራጭ, ዹይለፍ ቃል ማስገባት እና ኢንክሪፕት በሆነ መልኩ ማስተላለፍን ያካትታል. IEEE8021X - በአለም አቀፍ ደሹጃ (በ WPA ቀተሰብ ኹሚደገፈው ዹተለዹ)። OWE (Opportunistic Wireless Encryption) ዹ IEEE 802.11 መስፈርት OPEN ብለን ለመደብንባ቞ው ነጥቊቜ ቅጥያ ነው። OWE ደህንነቱ ባልተጠበቀ አውታሚ መሚብ ላይ ዹሚተላለፈውን መሹጃ በማመስጠር ደህንነቱን ያሚጋግጣል። ዚመዳሚሻ ቁልፎቜ በሌሉበት ጊዜ አንድ አማራጭ ሊኖር ይቜላል፣ ይህን አማራጭ NONE ብለን እንጥራው።

ሊስተኛው ግቀት ተብሎ ዚሚጠራው ነው. ዚምስጠራ ዕቅዶቜ - ዹተላለፈውን መሹጃ ለመጠበቅ ምስጢሩ በትክክል እንዎት ጥቅም ላይ እንደሚውል አማራጮቜን እንዘርዝር። WEP - ዹ RC4 ዥሚት ምስጠራን ይጠቀማል, ዚምስጢር ቁልፉ ዚኢንክሪፕሜን ቁልፍ ነው, ይህም በዘመናዊው ምስጠራ ዓለም ውስጥ ተቀባይነት እንደሌለው ይቆጠራል. TKIP - በ WPA, CKIP - በ WPA2 ውስጥ ጥቅም ላይ ይውላል. TKIP+CKIP - ለኋላ ተኳሃኝነት WPA እና WPA2 በሚቜሉ ነጥቊቜ ሊገለጜ ይቜላል።

ኚሶስት አካላት ይልቅ፣ ብ቞ኛ ዹሆነ ዹWEP ምልክት ማግኘት ይቜላሉ፡-

[WEP]

ኹላይ እንደተነጋገርነው, ይህ ቁልፎቜን ለመጠቀም ስልተ-ቀመርን አለመጥቀስ በቂ ነው, እሱም ዹለም, እና ምስጠራ ዘዮ, በነባሪነት ተመሳሳይ ነው.

አሁን ይህንን ቅንፍ አስቡበት፡-

[ESS]

ይህ ዹ Wi-Fi አሠራር ሁኔታ ወይም ዹWi-Fi አውታሚ መሚብ ቶፖሎጂ. ዚቢኀስኀስ (መሰሚታዊ አገልግሎት ስብስብ) ሁነታ ሊያጋጥሙዎት ይቜላሉ - ዹተገናኙ መሳሪያዎቜ ዚሚገናኙበት አንድ ዚመዳሚሻ ነጥብ ሲኖር። በአካባቢያዊ አውታሚ መሚቊቜ ላይ ሊገኝ ይቜላል. እንደ አንድ ደንብ ኚተለያዩ ዚአካባቢያዊ አውታሚ መሚቊቜ ውስጥ መሳሪያዎቜን ለማገናኘት ዚመዳሚሻ ነጥቊቜ ያስፈልጋሉ, ስለዚህ ዚተራዘመ ዚአገልግሎት ስብስቊቜ አካል ናቾው - ESS. ዹ IBSSs (ገለልተኛ ዚመሠሚታዊ አገልግሎት ስብስቊቜ) ዓይነት መሣሪያው ዚአቻ-ለ-አቻ አውታሚ መሚብ አካል መሆኑን ያመለክታል።

ዹWPS ባንዲራም ማዚት ትቜላለህ፡-

[WPS]

WPS (በWi-Fi ዹተጠበቀ ማዋቀር) ዹWi-Fi አውታሚ መሚብን ኹፊል አውቶማቲክ ማስጀመር ፕሮቶኮል ነው። ለመጀመር ተጠቃሚው ባለ 8 ቁምፊ ይለፍ ቃል ያስገባል ወይም በራውተር ላይ አንድ ቁልፍ ይጫናል። ዚመዳሚሻ ነጥብዎ ዚመጀመሪያው ዓይነት ኹሆነ እና ይህ አመልካቜ ሳጥን ኚመዳሚሻ ነጥብዎ ስም ቀጥሎ ኚታዚ ወደ አስተዳዳሪ ፓነል ሄደው ዹWPS መዳሚሻን እንዲያሰናክሉ በጥብቅ ይመኚራሉ። እውነታው ግን ብዙውን ጊዜ ባለ 8-አሃዝ ፒን በ MAC አድራሻ ሊገኝ ይቜላል, ወይም ሊታወቅ በሚቜል ጊዜ ውስጥ ሊስተካኚል ይቜላል, ይህም አንድ ሰው በቅንነት ሊጠቀምበት ይቜላል.

6. ሞዮል እና ዹመተንተን ተግባር ይፍጠሩ

ኹላይ ባወቅነው መሰሚት፣ ዚውሂብ ክፍሎቜን በመጠቀም ምን እንደተፈጠሚ እንገልፃለን፡-

/* схеЌа аутеМтОфОкацОО */
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.
}

አሁን ዚቜሎታ መስኩን ዹሚተነተን ተግባር እንፃፍ፡-


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.

СпасОбП Egor Ponomarev ጠቃሚ ለሆኑ ተጚማሪዎቜ.

ዹሆነ ነገር መታኚል ወይም መታሚም አለበት ብለው ካሰቡ በአስተያዚቶቹ ውስጥ ይፃፉ :)

ምንጭ: hab.com

አስተያዚት ያክሉ