我发现有几个android wifi应用程序(WiFi管理器,WiFi分析器)显示除了BSSID/SSID等之外的WiFi网络的频道号.但我找不到任何关于他们如何做的信息.我唯一知道的是我可以获得一些wifi频率.也许他们确定了与该频率相对应的频道?有没有办法在android中检测wifi网络的频道?当然这个信息并不是什么大问题,我可以没有它:)但我仍然很好奇......
Dan*_*ode 24
据Radio-Electronics.com称,频道号与频率密切相关.
CHA LOWER CENTER UPPER
NUM FREQ FREQ FREQ
MHZ MHZ MHZ
1 2 401 2 412 2 423
2 2 404 2 417 2 428
3 2 411 2 422 2 433
4 2 416 2 427 2 438
5 2 421 2 432 2 443
6 2 426 2 437 2 448
7 2 431 2 442 2 453
8 2 436 2 447 2 458
9 2 441 2 452 2 463
10 2 451 2 457 2 468
11 2 451 2 462 2 473
12 2 456 2 467 2 478
13 2 461 2 472 2 483
14 2 473 2 484 2 495
对于Android,ScanResult包含频道的频率.
小智 17
@SuppressWarnings("boxing")
private final static ArrayList<Integer> channelsFrequency = new ArrayList<Integer>(
Arrays.asList(0, 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447,
2452, 2457, 2462, 2467, 2472, 2484));
public static Integer getFrequencyFromChannel(int channel) {
return channelsFrequency.get(channel);
}
public static int getChannelFromFrequency(int frequency) {
return channelsFrequency.indexOf(Integer.valueOf(frequency));
}
Run Code Online (Sandbox Code Playgroud)
jab*_*edo 17
您可以使用几个公式表示转换,每个公式一个.在频率不是有效的wifi频率(2.4GHz和5GHz)的情况下,该函数返回给定频率的信道或-1.
public static int convertFrequencyToChannel(int freq) {
if (freq >= 2412 && freq <= 2484) {
return (freq - 2412) / 5 + 1;
} else if (freq >= 5170 && freq <= 5825) {
return (freq - 5170) / 5 + 34;
} else {
return -1;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一种紧凑的方式.
art*_*rtm 16
根据标准[802.11-2012],有一种更简单的方法可以从频率中计算出频道号.特别,
channel_center_frequency = channel_starting_frequency + 5 * channel_number
对于5G频段,
channel_number= 0,1,...,200; channel_starting_frequency= 5000 MHz.
对于2.4G频段,
channel_number= 1,2,...,13; channel_starting_frequency= 2047 MHz.
可以在WiFi频道找到所有频道频率的列表
将其翻译成代码 - 参考iw来源:
int ieee80211_frequency_to_channel(int freq)
{
if (freq == 2484)
return 14;
if (freq < 2484)
return (freq - 2407) / 5;
return freq/5 - 1000;
}
Run Code Online (Sandbox Code Playgroud)
添加到@artm 的答案,这里是在 Linux 源代码中找到的更新的算法:
int ieee80211_freq_khz_to_channel(u32 freq)
{
/* TODO: just handle MHz for now */
freq = KHZ_TO_MHZ(freq);
/* see 802.11 17.3.8.3.2 and Annex J */
if (freq == 2484)
return 14;
else if (freq < 2484)
return (freq - 2407) / 5;
else if (freq >= 4910 && freq <= 4980)
return (freq - 4000) / 5;
else if (freq < 5925)
return (freq - 5000) / 5;
else if (freq == 5935)
return 2;
else if (freq <= 45000) /* DMG band lower limit */
/* see 802.11ax D6.1 27.3.22.2 */
return (freq - 5950) / 5;
else if (freq >= 58320 && freq <= 70200)
return (freq - 56160) / 2160;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
来源: https: //github.com/torvalds/linux/blob/master/net/wireless/util.c#L141,函数名称:ieee80211_freq_khz_to_channel
| 归档时间: |
|
| 查看次数: |
20759 次 |
| 最近记录: |