เชเช เชฆเชฟเชตเชธ เชฎเชพเชฐเซ Android เชเชชเซเชฒเชฟเชเซเชถเชจเซเชฎเชพเชเชฅเซ Wi-Fi เชจเซเชเชตเชฐเซเชเซเชธ เชธเซเชเซเชจ เชเชฐเชตเชพเชจเซ เช
เชจเซ เชเชเซเชธเซเชธ เชชเซเชเชจเซเช เชตเชฟเชถเซ เชตเชฟเชเชคเชตเชพเชฐ เชกเซเชเชพ เชฎเซเชณเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชนเชคเซ.
เช
เชนเซเช เช
เชฎเชจเซ เชเชฃเซ เชฎเซเชถเซเชเซเชฒเซเชเชจเซ เชธเชพเชฎเชจเซ เชเชฐเชตเซ เชชเชกเซเชฏเซ:
เช เชฒเซเช เชเชฐเซเชเชพ เชเชฐเซ เชเซ เชเซ NDK, เชนเซเชเซเชธ เชตเชเชฐ Android เชเซเชกเชฎเชพเชเชฅเซ Wi-Fi เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชตเชฟเชถเซเชจเซ เชตเซเชฏเชพเชชเช เชกเซเชเชพ เชเซเชตเซ เชฐเซเชคเซ เชฎเซเชณเชตเชตเซ, เชชเชฐเชเชคเซ เชฎเชพเชคเซเชฐ Android API เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เช เชจเซ เชคเซเชจเซเช เช เชฐเซเชฅเชเชเชจ เชเซเชตเซ เชฐเซเชคเซ เชเชฐเชตเซเช เชคเซ เชธเชฎเชเชตเซเช.
เชเชพเชฒเซ เชตเชฟเชฒเชเชฌ เชจ เชเชฐเซเช เช เชจเซ เชเซเชก เชฒเชเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเช.
1. เชเช เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเซ
เช เชจเซเชเชง เชเชตเชพ เชฒเซเชเซ เชฎเชพเชเซ เชเซ เชเซ เชเซเชฎเชฃเซ เชเช เชเชฐเชคเชพ เชตเชงเซ เชตเชเชค Android เชชเซเชฐเซเชเซเชเซเช เชฌเชจเชพเชตเซเชฏเซ เชเซ, เชคเซเชฅเซ เช เชฎเซ เช เชเชเชเชฎเชจเซ เชตเชฟเชเชคเซ เชเซเชกเซ เชฆเชเช เชเซเช. เชจเซเชเซเชจเซ เชเซเชก เชเซเชเชฒเชฟเชจเชฎเชพเช เชฐเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, 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 เชชเชฆเซเชงเชคเชฟ API เชธเชเชธเซเชเชฐเชฃ 28 เชฅเซ เชตเชเชเชฟเชค เชคเชฐเซเชเซ เชเชฟเชนเซเชจเชฟเชค เชฅเชฏเซเชฒ เชเซ, เชชเชฐเชเชคเซ เชฌเชเชง เชเซ.
เชเซเชฒ, เช
เชฎเชจเซ เชเชฌเซเชเซเชเซเชเซเชธเชจเซ เชธเซเชเชฟ เชชเซเชฐเชพเชชเซเชค เชฅเช
4. ScanResult เชเซเช เช เชจเซ เชถเชฐเชคเซ เชธเชฎเชเซ
เชเชพเชฒเซ เช เชตเชฐเซเชเชจเชพ เชเซเชเชฒเชพเช เชเซเชทเซเชคเซเชฐเซ เชเซเชเช เช เชจเซ เชคเซเชจเซ เช เชฐเซเชฅ เชถเซเช เชเซ เชคเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซเช:
เชเชธเชเชธเชเชเชกเซ โ เชธเชฐเซเชตเชฟเชธ เชธเซเช เชเชเชกเซเชจเซเชเชฟเชซเชพเชฏเชฐ เช เชจเซเชเชตเชฐเซเชเชจเซเช เชจเชพเชฎ เชเซ
เชฌเซเชเชธเชเชธเชเชเชกเซ - เชฎเซเชณเชญเซเชค เชธเซเชตเชพ เชธเซเช เชเชณเชเชเชฐเซเชคเชพ - เชจเซเชเชตเชฐเซเช เชเชกเซเชชเซเชเชฐเชจเซเช 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 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.* เชชเซเชเซเชเชจเชพ เชตเชฐเซเชเซเชจเซ เชเชชเชฏเซเช Linux เชเชชเชฏเซเชเชฟเชคเชพ เชฆเซเชตเชพเชฐเชพ เชนเซเชก เชนเซเช เชณ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เช เชฎเซ เชธเชคเชค เชเชพเชฎ เชเชฐเซเชถเซเช. เชเชพเชฒเซ เชชเชนเซเชฒเชพ เชซเซเชฐเซเชฎเซเชเชจเชพ เชเชเชเชชเซเชเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเชเช เชเซเชฎเชพเช เชเซเชเชธเชจเซ เช เชเชฆเชฐเชจเชพ เชเชเชเซเชจเซ โ-โ เชเชฟเชนเซเชจ เชฆเซเชตเชพเชฐเชพ เช เชฒเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
[WPA-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]
เชชเซเชฐเชฅเชฎ เช เชฐเซเชฅ เชเชนเซเชตเชพเชคเชพ เชตเชฐเซเชฃเชตเซ เชเซ. เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชชเชฆเซเชงเชคเชฟ. เชเชเชฒเซ เชเซ, เชเชเซเชธเซเชธ เชชเซเชเชจเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เช เชจเซ เชชเซเชฒเซเชกเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชเชจเซเชเซเชฐเชฟเชชเซเช เชเชฐเชตเซเช เชคเซ เชฎเชพเชเซ เชเชชเชเชฐเชฃ เช เชจเซ เชเชเซเชธเซเชธ เชชเซเชเชจเซเชเซ เชเซเชฐเชฟเชฏเชพเชเชจเซ เชเชฏเซ เชเซเชฐเชฎ เชเชฐเชตเซ เชเซเชเช. เช เชชเซเชธเซเช เชฒเชเชคเซ เชตเชเชคเซ, เชธเซเชฅเซ เชธเชพเชฎเชพเชจเซเชฏ เชตเชฟเชเชฒเซเชชเซ WPA เช เชจเซ WPA2 เชเซ, เชเซเชฎเชพเช เชเซเชฏเชพเช เชคเซ เชฆเชฐเซเช เชเชจเซเชเซเชเซเชก เชเชชเชเชฐเชฃ เชธเซเชงเชพ เช เชฅเชตเชพ เชเชนเซเชตเชพเชคเชพ เชฆเซเชตเชพเชฐเชพ. RADIUS เชธเชฐเซเชตเชฐ (WPA-Enterprice) เชเชจเซเชเซเชฐเชฟเชชเซเชเซเชก เชเซเชจเชฒ เชชเชฐ เชชเชพเชธเชตเชฐเซเชก เชชเซเชฐเซ เชชเชพเชกเซ เชเซ. เชฎเซเชเซ เชญเชพเชเซ, เชคเชฎเชพเชฐเชพ เชเชฐเชฎเชพเช เชเชเซเชธเซเชธ เชชเซเชเชจเซเช เช เชธเซเชเซเชฎ เช เชจเซเชธเชพเชฐ เชเชจเซเชเซเชถเชจ เชชเซเชฐเซเช เชชเชพเชกเซ เชเซ. เชฌเซเชเชพ เชธเชเชธเซเชเชฐเชฃ เช เชจเซ เชชเซเชฐเชฅเชฎ เชตเชเซเชเซเชจเซ เชคเชซเชพเชตเชค เช เชเซ เชเซ เชคเซเชฎเชพเช เชฎเชเชฌเซเชค เชธเชพเชเชซเชฐ เชเซ: AES เชตเชฟเชฐเซเชฆเซเชง เช เชธเซเชฐเชเซเชทเชฟเชค TKIP. WPA3, เชเซ เชตเชงเซ เชเชเชฟเชฒ เช เชจเซ เช เชฆเซเชฏเชคเชจ เชเซ, เชคเซ เชชเชฃ เชงเซเชฎเซ เชงเซเชฎเซ เชฐเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชฐเชนเซเชฏเซเช เชเซ. เชธเซเชฆเซเชงเชพเชเชคเชฟเช เชฐเซเชคเซ, เชเชจเซเชเชฐเชชเซเชฐเชพเชเชธ เชธเซเชฒเซเชฏเซเชถเชจ CCKM (เชธเชฟเชธเซเชเซ เชธเซเชจเซเชเซเชฐเชฒเชพเชเชเซเชก เชเซ เชฎเซเชจเซเชเชฎเซเชจเซเช) เชธเชพเชฅเซ เชเซเช เชตเชฟเชเชฒเซเชช เชนเซเช เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เชฎเชจเซ เชคเซ เชเซเชฏเชพเชฐเซเชฏ เชฎเชณเซเชฏเซเช เชจเชฅเซ.
เชเชเซเชธเซเชธ เชชเซเชเชจเซเช 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 เชเชชเชฐเซเชเชฟเชเช เชฎเซเชก เช เชฅเชตเชพ Wi-Fi เชจเซเชเชตเชฐเซเช เชเซเชชเซเชฒเซเชเซ. เชคเชฎเซ BSS (เชฎเซเชณเชญเซเชค เชธเซเชตเชพ เชธเซเช) เชฎเซเชกเชจเซ เชธเชพเชฎเชจเซ เชเชฐเซ เชถเชเซ เชเซ - เชเซเชฏเชพเชฐเซ เชคเซเชฏเชพเช เชเช เชเชเซเชธเซเชธ เชชเซเชเชจเซเช เชนเซเชฏ เชเซเชจเชพ เชฆเซเชตเชพเชฐเชพ เชเชจเซเชเซเชเซเชก เชเชชเชเชฐเชฃเซ เชตเชพเชคเชเซเชค เชเชฐเซ เชเซ. เชธเซเชฅเชพเชจเชฟเช เชจเซเชเชตเชฐเซเชเซเชธ เชชเชฐ เชฎเชณเซ เชถเชเซ เชเซ. เชเช เชจเชฟเชฏเชฎ เชคเชฐเซเชเซ, เชตเชฟเชตเชฟเชง เชธเซเชฅเชพเชจเชฟเช เชจเซเชเชตเชฐเซเชเซเชธเชฎเชพเชเชฅเซ เชเชชเชเชฐเชฃเซเชจเซ เชเชจเซเชเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเชเซเชธเซเชธ เชชเซเชเชจเซเชเชจเซ เชเชฐเซเชฐ เชเซ, เชคเซเชฅเซ เชคเซเช เชตเชฟเชธเซเชคเซเชค เชธเซเชตเชพ เชธเซเช - ESS เชจเซ เชญเชพเช เชเซ. IBSSs (เชธเซเชตเชคเชเชคเซเชฐ เชฎเซเชณเชญเซเชค เชธเซเชตเชพ เชธเซเช) เชชเซเชฐเชเชพเชฐ เชธเซเชเชตเซ เชเซ เชเซ เชเชชเชเชฐเชฃ เชชเซเช เชฐ-เชเซ-เชชเซเช เชฐ เชจเซเชเชตเชฐเซเชเชจเซ เชญเชพเช เชเซ.
เชคเชฎเซ WPS เชงเซเชตเช เชชเชฃ เชเซเช เชถเชเซ เชเซ:
[WPS]
WPS (Wi-Fi เชชเซเชฐเซเชเซเชเซเชเซเชก เชธเซเชเช เชช) เช Wi-Fi เชจเซเชเชตเชฐเซเชเชจเชพ เช เชฐเซเชง-เชธเซเชตเชเชพเชฒเชฟเชค เชชเซเชฐเชพเชฐเชเชญ เชฎเชพเชเซเชจเซ เชชเซเชฐเซเชเซเชเซเชฒ เชเซ. เชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพ เชฎเชพเชเซ, เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเชพเช เชคเซ 8-เช เชเซเชทเชฐเชจเซ เชชเชพเชธเชตเชฐเซเชก เชฆเชพเชเชฒ เชเชฐเซ เชเซ เช เชฅเชตเชพ เชฐเชพเชเชเชฐ เชชเชฐเชจเซเช เชฌเชเชจ เชฆเชฌเชพเชตเชถเซ. เชเซ เชคเชฎเชพเชฐเซ เชเชเซเชธเซเชธ เชชเซเชเชจเซเช เชชเซเชฐเชฅเชฎ เชชเซเชฐเชเชพเชฐเชจเซ เชเซ เช เชจเซ เช เชเซเชเชฌเซเชเซเชธ เชคเชฎเชพเชฐเชพ เชเชเซเชธเซเชธ เชชเซเชเชจเซเชเชจเชพ เชจเชพเชฎเชจเซ เชฌเชพเชเซเชฎเชพเช เชฆเซเชเชพเชฏ เชเซ, เชคเซ เชคเชฎเชจเซ เชเชกเชฎเชฟเชจ เชชเซเชจเชฒ เชชเชฐ เชเชตเชพ เช เชจเซ WPS เชเชเซเชธเซเชธเชจเซ เช เชเซเชทเชฎ เชเชฐเชตเชพเชจเซ เชญเชพเชฐเชชเซเชฐเซเชตเช เชญเชฒเชพเชฎเชฃ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชนเชเซเชเชค เช เชเซ เชเซ เชเชฃเซเชตเชพเชฐ MAC เชเชกเซเชฐเซเชธ เชฆเซเชตเชพเชฐเชพ 8-เช เชเชเชจเซ เชชเชฟเชจ เชถเซเชงเซ เชถเชเชพเชฏ เชเซ, เช เชฅเชตเชพ เชคเซเชจเซ เชจเชเซเชเชจเชพ เชธเชฎเชฏเชฎเชพเช เชธเซเชฐเซเช เชเชเช เชเชฐเซ เชถเชเชพเชฏ เชเซ, เชเซเชจเซ เชเซเช เช เชชเซเชฐเชฎเชพเชฃเชฟเชเชชเชฃเซ เชฒเชพเชญ เชฒเช เชถเชเซ เชเซ.
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
เชเชชเซเชฒเชฟเชเซเชถเชจ เชเซเชกเชฅเซ เชจเซเชเชตเชฐเซเชเชฅเซ เชเชจเซเชเซเช เชฅเชตเชพเชจเซ เชฎเซเชฆเซเชฆเซ เชคเชชเชพเชธเซเชฏเชพ เชตเชฟเชจเชพ เชฐเชนเซเชฏเซ. เชนเซเช เชซเชเซเชค เชเชเชฒเซเช เช เชเชนเซเชถ เชเซ เชฎเซเชฌเชพเชเชฒ เชเชชเชเชฐเชฃเชจเชพ OS เชฎเชพเชเชฅเซ เชธเชพเชเชตเซเชฒเชพ เชชเชพเชธเชตเชฐเซเชกเซเชธ เชตเชพเชเชเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชฐเซเช เชฐเชพเชเชเซเชธ เช
เชจเซ wpa_supplicant.conf เชตเชพเชเชเชตเชพ เชฎเชพเชเซ เชซเชพเชเชฒ เชธเชฟเชธเซเชเชฎ เชฆเซเชตเชพเชฐเชพ เชฐเซเชฎเซเช เชเชฐเชตเชพเชจเซ เชเชเซเชเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชคเชฐเซเช เชฎเชพเชเซ เชฌเชนเชพเชฐเชฅเซ เชชเชพเชธเชตเชฐเซเชก เชฆเชพเชเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ, เชคเซ เชเชจเซเชเซเชถเชจ เชตเชฐเซเช เชฆเซเชตเชพเชฐเชพ เชเชฐเซ เชถเชเชพเชฏ เชเซ
ะกะฟะฐัะธะฑะพ
เชเซ เชคเชฎเชจเซ เชฒเชพเชเซ เชเซ เชเชเชเช เชเชฎเซเชฐเชตเชพ เช
เชฅเชตเชพ เชธเซเชงเชพเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, เชคเซ เชเชฟเชชเซเชชเชฃเซเชเชฎเชพเช เชฒเชเซ :)
เชธเซเชฐเซเชธ: www.habr.com