Нестабильный Wi-Fi? MikroTik покупай, частоту на нём автоматом меняй

xtw1foye0vkym-n2dy_t9ya--gk.jpeg


В настоящее время интерференция наиболее актуальна для диапазона 2.4 ГГц, который перенасыщен работой вездесущих точек доступа. В статье я рассмотрел, какие возможности по исследованию радиочастотного спектра имеются на борту RouterOS, сформулировал рекомендации по выбору рабочей частоты точки доступа, работающей в сети без контроллера, а также предложил авторскую реализацию её автоматической смены. Предыстория такова, что ко мне обратилась компания Coffee Cup, у которой имеется сеть точек продаж формата кофе с собой, размещённых в разнокалиберных торговых центрах различных городов. Для работы кассового оборудования жизненно необходима работа Wi-Fi именно в диапазоне 2.4 ГГц, который, как следует ожидать, сильно зашумлён даже в огромных ТРЦ. Проблема оказалась настолько острой, что периодически устройства не могли нормально выйти в интернет, войдя в пике попыток переподключений к точке доступа. Вот в этом контексте и будет идти повествование, с отвлечением на моделирование других ситуаций.

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

oyjhzb_hzxy0rwx6rsvldsmlhvq.jpeg


Всего каналов 14. При этом не все разрешены в той или иной государственной локации. Классической гик-рекомендацией является использование «запрещённого для свободного использования» канала (речь идёт об 2484 МГц) в соответствии с постановлением Правительства РФ от 12.10.2004 N 539 (ред. от 22.12.2018) «О порядке регистрации радиоэлектронных средств и высокочастотных устройств», а именно пункта 24, который гласит, что не подлежат регистрации устройства малого радиуса действия, используемые в сетях беспроводной передачи данных, и другие устройства с функцией передачи данных в полосе радиочастот 2400 — 2483,5 МГц, с прямым расширением спектра и другими видами модуляции с максимальной эквивалентной изотропно-излучаемой мощностью не более 100 мВт.

Во-первых, нарушать законодательство нельзя, во-вторых, продаваемые на рынке устройства MikroTik имеют прошивки с предустановленными ограничениями, в том числе на выбор 14 канала. Конечно, можно справиться с этой оказией посредством перепрошивки роутера, но делать это для удалённых от вас устройств не рекомендуется ни при каких обстоятельствах. Иначе, как гласит админская мудрость, собирай рюкзак к дальней поездке. Большинство каналов между собой частично перекрываются. Неперекрываемые каналы являются смежными. И тут в работе точки доступа появляются интерференции, которые и являются источником основного количества проблем.

Интерференции бывают разнородные. Межканальные интерференции (neighboring channel interference) возникают, когда сигналы от устройств, работающих на разных, но расположенных недостаточно далеко частотах, частично накладываются друг на друга. Результат — интерференция на обоих каналах. Внутриканальные интерференции (co-channel interference) — это наложение сигналов от устройств, работающих на одинаковой частоте. Кроме этого помехи и интерференции могут создавать устройства, не имеющие отношения к IEEE 802.11, например: Wi-Max, Bluetooth, микроволновые печи, некоторые радиотелефоны, летающие за окном квадрокоптеры.

1vatdqanzqgbmhw1dqm_mvv1yam.png


Влиять на весь этот зоопарк в радиочастотном спектре в большинстве случаев мы никак не можем. А наш заказчик, находящийся в торговых центрах на правах арендатора, и тем более, поэтому единственно, что нужно сделать — максимально корректно задать настройки собственной сети. Провести элементарное радиообследование RouterOS позволяет из коробки, причём как в консольном режиме, так графическом, так и псевдографическом:

ihey_6oomllsextxtuii1fktsou.jpeg


