前回 SIPクライアントが1台もレジストされていないとき(症状・原因編) を+αで解決できたときのメモです。
ダイヤルプランの追加・修正が必要なことが判明したので対策を考えてみた。
SIPクライアントが1台もいないときにスキップされるのだから、スキップされたことが検出されたときにも着信音がなるような方向で解決を目指してみた。
ついでにpush着信できるようにしてみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
; ring exten => s,n(waitanswer1),Ringing exten => s,n,Set(DIALCOUNT=1) ; loop head exten => s,n(waitanswer2),Wait(1) exten => s,n,Dial(SIP/${FLOOR_A_ALL}&${FLOOR_B_ALL},30,t) exten => s,n,GotoIf($["${DIALSTATUS}"!="CHANUNAVAIL"]?waitanswer3) exten => s,n,Set(DIALCOUNT=$[${DIALCOUNT}+1]) exten => s,n,GotoIf($[${DIALCOUNT}<30]?s,waitanswer2); ; answer by asterisk exten => s,n(waitanswer3),Answer() ; announce exten => s,n(recallannounce),Playback(recallannounce) |
2行目でasterisk側で呼び出し音を鳴らす
3行目でリトライのカウント値を初期化
5行目で1秒待機
6行目でSIPクライアントを呼び出し
→SIPクライアントが1台以上レジストされていればそのダイアルプランにとんで、ここのダイヤルプランは終了
7行目でDialステータスを見て使用不可以外のエラーであれば11行へ移動
8行目でリトライ回数インクリメント
9行目でリトライ回数が制限回数未満で5行へ移動
11行目でasterisk側で着信
13行目で自動応答メッセージを流す
以降hangup処理などなど。
動作として、とりあえず呼び出し音を鳴らしてSIPクライアントがあれば内線へDialして終わり。内線にDialできなければ最大30秒の間で1秒ごとに内線にDialして成功すればそこで終わり、最後までDial出来ないか、途中で使用不可以外のエラーがあれば自動応答する。
というダイヤルプランになっているかと思う。
発信元に呼び出し音をただ聞かせていてもいいが、せっかくなので呼び出し中にSIPクライアントが立ち上がれば着信できるようにループ処理で1秒ごとに内線をDialするようにしてみた。
push着信をするためにはだが
先のダイヤルプランでpush着信自体へは対応できていて、あとはpush通知を送ってあげればいい。
まずはスマホなどへpush通知するシェルをRinging前後でキックしてあげるようにしてあげる。
push通知を受け取ったらSIPクライアントを立ち上げたりしてasteriskとの接続状態を確保するようにする。
接続が確保された時点でSIPクライアントで着信可能になるはず。
push通知に対応してない回線でpush通知を受けたい場合や、専用アプリなしでpush通知を受けたい場合に使える。
実際に使用している組み合わせはこちら。
・asterisk
・curl(httpsでのpush送信のため)
・AGEphone
・Airgram(push通知受信アプリ、https経由でpush通知を送れる)