Asteriskのextension.confのTips集

この記事は筆者が調査をした段階で随時更新していきます。

extension.conf

Asterisk の根幹ともいえる設定ファイルですが、非常に複雑です。
まともな日本語のドキュメントもなく、多くの方がこの設定で躓くことでしょう。
このドキュメントは、そのような人の助けになれば、と思います。

以下、全ての内容は以下のドキュメントを参考にしております。

また動作環境は以下の通りです。

基本的な流れ

あらゆるプログラム言語と同じように、全ての処理は上から下へ順に評価されていきます。
ただし実行順序は、 Asterisk が内部で置き換えている可能性があり、一概に上から下へ順である、とは言えません。
priority を自由に設定できることからも、同様に言うことができるでしょう。

Fax で送信元の電話番号を指定する

結論

以下のようなコマンドを、 SendFAX() をコールする前に実行し、 CALLERID をセットします。

exten => fax,n,Set(CALLERID(num)=XXXXXXXXXXX)

説明

Fax は基本的に以下のコマンドのみで、送信するをすることができます。

exten => send,n,SendFAX(${FAXFILE},d)

SendFAX() は以下のURLで説明されていますが、送信元の電話番号を指定するオプションがここにはありません。

また、それらしい FAXOPT() というものもありますが、これも関係がありません。

では、どうするかというと、
FAX も結局は電話なので、 SendFAX() を実行する前に CALLERID() を設定することになります。

[hoge]
...
exten => fax,n,Set(CALLERID(num)=XXXXXXXXXXX)
exten => fax,n,Goto(recieve-fax,receive,1)

[send-fax]
exten => send,1,SendFAX(${FAXFILE},d)
exten => send,1,Hangup()

複数の外線番号をそれぞれ内線番号に振り分ける

ひかり電話などで複数の外線番号を契約していることがあります。
せっかく外線が分かれているので、それぞれに内線番号を対応させようと思います。
ある番号をある内線番号に、別の番号を別の内線番号に振り分ける、というようなことをします。

結論

以下のように処理をしていきます。

; 着信番号を取得する
exten => _0X.,1,Set(Num_in=${SIP_HEADER(To)})
exten => _0X.,n,Set(Num_to=${Num_in:5:10})

; 着信した電話番号について、それぞれのLabelに振り分ける
exten => _0X.,n,GotoIf($[${Num_to}=XXXXXXXXXXX]?dialToX)
exten => _0X.,n,GotoIf($[${Num_to}=YYYYYYYYYYY]?dialToY)

; XXXXXXXXXXX に着信したものは内線200をコール
exten => _0X.,n(dialToX),Dial(SIP/200,20,r)
exten => _0X.,n,Hangup()
; YYYYYYYYYYY に着信したものは内線300をコール
exten => _0X.,n(dialToY),Dial(SIP/300,20,r)
exten => _0X.,n,Hangup()

説明

複数の電話番号を契約している場合、そのうちのどれか一つが代表番号となり、 ひかり電話からの通信は、基本的に代表番号をベースに行われます。

そのため、どの番号に着信があったかは、 SIP のヘッダ情報から取り出す必要があり、
これを以下の処理で行っています。

exten => _0X.,1,Set(Num_in=${SIP_HEADER(To)})
exten => _0X.,n,Set(Num_to=${Num_in:5:10})

着信した電話番号は Num_to に入っているため、
GotoIf() で条件分岐した後、それぞれに対応する内線番号を Dial() しています。

GotoIf() の書き方

syntax は以下の通りです。

GotoIf(condition?[label1][:label2])
GotoIf(condition?[[[context1,]extension1,]priority1]:[[[context2,]extension2,]priority2])

(途中)