Для упрощения ниже будут представлены измерения в лабораторных условиях, где нет высокой загруженности. Классический для беспроводных точек доступа вывод состояния эфира представлен ниже. На нём отображены (в порядке очерёдности) MAC-адрес соседних Wi-Fi точек доступа, имена вещаемых ими сетей (SSID), занимаемые частоты, ширина каналов и возможности по расширению спектра, используемый стандарт, уровень принимаемого от них сигнала, уровень шума на занимаемой частоте и соотношение сигнал/шум:

/interface wireless scan yourInterfaceName 
Flags: A - active, P - privacy, R - routeros-network, N - nstreme, T - tdma, W - wds, B - bridge 
	ADDRESS				SSID			CHANNEL			SIG   NF SNR
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2412/20-Ce/gn	-80 -104  24
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2412/20-Ce/gn	-76 -104  28
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2417/20-Ce/gn	-61 -104  43
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2417/20/gn		-90 -104  14
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2432/20-Ce/gn	-83 -105  22
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2457/20-eC/gn	-74 -105  31
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2462/20/gn		-80 -102  22
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2462/20-eC/gn	-57 -102  45
AP	XX:XX:XX:XX:XX:XX	XXXXXXXXXXXXXX	2462/20-eC/gn	-91 -102  11


Современные стандарты Wi-Fi (IEEE 802.11n и новее) умеют объединять каналы по 40 МГц и более (channel aggregation) и, соответственно, расплываться на соседей. Сделано это для увеличения скорости передачи информации. Поэтому сразу отмечаем, что если необходимо быстро и без задержек предавать современный тяжёлый мультимедийный контент, то использовать стоит только 5 ГГц. 2.4 ГГц оставить там, где важно работать на большом расстоянии или через стены. А также для тех устройств, которые по-другому не умеют. Так как наша основная задача — уменьшить интерференции, поэтому разумно будет использовать более узкую полосу, например, в 5 МГц. Странные аббревиатуры Ce, eC, XX обозначают, в какую сторону от центральной частоты может быть выполнено расширение extended для channel aggregation (Ce — право, eC — влево, XX — в любую сторону). Для понимания, какую же частоту всё-таки выбрать, лучше использовать другие консольные команды, отсекающие лишнюю информацию и агрегирующие вывод в более удобном виде:

/interface wireless snooper snoop yourInterfaceName 
CHANNEL			USE        BW 		NET-COUNT 	NOISE-FLOOR 	STA-COUNT
2412/20/gn		20.3%	223.7kbps	4			-104			9
2417/20/gn		10.7%	74.5kbps	3			-104			7
2422/20/gn		17.8%	29.1kbps	1			-105			1
2427/20/gn		7.7%	66.8kbps	0			-105			0
2432/20/gn		10.9%	371.9kbps	1			-105			3
2437/20/gn		8.4%	59.9kbps	0			-105			0
2442/20/gn		8.1%	174.9kbps	0			-104			0
2447/20/gn		0.9%	6.8kbps		0			-103			1
2452/20/gn		5.2%	47.0kbps	0			-105			1
2457/20/gn		13%		105.4kbps	1			-106			1
2462/20/gn		14.2%	129.7kbps	4			-103			7


Здесь видна приблизительная утилизация полосы пропускания, скорость передачи информации, количество сетей, использующих радиочастоту, уровень шума и количество подключённых беспроводных клиентов. Команда для ещё более редуцированного вывода:

/interface wireless frequency-monitor yourInterfaceName
FREQ			USE			NF
2412MHz			12.9%		-104
2417MHz			19.4%		-105
2422MHz			15.4%		-106
2427MHz			4.8%		-116
2432MHz			15.8%		-118
2437MHz			1.2%		-104
2442MHz			8.4%		-105
2447MHz			1.6%		-104
2452MHz			2.5%		-107
2457MHz			13.5%		-106
2462MHz			15.8%		-103


Дополнительно на борту имеется вот такой режим тексто-графического спектрального сканирования, показывающего мощность излучения в текущий момент времени. В каждой строке на графике отображается частота (столбец FREQ), среднее значение мощности (столбец DBM) и графическое представление мощности в виде точек (столбец GRAPH). Двоеточие »:» обозначает среднее значение мощности. Точками ».» обозначены средние пиковые значения:

