Как определить номер канала Wi-Fi, используемого Wi-Fi AP / сети? - PullRequest
15 голосов
/ 30 марта 2011

Я обнаружил, что несколько wifi-приложений для Android (WiFi Manager, WiFi Analyzer) показывают номер канала сети WiFi, дополнительно к BSSID / SSID и т. Д. Но я не могу найти информацию о том, как они это делают.Единственное, что я знаю, я могу получить частоту Wi-Fi.Может быть, они определяют канал, соответствующий этой частоте?Есть ли вообще способ обнаружить канал wifi в андроиде?Конечно, эта информация не имеет большого значения, и я могу жить без нее :), но все же мне любопытно ...

Ответы [ 4 ]

24 голосов
/ 30 марта 2011

Согласно 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 голосов
/ 07 марта 2014

Вы можете выразить преобразование, используя несколько формул, по одной для каждой полосы. Функция возвращает канал с заданной частотой или -1, если частота не является допустимой частотой Wi-Fi (2,4 ГГц и 5 ГГц).

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;
    }
}

Это компактный способ сделать то же самое.

17 голосов
/ 31 июля 2012
@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));
}
16 голосов
/ 22 октября 2015

Согласно стандарту [802.11-2012], существует более простой способ определить номер канала по частоте.В частности,

channel_center_frequency = channel_starting_frequency + 5 * channel_number

для диапазона 5G: channel_number = 0, 1, ..., 200;channel_starting_frequency = 5000 МГц.

Для диапазона 2,4 ГБ, channel_number = 1, 2, ..., 13;channel_starting_frequency = 2047 МГц.

Список всех частот канала можно найти на каналах 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;
}
...