Wi-Fi ืื•ืŸ ืคื™ืœืข ืื ื“ืขืจืข ืึทื‘ืจื™ื•ื•ื™ื™ื™ืฉืึทื ื–. ื•ื•ื™ ืื™ืŸ Android ื‘ืึทืงื•ืžืขืŸ ื“ืึทื˜ืŸ ื•ื•ืขื’ืŸ Wi-Fi ื ืึธื•ื“ื– ืื™ืŸ ื“ืขืจ ืึทืคึผ ืึธืŸ ื•ื•ืขืจืŸ ืึธื•ื•ื•ืขืจื•ื•ืขืœืžื“

ืื™ื™ืŸ ื˜ืึธื’ ื”ืึธื‘ ืื™ืš ื’ืขื“ืึทืจืคื˜ ืกืงืขื ืขืŸ ืคึฟื•ืŸ Android Wi-Fi ื ืขืฅ ืึทืคึผืœื™ืงืึทืฆื™ืขืก ืื•ืŸ ื‘ืึทืงื•ืžืขืŸ ื“ื™ื˜ื™ื™ืœื“ ื“ืึทื˜ืŸ ื•ื•ืขื’ืŸ ืึทืงืกืขืก ืคื•ื ืงื˜ืŸ.

ื“ืึธ ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขื”ืื˜ ืขื˜ืœืขื›ืข ืฉื•ื•ืขืจื™ืงื™ื™ื˜ืŸ: ืืคื™ืฆื™ืขืœืข ื“ืืงื•ืžืขื ื˜ืืฆื™ืข Android ืคื™ืœืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื“ื™ืกืงืจื™ื™ื‘ื“ ืงืœืืกืŸ ื–ืขื ืขืŸ ื“ื™ืคึผืจื™ืฉื™ื™ื™ื˜ื™ื“ (ืึทืคึผื™ ืžื“ืจื’ื”> 26), ื•ื•ืึธืก ืื™ื– ื ื™ืฉื˜ ืฉืคื™ื’ืœื˜ ืื™ืŸ ืขืก; ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ืขื˜ืœืขื›ืข ื˜ื™ื ื’ื– ืื™ืŸ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ืื™ื– ืžื™ื ื™ืžืึทืœ (ืœืžืฉืœ, ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคืขืœื“ ืคื•ืŸ ื“ื™ ืงืœืึทืก ScanResult ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ืคื•ืŸ ืฉืจื™ื™ื‘ืŸ, ื›ึผืžืขื˜ ื’ืึธืจื ื™ืฉื˜ ืื™ื– ื“ื™ืกืงืจื™ื™ื‘ื“, ื›ืึธื˜ืฉ ืขืก ื›ึผื•ืœืœ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ื•ื•ื™ื›ื˜ื™ืง ื“ืึทื˜ืŸ). ื“ื™ ื“ืจื™ื˜ ืฉื•ื•ืขืจื™ืงื™ื™ื˜ ืงืขืŸ ื–ื™ื™ืŸ ืึทื– ื•ื•ืขืŸ ืื™ืจ ืขืจืฉื˜ืขืจ ื‘ืึทืงื•ืžืขืŸ ื ืึธืขื ื˜ ืฆื• Wi-Fi, ืึทื—ื•ืฅ ืœื™ื™ืขื ืขืŸ ื“ื™ ื˜ืขืึธืจื™ืข ืื•ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ืจืึทื•ื˜ืขืจ ื“ื•ืจืš Localhost, ืื™ืจ ื”ืึธื‘ืŸ ืฆื• ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืึทื‘ืจื™ื•ื•ื™ื™ื™ืฉืึทื ื– ื•ื•ืึธืก ื•ื™ืกืงื•ืžืขืŸ ื™ื ื“ื™ื•ื•ื™ื“ื–ืฉื•ืึทืœื™ ืคืึทืจืฉื˜ื™ื™ื™ืง. ืึธื‘ืขืจ ืขืก ืงืขืŸ ื ื™ืฉื˜ ื–ื™ื™ืŸ ืงืœืึธืจ ื•ื•ื™ ื“ืขืจ ื˜ืึธื’ ื•ื•ื™ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ืื•ืŸ ืกื˜ืจื•ืงื˜ื•ืจ ื–ื™ื™ (ื“ื™ืŸ ืื™ื– ืกืึทื‘ื“ื–ืฉืขืงื˜ื™ื•ื• ืื•ืŸ ื“ืขืคึผืขื ื“ืก ืื•ื™ืฃ ืคืจื™ื™ึทืขืจื“ื™ืง ื“ืขืจืคืึทืจื•ื ื’).

ื“ืึธืก ืึทืจื˜ื™ืงืœ ื“ื™ืกืงื•ื˜ื™ืจื˜ ื•ื•ื™ Android ืงืึธื“ ืฆื• ื‘ืึทืงื•ืžืขืŸ ืงืึธืžืคึผืจืขื”ืขื ืกื™ื•ื• ื“ืึทื˜ืŸ ื•ื•ืขื’ืŸ ื“ื™ Wi-Fi ืกื‘ื™ื‘ื” ืึธืŸ NDK, ื›ืึทืงืก, ืึธื‘ืขืจ ื‘ืœื•ื™ื– ืžื™ื˜ ื“ืขืจ ื”ื™ืœืฃ ืคื•ืŸ Android APIs ืื•ืŸ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ื™ ื–ื™ื™ ืฆื• ืื™ื ื˜ืขืจืคึผืจืขื˜ื™ืจืŸ.

