差分

移動先: 案内検索

Asterisk 20 サンプル設定ファイル 解説

4,038 バイト追加, 2024年7月25日 (木)
WIP
内線の処理は以上です。
==sub-whoami==
[sub-whoami]
exten => s,1,NoOp(WHOAMI)
exten => s,n,Set(MY_EXTEN=)
;自局のエンドポイントを求める
exten => s,n,Set(MY_ENDP=${CHANNEL(endpoint)})
;エンドポイントから内線番号を得る
exten => s,n,Gosub(sub-endpoint2ext,s,1(${MY_ENDP}))
;内線が当たってない場合にはそのまま復帰
exten => s,n,GotoIf($["${T_EXTEN}"=""]?ret)
exten => s,n,Set(MY_EXTEN=${T_EXTEN})
;CIDを内線番号に設定
exten => s,n,Set(CALLERID(num)=${MY_EXTEN})
exten => s,n,Set(CALLERID(name)=${MY_EXTEN})
exten => s,n(ret),Return
『自分の』情報を求めるサブルーチンです。内線を抽象化しているため、エンドポイント、つまり電話機等は自分の内線番号を『知りません』。このため内線番号を求めるためには、AsteriskのAstDBを調べて自分のエンドポイントに割り当てられている内線番号を調べる必要があります。<br>
サンプルの設定ファイルではsub-shoamiが呼び出されると、MY_EXTENに自分の内線番号がセットされるとともにCID類にも設定します。これにより「呼び出された」内線側には呼び出した内線の情報が通知されることになります。<br>
エンドポイントの名前自体はCHANNEL(endpoint)で求めることができますので、ここからAstDBを調べて割り当てられている内線番号を求めます。この処理を行っているのはsub-endpoint2extです。
==sub-endpoint2ext==
;
; エンドポイントから内線番号を求める
; ARG1:内線番号
; T_EXTEN:求めた内線番号
;
[sub-endpoint2ext]
exten => s,1,NoOp(エンドポイントから内線)
exten => s,n,Set(T_EXTEN=)
;DB中の要素数をセットする
exten => s,n,Set(KCOUNT=${DB_KEYCOUNT(MYPBX/EXT)})
;DB中のキーをカンマ列挙で取得
exten => s,n,Set(DKEYS=${DB_KEYS(MYPBX/EXT)})
;キー数がゼロなら終了
exten => s,n,GotoIf($["${KCONT}"="0"]?ret)
;DBエントリをループ処理
exten => s,n,While(${KCOUNT}>0)
;カウンタ位置の内線番号を取得
exten => s,n,Set(TMP_EXT=${CUT(DKEYS,\,,${KCOUNT})})
;内線番号を自局と比較する
exten => s,n,GotoIf($["${ARG1}"="${DB(MYPBX/EXT/${TMP_EXT})}"]?match)
;カウンタを-1する
exten => s,n,Set(KCOUNT=${DEC(KCOUNT)})
exten => s,n,EndWhile()
;ここまでループした場合は内線登録なし
exten => s,n,Goto(ret)
;マッチした場合には変数をセット
exten => s,n(match),Set(T_EXTEN=${TMP_EXT})
exten => s,n(ret),Return
エンドポイントから内線番号を求めるルーチンです。ループ処理でDB内で見つかるまで繰り返すため、最悪総ナメとなります。本来この方法はあまり良くはないのですが内線数がそれほど多くなく、かつ、マシンの性能が高ければあまり気になりません。なぜループしなければならないかというと、AstDBには以下のように内線番号と対応するエンドポイントが登録されます。
MYPBX/EXT 201 phone1
この場合、${DB(MYPBX/EXT/201)}の値はphone1となり、内線番号からエンドポイントを引くのには都合が良いのですが、逆にエンドポイントから内線番号を引くことはできません。ですのでループで回してphone1のあるエントリを探し出し、その内線を求めています。<br>
ループ処理しないで解決させる方法は、いわゆる『逆引き』を設けることなのですが、サンプル設定ファイルではそこまでやっていません。内線登録や削除の際に正引きだけ行えばできるようにしているからです。逆引きを設けた場合には内線登録や削除の場合には正逆2つのエントリを処理しなくてはいけません。
MYPBX/EREV phone1 201
このような形で逆引きエントリをつくれば処理は軽くなります。ご自身でチャレンジしてみてください。
=WIP=

案内メニュー

VoIp-Info.jp

HP Directplus -HP公式オンラインストア-