ืืื ืืื ืืืืชื ืฆืจืื ืืกืจืืง ืจืฉืชืืช Wi-Fi ืืืืฉืืื ืื ืืจืืืื ืืืงืื ื ืชืื ืื ืืคืืจืืื ืขื ื ืงืืืืช ืืืฉื.
ืืื ื ืืืฆื ื ืืืชืืืื ืขื ืืกืคืจ ืงืฉืืื:
ืืืืจ ืื ืื ืืืฆื ืืืฉืื ื ืชืื ืื ืืงืืคืื ืขื ืกืืืืช ื-Wi-Fi ืืงืื ืื ืืจืืืื ืืื NDK, ืคืจืืฆืืช, ืืื ืจืง ืืืืฆืขืืช ื-API ืฉื Android ืืืืืื ืืืฆื ืืคืจืฉ ืืืช.
ืืืื ืื ื ืชืขืื ืื ืชืืื ืืืชืื ืงืื.
1. ืฆืืจ ืคืจืืืงื
ืืขืจื ืื ืืืืขืืช ืืื ืฉืืฆืจ ืคืจืืืงื ืื ืืจืืืื ืืืชืจ ืืคืขื ืืืช, ืืื ืื ื ืืฉืืืืื ืืช ืืคืจืืื ืฉื ืคืจืื ืื. ืืงืื ืฉืืืื ืืืฆื ื-Kotlin, minSdkVersion=23.
2. ืืจืฉืืืช ืืืฉื
ืืื ืืขืืื ืขื Wi-Fi ืืืืคืืืงืฆืื, ืชืฆืืจื ืืงืื ืืกืคืจ ืืจืฉืืืช ืืืืฉืชืืฉ. ืืืชืื ื
ืื ื-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. ืฆืืจ BroadcastReceiver ืืืืจืฉื ืืืืจืืขื ืขืืืื ื ืชืื ืื ืขื ืกืจืืงืช ืกืืืืช ืจืฉืช ื-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, ืื ืืืืื.
ืืกื ืืื ืงืืืื ื ืจืฉืืื ืฉื ืืคืฆืื
4. ืขืืื ื-ScanResult ืืืืื ืืช ืืชื ืืื
ืืืื ื ืกืชืื ืขื ืืื ืฉืืืช ืืืืชื ืื ืื ืชืืจ ืืช ืืฉืืขืืชื:
SSID โ ืืืื ืขืจืืช ืฉืืจืืช ืืื ืฉื ืืจืฉืช
BSSID - ืืืื ืขืจืืช ืฉืืจืืช ืืกืืกืืช - ืืชืืืช MAC ืฉื ืืชืื ืืจืฉืช (ื ืงืืืช Wi-Fi)
ืจึธืึธื โ ืืืืื ืขืืฆืืช ืืืช ืืชืงืื [dBm (dBm ืจืืกืืช) โ ืืฆืืื, ืืกืคืง ืืืืืก 1 mW.] โ ืืื ืืืงืืืจ ืฉื ืขืืฆืืช ืืืืช ืืืชืงืื. ืืืงื ืขืจื ื-0 ืขื -100, ืืื ืฉืืจืืง ื-0, ืื ืืื ืืืชืจ ืืื ืืืืช ืืืืจื ืืืจื ืื ืงืืืช ื-Wi-Fi ืืืืฉืืจ ืฉืื. ืคืจืืื ื ืืกืคืื ื ืืชื ืืืฆืื, ืืืฉื, ืืืชืืืช
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 ืืืื-ืืจืฅ. ืืื, ืืืชืจ ืืืืง, ืื ืงืืื ืืฉืืจืช ืืืืข ืืืืคืื ืฉืื ืืชืืจ ืืืืกืคืจ ืงืจืื ืืื ืฉืฉืื. ืืกืคืจ ืขืจืืฆืื ืืชืืจืื ืืชืืืืื
/* ะฟะพ ัะฐััะพัะต ะพะฟัะตะดะตะปัะตะผ ะฝะพะผะตั ะบะฐะฝะฐะปะฐ */
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-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]
ืืืฉืืขืืช ืืจืืฉืื ื ืืชืืจืช โโืืช ืื ืฉื ืงืจื. ืฉืืืช ืืืืืช. ืืืืืจ, ืืืื ืจืฆืฃ ืฉื ืคืขืืืืช ืขื ืืืืฉืืจ ืื ืงืืืช ืืืืฉื ืืืฆืข ืืื ืฉื ืงืืืช ืืืืฉื ืชืืคืฉืจ ืฉืืืืฉ ืืขืฆืื ืืืืฆื ืืืฆืคืื ืืช ืืืืขื. ืืืื ืืชืืืช ืคืืกื ืื, ืืืคืฉืจืืืืช ืื ืคืืฆืืช ืืืืชืจ ืื WPA ื-WPA2, ืฉืืื ืื ืืืฉืืจ ืืืืืจ ืืฉืืจืืช ืื ืืจื ืื ืฉื ืงืจื. ืฉืจืช RADIUS (WPA-Enterprice) ืืกืคืง ืืช ืืกืืกืื ืืขืจืืฅ ืืืฆืคื. ืกืืืจ ืืื ืื ืฉื ืงืืืช ืืืืฉื ืืืืชื ืืกืคืงืช ืืืืืจ ืืืชืื ืืชืื ืืช ืื. ืืืืื ืืื ืืืจืกื ืืฉื ืืื ืืืจืกื ืืจืืฉืื ื ืืื ืฉืืฉ ืื ืฆืืคื ืืืง ืืืชืจ: AES ืืขืืืช TKIP ืืื ืืืืืื. ืื WPA3, ืฉืืื ืืืจืื ืืืชืงืื ืืืชืจ, ืืืฆื ืืืืจืื. ืชืืืืจืืืช, ืืืชืื ืฉืืฉ ืืคืฉืจืืช ืขื ืคืชืจืื ื-Enterprice CCKM (Cisco Centralized Key Management), ืืื ืืขืืื ืื ื ืชืงืืชื ืื.
ืืืชืื ืฉื ืงืืืช ืืืืฉื ืืืืืจื ืืืืืืช ืืคื ืืชืืืช MAC. ืืืืืคืื, ืื ื ืงืืืช ืืืืฉื ืืกืคืงืช ื ืชืื ืื ืืืืฆืขืืช ืืืืืจืืชื WEP ืืืืืฉื, ืืืขืฉื ืืื ืืืืืช (ืืืคืชื ืืกืืื ืืื ืืื ืืคืชื ืืืฆืคื ื). ืื ื ืืกืืืืื ืืคืฉืจืืืืช ืืืื ืืฉืืจ.
ืืฉื ื ืื ืฉืืื ืคืืคืืืจืืช ื-wi-fi ืฆืืืืจื ืขื Captive Portal Detection ืืืกืชืจ - ืืงืฉืช ืืืืืช ืืจื ืืคืืคื. ื ืงืืืืช ืืืฉื ืืืื ื ืจืืืช ืืกืืจืง ืืคืชืืืืช (ืฉืื ืื ืงืืืช ืืืื ืฉื ืืืืืืจ ืืคืืื). ืืื, ืื ื ืืกืืืืื ืืืชื ื-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. ืืชื ืขืืื ืืืืชืงื ืืืฆื BSS (Basic Service Set) - ืืืฉืจ ืืฉ ื ืงืืืช ืืืฉื ืืืช ืฉืืจืื ืืืฉืืจืื ืืืืืจืื ืืชืงืฉืจืื. ื ืืชื ืืืฆืื ืืจืฉืชืืช ืืงืืืืืช. ืืืื, ืืฉ ืฆืืจื ืื ืงืืืืช ืืืฉื ืืืืืืจ ืืชืงื ืื ืืจืฉืชืืช ืืงืืืืืช ืฉืื ืืช, ืื ืฉืื ืืืง ื-Extended Service Sets - ESS. ืกืื ื-IBSSs (Independent Basic Service Sets) ืืฆืืื ืฉืืืืฉืืจ ืืื ืืืง ืืจืฉืช Peer-to-Peer.
ืืืชืื ืฉืชืจืื ืื ืืช ืืื ื-WPS:
[WPS]
WPS (ืืืืจื ืืืื ืช Wi-Fi) ืืื ืคืจืืืืงืื ืืืชืืื ืืฆื ืืืืืืื ืฉื ืจืฉืช Wi-Fi. ืืื ืืืชืื, ืืืฉืชืืฉ ืืืื ืกืืกืื ืืช 8 ืชืืืื ืื ืืืืฅ ืขื ืืคืชืืจ ืื ืชื. ืื ื ืงืืืช ืืืืฉื ืฉืื ืืื ืืืกืื ืืจืืฉืื ืืชืืืช ืกืืืื ืื ืืืคืืขื ืืฆื ืฉื ื ืงืืืช ืืืืฉื ืฉืื, ืืืืืฅ ืืืื ืืขืืืจ ืืืื ืื ืืืื ืืืืฉืืืช ืืช ืืืฉืช WPS. ืืขืืืื ืืื ืฉืืขืชืื ืงืจืืืืช ื ืืชื ืืืืืช ืืช ื-PIN ืื 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
ืกืืืืืช ืืืชืืืจืืช ืืจืฉืช ืืงืื ืืืคืืืงืฆืื ื ืืชืจื ืืืชื ื ืืืงืช. ืื ื ืจืง ืืืื ืฉืืื ืืงืจืื ืกืืกืืืืช ืฉืืืจืืช ืืืขืจืืช ืืืคืขืื ืฉื ืืืฉืืจ ื ืืื, ืืชื ืฆืจืื ืืืืืืช ืฉืืจืฉ ืื ืืื ืืช ืืืื ืืืขืจืืช ืืงืืฆืื ืืื ืืงืจืื ืืช wpa_supplicant.conf. ืื ืืืืืืงื ืฉื ืืืคืืืงืฆืื ืืืจืฉืช ืืื ืช ืกืืกืื ืืืืืฅ, ื ืืชื ืืืฆืืจ ืืช ืืืืืืจ ืืจื ืืืืชื
ืชืืื
ืื ืืชื ืืืฉืืื ืฉืฆืจืื ืืืืกืืฃ ืื ืืชืงื ืืฉืื, ืืชืื ืืชืืืืืช :)
ืืงืืจ: www.habr.com