ืœืึธืžื™ืจ ื ื™ืฉื˜ ืคืึทืจื”ืึทืœื˜ืŸ ืื•ืŸ ืึธื ื”ื™ื™ื‘ืŸ ืฉืจื™ื™ื‘ืŸ ืงืึธื“.

1. ืฉืึทืคึฟืŸ ืึท ืคึผืจื•ื™ืขืงื˜

ื“ื™ ื ืื˜ื™ืฅ ืื™ื– ื’ืขืžื™ื™ื ื˜ ืคืืจ ื™ืขื ืข ื•ื•ืืก ื”ืื‘ืŸ ืฉื•ื™ืŸ ื‘ืืฉืืคืŸ ืžืขืจ ื•ื•ื™ ืื™ื™ืŸ ืžืืœ Android ืคึผืจืึธื™ืขืงื˜, ืึทื–ื•ื™ ืžื™ืจ ื•ื•ืขืœืŸ ืื™ื‘ืขืจืฉืคึผืจื™ื ื’ืขืŸ ื“ื™ ืคืจื˜ื™ื ืคื•ืŸ ื“ืขื ืึธืคึผื˜ื™ื™ืœ. ื“ืขืจ ืงืึธื“ ืื•ื ื˜ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคึผืจืขื–ืขื ื˜ื™ืจื˜ ืื™ืŸ ืงืึธื˜ืœื™ืŸ, minSdkVersion=23.

2. ืึทืงืกืขืก ืคึผืขืจืžื™ืฉืึทื ื–

ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ Wi-Fi ืคึฟื•ืŸ ื“ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื‘ืึทืงื•ืžืขืŸ ืขื˜ืœืขื›ืข ืคึผืขืจืžื™ืฉืึทื ื– ืคื•ืŸ ื“ื™ ื‘ืึทื ื™ืฆืขืจ. ืœื•ื™ื˜ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ, ืฆื• ื™ื‘ืขืจืงื•ืงืŸ ื“ื™ ื ืขืฅ ืื•ื™ืฃ ื“ืขื•ื•ื™ืกืขืก ืžื™ื˜ ืึทืก ื•ื•ืขืจืกื™ืขืก ื ืึธืš 8.0, ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื–ืขืŸ ื“ื™ ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ื ืขืฅ ืกื•ื•ื™ื•ื•ืข, ืื™ืจ ื“ืึทืจืคึฟืŸ ืึทืงืกืขืก ืฆื• ื˜ื•ื™ืฉืŸ ื“ื™ ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ Wi-Fi ืžืึธื“ื•ืœืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืžื™ื˜ืœ ืึธื“ืขืจ ืึทืงืกืขืก ืฆื• ืงืึธื•ืึธืจื“ืึทื ืึทืฅ (ื‘ืขืขืจืขืš). ืึธื“ืขืจ ืคึผื™ื ื˜ืœืขืš). ืกื˜ืึทืจื˜ื™ื ื’ ืžื™ื˜ ื•ื•ืขืจืกื™ืข 9.0, ืื™ืจ ืžื•ื–ืŸ ื‘ืขื˜ืŸ ื“ืขื ื‘ืึทื ื™ืฆืขืจ ืคึฟืึทืจ ื‘ื™ื™ื“ืข, ืื•ืŸ ืื•ื™ืš ื‘ืคื™ืจื•ืฉ ื‘ืขื˜ืŸ ื“ืขื ื‘ืึทื ื™ืฆืขืจ ืฆื• ื•ื•ืขื ื“ืŸ ืึธืจื˜ ื‘ืึทื“ื™ื ื•ื ื’ืก. ื“ื• ื–ืืœืกื˜ ื ื™ืฉื˜ ืคืึทืจื’ืขืกืŸ ืฆื• ื’ืึทืœืึทื ื˜ืœื™ ื“ืขืจืงืœืขืจืŸ ืฆื• ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืึทื– ื“ืึธืก ืื™ื– Google ืก ืงืึทืคึผืจื™ื– ืื•ืŸ ื ื™ืฉื˜ ืื•ื ื“ื–ืขืจ ืคืึทืจืœืึทื ื’ ืฆื• ืฉืคึผื™ืึธืŸ ืื•ื™ืฃ ืื™ื :)

ืื™ืŸ ื’ืึทื ืฆืŸ, ืื™ืŸ Androidืœื™ื™ื’ ืฆื• Manifest.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 ืื•ืคึฟืŸ ืื™ืŸ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ืื™ื– ืื ื’ืขืฆื™ื™ื›ื ื˜ ื•ื•ื™ ื“ื™ืคึผืจื™ืฉื™ื™ื™ื˜ื™ื“ ื–ื™ื ื˜ API ื•ื•ืขืจืกื™ืข 28, ืึธื‘ืขืจ ืึทื•ื•ืขืง. ืคื™ืจืขืจ ืกืึทื’ื“ื–ืฉืขืกืฅ ื ื™ืฆืŸ ืขืก.

ืื™ืŸ ื’ืึทื ืฅ, ืžื™ืจ ื‘ืืงื•ืžืขืŸ ืึท ืจืฉื™ืžื” ืคื•ืŸ ืึทื‘ื“ื–ืฉืขืงืก ScanResult.

4. ืงื•ืง ื‘ื™ื™ึท ScanResult ืื•ืŸ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ื™ ื˜ืขืจืžื™ื ืขืŸ

