Странный 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 и пропускать важные пролёты спутников. А можно попытаться разобраться в проблеме.