/interface wireless spectral-scan yourInterfaceName 
FREQ  DBM GRAPH
2381  -85 :::::::::::::::::::::::::::::::::::::::::::::.
2383  -84 ::::::::::::::::::::::::::::::::::::::::::::::::.
2386  -85 ::::::::::::::::::::::::::::::::::::::::::::::.........
2389  -86 :::::::::::::::::::::::::::::::::::::::::::......
2391  -85 ::::::::::::::::::::::::::::::::::::::::::::::...
2394  -87 ::::::::::::::::::::::::::::::::::::::::...............
2397  -85 ::::::::::::::::::::::::::::::::::::::::::::::............
2399  -84 ::::::::::::::::::::::::::::::::::::::::::::::::.
2402  -86 :::::::::::::::::::::::::::::::::::::::::::............................
2405  -86 :::::::::::::::::::::::::::::::::::::::::::..............................................
2408  -83 ::::::::::::::::::::::::::::::::::::::::::::::::::::....................................................
2410  -83 ::::::::::::::::::::::::::::::::::::::::::::::::::::....................................................


В RouterOS также имеется интересный графический режим Snooper, позволяющий шпионить за соседними точками доступа, собирая и агрегируя различную информацию об их работе. Нам он не пригодится:

wet5mpfzdzo-mrlfovraeveovcq.jpeg


Более подробно про весь инструментарий, имеющийся в RouterOS для спектрального анализа радиоэфира, можно почитать в докладе Дмитрия Скоромнова на MikroTik User Meeting в 2019 году в Москве. Желающим во всём этом хорошо разбираться могу порекомендовать пройти у него обучение на онлайн-курсе по программе »Устройство, проектирование и диагностика беспроводных сетей 802.11 (Wi-Fi)».

Выбор рабочей частоты должен быть остановлен на той, которая наименее загружена и имеет наименьший уровень шума. Но есть ещё кое-что, о чём нужно обязательно помнить. Если нет возможности уйти на свободный смежный канал, то лучше работать на том же канале, на котором работает современный роутер (здесь и далее под роутером понимается access point) не сильно удалённого соседа. Не нужно выбирать соседнюю с ним частоту. Тут логика следующая: работая на общем канале и слыша друг друга, точки доступа смогут договариваться насчёт совместной поочерёдной работы. Важным моментом является то, что они должны воспринимать друг друга не за шум, а за устройство IEEE 802.11. И желательно, чтобы у них не было других помех, и они обе могли работать на высоких скоростях, тем самым повышая утилизацию эфирного времени. И ещё чтобы к ним не было подключено постоянно скачивающее что-то из интернета устройство-динозавр, занимающее эфир медленной загрузкой. Переводя своё устройство на соседнюю частоту, мы делаем хуже обоим, лишь увеличивая интерференции. Интерференция — неизбежное зло для 2,4 ГГц. Проблема будет проявляться только при одновременной передаче. Нежелательно настраивать близлежащие передатчики на несмежных каналах. Стоит также помнить, чем выше скорость, тем выше требования к SNR.

В идеальном мире на 2.4 ГГц все роутеры работают только на смежных каналах. При этом высокоскоростные устройства занимают одну общую частоту. Роутеры, поддерживающие только старые стандарты, работают на отдельных частотах. «Медленные» клиенты (не поддерживающие высокие скорости, из-за которых происходит снижение утилизации эфирного времени) из сетей исключены. И никто в эту идиллию инженерной мысли постоянно вмешаться не пытается.

Выбор рабочей частоты можно доверить и самому MikroTik, включив режим auto в настройках:

/interface wireless set yourInterfaceName frequency=auto


