ルーターMikrotikは、無線放送と音声スマートホームを制御します

最近、私は誤ってDJSoft.Net会社www.radioboss.ruのRadioBossプログラムに精通し、 このラジオ放送自動化ソフトウェアステーションの設計と機能に満足しました。もちろん、私はプロではなく、洗練された音楽愛好家のユーザーでもありませんが、それでも、よく考えられたインターフェイス、ロシア語の完全なサポート、最も豊富な再生とブロードキャストのスケジュール制御、そして低価格は嬉しい驚きです。無料のフルバージョンは、5時間の作業を150回実行するように設計されており、プログラムの機能を習得するには十分すぎるほどです。 RadioBossの詳細については、公式Webサイトおよび フォーラムを参照してください







プログラムがAPIコントロールをサポートしているという事実に、私はもっと魅了されました。APIコントロールを使用すると、RadioBossがインストールされているコンピューターで音楽の再生をリモートで完全に制御できます。私は長い間、リモートPCのデスクトップに接続せずに、コンピューターをまったく使用せずに、メディアをリモートで再生できるようにすることを夢見ていました。たとえば、私のルーターMikrotikに任せてください!



ご存知のように、Router OS Mikrotikには、ルーターの操作を自動化するためのスクリプトやプログラムを作成できる強力なスクリプト言語が組み込まれています。しかし、単なるルーターではありません!スクリプトコマンド /ツールフェッチ指定されたURLへの外部GETおよびPOST要求を整理して、オープンAPIを使用して任意のハードウェアまたはプログラムにアクセスできます。たとえば、スクリプトと環境をMikrotikからインターネット・リレー・モジュールを制御および監視するためのコマンドのライブラリーについて( 閲覧することができ、ここからダウンロード)を取得、 天気についての情報を電報でイベントについて、通知をし、 電報を経由してルータを制御する日の出/日の入りの時間を決定する天文学の組織とリレーなど..。



なぜ私たちはそれを手に入れましたか?RadioBoss APIのマニュアルを使用して 、Router OS Mikrotikのいくつかの簡単な関数記述します。これにより、ルーターはRadioBossでアクションを実行し、ルーターでイベントを実行できます。



#---------------------------------------------------------#
#   RadioBoss                                
#          by Sertik 18/12/2020                                       
#---------------------------------------------------------#

# - FuncRadioBossInit
#   ,      RadioBoss    
#     

:global FuncRadioBossInit do={
:if ([:len $0]!=0) do={
:if ([:len $1]!=0) do={
:if ([:len $2]!=0) do={
:if ([:len $3]!=0) do={
:global FuncPing
:if ([$FuncPing PingAdr=$1]="OK") do={
:global RBaddr $1
:global RBport $2
:global RBpass $3
:return "OK";
             } else={:return "ERROR PC RadioBoss not responded"}
          } else={:return "ERROR parametr password"}
     } else={:return "ERROR parametr port"}
   } else={:return "ERROR parametr address"}
  }
}


# - FuncRadioBossPlay
#     ,   ,    
#   "next"/"prev"   / 

:global FuncRadioBossPlay do={
:if ([:len $0]!=0) do={
:global RBaddr
:global RBport
:global RBpass
:if (([:len $RBaddr]!=0) and ([:len $RBport]!=0) and ([:len $RBpass]!=0)) do={
:local StrFetchRB;
:if (($1="next") or ($1="prev")) do={:set StrFetchRB ("http://"."$RBaddr".":"."$RBport"."/\?pass="."$RBpass"."&cmd="."$1");} else={ 
:set StrFetchRB ("http://"."$RBaddr".":"."$RBport"."/\?pass="."$RBpass"."&cmd=play%20"."$1");} 
do {
:global RBanswer [/tool fetch url=$StrFetchRB mode=http as-value output=user];
} on-error={:return "ERROR"}
:global RBanswer; 
:if (($RBanswer->"status")!="finished") do={:return "ERROR"}
:return ($RBanswer->"data");
   } else={:return "ERROR no define address, port or password"}
 }
}

# - FuncRadioBossStop
#  

:global FuncRadioBossStop do={
:if ([:len $0]!=0) do={
:global RBaddr
:global RBport
:global RBpass
:if (([:len $RBaddr]!=0) and ([:len $RBport]!=0) and ([:len $RBpass]!=0)) do={
:local StrFetchRB; :set StrFetchRB ("http://"."$RBaddr".":"."$RBport"."/\?pass="."$RBpass"."&cmd=stop"); 
do {
:global RBanswer [/tool fetch url=$StrFetchRB mode=http as-value output=user];
} on-error={:return "ERROR"}
:global RBanswer; 
:if (($RBanswer->"status")!="finished") do={:return "ERROR"}
:return ($RBanswer->"data");
   } else={:return "ERROR no define address, port or password"}
 }
}


