アスタリスク:Multifon VoIPサービスとの対話の例を使用して、サーバーで登録イベントを処理します

こんにちは、Habrahabr! この記事では、アスタリスクサーバーにスマートフォンを登録するときに、マルチフォンでの通話の受信モード(gsm-to-gsm / gsm-to-sip)を自動的に切り替える問題を解決する方法について説明します。 以下に、なぜそれが必要なのか、どのソリューションオプションが検討されたのか、最終的にどのように実装されたのかを説明します。 次の例は、Asterisk 1.6とともにDebian Lennyを実行しているホームサーバーに基づいて使用されましたが、他の一般的なLinuxプラットフォームで動作する可能性が最も高いでしょう。



問題の背景について簡単に



Megafonの加入者として、最近VoIPサービスの使用を開始しました。 このサービスの機能の1つは、発信呼び出しに加えて、SIPクライアントを介して携帯電話番号への着信呼び出しを受信できることです。 この機会を利用して、スマートフォンをアスタリスクホームサーバーにSIP経由で接続するように設定しました。 登録手順自体については触れません。サービスに接続し、SIPアカウントを設定します。これについてはすでに十分に書かれています。 私は次のことをしたかったです。スマートフォンをサーバーに接続すると、すべての着信セルラーコールがSIP経由で着信し始めます。 サーバーから切断された場合、電話による通話受信の通常モード(gsm-to-gsm)を復元する必要があります。 ソリューションは可能な限り自動化する必要があり、必要なのは1回だけです。ボタンをクリックしてスマートフォンのデスクトップ上のサーバーに接続します。



タスクを完了するために必要なもの



計画を実施するには、少なくとも2つの条件が満たされている必要があります。

1.「マルチフォン」は、セルラーコールの受信モードを切り替える機能を提供する必要があります:セルラーで受信、sipクライアントで受信。 サービスにはこのような機会があり、特定のhttpsリクエストをサーバーに送信することで実装されます(リクエストの形式について詳しくは、記事の最後に示されているリンクをクリックしてください)。 リクエストはコンソールから実行できます(たとえば、curlまたはwgetを使用)。これにより、スクリプトで使用できるようになります。

2.サーバーは、特定のピア(スマートフォン)がアスタリスクに登録されていることを「認識」し、接続/切断するときにhttps要求を実行する必要があります。 この質問については、以下で詳しく検討します。



解決策を求めて



スマートフォンがサーバーに登録される瞬間を判断する必要があります。 クライアントの接続に対するアスタリスクの反応と利用可能なイベント通知方法を調べた後、2つの主な解決策を決定しました。AMI(AsteriskマネージャーAPI)を介してイベントを調べるか、外部スクリプトを介してコマンド「sipピアを表示します。」 2番目のオプションは私に近いものだったので、私はそれにとどまることにしました。 ( ところで、今、私はまだ3番目の方法があると考えました-「Registered SIP 'peername'」および「Unregistered SIP 'peername'」の行の存在についてファイル/ var / log / asterisk / fullの出力を解析すること。もっと簡単ですが、私は逆の方法を取りましたより簡単なオプションを知っているなら、教えてください、私は喜んでそれらを聞きます )。



サーバーが書き込む内容を見てみましょう。



asterisk*CLI> sip show peers Name/username Host Dyn Nat ACL Port Status peer1/peer1 192.168.XXX.XXX D 5060 Unmonitored peer2/peer2 (Unspecified) D 5060 Unmonitored peer3/peer3 192.168.XXX.XXX D 5060 Unmonitored multifon/7922XXXXXXX 193.201.229.35 5060 OK (34 ms) sipnet/sipnet 212.53.40.40 5060 Unmonitored mywifipeer/mywifipeer (Unspecified) D 0 Unmonitored 6 sip peers [Monitored: 1 online, 0 offline Unmonitored: 4 online, 1 offline]
      
      





「ホスト」列には、切断されたクライアントの碑文(指定なし)が表示され、登録されたクライアントの場合はIPアドレスが表示されます。 このデータは、クライアントの登録ステータスを判断するのに十分です。 したがって、タスクは、必要なsipアカウント(smartphone-mywifipeer)のステータスをサーバーに照会し、その登録ステータスが変更された場合、https要求を送信するスクリプトを書くことに要約されました。 行われた変更を制御するために、イベントに関する情報がjabberで複製されます。 次に、スクリプトはcronに配置され、毎分実行されます。



このスクリプトはデーモンとしてではなくオンデマンドで動作するため、接続ステータスが変更されたことを判断するには、前回の起動時の状態に関する情報が必要です。 これが行われない場合、スクリプトはメガホンサーバーをDOSし、テスト中に毎回GSMモードを設定する要求を送信しますが、これは悪いことです。 したがって、スクリプトが最初に呼び出すときに、現在のステータス($ peer_state_now)に関する情報が外部ファイル($ peer_state_last_file)に書き込まれ、後続のファイルはすべてこのファイル($ peer_state_last)から情報を読み取り、現在のステータスと照合します。



Curlはhttpリクエストの送信に使用され、sendxmpp($ xmpp_binおよび$ xmpp_jid)はギャバーへの通知に使用されました。 スクリプトを使用する前に、Multifon-SIP登録レコードに対応するログインパスワード($ multifon_loginおよび$ multifon_password)を指定する必要があります。



Asterisk_peer_checkスクリプト



 #!/bin/bash # # press F1 for help if [ -z "$1" ]; then echo "Usage: $0 <peer_name>" exit 1 fi # determining the future... peer=$1 path="/var/spool/asterisk/tmp" peer_state_last_file="$path/peer_state_$peer" # Multifon account multifon_login="7922XXXXXXX@multifon.ru" multifon_password="mypassword" # Jabber account for report xmpp_jid="change_me@jabberserver.ru" xmpp_bin="sendxmpp" #getting actual peer state from asterisk peer_state_now=`asterisk -rx "sip show peers" | grep -i $peer | awk '{print $2}'`; #getting previous peer state from file if [ -f "$peer_state_last_file" ]; then peer_state_last=`cat $peer_state_last_file` else #first run peer_state_last=$peer_state_now fi #comparing actual peer status with previous if [ "$peer_state_now" != "$peer_state_last" ] then #peer status changed if [ "$peer_state_now" = "(Unspecified)" ] then #GSM-2-GSM multifon_routing="0" else #GSM-2-SIP multifon_routing="1" fi #changing multifon status multifon_url="https://sm.megafon.ru/sm/client/routing/set?login=$multifon_login&password=$multifon_password&routing=$multifon_routing" curl --silent $multifon_url >/dev/null #jabber announce, if sendxmpp installed which $xmpp_bin >/dev/null || [ $? -eq 0 ] && echo "[`hostname`] Asterisk: Megafon incoming calls set to $multifon_routing" | $xmpp_bin -i $xmpp_jid fi #writing actual peer state in file echo $peer_state_now > $peer_state_last_file #
      
      





/ etc / crontabにスクリプトの起動を追加するために残ります

 # * * * * * root /etc/cron/asterisk_peer_check mywifipeer #
      
      





できた! これで、システム全体の正常性を確認できます。 電話機をサーバーに接続すると、すぐにジャバーで確認メッセージが表示されます。 電話にテストコールを行い、すべてが意図したとおりに機能することを確認します。



参照:



Multifon:HTTPリクエスト形式、サーバー応答、コード処理



All Articles