При загрузке устройство самостоятельно проведёт радиообследование по заложенному в него алгоритму, не оставив нам никакого поля для творчества. Именно по этой причине в условиях нестабильной работы беспроводной сети всеми любимая перезагрузка роутера оказывается иногда эффективной. Как говорится, семь бед, один Reset. Остальные настройки работы беспроводных сетей рассматривать не будем, поскольку это сильно уведёт нас в сторону от предмета разговора. Чтобы посмотреть, с какими текущими параметрами работает интерфейс, воспользуемся командой:

/int wireless monitor [find name=yourInterfaceName] once 
                 status: running-ap
                channel: 2447/20-eC/gn
      wireless-protocol: 802.11
            noise-floor: -102dBm
         overall-tx-ccq: 95%
     registered-clients: 8
  authenticated-clients: 8
            wmm-enabled: yes
      current-tx-powers: 1Mbps:24(24/29),2Mbps:24(24/29),5.5Mbps:24(24/29),11Mbps:24(24/29),
                         6Mbps:24(24/29),9Mbps:24(24/29),12Mbps:24(24/29),18Mbps:24(24/29),
                         24Mbps:24(24/29),36Mbps:23(23/28),48Mbps:22(22/27),54Mbps:21(21/26),
                         HT20-0:24(24/29),HT20-1:24(24/29),HT20-2:24(24/29),HT20-3:24(24/29),
                         HT20-4:24(24/29),HT20-5:23(23/28),HT20-6:21(21/26),HT20-7:20(20/25),
                         HT40-0:24(24/29),HT40-1:24(24/29),HT40-2:24(24/29),HT40-3:24(24/29),
                         HT40-4:24(24/29),HT40-5:23(23/28),HT40-6:21(21/26),HT40-7:20(20/25)
    notify-external-fdb: no


Для нас здесь интересна характеристика CCQ (Client Connection Quality). Она интерпретирует значение в процентах, насколько эффективно используется полоса пропускания относительно максимально возможного значения. Рассчитывается как среднее отношение двух временных интервалов: делителем выступает реально затраченный промежуток времени на передачу кадра, числителем является минимально возможное время (с максимальной скоростью и без повторных попыток отправить кадр). Если его значение начнёт снижаться, значит, количество повторных отправок стало расти, а этому виной интерференция. Подведём промежуточные итоги. Нами выбрана оптимальная частота Wi-Fi, интерференции есть, но лучше не сделаешь:

ciqeb1zmjd6httzpmptov8piihi.png


В пятницу вечером поступает звонок: у клиента всё упало, не работает CRM, касса, камера. А всё потому, что соседние точки доступа до этого несколько раз были перезагружены и поменяли свои настройки излучения, а у нас частота задана жёстко. Режим auto часто тоже не помогает, не в этой, так другой аналогичной ситуации. Клиентские устройства постоянно разрывают соединение с точкой доступа. В логе видим примерно следующее:

2023-03-16T14:01:36.013859+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: disconnected, unicast key exchange timeout, signal strength -33
2023-03-16T14:01:37.985225+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: connected, signal strength -25
2023-03-16T14:01:42.985967+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: disconnected, unicast key exchange timeout, signal strength -26
2023-03-16T14:01:48.994610+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: connected, signal strength -26
2023-03-16T14:01:53.983365+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: disconnected, unicast key exchange timeout, signal strength -26
2023-03-16T14:02:06.466390+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: connected, signal strength -27
2023-03-16T14:02:12.565514+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: reassociating
2023-03-16T14:02:12.616101+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: disconnected, ok, signal strength -27
2023-03-16T14:02:12.616101+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: connected, signal strength -23
2023-03-16T14:02:16.003368+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: reassociating
2023-03-16T14:02:16.056218+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: disconnected, ok, signal strength -23
2023-03-16T14:02:16.056218+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: connected, signal strength -24
2023-03-27T14:52:27.815225+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: disconnected, group key exchange timeout
2023-03-27T14:52:27.856921+03:00 192.168.15.25 wireless,info BA:5B:4E:A6:FF:0F@wlan1-COFFEECUP_2_staff: disconnected, group key exchange timeout
2023-03-27T14:52:31.770148+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: connected, signal strength -54