# - FuncRadioBossBreak
#      

:global FuncRadioBossBreak do={
:if ([:len $0]!=0) do={
:global RBaddr
:global RBport
:global RBpass
:if (([:len $RBaddr]!=0) and ([:len $RBport]!=0) and ([:len $RBpass]!=0)) do={
:local StrFetchRB; :set StrFetchRB ("http://"."$RBaddr".":"."$RBport"."/\?pass="."$RBpass"."&cmd=set%20break");
do {
:global RBanswer [/tool fetch url=$StrFetchRB mode=http as-value output=user];
} on-error={:return "ERROR"}
:global RBanswer; 
:if (($RBanswer->"status")!="finished") do={:return "ERROR"}
:return ($RBanswer->"data");
   } else={:return "ERROR no define address, port or password"}
 }
}


# - FuncRadioBossVolume
#   0-100

:global FuncRadioBossVolume do={
:if ([:len $0]!=0) do={
:global RBaddr
:global RBport
:global RBpass
:if (([:len $RBaddr]!=0) and ([:len $RBport]!=0) and ([:len $RBpass]!=0)) do={
:local StrFetchRB; :set StrFetchRB ("http://"."$RBaddr".":"."$RBport"."/\?pass="."$RBpass"."&cmd=setvol%20"."$1"); 
do {
:global RBanswer [/tool fetch url=$StrFetchRB mode=http as-value output=user];
} on-error={:return "ERROR"}
:global RBanswer; 
:if (($RBanswer->"status")!="finished") do={:return "ERROR"}
:return ($RBanswer->"data");
   } else={:return "ERROR no define address, port or password"}
 }
}

# - FuncRadioBossShuffle
# /  
#  [$FuncRadioBossShuffle "on/off"]


:global FuncRadioBossShuffle do={
:if ([:len $0]!=0) do={
:global RBaddr
:global RBport
:global RBpass
:if (([:len $RBaddr]!=0) and ([:len $RBport]!=0) and ([:len $RBpass]!=0)) do={
:local StrFetchRB; :set StrFetchRB ("http://"."$RBaddr".":"."$RBport"."/\?pass="."$RBpass"."&cmd=set%20shuffle%20"."$1"); 
do {
:global RBanswer [/tool fetch url=$StrFetchRB mode=http as-value output=user];
} on-error={:return "ERROR"}
:global RBanswer; 
:if (($RBanswer->"status")!="finished") do={:return "ERROR"}
:return ($RBanswer->"data");
   } else={:return "ERROR no define address, port or password"}
 }
}


# - FuncRadioBossReset
#      

:global FuncRadioBossReset do={
:if ([:len $0]!=0) do={
:global RBaddr
:global RBport
:global RBpass
:if (([:len $RBaddr]!=0) and ([:len $RBport]!=0) and ([:len $RBpass]!=0)) do={
:local StrFetchRB; :set StrFetchRB ("http://"."$RBaddr".":"."$RBport"."/\?pass="."$RBpass"."&cmd=resetplayedstate"); 
do {
:global RBanswer [/tool fetch url=$StrFetchRB mode=http as-value output=user];
} on-error={:return "ERROR"}
:global RBanswer; 
:if (($RBanswer->"status")!="finished") do={:return "ERROR"}
:return ($RBanswer->"data");
   } else={:return "ERROR no define address, port or password"}
 }
}

:global FuncPing do={
:local PingCount 3; #  ;
:local Hadr;
:if ([:find $PingAdr ":"]>0) do={:set Hadr [:pick $PingAdr 0 [:find $PingAdr ":"]];} else={
:set Hadr $PingAdr}
:local Result [/ping $Hadr count=$PingCount];
:local PingAnswer "";
:local MainIfInetOk false;
:set MainIfInetOk ((3*$Result) >= (2 * $PingCount))
:put "MainIfInetOk=$MainIfInetOk"
if (!$MainIfInetOk) do={
:set PingAnswer "ERROR"
}
if ($MainIfInetOk) do={
:set PingAnswer "OK"
}
:return $PingAnswer;
}
      
      







上記のスクリプトコードをルーターリポジトリに挿入します。変数の環境で記述された関数を「定義」するために、鉄片の先頭で(または必要に応じて)呼び出すことを忘れないでください。次に、RadioBoss制御関数がすべてのスクリプトから使用できるようになります。たとえば、次のように呼び出すことができます。



