カテゴリー
Asterisk IP-PBX PHP

Asterisk AGI PHPスクリプトの改行コード

オープンソースのIP-PBXである Asterisk は 機能を追加するために AGI (Asterisk Gateway Interface) というインターフェースがあります。さまざまな言語 (Perl, PHP etc.) でデータベースへアクセスするなど電話とコンピュータシステムの連携することができます。

現在開発中のシステムで AGI スクリプトを PHP で書いていて気づいた点があったので備忘録に。

例えば、以下のdefault コンテキストのエクステンションから起動される hangup.php という AGI スクリプトがあります。処理は電話の切断情報をデータベースに書き込んで終了します。

[default]
.. 省略 ..
exten => h,1,NoOp(${HANGUPCAUSE})
 same => n,NoOp(${CHANNEL})
 same => n,NoOp(${AVAILSTATUS})
 same => n,AGI(hangup.php)

コマンドラインから hangup.php 単体を実行すると期待どおりの動作で問題なかったのですが、エクステンションから起動されると、正常終了するものの処理が行われません。

正常に動作するスクリプトと見比べること数時間。。

違いといえば、正常動作するスクリプトは改行コードが LF のみで、hangup.php は改行コードが CRLF になっていることくらい。

ものは試しに改行コードを LF に変換して実行すると、期待通りの動作となりました。 🙂

ということで、AGIスクリプトの改行コードは LF のみでないと期待通りの動作にならないことがある。

ちなみに、Asterisk のバージョンは 1.8.25 です。

カテゴリー
Asterisk IP-PBX

Ubuntu 12.04 LTSへAsterisk 1.8.x をインストール

Ubuntu 12.04 LTS へ Asterisk 1.8.21.0 をインストール メモです。

Ubuntu 12.04 LTS をインストールが終わったら、Asterisk をビルドする準備をします。

1. まず、Ubuntu を最新にします。

$ sudo su
# apt-get update
# apt-get upgrade

 
2. ソースのビルドに必要なパッケージのインストール

# apt-get install build-essential
# apt-get install libncurses5-dev
# apt-get install libssl-dev
# apt-get install docxygen

 
3. 次に、Asterisk をダウンロードしてきます。1.8 の最新版(現時点で 1.8.21.0)を wget コマンドでダウンロードして展開します。

# wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.8-current.tar.gz
# tar zxvf asterisk-1.8-current.tar.gz

 
4. 展開したディレクトリに移動してビルド開始します。 ./configure で問題ないか確認します。

# ./configure

 
5. menuselect でインストールするアドオンなどを確認。デフォルトのままで大丈夫でしょう。[ESC]キーでメニューから抜けます。

# make menuselect

 
6. make でビルドしてインストールします。

# make
# make install

 
7. サンプルコンフィグを作成。 /etc/asterisk に *.conf ファイルが作成されます。

# make samples

 
8. 最後に起動時に Asterisk が開始されるように設定します。

# make config

 

カテゴリー
Asterisk IP-PBX

Asterisk extensions.conf ‘same =>’ オペレータ

Extensions.conf  のダイアルプランの記述が少し楽になる ‘same =>’ オペレータがあります。また、ダイアルプランが見やすくなるので個人的に気に入っています。

簡単な例として、こちらで紹介したダイアルプランを same => オペレータで記述すると:

[internal]
; exten => name,priority,application
; ex. exten => 123,1,Answer()
exten => 1000,1,Answer()
 same => 2,Playback(hello-world)
 same => 3,Hangup()

となります。簡単なのであまりメリットを感じられないかもしれません。

もう少し書いてみましょう。

今度はこちらの例を書き直すと:

[incoming]
exten => 8005,1,NoOp(${CALLERID(num)})
; 営業時間外
 same => n,GotoIfTime(18:00-08:59,mon-fri,*,*?closed)
 same => n,GotoIfTime(00:00-23:59,sat-sun,*,*?closed)
; 営業中は「Hello world」を再生
 same => n,Answer()
 same => n,Wait(1)
 same => n,Playback(hello-world)
 same => n,Wait(1)
 same => n,Hangup()
; 営業時間外は「I'm sorry」を再生
 same => n(closed),Answer()
 same => n,Wait(1)
 same => n,PlayBack(im-sorry)
 same => n,Wait(1)
 same => n,Hangup()

だいぶコードがすっきりして見えます。

 

カテゴリー
Asterisk IP-PBX

Asterisk sip.conf コンフィグ テンプレート

久しぶりに Asterisk 1.8 系をインストールして sip.conf と extensions.conf 定義を見直ししていました。あらためて make samples コマンドで作成された sip.conf を開いて詳細な設定を勉強していて便利だなと思ったテンプレートを紹介します。

以下の [basic-options](!) のように “(!)” をつけると設定オプションをテンプレートとして定義できます。設定の継承も出来て [kx-ut136n-options](!,basic-options) のように (!,basic-options) をつけると basic-options で定義された内容を継承しつつ、新たなオプションを追加設定したテンプレートを定義することができます。

以下の例では:

201 電話機は basic-options の設定に sendrpid=pai を追加
205 電話機は basic-options の設定の context を incoming にオーバーライド

しています。

[general]
context=default
udpbindaddr=0.0.0.0
allowguest=no
language=ja
rtptimeout=60
rtpholdtimeout=300

[basic-options](!)                    ; a template
        secret=1234
        type=friend
        host=dynamic
        canreinvite=no
        context=internal

[kx-ut136n-options](!,basic-options)  ; panasonic KX-UT136N options
        sendrpid=pai

[my-codecs](!)                        ; a template for my preferred codecs
        disallow=all
        allow=ulaw
        allow=alaw
        allow=ilbc
        allow=g729
        allow=gsm
        allow=g723

[201](kx-ut136n-options,my-codecs)
[202](basic-options,my-codecs)
[203](basic-options,my-codecs)
[204](basic-options,my-codecs)
[205](basic-options,my-codecs)
        context=incoming

これで、いろいろな SIP 電話機に柔軟対応が簡単に設定できます。

カテゴリー
Asterisk IP-PBX

Wireshark でパケットの解析

Wireshark というオープンソースのパケット解析ソフトでAsterisk とIP電話間のパケットを調べてみます。

Wireshark はhttps://www.wireshark.org/ からダウンロードできます。

パケットのキャプチャ

Asterisk は Linux 上で動作しているので、その上で tcpdump コマンドでUDP 5060ポートをキャプチャしておいて、IP電話で通話することで、Asterisk の SIPシーケンスを確認できます。

# /usr/sbin/tcpdump -s 65000 -w dump.cap udp port 5060

Wireshark で解析

Wireshark で上記のキャプチャして出力ファイルの dump.cap を読み込みます。

メニュー File -> Open で dump.cap を指定し、開くと下記のような画面が表示されます。
時系列にどこからどこへどんなやりとりが行われたかが一目瞭然です。

さらに、VoIP による通話に限定することもできます。

メニュー Telephony_ -> VoIP Calls を開くと VoIP による通話一覧が表示され、さらに Flow ボタンをクリックすると、下記のようにグラフィカルなシーケンスを確認することができます。

tcpdump と Wireshark があれば、いろいろネットワークのトラブル原因を調べるのに役立ちそうです。

参考:
https://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=FFFFFF&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=tmorita-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4274066835

以上です。