パターンマッチングを使用したダイアルプラン
パターンマッチングについて前回の記事でも少し紹介しましたが、今回はパターンマッチングを使用したダイアルプランの具体例を提示して見ていきます。
パターンマッチング復習
エクステンション名の先頭にアンダーバー(_)をつけ、パターンマッチングを使うことをAsteriskに明示します。
下表はパターンマッチングで使用する文字になります。
X | 0から9までのいずれかの数字 |
Z | 1から9までのいずれかの数字 |
N | 2から9までのいずれかの数字 |
[1-3] | 範囲指定。左記例では「1、2、3」がマッチ |
. | ワイルドカード。1つまたは複数の数字 |
パターンマッチング記述例
exten => _XXX,1,Answer() exten => _XXX,n,Playback(hello-world)
エクステンション名の先頭にアンダーバー(_)をつけていない場合、上表の文字を含めてもパターンマッチングは適用されません。
Dial()アプリケーションとパターンマッチング
Dial()アプリケーションは引数に内線番号を指定する必要があります。
Dial()アプリケーション記述例
[default] exten => 201,1,Dial(SIP/201,30,r) exten => 201,2,Hangup() exten => 202,1,Dial(SIP/202,30,r) exten => 202,2,Hangup()
この例にパターンマッチングを使用すると下記のようになります。
[default] exten => _20[1-2],1,Dial(SIP/201,30,r) exten => _20[1-2],2,Hangup()
この記述で「201」と「202」のエクステンションを定義したことになります。
しかしこれでは、内線番号「202」に電話をかけたとき、「201」にコールしてしまいます。
それはDial()アプリケーションの第1引数で「201」を指定しているためです。
このことからわかるように、「202」のエクステンションにマッチさせるときには、Dial()アプリケーションの第1引数も「202」になるようにする必要があります。
ただ、パターンマッチングはエクステンション名で使える機能であり、アプリケーションの引数には使用できません。
そこで、${EXTEN}というチャネル変数を使用します。
${EXTEN}チャネル変数
Asteriskはダイヤルされた数字を${EXTEN}というチャネル変数に格納します。
それを確かめるために、SayDigits()アプリケーションを使用してみましょう。
SayDigits()アプリケーション記述例
exten => _XXX,1,Answer() exten => _XXX,2,SayDigits(${EXTEN})
上記を「extensions.conf」に追記し、Asteriskを再起動させたら、3桁の適当な番号をダイヤルしてください。
するとダイヤルした数字が読み上げられます。
SayDigits()アプリケーションは引数で指定した数字を読み上げるアプリケーションです。
${EXTEN}チャネル変数を引数で渡しており、ダイヤルした数字が読み上げられたということは、ダイヤルされた数字が${EXTEN}チャネル変数に格納されたということを意味します。
Dial()アプリケーションとパターンマッチングの使用例
このように、エクステンション名にはパターンマッチング、Dial()アプリケーションの引数にはチャネル変数を使用すること下記のようにまとまった記述をすることが可能になります。
パターンマッチングを使用したDial()アプリケーション記述例
exten => _20[1-2],1,Dial(SIP/${EXTEN},30,r) exten => _20[1-2],2,Hangup()
上記では[ ]による範囲指定を使用していますが、「X」「Z」「N」またはワイルドカードを組み合わせることで様々なマッチングが可能になります。