á ááµ áá ášWi-Fi á áá³áš áášáŠáœá ášá ááµá®ááµ á ááá¬áœáᜠááááµ á¥á ášáá³ášá» áá¥áŠáœá á á°ááášá° áááá áášá ááááµ áá ášá¥áá¢
á¥áá
á¥á áœáá®áœ á áá¥ááááá¡-
áá áá£á¥á á«á NDK ᣠhacks ᣠáá á ááµá®ááµ á€áá áá á¥á» á áá áá á¥á á¥ááŽáµ á¥áá°áá°ášáá áµá Wi-Fi á á«á£á¢ á á ááá áášáá ášá ááµá®ááµ á®áµ á¥ááŽáµ ááááµ á¥áá°áá»á á«á¥á«á«áá¢
á áááá á¥á á®áµ áá»á á¥ááááá¢
1. áá®áááµ ááá á©
áá ááµá³áá» ášá ááµá®ááµ áá®áááµ ášá ááµ áá á áá ááá á© ášá³á°á ááᣠáµááá ášáá á áá¥á ááá áááá á¥áá°ááááᢠášá³áœ á«áá á®áµ á á®áµááᣠ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. á¥á®áµá«áµáµ áªá²ášá ááá á© á¥á áš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 áá¥á¥ áá° áá³áªá«á á áááµá°á ááááµ áá á áá·áᢠá°ášá᪠áááá®áœ ááá³á á
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 ááᢠááá ááᣠáá áᥠáµáááá ááááᣠáá¥á¡ ášá°á°ášáá á°á áá á á°ááá áá¥á á£áá á°á°áááááµ áášáá áá° áµááá á«áµá°ááááᢠášá°ááŠáœ á¥ááµ á¥á á°áá³á áµááááŸáœ
/* пП ÑаÑÑПÑе ПпÑеЎелÑеЌ ÐœÐŸÐŒÐµÑ ÐºÐ°ÐœÐ°Ð»Ð° */
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 ááµ á ááµá á¥ášá°ááá ááᢠá ááµá áá³á¥á£ ášá¢áá°ááá«ááµ áááµá 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 áááá ᥠášááá áµááá±á áááá°áœ ááá°á ááá á«áµááááá³áᢠášáá°áá áªá«á á áááá® ášáá ášááá áá ááµáá£áµ á«áµááá ááááá± á ááá ááµá¥ áášááá ááœáá
СпаÑОбП
ášáá ááá áá³ášá ááá áá³ášá á áá áµ á¥áá á«á°á¡ á á áµá°á«ášá¶á¹ ááµá¥ ááá :)
ááá: hab.com