ื–ืืœ ืก ืงื•ืง ืื™ืŸ ืขื˜ืœืขื›ืข ืคืขืœื“ืขืจ ืคื•ืŸ ื“ืขื ืงืœืึทืก ืื•ืŸ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื•ื•ืึธืก ื–ื™ื™ ืžื™ื™ื ืขืŸ:

ืกืกื™ื“ - Service Set Identifier ืื™ื– ื“ืขืจ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ื ืขืฅ

BSSID - Basic Service Set Identifier - MAC ืึทื“ืจืขืก ืคื•ืŸ ื“ื™ ื ืขืฅ ืึทื“ืึทืคึผื˜ืขืจ (Wi-Fi ืคื•ื ื˜)

ื’ืœื™ื™ึทืš - ื‘ืืงื•ืžืขืŸ ืกื™ื’ื ืึทืœ ืฉื˜ืึทืจืงื™ื™ื˜ ื™ื ื“ื™ืงืึทื˜ืึธืจ [ื“ื‘ื (ืจื•ืกื™ืฉ ื“ื‘ื) - ื“ืขืกื™ื‘ืขืœ, ืจืขืคึฟืขืจืขื ืฅ ืžืึทื›ื˜ 1 ืžื•ื•.] - ืึท ื’ืจืื“ืŸ ืคื•ืŸ ื“ื™ ื‘ืืงื•ืžืขืŸ ืกื™ื’ื ืึทืœ ืฉื˜ืึทืจืงื™ื™ื˜. ื ืขืžื˜ ืึท ื•ื•ืขืจื˜ ืคื•ืŸ 0 ืฆื• -100, ื“ื™ ื•ื•ื™ื™ึทื˜ืขืจ ืคื•ืŸ 0, ื“ื™ ืžืขืจ ืกื™ื’ื ืึทืœ ืžืึทื›ื˜ ืื™ื– ืคืึทืจืคืึทืœืŸ ืฆื•ื–ืืžืขืŸ ื“ื™ ื•ื•ืขื’ ืคื•ืŸ ื“ื™ Wi-Fi ืคื•ื ื˜ ืฆื• ื“ื™ื™ืŸ ืžื™ื˜ืœ. ืžืขืจ ื“ืขื˜ืึทื™ืœืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ, ืœืžืฉืœ, ืื™ืŸ Wikipediaื“ืึธ ื•ื•ืขืœ ืื™ืš ื“ื™ืจ ื–ืึธื’ืŸ ื•ื•ืึธืก ืฆื• ื˜ืึธืŸ ืžื™ื˜ ื“ืขืจ ื”ื™ืœืฃ ืคึฟื•ืŸ Android ืงืœืึทืก WifiManager ืื™ืจ ืงืขื ืขืŸ ืงืึทืœืึทื‘ืจื™ื™ื˜ ื“ื™ ืกื™ื’ื ืึทืœ ืžื“ืจื’ื” ืื•ื™ืฃ ืึท ื•ื•ืึธื’ ืคื•ืŸ ื•ื™ืกื’ืขืฆื™ื™ื›ื ื˜ ืฆื• ืฉืจืขืงืœืขืš ืื™ืŸ ื“ื™ ืฉืจื™ื˜ ืื™ืจ ืงืœื™ื™ึทื‘ืŸ:

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

