如何确定wifi ap / network使用的wifi频道号码?

时间:2011-03-30 11:36:41

标签: android c wifi

我发现有几个android wifi应用程序(WiFi管理器,WiFi分析器)显示除了BSSID / SSID等之外的WiFi网络的频道号。但我找不到任何关于他们如何做的信息。我唯一知道的是我可以获得一些wifi频率。也许他们确定了与该频率相对应的频道?有没有办法在android中检测wifi网络的频道?当然这个信息并不是什么大问题,我可以没有它:)但我仍然很好奇......

5 个答案:

答案 0 :(得分: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包含频道的频率。

答案 1 :(得分: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));
}

答案 2 :(得分: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;
    }
}

这是一种紧凑的方式。

答案 3 :(得分: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 channels

找到

将其翻译成代码 - 请参阅iw来源:

int ieee80211_frequency_to_channel(int freq)
{
    if (freq == 2484)
        return 14;

    if (freq < 2484)
        return (freq - 2407) / 5;

    return freq/5 - 1000;
}

答案 4 :(得分:0)

除了answer by @artm之外,还有Linux源代码中更新的算法:

int ieee80211_frequency_to_channel(int 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 < 5945)
        return (freq - 5000) / 5;
    else if (freq <= 45000) /* DMG band lower limit */
        /* see 802.11ax D4.1 27.3.22.2 */
        return (freq - 5940) / 5;
    else if (freq >= 58320 && freq <= 70200)
        return (freq - 56160) / 2160;
    else
        return 0;
}

来源:https://github.com/torvalds/linux/blob/master/net/wireless/util.c#L110