Для начала разберёмся, что же тут происходит. Мы видим неудачные попытки подключения клиентов с отличным уровнем сигнала по причине какого-то timeout. Group key exchange (Unicast key exchange аналогичен ему) — это процедура обновления временного ключа в WPA. Ключ общий для всех клиентов и периодически сменяется роутером. В MikroTik по умолчанию интервал обновления 5 минут:

ltbpq0rcyxukc_al-sucus7h6r8.jpeg


В процессе обновления временного ключа клиенты его должны получить, но у них это не выходит. И проблема сама собой не решится. Это и есть триггер для смены рабочей частоты, так как даже близкорасположенные клиенты не могут далее нормально взаимодействовать с точкой доступа, осуществляя стандартные операции. В интернете можно встретить рекомендации по увеличению интервала обновления до 1 часа, что только усугубит проблемы отсутствием нормальной информации в логе при аналогичных сбоях. Перевод логирования wireless в режим debug в данной ситуации не даст более развёрнутой картины. Ниже приведены различные ситуации, при которых вмешиваться в работу роутера не стоит:

2023-03-20T11:08:12.185476+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: disconnected, extensive data loss
2023-03-20T11:08:12.399566+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: connected, signal strength -44
2023-03-20T11:08:51.069290+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: disconnected, extensive data loss
2023-03-20T11:08:51.155986+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: connected, signal strength -44
2023-03-20T11:12:06.857901+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: disconnected, extensive data loss
2023-03-20T11:12:06.931950+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: connected, signal strength -45
2023-03-20T11:15:40.124038+03:00 192.168.15.17 wireless,info 72:5E:1F:46:5B:A0@wlan4-COFFEECUP_2: connected, signal strength -59
2023-03-20T11:15:40.525311+03:00 192.168.15.17 wireless,info 72:5E:1F:46:5B:A0@wlan4-COFFEECUP_2: disconnected, received deauth: sending station leaving (3), signal strength -59
2023-03-20T11:15:54.109104+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: disconnected, extensive data loss
2023-03-20T11:15:54.236219+03:00 192.168.15.25 wireless,info AA:D2:21:F2:04:A8@wlan1-COFFEECUP_2_staff: connected, signal strength -35
2023-03-16T14:02:12.565514+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: reassociating
2023-03-16T14:02:12.616101+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: disconnected, ok, signal strength -27
2023-03-16T14:02:12.616101+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: connected, signal strength -23
2023-03-16T14:02:16.003368+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: reassociating
2023-03-16T14:02:16.056218+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: disconnected, ok, signal strength -23
2023-03-16T14:02:16.056218+03:00 192.168.15.17 wireless,info 60:01:94:20:4A:C9@wlan1-COFFEECUP_2_staff: connected, signal strength -24


Здесь штатные отключения. Из интересного — Reassociating, для нашего случая процедура установления L2 соединения между беспроводным клиентом и точкой доступа, если клиент хочет переключиться от одной точки доступа к другой в рамках одного устройства. Запрос на ассоциацию отправляется после аутентификации.

Возвращаясь к предыстории, при возникновении проблем с критически важным для бизнес-процессов беспроводным оборудованием заказчика, работающем только на 2.4 ГГц, приходилось вручную подключаться к устройствам и перестраивать рабочую частоту. При этом выбирать её по науке нет необходимости, ведь завтра точка доступа соседа перезагрузится, и весь расчёт окажется не рабочим. Достаточно методом перебора задавать такую частоту, чтобы всё работало хорошо и при необходимости повторять эту процедуру заново. Тогда и появилась идея написать скрипт для RouterOS, который делал бы это за специалиста. Готовая версия давно старается на устройствах заказчика и со своей задачей неплохо справляется:

