Решил маленько "озвучить" Микротик используя Serial MP3/WAV Player от фирмы Catalex (разумеется его китайский клон). Это маленькое устройство, про которое я немного писал тут https://habr.com/ru/articles/776908/. Стоит на АЛИ 120-200р. К нему можно напрямую подключить наушники или колонки.
Его в принципе можно подключить к любому RB, который имеет последовательный порт или USB-порт. Я использовал возможности RBM33G с его "внутренним" serial1 портом на GPIO-разъеме. Также можно использовать USB-порт, подключив модуль Catalex через шнур-переходник serial-USB.
Само устройство имеет, повторюсь, компактные размеры. Его можно даже установить прямо на плату RBM33G (потом расскажу как) или на место PCI-e (если оно не занято, разумеется только на место, не подключая
![Смех :-)](./images/smilies/ag.gif)
Дальше соединяем +5В, GND, RX и TX от GPIO разъема RBM33G и соответствующие пины модуля MP3 Player.
Модуль имеет слот для микро SD-карты до 32Gb, на которую можно записать файлы мелодий или голосовых сообщений (своим голосом или голосом любимой девушки) для озвучивания любых событий на роутере.
Фишка в том, что устройство управляется шестнадцатиричными командами (см. описание Catalex YX5300 или 6300, легко гуглится, много проектов под Ардуино)
Как же управлять им с Микротик ?
А вот -как - один из простейших вариантов - через интерфейс ppp-клиента ! В поле ppp-client modem-init= можно передать нужные данные.
Пришлось правда повозиться, так как в лоб не получилось. Были кое-какие сложности, их все удалось обойти. Всё сразу не расскажу, скорее всего опишу подробно в статье на Хабре чуть позже.
А тут приведу готовую функцию управления serial MP3 player Catalex для Микротик, которую можно просто взять и использовать из своих скриптов.
За код прошу не пинать, это "опытный образец", главное работает ! Потом поизящнее перепишу.
Итак от URRI-ресивера за 20.000 https://habr.com/ru/articles/586288/ я пришел таки к Catalex за 200 рублей !
![Браво! :bra_vo:](./images/smilies/bi.gif)
Код: Выделить всё
#
# serial-MP3-player Catalex YX6300 FUNCTION v 1.0 Sertik 25/12/2023
# for ports serial0 or serial1 RBM33G
#
# ! the port must be freed in advance from the console, etc. and configured for an exchange rate of 9600 b/s!
# the port is set in global SMPport. If not specified, the serial1 port is set
# almost all commands without parameters, except:
# playfile [folder number] [file number], for example [$SMP playfile 01 01]
# playCycle [file number in folder] - cyclic playback of the file
# folderCycle [folder number] - cyclic playback of a folder
:global SMP do={
# check/set port
:global SMPport; :if ([:len $SMPport]=0) do={:set SMPport "serial1"}
:if (($SMPport="serial0") or ($SMPport="serial1")) do={
# convert number to code
:local fBy do={
:set $1 [:tonum $1]
:return [[:parse "(\"\\$[:pick "0123456789ABCDEF" (($1 >> 4) & 0xF)]$[:pick "0123456789ABCDEF" ($1 & 0xF)]\")"]]
}
# some commands Catalex YX6300
:global ArrayComSMP {
"play"="\0D"
"pause"="\0E"
"stop"="\16"
"next"="\01"
"previous"="\02"
"volumeUP"="\04"
"volumeDW"="\05"
"sleep"="\0A"
"wakeup"="\0B"
"reset"="\0C"
"shuffle"="\18"
"playfile"="\0F\11"
"volume"="\06\11"
"playCycle"="\08\11"
"folderCycle"="\17\11"
"TF"="09\11"}
:local param "\11\11\11\EF"
:if ([:len $1]=0) do={:return "no set name command"}
:local cmd ($ArrayComSMP->$1)
:if ([:len $cmd]=0) do={:return "bad command"}
# command for selecting the playback source (optional)
:if ($cmd="TF") do={:set $2 02}
:put "Execute command Serial MP3 Player: $1"
# flipping parameter $2 - > $3 for commands with one parameter and calculating \byte by parameters
:local a1 $2
:local b1 $3
:if ([:len $3]=0) do={:set b1 $2; :set a1 "\11"}
:if ($a1="\11") do={} else={:set a1 [$fBy $a1]}
:set b1 [$fBy $b1]
# if the command is longer than one byte, then it needs parameters
:if ([:len $cmd]>1) do={:set param ("$a1"."$b1"."\EF")}
# remove the ppp client interface just in case it was left
:if ([/interface ppp-client find name="scripttemp"]) do={/interface ppp-client remove [/interface ppp-client find name="scripttemp"]}
# sending a command to the serial-MP3-player device via ppp-client
/interface ppp-client add name="scripttemp" dial-on-demand=no port=$SMPport modem-init=("\7E\FF\06"."$cmd"."$param") null-modem=yes disabled=no
:delay 1s
/interface ppp-client remove [/interface ppp-client find name="scripttemp"]
:return []
} else={:return "bad port in global variable SMPport: $SMPport"}
}
# Examples:
# $SMP play - start play
# $SMP stop
# $SMP volume 20 - set volume 20
# $SMP playfile 01 02 - play file 002XXX.mp3 in folder 01