#  ():
:global FuncRadioBossInit; :global FuncRadioBossVolume; :global FuncRadioBossPlay;
:global FuncRadioBossReset; :global FuncRadioBossShuffle; :global FuncRadioBossBreak;
#      RadioBoss
[$FuncRadioBossInit "192.168.0.2" "9001" "your password"]
#  
[$FuncRadioBossVolume "30"]
#    
[$FuncRadioBossReset]
#     
[$FuncRadioBossShuffle "on"]
#   
:log info [$FuncRadioBossPlay "next"]
#     
[$FuncRadioBossBreak]
      
      





スクリプトで提供される最小限の機能セットを使用すると、メインプレイリストから指定したトラックの再生を開始し、ランダムな順序でトラックを再生し、再生を停止し、次の前のトラックを再生し、再生音量を設定できます。 RadioBoss APIははるかに広範囲であり、プレイリストへのトラックとストリームの追加、削除、ジングルの挿入など、プログラムのほぼすべての機能を管理できます。



当然、自分のインターネットラジオ局を開くつもりはありませんでしたが、実用的な目的でこのプログラムを使用することは、私にとってさらに魅力的でした。特に、内蔵スピーカーを介してスクリプトを鳴らすためのMikrotikルーターの機能は非常に控えめです。そして、音声メッセージを録音し、トラックの代わりにプレイリストに挿入し、必要に応じてMicrotic OSルーターから起動することが可能になります。これは私ではなく、ルーター自体によって行われます。



RadioBossがインストールされているPCで、リモートアクセスを有効にし、ポートとアクセスパスワードを構成します。







ホーム時にトレイwindose RadioBossプログラムは、今私に(ETC無線LAN、息子の過剰トラフィックの制限、新しいバージョンのソフトウェアの入手、ルータに不正にアクセスしようとする試み、上の世帯を結ぶ...)ローカルエリアネットワーク内の必要なイベントの声告げるに圧延PC、



国ではマルチチャネルMESHVPNネットワークが長い間自然に組織されてきた、たとえば、ビデオカメラで動きを検出するとき、アンプとストリートスピーカーを介して自動的にフーリガンと泥棒に彼らが見られ、記録され、すぐに首を叩かれていることを警告することができます。



システム管理者は、RadioBossをオフィスのPCにインストールし、インターネットを閲覧したり「タンク」を再生したりするのではなく、職場で作業する必要があることを音声で違反者に自動的に警告する機会があります。高価なハードウェアシステムを購入せずに無線放送システムを実行することも可能になりました。会議や会議などに関するメッセージ...



これは、たとえば、上司が午前中にオフィスに現れたときに上司に挨拶する(同時に従業員に警告する!)方法です(上司のスマートフォンのMACアドレスをMAC変数に追加します(アイデアはここから取得さ れます)。



:local MAC CC:CC:CC:CC:CC:CC;
:local MACdetect [interface wireless registration-table find mac-address=$MAC];
:if ([:len $MACdetect]>0) do {:do {:local nameADR [/ip firewall address-list get value-name=list [find address=123.123.123.123]];
:global FuncRadioBossInit; :[$FuncRadioBossInit «192.168.0.3» «9001» «PASSWORD»]
:global FuncRadioBossPlay
[$FuncRadioBossPlay «1»]
} on-error={/ip firewall address-list add dynamic=yes address=123.123.123.123 list=timer timeout=23:59:59; }}
      
      





スクリプトの実行をMikrotikaのスケジューラに配置し、たとえば15秒に1回実行します。



$ FuncRadioInit関数で渡されたアドレスで上司がPCのオフィスに現れると(追跡されるのはその日の最初の出現です)、プログラムのプレイリストから最初のトラックが起動されます。



もちろん、RadioSoftのRadioPlayerProTraktとTraktSoftのDJin Liteなど、他にも多くの放送自動化プログラム がありますが、RadioBossの機能とその価格を考えると、このプログラムには実質的に競合他社はありません。



おそらくAPIを使用して通常のWindowsMedia Playerを制御できますが、http要求を介してMediaPlayerを制御するための手順はどこにも見つかりませんでした。



ちなみに、RadioBoss APIを使用すると、任意のbatファイルとWindowsアプリケーションを実行できるだけでなく、コンピューターを再起動してシャットダウンすることもできます。したがって、パーソナルコンピュータまたはラップトップのネットワークカードにWake on Lan機能が装備されている場合、MikrotikはRadioBossでPCを起動できます。次に、必要な時間を計算した後、コンピュータの電源を切ります。



実験をお楽しみください!



All Articles