KeyExchangeTimeoutSeacher.lua
{
    # KeyExchangeTimeoutSeacher v1.1 (202303)
    # Скрипт меняет частоту WiFi при обнаружении в логе сообщений:
    # "unicast key exchange timeout" или "group key exchange timeout"
    # Имя интерфейса с проблемами
    :local interfaceName "yourInterfaceName";
    # 2407 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467
    # Минимальная рабочая частота, разрешенная конфигурацией устройства
    :local frequencyMin 2412;
    # Максимальная рабочая частота, разрешенная конфигурацией устройства
    :local frequencyMax 2452;

    :local smtpServer "XXX";
    :local emailFrom "XXX";
    :local emailTo "XXX";
    :local smtpUser "XXX";
    :local smtpServerPort 465;
    :local smtpUserPass "XXX";
    # Максимальное количество ошибок, после которых меняем частоту
    :local countTreshold 5;
    # Время, через которое обнуляется countTreshold (секунд)
    :local timeTreshold 600;

    :global count;
    :global time;
    :local frequency;
    # EpochTime - функция для вычисления UnixTime
    :global EpochTime do={
        :local ds [/system clock get date];
        :local months;
        :if ((([:pick $ds 9 11]-1)/4) != (([:pick $ds 9 11])/4)) do={
            :set months {"an"=0;"eb"=31;"ar"=60;"pr"=91;"ay"=121;"un"=152;"ul"=182;"ug"=213;"ep"=244;"ct"=274;"ov"=305;"ec"=335};
        } else={
            :set months {"an"=0;"eb"=31;"ar"=59;"pr"=90;"ay"=120;"un"=151;"ul"=181;"ug"=212;"ep"=243;"ct"=273;"ov"=304;"dec"=334};
        }
        :set ds (([:pick $ds 9 11]*365)+(([:pick $ds 9 11]-1)/4)+($months->[:pick $ds 1 3])+[:pick $ds 4 6]);
        :local ts [/system clock get time];
        :set ts (([:pick $ts 0 2]*60*60)+([:pick $ts 3 5]*60)+[:pick $ts 6 8]);
        :return ($ds*24*60*60 + $ts + 946684800 - [/system clock get gmt-offset]);
    }
    :local currentFrequency [/interface wireless get $interfaceName frequency];
    :local mikrotikName [/system identity get name];
    :local stringSearch1 "$interfaceName: disconnected, unicast key exchange timeout";
    :local stringSearch2 "$interfaceName: disconnected, group key exchange timeout";
    :local setStringSearch {$stringSearch1; $stringSearch2};
    # Инициализация массива
    :local logArray [ :toarray "" ];
    :foreach stringSearch in=$setStringSearch do={
        :foreach line in=[/log find buffer=wireless message~$stringSearch] do={
            :set logArray ($logArray, $line);
        }
    }
    # Если массив не пустой
    :if ($logArray != ({})) do={
        # Очищаем лог от старых обнаружений
        :log info "Wireless log clear by wifi analyzer script!";
        :execute "/system logging action set wireless memory-lines=1";
        :execute "/system logging action set wireless memory-lines=1000";
        # Парсим лог
        :foreach string in=$logArray do={
            # Определяем текущее время
            :local nowTime [$EpochTime];
            :local nowTimeWithDelta ($nowTime - $timeTreshold);
            # Много ли времени прошло с момента обнаружения последней ошибки
            :if ($nowTimeWithDelta > $time) do={
                :set count 0;
                :set time $nowTime;
            }
            :if ($count < $countTreshold) do={
                :set count ($count + 1);        
            } else={
                :set count 0;
                :set time [$EpochTime];
                if ($currentFrequency = $frequencyMax) do={
                    :set frequency $frequencyMin;
                } else={
                    :set frequency ($currentFrequency + 5);
                }
                :execute "/interface wireless set $interfaceName frequency=$frequency";
                # Отправка уведомления на email
                /tool e-mail send from=$emailFrom to=$emailTo server=$smtpServer \
                    port=$smtpServerPort user=$smtpUser password=$smtpUserPass start-tls=tls-only \
                    subject="$mikrotikName change frequency to $frequency MHz" \
                    body=("Good luck!");
                :log info "$mikrotikName change frequency to $frequency MHz";
                # Прекращаем выполнение скрипта, чтобы в будущем проанализировать
                # работу на новой частоте (несмотря на количество оставшихся не обработанных сообщений лога)
                :error "$mikrotikName change frequency to $frequency MHz";
            }
        }
    }
}


