前言
由于穩(wěn)定性均澳、成本等原因涎劈,大部分智能家居設(shè)備都只支持連接 2.4G 的無線網(wǎng)絡(luò)。所以我們?cè)诶?APP 實(shí)現(xiàn)配網(wǎng)的時(shí)候就需要判斷 Wi-Fi 是 2.4G奶躯、5G,還是 2.4G+5G 雙頻,也就是大部分智能家居設(shè)備是無法連接純 5G Wi-Fi 的督笆,如果用戶手機(jī)連接的是純 5G Wi-Fi 就需要給用戶一個(gè)提示信息,2.4G+5G 雙頻則不需要提示诱贿。
很多人肯定會(huì)想 “這個(gè)有什么難的娃肿?” 掃描出的 Wi-Fi 結(jié)果中肯定有屬性可以判斷。其實(shí)并沒有這么簡單珠十,我們的測試人員在禪道上提了這個(gè)問題料扰,結(jié)果我們團(tuán)隊(duì)負(fù)責(zé)這個(gè)功能的 Android 和 IOS 兩位小伙伴就把這個(gè) bug 在禪道上晾了幾個(gè)月,他們說確實(shí)沒什么辦法可以直接判斷焙蹭。
我今天沒這么忙就想起了這個(gè)問題晒杈,就想著看看能不能把這個(gè)問題解決掉。經(jīng)過查詢資料孔厉,確實(shí)可以通過掃描的頻率(frequency)來判斷是 2.4G 還是 5G拯钻,但是無法判斷出是 2.4G+5G 雙頻。我就不信了撰豺,Google 一頓搜索粪般,發(fā)現(xiàn)還真沒有解決方案!
經(jīng)過一個(gè)下午的分析后面終于解決了污桦!發(fā)現(xiàn)這個(gè)問題其實(shí)并不難亩歹,只是我一開始和其他兩個(gè)小伙伴一樣,由于對(duì) Wi-Fi 頻段不熟悉,思維沒有轉(zhuǎn)變過來捆憎,總是想著通過某個(gè) Wi-Fi 返回的信息來判斷是不是 2.4G+5G 雙頻舅柜,這個(gè)是行不通的,后面慢慢分析為什么行不通躲惰。
一致份、頻段
我們?cè)谔詫毶腺I路由器的時(shí)候,經(jīng)常會(huì)搜索到標(biāo)題包含 雙頻
的路由器础拨,這里的雙頻指的是這個(gè)路由器可以開兩個(gè)頻段的網(wǎng)絡(luò)氮块,分別是 2.4GHz 頻段和 5GHz 頻段。具體區(qū)別如下:
- 2.4GHz 頻段
2.4GHz 頻段的網(wǎng)絡(luò)接入速率為 72M诡宗,Wi-Fi 協(xié)議對(duì)應(yīng)的是 802.11n滔蝉。特點(diǎn)是速率低,信道少干擾大塔沃,穿墻能力強(qiáng)蝠引,覆蓋距離遠(yuǎn)。頻率在 2400 到 2500 之間蛀柴,不包含頭尾螃概。
- 5GHz 頻段
5GHz 頻段的網(wǎng)絡(luò)接入速率是 433M,Wi-Fi 協(xié)議對(duì)應(yīng)的是 802.11ac鸽疾。特點(diǎn)是速率高吊洼,信道多干擾小,穿墻能力差制肮,覆蓋距離也比較近冒窍。頻率在 4900 到 5900 之間,不包含頭尾豺鼻。
如果路由器開啟了雙頻合一功能综液,那么這個(gè)路由器就會(huì)同時(shí)
發(fā)出 2.4GHz 頻段和 5GHz 頻段的網(wǎng)絡(luò),但是它們?cè)谑謾C(jī)上顯示的確是同一個(gè) SSID(Wi-Fi 名稱)
拘领,我們連接的時(shí)候可能連接的是 2.4GHz 頻段意乓,也可能是 5GHz 頻段樱调,連接哪個(gè)取決于當(dāng)時(shí)的環(huán)境约素、網(wǎng)絡(luò)狀況等原因。
二笆凌、代碼分析
看到我上面標(biāo)注的重點(diǎn)了嗎圣猎?突破口就是這里!雙頻路由器會(huì) 同時(shí)
發(fā)出兩個(gè)頻段的網(wǎng)絡(luò)乞而,但是卻顯示 同一個(gè) SSID(Wi-Fi 名稱)
送悔。如果這個(gè)時(shí)候我們路由器設(shè)置的 Wi-Fi 名稱是 “wildma_wifi”,那么我們手機(jī)上就只顯示一個(gè)該名字的 Wi-Fi,而不會(huì)顯示兩個(gè)同名的欠啤。
然后我們連接的時(shí)候荚藻,利用代碼打印出來,也是只有一個(gè)頻率洁段。如下:
val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
val wifiInfo = mWifiManager.connectionInfo
val frequency = wifiInfo.frequency
得到的 frequency 要么在 2400 到 2500 之間应狱,要么就在 4900 到 5900 之間。這樣就只能判斷 Wi-Fi 是 2.4G 還是 5G祠丝,而無法判斷出是 2.4G+5G 雙頻疾呻。
所以如果你不了解雙頻,那么思維就會(huì)一直停留在這里写半,無法得到答案岸蜗。我們了解雙頻后,知道雙頻路由器會(huì) 同時(shí)
發(fā)出兩個(gè)頻段的網(wǎng)絡(luò)叠蝇,那么我們就可以遍歷掃描到的 Wi-Fi璃岳,如果同一個(gè) SSID 的 Wi-Fi 出現(xiàn)兩次,并且頻率不一樣悔捶,那么連接的這個(gè) Wi-Fi 就是 2.4G+5G 雙頻矾睦。
代碼如下:
class MainActivity : AppCompatActivity() {
var mWifiScanResults = HashMap<String, WifiScanResult?>()
/**
* 處理掃描結(jié)果
*
* @param scanResults 掃描結(jié)果集合
*/
private fun handleScanResult(scanResults: List<ScanResult>) {
for (i in scanResults.indices) {
val scanResult = scanResults[i]
val ssid = scanResult.SSID
if (!mWifiScanResults.containsKey(ssid)) {
mWifiScanResults[ssid] = WifiScanResult()
}
mWifiScanResults[ssid]?.setFrequency(scanResult.frequency)
}
}
}
class WifiScanResult {
// 是否是 2.4G
private var is24G = false
// 是否是 5G
private var is5G = false
/**
* 設(shè)置頻率
*
* @param frequency 頻率
*/
fun setFrequency(frequency: Int) {
if (frequency in 2401..2499) {
is24G = true
}
if (frequency in 4901..5899) {
is5G = true
}
}
}
完整源碼:Wifi
三、總結(jié)
一個(gè)問題可能并不難炎功,但是如果你不了解某個(gè)知識(shí)點(diǎn)枚冗,思維就轉(zhuǎn)變不了,就會(huì)一直卡在某個(gè)點(diǎn)蛇损。
關(guān)于我
我是 wildma赁温,CSDN 認(rèn)證博客專家,簡書程序員優(yōu)秀作者淤齐,擅長屏幕適配股囊。
如果文章對(duì)你有幫助,點(diǎn)個(gè)贊就是對(duì)我最大的認(rèn)可更啄!