Бюджетно снаряжаем Микротик RBM33G для «дальнего боя»
Микротик OEM RouterBoard RBM33G далеко не новинка и хорошо известна среди специалистов и пользователей Микротик. Она была создана производителем для того, чтобы дать каждому возможность самому «сконструировать» свой роутер. В настоящее время эта плата вовсе не устарела, активно используется и полна интересных «сюрпризов» для тех, кто не знает всех её возможностей.
Эта небольшая по размеру, весьма производительная плата (на борту двухядерный процессор MediaTek MT7621 880Мгц с 16Мб flash-памяти и 256Мб DDR3 RAM), имеет ещё целый ряд аппаратных возможностей к расширению — два слота mini PCI-e для установки модулей модемов и/или wifi-радиокарт), слот microSD для дополнительной карты памяти (расположен на оборотной стороне платы), M.2 слот для установки SSD, что позволяет с избытком восполнить недостаток flash-памяти на самой плате.
Рис. 1 RBM33G Внешний вид платы. Вверху слева направо разъемы: 2 miniPCI-e, M.2, USB.
Мне интересно было максимально использовать возможности расширения платы, в том числе установив на неё «не родные» модем и wifi-модуль.
Сама RBM33G мне досталась б/у за половину стоимости новой (5000р.). Также я приобрёл «родной» корпус Микротик CA433U за полную стоимость (3.900 р.), так как найти б/у такой корпус не получалось, а использовать иные не хотелось. «Погуглив» ещё немного Интернет я купил за копейки то, что мне было нужно на «Авито»: LTE-модем Huawey ME909s-120 (за 2000 р.) — не слишком по современным меркам скоростной (Cat4), но очень надежный и вполне достаточный для резервирования канала Интернет за городом (до сих пор не понимаю зачем в России современные модемы с агрегацией — чтобы за 3 минуты истратить весь трафик на СИМ-карте?).
C wifi-модулем оказалось немного посложнее, так как я также не хотел ставить «родной» Микротиковский модуль, на который сейчас, в условиях санкций, сильно кусается цена, а о совместимых модулях конкретно известно мало (кроме того, что имеется совместимость с семействами Atheros AR93xx, AR94xx, AR95xx, и Qulcomm QCA95xx, QCA98xx, QCA6300). Пришлось подумать и поискать. Учтя приверженность разработчиков Микротик к чипам Atheros, в результате всего за 50 р. (да, да, пятьдесят !) я купил старенький, полуразмерный Qualcomm Atheros AR5B95 c wifi 2,4 Мгц b/g/n, который идеально подошёл и сразу заработал с RBM33G. Модули wifi 5 Мгц я не пробовал, также не пробовал двухдиапазонные модули, вероятно, для меня это дело будущего.
Понятно пришлось приобрести также необходимы антенны для lte-модемов и wifi и пигтейлы к ним (для теста LTE я брал обычные штыревые антенны с небольшим коэффициентом усиления, расчитанные на работу в «городских» условиях). Всё вместе составило около 2500р.
Также была куплена промышленного типа SD-карта Metorage объемом 32GB (1.600 р.) для установки сервера Микротик Dude. Для подобных задач всегда лучше брать промышленного («industrial») стандарта SD, рассчитанные на соответствующие условия эксплуатации.
Рис 2. Индустриальная SD-карта 32 Гб.
В качестве SSD был приобретён M.2 диск GUDGA GVX-2242 объемом 512 Гб с ключом М в размере 2242. В выборе SSD я руководствовался только физической длиной диска (42 мм) и ценой (3000р). Как заявлено производителем RBM33G, система поддерживает только SSD в формфакторе M.2 с ключом М, при этом какой бы скоростной не был диск, поддерживается только «первая» скорость –PCI-x1.
Рис 3. SSD GUDGA M.2 512 ГБ M key.
SSD, выполненные именно в размере 2442, отлично подходят для монтирования на RBM33G, так как под него имеется отверстие для крепления, в которое нужно вставить заклепку из K-25 набора RBM33G. SSD планировался под хранение библиотек скриптов, различных нужных программ и файлов, доступных в расшаренных папках по SMB-протоколу и по FTP. Сколько времени проживёт диск сказать сложно. Для лучшего охлаждения лучше приклеить к нему алюминиевый радиатор.
Система без проблем сразу «увидела» оба диска, и SD и SDD, в /system disk. Их пришлось разумеется переразметить в формат ext3, настроить сетевые папки в /ip smb. Тем, кто пойдет по моим стопам, совет — не берите скоростные SSD, всё равно работа будет медленной, т.к. плата поддерживает только PCI1 x. Микротик вообще не расчитан быть NAS-ом, его SSD официальное руководство советуют использовать под базы данных IP, /user manager, кеша web proxy и резервного копирования данных или хранения лога. (https://wiki.mikrotik.com/wiki/Manual: System/Disks).
У RBM33G есть приятная особенность: большинство плат Микротик отключают USB-порт при использовании обоих mini PCI-e слотов. В RBM33G можно установить один mini PCI-e модем и wifi-радиокарту не отключая USB-порт (не снимая соответствующую перемычку). Если же нужно установить два модема перемычку нужно снять, но тогда отключается только USB2 интерфейс, а USB3 всё равно остаётся подключенным. Так что даже при «полной загрузке» можно использовать USB3-порт для подключения дополнительного диска или, например, суперскоростного модема с агрегацией частот (этого я делать пока не стал).
Отдельной, очень интересной с моей точке зрения возможностью расширения, является наличие у RBM33G GPIO (интерфейса ввода/вывода), разъем которого присутствует на плате в виде 26 «штырьков» (пинов). Часть PIN-контактов разъема доступны програмно из консоли или скриптового языка RouterOS и могут быть настроены как на ввод, так и на вывод. Распиновка GPIO RBM33G описана в официальной документации help.mikrotik.com/docs/display/UM/RBM33G
Рис 4. Распиновка GPIO RBM33G (26 контактов).
Интересно, что GPIO Микротик распиновкой точь в точь соответствует 26 контактному GPIN-разъему Raspberry Pi B. Не знаю это стандарт или намеренное заимствование для совместимости разработчиков Микротик.
Рис 5. Схема GPIO RBM33G точно соответствует GPIO-разъему Raspberry Pi B (она есть в Интернет и её красочный вариант удобно использовать).
RBM33G имеет только цифровые (digital) GPIO. Программно доступны Pin 3, 5, 12, 13, 15 и 16. По умолчанию под GPIO на RBM33G доступны только Pin3 и Pin5:
/iot gpio digital print
# NAME DIRECTION OUTPUT INPUT SCRIPT
0 pin3 input 0 1
1 pin5 input 0 1
Также по умолчанию, Pin 12–16 используются под последовательный порт (тоже, кстати, отдельная тема, до которой ещё не дошли руки). Чтобы использовать их под GPIO нужно выполнить команду:
/system/routerboard/settings/set gpio-function=""
,
Отключающую GPIO от serial-порта. Для вступления изменений в силу необходима перезагрузка платы:
/system reboot
Теперь под GPIO будут доступны целых шесть цифровых линий ввода/вывода:
/iot gpio digital print
# NAME DIRECTION OUTPUT INPUT SCRIPT
0 pin3 input 0 1
1 pin5 input 0 1
2 pin15 input 0 0
3 pin13 input 0 0
4 pin12 output 1
5 pin16 output 0
У RBM33G линии ввода/вывода только цифровые (digital), аналоговых линий нет. Все линии могут быть настроены програмно как на ввод, так и на вывод:
/iot gpio digital set pin15 direction=input
/iot gpio digital set pin16 direction=output
На линиях, настроенных на вывод (output), можно программно устанавливать значение логической единицы или нуля (при этом на линии появляется напряжение соответственно от 0 до +1,4В и от +1,41 до +3,63В).
/iot gpio digital set pin16 output=1
/iot gpio digital set pin16 output=0
К линиям можно «прицеплять» скрипты репозитория или непосредственно исполняемый код:
/iot gpio digital set pin12 script=io_test
/iot gpio digital set pin13 script=":log warning \"Reverse line\""
/iot gpio digital set pin15 script=":global myFunc; [$myFunc]"
Тогда при смене состояния линии будет выполняться прикрепленный скрипт или инструкция. Глобальная функция, «прикрепленная к GPIO», у меня выполнялась, почему-то только если была создана непосредственно из CLI (возможно ошибка разработчиков Микротик).
Соответственно, используя GPIO, можно подключить к RBM33G какое-либо оборудование, способное принимать и передавать цифровые сигналы. То есть можно управлять работой этого оборудования или получать данные с него, либо с него управлять работой Микротик.
Я решил подключить к GPIO Микротик свой любимый модуль мониторинга среды и управления нагрузками Laurent-5G компании KernelChip (https://kernelchip.ru/Laurent-5G.php). У этого модуля есть аналогичные, удобные для подключения, программируемые линии ввода/вывода общего назначения (8 линий IO), с той же логикой и вольтажом управления, что и GPIO RBM33G, то есть как нельзя лучше подходящие для такой задачи.
Для экперимента, я соединил линии pin3 и pin5 RBM33G, настроенные на вывод с двунаправленными дискретными линиями общего назначения IO 1 и 2, настроенными на вход.
Рис. 6 Соединение GPIO RBM33G Pin3 и Pin5 и линий ввода/вывода IO1 и IO2 Laurent-5G
При подаче команды на Микротик РоутерОС:
/iot gpio digital set pin3 output=1
на IO1 Laurent-5G подаётся напряжение +3V в допустимых пределах отклонения (логическая единица). При
/iot gpio digital set pin3 output=0
Напряжение на IO1 не будет превышать +1,41 (логический ноль)
Появление того или иного явления на линии ввода можно обнаружить на Laurent-5G с помощью специально «запрограммированного» задания системы СAT (см. Руководство Laurent-5G kernelchip.ru/download/Laurent-5_5G/Laurent-5_Manual_v. 1.15.pdf) и по достижению этого факта выполнить то или иное действие.
Также я подключал к линиям GPIO RBM33G, настроенным на вывод блок на 4 реле 220В с низким управляющим напряжением (1,5–5В) KIT MP701 (https://masterkit.ru/shop/1327359) и непосредственно управлял работой его реле через скрипты РоутерОС.
Рис. 7 Модуль реле 220В 4 канала MP701 с управляющим напряжением 1,4–5В.
Схема такого подключения проста: +5В возьмем, например, с PIN 4, а GND с PIN 6 GPIO RBM33G. Управляющие сигналы будут поступать с PIN 12, 13, 15 и 16, настроенных на вывод и физически соединенными соответственно с PIN 2–4 (на схеме IN1–4) блока MP701.
Рис. 8 Пробное подключение MP701 к RBM33G «на коленке» «на столе». На фото видны также установленные модем Huawey и полуразмерный wifi Atheros.
Рис. 9 Подключение модуля реле MP701 к GPIO RBM33G c размещением в оригинальном корпусе Микротик CA433U.
После установки компактной RBM33G в удлиненный корпус CA433U остаётся свободное место, как раз достаточное для внутренней установки модуля MP701. Обратите также внимание: на фото установлен другой SSD, более длинный (размер 2280), что не мешает установке MP701. Также установлены два модема mini-PCI-e Mikrotik R11e-LTE 4 Cat.
Настраиваем линии 12, 13, 15, 16 Микротик RBM33G на вывод:
/iot gpio digital set pin12 direction=output
/iot gpio digital set pin13 direction=output
/iot gpio digital set pin15 direction=output
/iot gpio digital set pin16 direction=output
Теперь можно переключать реле 220В блока MP701:
# включаем реле 2; /iot gpio digital set pin13 output=1
# выключаем реле 4; /iot gpio digital set pin16 output=1
Поскольку мы используем механические реле, а не оптроны, то они будут «щелкать» при переключении, для проверки работы можно не подключать нагрузку.
Как видим номерам реле 1, 2, 3, 4 соответствуют линии 12, 13, 15, 16 соответственно. Чтобы не путаться в этих цифрах, можно занести их в массив, где номер линии будет соответствовать порядковому номеру элемента массива. Тогда вызывать элементы массива можно выражением ($Array→X), где $Array — имя массива, X — номер элемента. Не забываем, что элементы массива номеруются с нуля.
:local arrayPin {12; 13; 15; 16}
:local on 1; local off 2
# работаем сразу со всеми реле массива
# - > включение
:local count 0
:foreach Xpin in=$arrayPin do={
:set count ($count+1)
:put «Включаем реле $count»
/iot gpio digital set "pin$Xpin" output=$on
}
}
# - > выключение
:set count 0
:foreach Xpin in=$arrayPin do={
:set count ($count+1)
:put «Выключаем реле $count»
/iot gpio digital set "pin$Xpin" output=$off
}
}
# или отдельно с выбранным реле
:set count 2
/iot gpio digital set "pin$($arrayPin->2)" output=$on
А можно чуть потрудиться и написать более удобную, универсальную функцию:
# Функция работы с реле 4-х канального модуля MP701; by Sertik 03/10/2023
# $1 - действие (on/off/status/direction/info), при info всегда выдается информация по всем реле
# $2 - номер реле (если не указан действие выполняется над всеми)
# $3 - input/output, используется при $1 direction, если не задан, действие производится над всеми линиями
:global iotRele do={
:local arrayPin {12; 13; 15; 16}
:local act;
:if ($1="help") do={
/terminal style varname
:put ""
:put "Function works with GPIO RBM33G"
:put "version 1.0"
:put "by Sertik 03/10/2023"
:put ""
:put "\$1-action: on/off/status/direction/info/help"
:put "\$2-rele number, if not define - all"
:put "\$3-input/output for direction"
:put ""
/terminal style none}
:do {
:foreach Xpin in=$arrayPin do={
/iot gpio digital set "pin$Xpin" direction=output}
} on-error={:local gpioanswer "GPIO pin 12-16 is set on serial-port"
:put ("ERROR $0"."\r\n"."$gpioanswer")
:log error ("ERROR $0"."\r\n"."$gpioanswer")
:return $gpioanswer
}
if ($1="info") do={
:local gio [/iot gpio digital print as-value]
:local count 0; local name; :local dir; :local state;
:foreach i in=$gio do={
:set name ($gio->$count->"name")
:set dir ($gio->$count->"direction")
:set state ($gio->$count->"output")
:set count ($count+1)
:put ("$count "."$name "."$dir "."$state")
:log info ("$count "."$name "."$dir "."$state")
}
:return $gio}
:if (($1="status") and ([:len $2]=1)) do={
do {
:return [/iot gpio digital get "pin$($arrayPin->([:tonum $2]-1))"]
} on-error={:return Error}
}
:if (($1="direction") and ([:len $3]=0)) do={
:if (($2="input") or ($2="output")) do={
do {
:foreach Xpin in=$arrayPin do={
/iot gpio digital set "pin$Xpin" direction=$2
}
} on-error={:return Error}
} else={:return Error}
:return Done}
:if (($1="direction") and ([:len $2]=1) and ([:len $3]>0)) do={
:if (($3="input") or ($3="output")) do={
:do {
/iot gpio digital set "pin$($arrayPin->[:tonum $2])" direction=$3
} on-error={:return Error}
} else={:return Error}
:return Done}
:if ($1="on") do={:set act 1}
:if ($1="off") do={:set act 0}
:if ([:len $act]>0) do={
:if ([:len $2]>0) do={
:do {
:if (([:tonum $2]<=0) or ([:tonum $2]>4)) do={:return Error}
/iot gpio digital set "pin$($arrayPin->([:tonum $2]-1))" output=$act
} on-error={:return Error}
} else={
:foreach Xpin in=$arrayPin do={
/iot gpio digital set "pin$Xpin" output=$act
}
}
:return "Done"} else={:return "Error"}
}
# Примеры вызова
# вывести состояние всех реле в терминал и лог
# [$iotRele info]
# запросить состояние реле 3
# :local R3 [$iotRele status 3]
# установить направление ввода/вывода линии 4
# [$iotRele direction 3 output]
# установить направление ввода/вывода всех 4-х линий на ввод:
# [$iotRele direction input]
# :log error ("Включаем реле 3 "."$[$iotRele off 3]")
# :delay 2s
# :log warning ("Выключаем реле 3 "."$[$iotRele off 3]")
# Включаем все реле
# [$iotRele on]
# Выключаем все реле
# [$iotRele off]
Можно, разумеется, вместо MP701 использовать другие совместимые по управляющему току, в том числе твердотельные, релейные модули.
Также можно установить на корпус с Микротик RBM33G небольшие симпатичные кнопки «без фиксации», соединив их с PIN +5В GPIO и одной из линий ввода/вывода, настроенной на input. Тогда, при нажатии на кнопку, на линии будет появляться «логическая 1», а при отпускании — «логический ноль». Этот факт можно зафиксировать быстро исполняемым скриптом Планировщика роутера (/system scheduler). Ну, правда придётся конпку подержать, хотя бы секунду и скрипт вызывать с той же частотой. Дальше зависит от фантазии и целей — перезагрузка роутера, переключение реле, переключение на другой wan-канал и т.д…
На этом комплектацию RBM33G можно считать завершённой.
Рис. 10 Фото «законченного изделия» в корпусе CA433U.
Для универсальности можно установить один LTE-модем и двухдиапазонный wifi-модуль в mini PCI-e слоты (тогда будем иметь wifi 2,4 и 5 МГц), или два модема (один mini PCI-e, другой USB), если нужно резервировать LTE-каналы в Интернет. Дополнительный скоростной M.2 модем с USB3 адаптером, кстати, можно установить прямо в корпус CA433U, места хватит. На SD-карту можно инсталлировать DUDE-server для мониторинга сети (я это уже делал несколько раз успешно ранее и могу сказать, что SD промышленного класса более пригодны для этой цели, чем SSD), SSD использовать как хранилище скриптовых библиотек и не часто используемых файлов. Кстати в РоутерОС v7 можно использовать контейнеры, открытые на SSD.
К силовым контактам MP701 осталось подключить разъем на корпус RBM33G, с которого можно снимать фазу 4-х контактного релейного модуля. Микротик RBM33G c MP701 или другим совместимым релейным модулем может использоваться для включения/выключения дополнительного сетевого оборудования, физического подключения NAS при входе VPN-пользователей, управления элементами охлаждения/подогрева сетевого шкафа и т. д…
В целом собранный нами комбайн вполне может справиться с нагрузками и «хотелками» сети среднего офиса или загородной резиденции.
Пишите в комментариях свои варианты расширенного использования RBM33G.