Код парсит лог в буфере wireless и ищет в нём сообщения, содержащие ключевые слова disconnected, unicast key exchange timeout или disconnected, group key exchange timeout — триггеры появившихся проблем, которые придётся решать сменой рабочей частоты. Если они встретились, тогда определяется текущее время, которое переводится в Unix Time Stamp. Из коробки RouterOS не поддерживает этот формат, поэтому пришлось использовать найденную в интернете функцию EpochTime. Далее код обращает внимание, давно ли до этого встречалось подобное сообщение (здесь удобно использовать Unix Time Stamp в арифметических операциях). Если давно, то выставляет счётчик на ноль и начинает подсчитываться количество произошедших таймаутов (сообщений об ошибках). Отмечу, что время будет впервые рассчитано только после того, как счётчик единожды превысит указанный порог. Если превышен порог, то точка доступа переключается на следующую рабочую частоту и отправляет администратору уведомление. Перед выполнением скрипта необходимо внести изменение в конфигурацию устройства, указав беспроводному интерфейсу жёстко заданную рабочую частоту, и добавить дублирование сообщений в логе для тем wireless и info в новый буфер wireless, например:

/interface wireless set yourInterfaceName frequency=2412
/system logging add action=wireless topics=wireless,info
/system logging action add name=wireless target=memory


vfppmd_muuq6ipooqfwqj84lvxw.jpeg


Для устройств, работающих на RouterOS 7, в коде отправки сообщения вместо start-tls=tls-only необходимо написать tls=yes. В планировщике необходимо запланировать выполнение скрипта:

/system scheduler
add interval=150s name=KeyExchangeTimeoutSeacher on-event="/system script run KeyExchangeTimeoutSeacher" policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-time=startup


Для симуляции проблемы и обкатки скрипта можно вручную создать необходимые записи в логе:

:log info "60:01:94:20:4A:C9@yourInterfaceName: connected, signal strength -24";
:log info "60:01:94:20:4A:C9@yourInterfaceName: disconnected, unicast key exchange timeout, signal strength -33";
:log info "AA:D2:21:F2:04:A8@yourInterfaceName: disconnected, group key exchange timeout";


При таком тестировании добавленное дублирование сообщений в логе для тем wireless и info необходимо выключить, а в код внести изменения:

...
:foreach line in=[/log find buffer=memory message~$stringSearch] do={
...
:execute "/system logging action set memory memory-lines=1";
:execute "/system logging action set memory memory-lines=1000";
...


Ещё одна задача автоматизирована. Роутеры стараются подобрать рабочую частоту, на которой беспроводные клиенты смогут работать без навязчивых ошибок. Выбор у них на самом деле невелик. При желании можно допилить код, продумав более сложные алгоритмы по смене частоты. Или реакцию на появление других сообщений в логе. Или заняться более детальным переконфигурированием беспроводных интерфейсов. А также можно выйти на другие диапазоны, где на текущий момент интерференция не столь актуальна. MikroTik здесь выступает швейцарским ножом, с помощью которого можно, приложив усилия и фантазию, получить интересные автономные решения. Обобщая сказанное, выше рассмотрены причины появления разнородных интерференций в работе Wi-Fi-оборудования, показаны возможности по анализу радиоэфира, имеющиеся на борту в RouterOS. Сформулированы в некотором отношении противоречивые рекомендации по назначению рабочей частоты точки доступа. И самое интересное, представлен скрипт для её автоматической смены при появлении характерных ошибок.

Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх

© Habrahabr.ru