Подтвердить что ты не робот

Как определить номер канала wifi, используемый wifi ap/network?

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

4b9b3361

Ответ 1

Согласно 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 содержит частоту канала.

Ответ 2

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

Ответ 3

Вы можете выразить преобразование, используя пару формул, по одной для каждой группы. Функция возвращает канал данной частоты или -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;
    }
}

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

Ответ 4

Согласно стандарту [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 source:

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

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

    return freq/5 - 1000;
}