ืึธืคื˜ืงื™ื™ึทื˜ - ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืึธืคื˜ืงื™ื™ึทื˜ ืคื•ืŸ ื“ื™ Wi-Fi ืคื•ื ื˜ [ื”ื–]. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ืึธืคื˜ืงื™ื™ึทื˜ ื–ื™ืš, ืื™ืจ ืงืขืŸ ื–ื™ื™ืŸ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื“ื™ ืึทื–ื•ื™ ื’ืขืจื•ืคืขื ืข ืงืึทื ืึทืœ. ื™ืขื“ืขืจ ืคื•ื ื˜ ื”ืื˜ ื–ื™ื™ึทืŸ ืื™ื™ื’ืŸ ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืจื™ื™ื ืงื™ื™ึทื˜. ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ืคื•ืŸ ืฉืจื™ื™ื‘ืŸ, ื“ื™ ืžืขืจืกื˜ ืคืึธืœืงืก ืงื™ื™ื˜ ืคื•ืŸ Wi-Fi ืคื•ื ืงื˜ืŸ ืื™ื– 2.4 GHz. ืึธื‘ืขืจ, ืฆื• ื–ื™ื™ืŸ ืžืขืจ ื’ืขื ื•ื™, ื“ื™ ืคื•ื ื˜ ื˜ืจืึทื ื–ืžื™ืฅ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืฆื• ื“ื™ื™ืŸ ื˜ืขืœืขืคืึธืŸ ืื™ืŸ ืึท ื ื•ืžืขืจืขื“ ืึธืคื˜ืงื™ื™ึทื˜ ื ืึธืขื ื˜ ืฆื• ื“ืขืจ ืื™ื™ื ืขืจ ืžื™ื˜ ื“ื™ ื ืึธืžืขืŸ. ื ื•ืžืขืจ ืคื•ืŸ ื˜ืฉืึทื ืึทืœื– ืื•ืŸ ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืคืจื™ืงื•ื•ืึทื ืกื™ื– ืกื˜ืึทื ื“ืขืจื“ื™ื™ื–ื“. ื“ืึธืก ืื™ื– ื’ืขื˜ืืŸ ืึทื–ื•ื™ ืึทื– ื ื™ืจื‘ื™ื™ ืคื•ื ืงื˜ืŸ ืึทืจื‘ืขื˜ืŸ ืื™ืŸ ืคืึทืจืฉื™ื“ืขื ืข ืคืจื™ืงื•ื•ืึทื ืกื™ื–, ื“ืขืจืžื™ื˜ ื ื™ื˜ ื™ื ื˜ืขืจืคื™ืจื™ื ื’ ืžื™ื˜ ื™ืขื“ืขืจ ืื ื“ืขืจืข ืื•ืŸ ื ื™ื˜ ืžื™ื•ื˜ืฉื•ืึทืœื™ ืจื™ื“ื•ืกื™ื ื’ ื“ื™ ื’ื™ื›ืงื™ื™ึทื˜ ืื•ืŸ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืคื•ืŸ ื˜ืจืึทื ืกืžื™ืกื™ืข. ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ื™ ืคื•ื ืงื˜ืŸ ืึทืจื‘ืขื˜ืŸ ื ื™ืฉื˜ ืื™ืŸ ืื™ื™ืŸ ืึธืคื˜ืงื™ื™ึทื˜, ืึธื‘ืขืจ ืื™ื‘ืขืจ ืึท ืงื™ื™ื˜ ืคื•ืŸ ืคืจื™ืงื•ื•ืึทื ืกื™ื– (ืคึผืึทืจืึทืžืขื˜ืขืจ ืงืึทื ืึทืœื•ื•ื™ื“ื˜ื”), ื’ืขืจื•ืคืŸ ื“ื™ ืงืึทื ืึทืœ ื‘ืจื™ื™ื˜. ืึทื– ืื™ื–, ื•ื•ื™ื™ื–ื˜ ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืื•ื™ืฃ ืฉื›ื™ื™ื ื™ืฉ (ืื•ืŸ ื ื™ื˜ ื‘ืœื•ื™ื– ืฉื›ื™ื™ื ื™ืฉ, ืึธื‘ืขืจ ืืคื™ืœื• 3 ืคื•ืŸ ื–ื™ืš) ื˜ืฉืึทื ืึทืœื– ืึทืจื™ื™ึทื ืžื™ืฉื  ื–ื™ืš ืžื™ื˜ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ. ืื™ืจ ืงืขืŸ ื’ืขืคึฟื™ื ืขืŸ ื“ืขื ืคึผืฉื•ื˜ ืงืึธื“ ื ื•ืฆื™ืง, ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืจืขื›ืขื ืขืŸ ื“ื™ ืงืึทื ืึทืœ ื ื•ืžืขืจ ืคื•ืŸ ื“ื™ ืึธืคื˜ืงื™ื™ึทื˜ ื•ื•ืขืจื˜ ืคึฟืึทืจ ื•ื•ื™ื™ื–ื˜ ืžื™ื˜ ืึท ืึธืคื˜ืงื™ื™ึทื˜ ืคื•ืŸ 2.4 ืื•ืŸ 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
            }
        }

ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– - ื“ื™ ืžืขืจืกื˜ ื˜ืฉื™ืงืึทื•ื•ืข ืคืขืœื“ ืคึฟืึทืจ ืึทื ืึทืœื™ืกื™ืก, ืึทืจื‘ืขื˜ ืžื™ื˜ ื•ื•ืึธืก ืคืืจืœืื ื’ื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ื˜. ื“ืึธ ื“ื™ "ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื–" ืคื•ืŸ ื“ื™ ืคื•ื ื˜ ื–ืขื ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ื“ื™ ืฉื•ืจื”. ืื™ืŸ ื“ืขื ืคืึทืœ, ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืฆื• ืงื•ืงืŸ ืคึฟืึทืจ ื“ืขื˜ืึทื™ืœืก ืคื•ืŸ ืฉื˜ืจื™ืงืœ ื™ื ื˜ืขืจืคึผืจื™ื˜ื™ื™ืฉืึทืŸ ืื™ืŸ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ. ื“ืึธ ื–ืขื ืขืŸ ืขื˜ืœืขื›ืข ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื•ื•ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ืื™ืŸ ื“ืขื ืฉื•ืจื”:

