Странный Wi-Fi

В процессе исследования странного поведения WiFi в RPi, я наткнулся на довольно интересную информацию. Немногие знают, но WiFi работает в разных странах на разных частотах. Исторически, частоты современного Wifi 2.4Ггц и 5Ггц использовались военными, метеорологическими станциями и радарами. В разных странах они работали немножко на разных частотах, поэтому когда пришёл WiFi, инженеры начали выкручиваться.

Они придумали довольно простой способ - это конфигурация WiFi в зависимости от страны. Несмотря на то, что железо в принципе может работать в широком диапазоне частот, его ограничивают на уровне прошивки в зависимости от страны.

Такой подход несёт в себе множество потенциальных странностей в поведении WiFi.

Создание помех

Представьте себе, что рядом стоят две WiFi точки из разных стран. У каждой из них каналы распределены равномерно, но границы частот немного сдвинуты. Получается что-то вроде этого:

Если идёт передача данных на второй точке доступа на 3 канале, то она создаёт помехи на первой точке доступа на каналах 2 и 3. WiFi протокол достаточно продвинутый и предусматривает переключение на другие каналы, если есть помехи. Но в данном случае один канал создаёт помехи на двух каналах, что уменьшает количество свободных каналов. А если добавить сюда несколько точек доступа, то количество свободных каналов ещё уменьшится.

Получается неправильно настроенная точка доступа создаёт помехи в два раза больше, чем правильно настроенная. Это работает и в обратную сторону: все правильно настроенные точки доступа создают в два раза больше помех для неправильно настроенной.

Это в теории. В реальности всё чуть сложнее. На 2.4Ггц почти не бывает конфликтов. Всё потому, что диапазон частот и каналы с 1 по 11 во всех странах одинаковые.

Наиболее подвержены таким помехам станции на 5Ггц.

Перебои в работе

В RPi сущесвует специальный сервис - “wifi-country”. Он следит за тем, чтобы страна была правильно указана. Если она не указана, то в логах появляются вот такие сообщения:

Sep 18 18:10:25 raspberrypi wifi-country[324]: Wi-Fi is disabled because the country is not set

При этом сам WiFi модуль не выключается и сеть работает. Однако, через какое-то время WiFi может потерять связь и отключиться. Это случается спонтанно и такое событие трудно отловить. За несколько лет на моих RPi это случалось примерно раз в месяц.

Как узнать настройки страны для WiFi?

В MacOS это можно сделать через меню “About this Mac” -> “System report” -> “Wi-Fi”. Некоторые точки доступа отправляют настройки страны:

Для RPi узнать настройки можно командой iw:

# iw reg get

global
country RU: DFS-ETSI
	(2402 - 2482 @ 40), (N/A, 20), (N/A)
	(5170 - 5250 @ 80), (N/A, 20), (N/A), AUTO-BW
	(5250 - 5330 @ 80), (N/A, 20), (0 ms), DFS, AUTO-BW
	(5650 - 5730 @ 80), (N/A, 30), (0 ms), DFS
	(5735 - 5835 @ 80), (N/A, 30), (N/A)
	(57000 - 66000 @ 2160), (N/A, 40), (N/A)

Или для GB:

global
country GB: DFS-ETSI
	(2402 - 2482 @ 40), (N/A, 20), (N/A)
	(5170 - 5250 @ 80), (N/A, 20), (N/A), AUTO-BW
	(5250 - 5330 @ 80), (N/A, 20), (0 ms), DFS, AUTO-BW
	(5490 - 5710 @ 160), (N/A, 27), (0 ms), DFS
	(57000 - 66000 @ 2160), (N/A, 40), (N/A)

В первом блоке указывается интервал частот. Например, в России можно использовать частоты 5.735Ггц - 5.835Ггц, а вот в Великобритании уже нельзя.

Как изменить настройки страны для WiFi?

В MacOS это можно сделать через программу “Wireless Diagnostics”. Для этого нужно нажать клавишу “Alt” и кликнуть по значку WiFi. В появившемся меню будет пункт “Open Wireless Diagnostics”. Эта программа проанализирует WiFi сети вокруг и выдаст отчёт.

Как видно на скриншоте, моя Time Capsule конфликтует с сетями вокруг. Для того, чтобы поменять страну, нужно открыть AirPort Utility, выбрать “Wireless” -> “Wireless options” и выбрать регион:

Иии… ничего не получится, так как список стран для Time Capsule задаётся в прошивке.

Для RPi поменять страну очень просто. Это можно сделать через программу raspi-config. Нужно выбрать “Localization Options” -> “Change Wi-Fi Country” и выбрать свою страну из списка.

“Просто”, но это не значит, что сработает. Многие жалуются, что даже после того, как страна изменена в raspi-config, в системе по-прежнему появляется сообщение:

Sep 18 18:10:25 raspberrypi wifi-country[324]: Wi-Fi is disabled because the country is not set

В таком случае можно сделать следующее:

  • поменять страну через команду: sudo iw reg set RU
  • добавить страну в /etc/wpa_supplicant/wpa_supplicant.conf: country=RU
  • убедиться, что страна задана большими буквами. wifi-country.service почему-то проверяет только две большие буквы:
if /bin/grep -q "^country=[A-Z][A-Z]" /etc/wpa_supplicant/wpa_supplicant.conf; then
        exit 0
fi

Выводы

Можно ныть из-за плохого WiFi и пропускать важные пролёты спутников. А можно попытаться разобраться в проблеме.