2016年2月9日火曜日

余話 asterisk11 超手抜き 回線使用確認 pre-dial-handler と hangup-handler

もう随分前のことだけど、
回線が使用中なのか、相手が話中なのか 
判断する方法がわからなくて無理やりなんとかした方法。

当たり前だけど、dialして戻ってきたstatusで確認すればいいのに
なんでこんなことしたんだか・・・

何かに使えそうなのでめもっとく。

方法


電話をかけたら、DBにデータを書いて、hungup したら消す
で、電話をかける前にそれを見ればいいじゃん?! 
という超単純な方法。
pre-dial-handler と hangup-handler を使う。

[hogehoge]
exten => start,1,Set(MYNUMBER=${ARG1})
same  =>       n,Dial(hogehoge,120,Tb(pre-dial-handler,s,1(${MYNUMBER})))

[subReciver]
exten => start,1,Set(MYNUMBER=${ARG1})
same  =>       n,Dial(SIP/21,TB(pre-dial-handler,s,1(${MYNUMBER})))

[pre-dial-handler]
exten => s,1,Verbose(0,Entering contex ${ARG1} ${CONTEXT} in channel ${CHANNEL} with EXTEN and CID set to ${EXTEN} and ${CALLERID(num)})
same  => n,Set(DB(${ARG1}/use)=1)
same  => n, Set(CHANNEL(hangup_handler_push)=hangup-handler,s,1(${ARG1}))

[hangup-handler]
exten => s,1,Verbose(0,Entering context ${ARG1} ${CONTEXT} in channel ${CHANNEL} with EXTEN and CID set to ${EXTEN} and ${CALLERID(num)})
same  => n,Set(DB(${ARG1}/use)=0)
same => n,NoOp(${DB_DELETE(${ARG1}/use)})
same => n,Return()  

一部抜粋しただけなのでこのままじゃ使えないです。

subReciverで着信するとまずBオプションがあるので
pre-dial-handlerのs、1から引数${MYNUMBER})で実行

DBコマンドでデータベースに${MYNUMBER}/use に1を書きます。


次に切断時に実行するコマンドをCHANNEL(hangup_handler_push)で設定します。


ここまで終わると SIP/21にdialします。


hungupするとhangup-handler,s,1(${ARG1}))を実行します。

ARG1はMYNUMBERですから
一応0にしてDB_DELETEで消します。
余計なことせず一発で消せばいいのに。。

かける側と受ける側でオプションがb と B 違うので注意が必要です。


やっつけ感が半端ないけど一応使えたので気にしないことにしました。
peerでBusyかInuseか判別つかねーよ っていう場合にどうぞ

もっと賢い方法もありそうだけど、問題ないみたいだしいいかっ




0 件のコメント:

コメントを投稿