[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_supplicant ืื•ืŸ ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืจืขื–ื•ืœื˜ืึทื˜ ืื™ืŸ ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคืขืœื“ ืื™ื– ืึท ืงืึธืคึผื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืคืœืึทื’ืก ืคืขืœื“ ื•ื•ืขืŸ ืกืงืึทื ื™ื ื’.

ืžื™ืจ ื•ื•ืขืœืŸ ื”ืึทื ื“ืœืขืŸ ืงืึทื ืกื™ืกื˜ืึทื ื˜ืœื™. ื–ืืœ ืก ืขืจืฉื˜ืขืจ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ืึท ืคึฟืึธืจืžืึทื˜ ืื™ืŸ ื•ื•ืึธืก ืขืœืขืžืขื ื˜ืŸ ื™ืŸ ืงืœืึทืžืขืจืŸ ื–ืขื ืขืŸ ืืคื’ืขืฉื™ื™ื“ื˜ ื“ื•ืจืš ืึท "-" ืฆื™ื™ื›ืŸ:

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

ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ื™ื™ึทื˜ืฉ ื‘ืืฉืจื™ื™ื‘ื˜ ื“ื™ ืึทื–ื•ื™ ื’ืขืจื•ืคืขื ืข. ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ ืื•ืคึฟืŸ. ืึทื– ืื™ื–, ื•ื•ืึธืก ืกื™ืงื•ื•ืึทื ืก ืคื•ืŸ ืึทืงืฉืึทื ื– ืžื•ื–ืŸ ื“ื•ืจื›ืคื™ืจืŸ ื“ื™ ืžื™ื˜ืœ ืื•ืŸ ื“ื™ ืึทืงืกืขืก ืคื•ื ื˜ ืื™ืŸ ืกื“ืจ ืคึฟืึทืจ ื“ื™ ืึทืงืกืขืก ืคื•ื ื˜ ืฆื• ืœืึธื–ืŸ ื–ื™ืš ืฆื• ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื•ืŸ ื•ื•ื™ ืฆื• ื™ื ืงืจื™ืคึผื˜ ื“ื™ ืคึผื™ื™ืœืึธื•ื“. ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ืคื•ืŸ ืฉืจื™ื™ื‘ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ, ื“ื™ ืžืขืจืกื˜ ืคึผืจืึธืกื˜ ืึธืคึผืฆื™ืขืก ื–ืขื ืขืŸ WPA ืื•ืŸ WPA2, ืื™ืŸ ื•ื•ืึธืก ื™ืขื“ืขืจ ืงืึธื ื ืขืงื˜ืขื“ ืžื™ื˜ืœ ื’ืœื™ื™ึทืš ืึธื“ืขืจ ื“ื•ืจืš ื“ื™ ืึทื–ื•ื™ ื’ืขืจื•ืคืขื ืข. ื“ื™ RADIUS ืกืขืจื•ื•ืขืจ (WPA-Enterprice) ื’ื™ื˜ ื“ื™ ืคึผืึทืจืึธืœ ืื™ื‘ืขืจ ืึท ื™ื ืงืจื™ืคึผื˜ื™ื“ ืงืึทื ืึทืœ. ืจื•ื‘ึฟ ืžืกืชึผืžื, ื“ื™ ืึทืงืกืขืก ืคื•ื ื˜ ืื™ืŸ ื“ื™ื™ืŸ ื”ื™ื™ื ื’ื™ื˜ ืึท ืงืฉืจ ืœื•ื™ื˜ ื“ืขื ืกื›ืขืžืข. ื“ืขืจ ื—ื™ืœื•ืง ืฆื•ื•ื™ืฉืŸ ื“ื™ ืฆื•ื•ื™ื™ื˜ืข ื•ื•ืขืจืกื™ืข ืื•ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ืื™ื– ืึทื– ืขืก ื”ืื˜ ืึท ืฉื˜ืืจืงืขืจ ืกื™ื™ืคืขืจ: AES ืงืขื’ืŸ ื“ื™ ื™ื ืกืึทืงื™ืขืจ TKIP. WPA3, ื•ื•ืึธืก ืื™ื– ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ืื•ืŸ ืึทื•ื•ืึทื ืกื™ืจื˜ืข, ืื™ื– ืื•ื™ืš ื‘ื™ืกืœืขื›ื•ื•ื™ื™ึทื– ื™ื ื˜ืจืึธื•ื“ื•ืกื˜. ื˜ื”ืขืึธืจืขื˜ื™ืงืึทืœืœื™, ืขืก ืงืขืŸ ื–ื™ื™ืŸ ืึทืŸ ืึธืคึผืฆื™ืข ืžื™ื˜ ื“ื™ ืขื ื˜ืขืจืคึผืจื™ื™ื– ืœื™ื™ื–ื•ื ื’ CCKM (Cisco Centralized Key Management), ืึธื‘ืขืจ ืื™ืš ื”ืึธื‘ืŸ ืงื™ื™ื ืžืึธืœ ื’ืขืคึฟื•ื ืขืŸ ืขืก.

ื“ื™ ืึทืงืกืขืก ืคื•ื ื˜ ืงืขืŸ ื–ื™ื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื“ ืฆื• ืึธื˜ืขื ื˜ืึทืงื™ื™ื˜ ื“ื•ืจืš MAC ืึทื“ืจืขืก. ืึธื“ืขืจ, ืื•ื™ื‘ ื“ื™ ืึทืงืกืขืก ืคื•ื ื˜ ื’ื™ื˜ ื“ืึทื˜ืŸ ืžื™ื˜ ื“ื™ ืึทื•ื˜ื“ื™ื™ื˜ื™ื“ WEP ืึทืœื’ืขืจื™ื“ืึทื, ืขืก ืื™ื– ืคืืงื˜ื™ืฉ ืงื™ื™ืŸ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ (ื“ืขืจ ืกื•ื“ ืฉืœื™ืกืœ ื“ืึธ ืื™ื– ื“ื™ ืขื ืงืจื™ืคึผืฉืึทืŸ ืฉืœื™ืกืœ). ืžื™ืจ ืงืœืึทืกื™ืคื™ืฆื™ืจืŸ ืึทื–ืึท ืึธืคึผืฆื™ืขืก ื•ื•ื™ ืื ื“ืขืจืข.
ืขืก ืื™ื– ืื•ื™ืš ืึท ืื•ืคึฟืŸ ื•ื•ืึธืก ืื™ื– ืคืึธืœืงืก ืื™ืŸ ืฆื™ื‘ื•ืจ ื•ื•ื™-ืคื™ ืžื™ื˜ ืคืึทืจื‘ืึธืจื’ืŸ ืงืึทืคึผื˜ื™ื•ื• ืคึผืึธืจื˜ืึทืœ ื“ืขื˜ืขืงืฉืึทืŸ - ืึทืŸ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ ื‘ืขื˜ืŸ ื“ื•ืจืš ืึท ื‘ืœืขื˜ืขืจืขืจ. ืึทื–ืึท ืึทืงืกืขืก ืคื•ื ืงื˜ืŸ ื“ืขืจืฉื™ื™ึทื ืขืŸ ืฆื• ื“ื™ ืกืงืึทื ื ืขืจ ื•ื•ื™ ืึธืคึฟืŸ (ื•ื•ืึธืก ื–ื™ื™ ื–ืขื ืขืŸ ืคึฟื•ืŸ ื“ื™ ืคื•ื ื˜ ืคื•ืŸ ืžื™ื™ื ื•ื ื’ ืคื•ืŸ ื“ื™ ื’ืฉืžื™ื•ืช ืงืฉืจ). ื“ืขืจื™ื‘ืขืจ, ืžื™ืจ ืงืœืึทืกืึทืคื™ื™ื“ ื–ื™ื™ ื•ื•ื™ OPEN.

ื“ื™ ืจื’ืข ื•ื•ืขืจื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื“ื™ื ืึธื•ื˜ื™ื“ ื•ื•ื™ ืฉืœื™ืกืœ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืึทืœื’ืขืจื™ื“ืึทื. ื“ืึธืก ืื™ื– ืึท ืคึผืึทืจืึทืžืขื˜ืขืจ ืคื•ืŸ ื“ื™ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ ืื•ืคึฟืŸ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื•ื™ื‘ืŸ. ืจืขื“ื˜ ื•ื•ืขื’ืŸ ืคึผื•ื ืงื˜ ื•ื•ื™ ืขื ืงืจื™ืคึผืฉืึทืŸ ืฉืœื™ืกืœืขืŸ ื–ืขื ืขืŸ ืคืืจื‘ื™ื˜ืŸ. ื–ืืœ ืก ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื™ ืžืขื’ืœืขืš ืึธืคึผืฆื™ืขืก. EAP - ื’ืขื•ื•ื™ื™ื ื˜ ืื™ืŸ ื“ื™ ื“ืขืจืžืื ื˜ WPA-Enterprice, ื ื™ืฆื˜ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ื™ ืืจื™ื™ืŸ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ ื“ืึทื˜ืŸ. SAE - ื’ืขื ื™ืฆื˜ ืื™ืŸ ืึทื•ื•ืึทื ืกื™ืจื˜ืข WPA3, ืžืขืจ ืงืขื’ื ืฉื˜ืขืœื™ืง ืฆื• ื‘ืจื•ื˜ ืงืจืึทืคื˜. PSK - ื“ื™ ืžืขืจืกื˜ ืคึผืจืึธืกื˜ ืึธืคึผืฆื™ืข ื™ื ื•ื•ืึทืœื•ื•ื– ืึทืจื™ื™ึทืŸ ืึท ืคึผืึทืจืึธืœ ืื•ืŸ ื˜ืจืึทื ืกืžื™ื˜ื™ื ื’ ืขืก ืื™ืŸ ื™ื ืงืจื™ืคึผื˜ื™ื“ ืคืึธืจืขื. IEEE8021X - ืœื•ื™ื˜ ืึทืŸ ืื™ื ื˜ืขืจื ืึทืฆื™ืึธื ืึทืœืข ืกื˜ืึทื ื“ืึทืจื˜ (ืึทื ื“ืขืจืฉ ืคื•ืŸ ื“ืขื ื’ืขืฉื˜ื™ืฆื˜ ื“ื•ืจืš ื“ื™ WPA ืžืฉืคึผื—ื”). OWE (ืึธืคึผืคึผืึธืจื˜ื•ื ื™ืกื˜ื™ืง ื•ื•ื™ืจืขืœืขืกืก ืขื ืงืจื™ืคึผืฉืึทืŸ) ืื™ื– ืึท ืคืึทืจืœืขื ื’ืขืจื•ื ื’ ืคื•ืŸ ื“ื™ IEEE 802.11 ื ืึธืจืžืึทืœ ืคึฟืึทืจ ื•ื•ื™ื™ื–ื˜ ื•ื•ืึธืก ืžื™ืจ ืงืœืึทืกืึทืคื™ื™ื“ ื•ื•ื™ OPEN. OWE ื™ื ืฉื•ืจื– ื“ื™ ื–ื™ื›ืขืจื”ื™ื™ื˜ ืคื•ืŸ ื“ืึทื˜ืŸ ื˜ืจืึทื ืกืžื™ื˜ื˜ืขื“ ืื™ื‘ืขืจ ืึทืŸ ืึทื ืกื™ืงื™ื•ืจื“ ื ืขืฅ ื“ื•ืจืš ืขื ืงืจื™ืคึผื˜ื™ื ื’ ืขืก. ืึทืŸ ืึธืคึผืฆื™ืข ืื™ื– ืื•ื™ืš ืžืขื’ืœืขืš ื•ื•ืขืŸ ืขืก ื–ืขื ืขืŸ ืงื™ื™ืŸ ืึทืงืกืขืก ืฉืœื™ืกืœืขืŸ, ืœืึธื–ืŸ ืื•ื ื“ื– ืจื•ืคืŸ ื“ืขื ืึธืคึผืฆื™ืข NONE.

ื“ื™ ื“ืจื™ื˜ ืคึผืึทืจืึทืžืขื˜ืขืจ ืื™ื– ื“ื™ ืึทื–ื•ื™ ื’ืขืจื•ืคืขื ืข. ืขื ืงืจื™ืคึผืฉืึทืŸ ืกืงื™ืžื– - ื•ื•ื™ ืคึผื•ื ืงื˜ ื“ื™ ืกื™ืคืขืจ ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ื‘ืึทืฉื™ืฆืŸ ื“ื™ ื˜ืจืึทื ืกืžื™ื˜ื˜ืขื“ ื“ืึทื˜ืŸ. ื–ืืœ ืก ืจืฉื™ืžื” ื“ื™ ืึธืคึผืฆื™ืขืก. WEP - ื ื™ืฆื˜ ืึท RC4 ื˜ื™ื™ึทืš ืกื™ืคืขืจ, ื“ืขืจ ืกื•ื“ ืฉืœื™ืกืœ ืื™ื– ื“ื™ ืขื ืงืจื™ืคึผืฉืึทืŸ ืฉืœื™ืกืœ, ื•ื•ืึธืก ืื™ื– ื’ืขื”ืืœื˜ืŸ ืึทื ืึทืงืกืขืคึผื˜ืึทื‘ืึทืœ ืื™ืŸ ื“ืขืจ ื•ื•ืขืœื˜ ืคื•ืŸ ืžืึธื“ืขืจืŸ ืงืจื™ืคึผื˜ืึธื’ืจืึทืคื™. TKIP - ื’ืขื ื™ืฆื˜ ืื™ืŸ WPA, CKIP - ืื™ืŸ WPA2. TKIP + CKIP - ืงืขื ืขืŸ ื–ื™ื™ืŸ ืกืคึผืขืกื™ืคื™ืขื“ ืื™ืŸ WPA ืื•ืŸ WPA2 ื•ื•ื™ื™ื–ื˜ ืคึฟืึทืจ ืฆื•ืจื™ืง ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™.

ืึทื ืฉื˜ืึธื˜ ื“ืจื™ื™ ืขืœืขืžืขื ื˜ืŸ, ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ืึท ืขืœื ื˜ WEP ืฆื™ื™ื›ืŸ:

[WEP]

ื•ื•ื™ ืžื™ืจ ื“ื™ืกืงืึทืกื˜ ืื•ื™ื‘ืŸ, ื“ืึธืก ืื™ื– ื’ืขื ื•ื’ ื ื™ืฉื˜ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ืึทืœื’ืขืจื™ื“ืึทื ืคึฟืึทืจ ื ื™ืฆืŸ ืฉืœื™ืกืœืขืŸ, ื•ื•ืึธืก ื˜ื•ื˜ ื ื™ืฉื˜ ืขืงืกื™ืกื˜ื™ืจืŸ, ืื•ืŸ ื“ื™ ืขื ืงืจื™ืคึผืฉืึทืŸ ืื•ืคึฟืŸ, ื•ื•ืึธืก ืื™ื– ื“ื™ ื–ืขืœื‘ืข ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜.

ืื™ืฆื˜ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ืขื ืงืœืึทืžืขืจ:

[ESS]

ืขืก Wi-Fi ืึทืคึผืขืจื™ื™ื˜ื™ื ื’ ืžืึธื“ืข ืึธื“ืขืจ ื•ื•ื™-ืคื™ ื ืขืฅ ื˜ืึธืคึผืึธืœืึธื’ื™. ืื™ืจ ืงืขืŸ ื˜ืจืขืคืŸ BSS (Basic Service Set) ืžืึธื“ืข - ื•ื•ืขืŸ ืขืก ืื™ื– ืื™ื™ืŸ ืึทืงืกืขืก ืคื•ื ื˜ ื“ื•ืจืš ื•ื•ืึธืก ืคืืจื‘ื•ื ื“ืŸ ื“ืขื•ื•ื™ืกืขืก ื™ื‘ืขืจื’ืขื‘ืŸ. ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื•ื™ืฃ ื”ื™ื’ืข ื ืขื˜ื•ื•ืึธืจืงืก. ื•ื•ื™ ืึท ื”ืขืจืฉืŸ, ืึทืงืกืขืก ืคื•ื ืงื˜ืŸ ื–ืขื ืขืŸ ื“ืืจืฃ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ื“ืขื•ื•ื™ืกืขืก ืคื•ืŸ ืคืึทืจืฉื™ื“ืขื ืข ื”ื™ื’ืข ื ืขื˜ื•ื•ืึธืจืงืก, ืึทื–ื•ื™ ื–ื™ื™ ื–ืขื ืขืŸ ื˜ื™ื™ืœ ืคื•ืŸ ืขืงืกื˜ืขื ื“ืขื“ ืกืขืจื•ื•ื™ืก ืกืขืฅ - ESS. ื“ื™ IBSSs (Independent Basic Service Sets) ื˜ื™ืคึผ ื™ื ื“ื™ืงื™ื™ืฅ ืึทื– ื“ื™ ืžื™ื˜ืœ ืื™ื– ืึท ื˜ื™ื™ืœ ืคื•ืŸ ืึท ืคึผื™ืจ-ืฆื•-ื™ื™ึทื ืงื•ืงื  ื ืขืฅ.

ืื™ืจ ืงืขืŸ ืื•ื™ืš ื–ืขืŸ ื“ื™ WPS ืคืึธืŸ:

[WPS]

WPS (Wi-Fi Protected Setup) ืื™ื– ืึท ืคึผืจืึธื˜ืึธืงืึธืœ ืคึฟืึทืจ ื”ืึทืœื‘-ืึธื˜ืึทืžืึทื˜ื™ืง ื™ื ื™ื˜ื™ืึทืœื™ื–ื™ื™ืฉืึทืŸ ืคื•ืŸ ืึท Wi-Fi ื ืขืฅ. ืฆื• ื™ื ื™ืฉืึทืœื™ื™ื–, ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืึธื“ืขืจ ืึทืจื™ื™ึทืŸ ืึท ืคึผืึทืจืึธืœ ืคื•ืŸ 8 ืื•ืชื™ื•ืช ืึธื“ืขืจ ื“ืจื™ืงืŸ ืึท ืงื ืขืคึผืœ ืื•ื™ืฃ ื“ื™ ืจืึทื•ื˜ืขืจ. ืื•ื™ื‘ ื“ื™ื™ืŸ ืึทืงืกืขืก ืคื•ื ื˜ ืื™ื– ืคื•ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ื™ืคึผ ืื•ืŸ ื“ืขื ื˜ืฉืขืงืงื‘ืึธืงืก ืื™ื– ื’ืขื•ื•ื™ื–ืŸ ื•ื•ื™ื™ึทื˜ืขืจ ืฆื• ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ื™ืŸ ืึทืงืกืขืก ืคื•ื ื˜, ืื™ืจ ื–ืขื ืขืŸ ืฉื˜ืืจืง ืจืขืงืึทืžืขื ื“ื™ื“ ืฆื• ื’ื™ื™ืŸ ืฆื• ื“ื™ ืึทื“ืžื™ืŸ ื˜ืึทืคืœื™ืข ืื•ืŸ ื“ื™ืกื™ื™ื‘ืึทืœ WPS ืึทืงืกืขืก. ื“ืขืจ ืคืึทืงื˜ ืื™ื– ืึทื– ืึธืคื˜ ื“ื™ 8-ืฆื™ืคึฟืขืจ PIN ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ื“ื•ืจืš ื“ื™ 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

ื“ื™ ืึทืจื•ื™ืกื’ืขื‘ืŸ ืคื•ืŸ ืงืึทื ืขืงื˜ื™ื ื’ ืฆื• ื“ื™ ื ืขืฅ ืคึฟื•ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงืึธื“ ืื™ื– ืคืืจื‘ืœื™ื‘ืŸ ืึทื ื™ืงืกืึทืžื™ื™ื ื“. ืื™ืš ื•ื•ืขืœ ื ืึธืจ ื–ืึธื’ืŸ ืึทื– ืื™ืŸ ืกื“ืจ ืฆื• ืœื™ื™ืขื ืขืŸ ื’ืขืจืื˜ืขื•ื•ืขื˜ ืคึผืึทืกื•ื•ืขืจื“ื– ืคึฟื•ืŸ ื“ื™ ืึทืก ืคื•ืŸ ืึท ืจื™ืจืขื•ื•ื“ื™ืง ืžื™ื˜ืœ, ืื™ืจ ื“ืึทืจืคึฟืŸ ื•ื•ืึธืจืฆืœ ืจืขื›ื˜ ืื•ืŸ ืึท ื•ื•ื™ืœื™ื ื’ื ืึทืก ืฆื• ืจื•ืžื– ื“ื•ืจืš ื“ื™ ื˜ืขืงืข ืกื™ืกื˜ืขื ืฆื• ืœื™ื™ืขื ืขืŸ wpa_supplicant.conf. ืื•ื™ื‘ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืœืึธื’ื™ืง ืจื™ืงื•ื•ื™ื™ืขืจื– ืึทืจื™ื™ึทืŸ ืึท ืคึผืึทืจืึธืœ ืคื•ืŸ ืึทืจื•ื™ืก, ื“ื™ ืงืฉืจ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืžืื›ื˜ ื“ื•ืจืš ื“ื™ ืงืœืึทืก android.net.wifi.WifiManager.

ื“ืึทื ืง ืขื’ืึธืจ ืคึผืึธื ืึธืžืึทืจืขื•ื• ืคึฟืึทืจ ื•ื•ืขืจื˜ืคื•ืœ ืึทื“ื™ืฉืึทื ื–.

ืื•ื™ื‘ ืื™ืจ ื˜ืจืึทื›ื˜ืŸ ืขืคึผืขืก ื“ืึทืจืฃ ืฆื• ื–ื™ื™ืŸ ืžื•ืกื™ืฃ ืึธื“ืขืจ ืงืขืจืขืงื˜ืึทื“, ืฉืจื™ื™ึทื‘ืŸ ืื™ืŸ ื“ื™ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ :)

ืžืงื•ืจ: www.habr.com

ืงื•ื™ืคืŸ ืคืึทืจืœืึธื–ืœืขืš ื”ืึธืกื˜ื™ื ื’ ืคึฟืึทืจ ื–ื™ื™ื˜ืœืขืš ืžื™ื˜ DDoS ืฉื•ืฅ, VPS VDS ืกืขืจื•ื•ืขืจืก ๐Ÿ”ฅ ืงื•ื™ืคื˜ ืคืึทืจืœืขืกืœืขื›ืข ื•ื•ืขื‘ื–ื™ื™ื˜ืœ ื”ืึธืกื˜ื™ื ื’ ืžื™ื˜ DDoS ืฉื•ืฅ, VPS VDS ืกืขืจื•ื•ืขืจืก | ProHoster