Suatu hari saya perlu mengimbas rangkaian Wi-Fi daripada aplikasi Android dan mendapatkan data terperinci tentang titik akses.
Di sini kami terpaksa menghadapi beberapa kesukaran:
Artikel ini membincangkan cara mendapatkan data komprehensif tentang persekitaran Wi-Fi daripada kod Android tanpa NDK, penggodaman, tetapi hanya menggunakan API Android dan memahami cara mentafsirnya.
Jangan berlengah dan mula menulis kod.
1. Buat projek
Nota ini ditujukan untuk mereka yang telah mencipta projek Android lebih daripada sekali, jadi kami meninggalkan butiran item ini. Kod di bawah akan dibentangkan dalam Kotlin, minSdkVersion=23.
2. Kebenaran akses
Untuk bekerja dengan Wi-Fi daripada aplikasi, anda perlu mendapatkan beberapa kebenaran daripada pengguna. Sesuai dengan
Jadi, dalam AndroidManifest.xml kami akan menambah:
<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"/>
Dan dalam kod yang mengandungi pautan ke Aktiviti semasa:
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. Cipta Penerima Siaran dan langgan acara kemas kini data tentang mengimbas persekitaran rangkaian 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
}
Kaedah WiFiManager.startScan dalam dokumentasi ditandakan sebagai tidak digunakan sejak API versi 28, tetapi dimatikan.
Secara keseluruhan, kami menerima senarai objek
4. Lihat ScanResult dan fahami termanya
Mari lihat beberapa bidang kelas ini dan huraikan maksudnya:
SSID β Pengecam Set Perkhidmatan ialah nama rangkaian
BSSID β Pengecam Set Perkhidmatan Asas β Alamat MAC penyesuai rangkaian (titik Wi-Fi)
tahap β Penunjuk Kekuatan Isyarat Diterima [dBm (dBm Rusia) β Desibel, kuasa rujukan 1 mW.] β Penunjuk kekuatan isyarat yang diterima. Mengambil nilai dari 0 hingga -100, semakin jauh dari 0, semakin banyak kuasa isyarat hilang sepanjang perjalanan dari titik Wi-Fi ke peranti anda. Butiran lanjut boleh didapati, contohnya, di
val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
val numberOfLevels = 5
val level = WifiManager.calculateSignalLevel(level, numberOfLevels)
kekerapan β kekerapan operasi titik Wi-Fi [Hz]. Sebagai tambahan kepada kekerapan itu sendiri, anda mungkin berminat dengan saluran yang dipanggil. Setiap titik mempunyai ketulenan operasinya sendiri. Pada masa penulisan, julat titik Wi-Fi yang paling popular ialah 2.4 GHz. Tetapi, untuk menjadi lebih tepat, titik menghantar maklumat ke telefon anda pada frekuensi bernombor dekat dengan yang dinamakan. Bilangan saluran dan frekuensi yang sepadan
/* ΠΏΠΎ ΡΠ°ΡΡΠΎΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π½ΠΎΠΌΠ΅Ρ ΠΊΠ°Π½Π°Π»Π° */
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
}
}
keupayaan - bidang yang paling menarik untuk analisis, kerja yang memerlukan banyak masa. Di sini "keupayaan" titik ditulis dalam baris. Dalam kes ini, anda tidak perlu mencari butiran tafsiran rentetan dalam dokumentasi. Berikut ialah beberapa contoh perkara yang mungkin terdapat dalam baris ini:
[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. Memahami singkatan dan keupayaan menghurai
Perlu dinyatakan bahawa kelas pakej android.net.wifi.* digunakan di bawah hud oleh utiliti Linux
Kami akan bertindak secara konsisten. Mari kita pertimbangkan dahulu output format di mana unsur-unsur dalam kurungan dipisahkan dengan tanda β-β:
[WPA-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]
Makna pertama menerangkan apa yang dipanggil. kaedah pengesahan. Iaitu, urutan tindakan yang mesti dilakukan oleh peranti dan pusat akses agar titik akses membenarkan dirinya digunakan dan cara menyulitkan muatan. Pada masa menulis siaran ini, pilihan yang paling biasa ialah WPA dan WPA2, di mana sama ada setiap peranti yang disambungkan secara langsung atau melalui apa yang dipanggil. Pelayan RADIUS (WPA-Enterprice) menyediakan kata laluan melalui saluran yang disulitkan. Kemungkinan besar, titik akses di rumah anda menyediakan sambungan mengikut skema ini. Perbezaan antara versi kedua dan yang pertama ialah ia mempunyai sifir yang lebih kuat: AES berbanding TKIP yang tidak selamat. WPA3, yang lebih kompleks dan maju, juga secara beransur-ansur diperkenalkan. Secara teorinya, mungkin terdapat pilihan dengan penyelesaian enterprice CCKM (Cisco Centralized Key Management), tetapi saya tidak pernah menemuinya.
Titik akses mungkin telah dikonfigurasikan untuk mengesahkan dengan alamat MAC. Atau, jika pusat akses menyediakan data menggunakan algoritma WEP yang sudah lapuk, maka sebenarnya tiada pengesahan (kunci rahsia di sini ialah kunci penyulitan). Kami mengklasifikasikan pilihan tersebut sebagai LAIN.
Terdapat juga kaedah yang popular di wi-fi awam dengan Pengesanan Portal Tawanan tersembunyi - permintaan pengesahan melalui penyemak imbas. Titik capaian sedemikian kelihatan kepada pengimbas sebagai terbuka (yang mana ia adalah dari sudut pandangan sambungan fizikal). Oleh itu, kami mengklasifikasikannya sebagai TERBUKA.
Nilai kedua boleh ditandakan sebagai algoritma pengurusan utama. Ini ialah parameter kaedah pengesahan yang diterangkan di atas. Bercakap tentang cara pertukaran kunci penyulitan dengan tepat. Mari kita pertimbangkan pilihan yang mungkin. EAP - digunakan dalam WPA-Enterprice yang disebutkan, menggunakan pangkalan data untuk mengesahkan data pengesahan yang dimasukkan. SAE - digunakan dalam WPA3 lanjutan, lebih tahan terhadap kekerasan. PSK - pilihan yang paling biasa, melibatkan memasukkan kata laluan dan menghantarnya dalam bentuk yang disulitkan. IEEE8021X - mengikut piawaian antarabangsa (berbeza daripada yang disokong oleh keluarga WPA). OWE (Opportunistic Wireless Encryption) ialah lanjutan daripada standard IEEE 802.11 untuk mata yang kami klasifikasikan sebagai OPEN. OWE memastikan keselamatan data yang dihantar melalui rangkaian tidak terjamin dengan menyulitkannya. Pilihan juga boleh dilakukan apabila tiada kekunci akses, mari kita panggil pilihan ini TIADA.
Parameter ketiga ialah apa yang dipanggil. skim penyulitan β bagaimana sebenarnya sifir digunakan untuk melindungi data yang dihantar. Mari senaraikan pilihan. WEP - menggunakan sifir aliran RC4, kunci rahsia ialah kunci penyulitan, yang dianggap tidak boleh diterima dalam dunia kriptografi moden. TKIP - digunakan dalam WPA, CKIP - dalam WPA2. TKIP+CKIP - boleh ditentukan dalam mata yang mampu WPA dan WPA2 untuk keserasian ke belakang.
Daripada tiga elemen, anda boleh mencari tanda WEP yang sunyi:
[WEP]
Seperti yang kita bincangkan di atas, ini sudah cukup untuk tidak menentukan algoritma untuk menggunakan kunci, yang tidak wujud, dan kaedah penyulitan, yang sama secara lalai.
Sekarang pertimbangkan kurungan ini:
[ESS]
ini Mod pengendalian Wi-Fi atau Topologi rangkaian Wi-Fi. Anda mungkin menghadapi mod BSS (Set Perkhidmatan Asas) - apabila terdapat satu pusat akses yang melaluinya peranti yang disambungkan berkomunikasi. Boleh didapati di rangkaian tempatan. Sebagai peraturan, pusat akses diperlukan untuk menyambungkan peranti daripada rangkaian tempatan yang berbeza, jadi ia adalah sebahagian daripada Set Perkhidmatan Lanjutan - ESS. Jenis IBSS (Set Perkhidmatan Asas Bebas) menunjukkan bahawa peranti adalah sebahagian daripada rangkaian Peer-to-Peer.
Anda juga mungkin melihat bendera WPS:
[WPS]
WPS (Wi-Fi Protected Setup) ialah protokol untuk permulaan separa automatik bagi rangkaian Wi-Fi. Untuk memulakan, pengguna sama ada memasukkan kata laluan 8 aksara atau menekan butang pada penghala. Jika pusat akses anda adalah jenis pertama dan kotak semak ini muncul di sebelah nama pusat akses anda, anda amat disyorkan untuk pergi ke panel pentadbir dan melumpuhkan akses WPS. Hakikatnya selalunya PIN 8 digit boleh didapati melalui alamat MAC, atau ia boleh diselesaikan dalam masa yang boleh dijangka, yang boleh dimanfaatkan oleh seseorang secara tidak jujur.
6. Buat model dan fungsi penghuraian
Berdasarkan apa yang kami dapati di atas, kami akan menerangkan apa yang berlaku menggunakan kelas data:
/* ΡΡ
Π΅ΠΌΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ */
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.
}
Sekarang mari kita tulis fungsi yang akan menghuraikan medan keupayaan:
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. Lihat hasilnya
Saya akan mengimbas rangkaian dan menunjukkan kepada anda perkara yang saya temui. Ditunjukkan ialah hasil keluaran mudah melalui Log.d:
Capability of Home-Home [WPA2-PSK-CCMP][ESS][WPS]
...
capabilities=[Capability(authScheme=WPA2, keyManagementAlgorithm=PSK, cipherMethod=CCMP)], topologyMode=ESS, availableWps=true
Isu menyambung ke rangkaian daripada kod aplikasi kekal tidak diselidiki. Saya hanya akan mengatakan bahawa untuk membaca kata laluan yang disimpan daripada OS peranti mudah alih, anda memerlukan hak akar dan kesediaan untuk menyelongkar sistem fail untuk membaca wpa_supplicant.conf. Jika logik aplikasi memerlukan memasukkan kata laluan dari luar, sambungan boleh dibuat melalui kelas
Terima kasih
Jika anda rasa sesuatu perlu ditambah atau diperbetulkan, tulis dalam komen :)
Sumber: www.habr.com