なるだけ、自分の携帯から発信したくない…自宅の家電話から発信したい…ということで、ちょっと以下のような「Asteriskによる無課金コールバックシステム」を作ってみました。
条件として、以下のような環境が必要です。
・050番号 ・NTTひかり電話
または、
・050番号その1 ・050番号その2
といった環境です。(ようは、外部に発信できるSIP registerが2つあれば、ということです。)
以下の説明は、050番号その1とその2の方法で書いてみます。
通話のながれ(1)携帯→050番号その1に電話→ビジーで通話が切れる
(2)050番号その1から携帯に着信→応答すると、IVRメニューに接続される
(3)IVRからAsterisk内にある内線電話を呼んだり、050番号その2を経由して外部に電話をする
{extensions.conf}[fromiptel1]
exten => ${IPTEL1},1,System(echo "${CALLERIDNUM}"|perl /var/bin/ipout.pl& )
exten => ${IPTEL1},2,busyこのエクステンションで(1)の動作をします。ようは、かかってきた番号だけをスクリプトに渡し、あとは着信せずビジーにします。こうすることで課金が発生しません。
[callbackmenu]
exten => s,1,SetVar(CNT=1)
exten => s,2,Ringing
exten => s,3,Wait,1
exten => s,4,Answer
exten => s,5,Wait,1
exten => s,6,Background(vm-enter-num-to-call)
exten => s,7,WaitExten(10)
exten => s,8,GotoIf($[${CNT} >= 3]?11:9)
exten => s,9,SetVar(CNT=$[${CNT} + 1])
exten => s,10,Goto(s,6)
exten => s,11,playback(tt-monkeysintro)
exten => s,12,Hangup
exten => s,13,Congestioninclude => ipout2
include => innerexten => i,1,Wait(1)
exten => i,2,GotoIf($[${CNT} >= 3]?6:3)
exten => i,3,SetVar(CNT=$[${CNT} + 1])
exten => i,4,Playback(pbx-invalid)
exten => i,5,Goto(s,7)
exten => i,6,playback(tt-monkeysintro)
exten => i,7.Hangup
exten => i,8,Congestionここまでで(2)のIVRを行います。
[ipout2]
exten => _0.,1,SetCallerId,050xxxx1234
exten => _0.,2,Dial(SIP/${EXTEN}@iptel2,60,r)
exten => _0.,3,Congestionここで(3)の動作となり、050番号その2で発信します。
自動発信について、Asteriskは、 /var/spool/asterisk/outgoing/ 内に以下のようなフォーマットのテキストを入れることで、自動発信を行います。
#
Channel: SIP/200
Callerid: 100
MaxRetries: 1
RetryTime: 60
WaitTime: 30
Set: LANGUAGE()=jp
Context: default
Extension: 201
Priority: 1
この内容で、Asteriskから内線200を呼び、extensionsのdefault→201,1を実行します。
(CallerIDが100にしてあるので、内線200には100から電話がきた、ということになります。)
そこで、今回の「かかってきた番号に対して、コールバックする」という仕組みを考えた場合、以下のような単純なスクリプトが出来ると思います。(ベタなPerlで作成しました…。)
{/var/bin/ipout.pl}#!/usr/local/bin/perl
#コールバックを受け付ける携帯のセット。複数ある場合は|で区切る。
$callphone = '080ABCD1234|090ABCD1234|0901234ABCD';
$time = time;#asterisk setting
$file = '/var/spool/asterisk/outgoing/ipcall.' . $time;
$callno =;
$callerid = '050xxxx1234'; #IP電話その2の番号
$retry = '1';
$rtime = '10';
$wtime = '20';
$context = 'callbackmenu';
$ext = 's';
$pr = '1';#callno check.
if($callno !~ /^[0-9]+$/){exit 1;} #電話番号に数字以外のものがあれば終了
if($callno !~ /$callphone/ ){exit 1;} #コールバックを受け付ける電話番号以外なら終了#Time Wait...
sleep 10;#File Write.
open(OUTFILE, ">$file");print OUTFILE '#' . "\n";
print OUTFILE "Channel: SIP/iptel2/$callno\n";
print OUTFILE "Callerid: $callerid\n";
print OUTFILE "MaxRetries: $retry\n";
print OUTFILE "RetryTime: $rtime\n";
print OUTFILE "WaitTime: $wtime\n";
print OUTFILE "Set: LANGUAGE()=jp\n";
print OUTFILE "Context: $context\n";
print OUTFILE "Extension: $ext\n";
print OUTFILE "Priority: $pr\n";close(OUTFILE);
一応イタズラ防止のため、$callphone にセットされていない電話番号にはコールバックしない、等の安全措置を入れてあります。
いろいろと遊べるかもしれませんね…。

>ひろぽんさん
頑張ってください。応援しております。
早速ありがとうございます。
ヒントをいただきとりあえずいろいろいじってみたいと思います。
通常のアスタリスクのインストールもしたことがない中でいきなりというのに少し無理があるのかもしれません。
ひとつずつステップをあがっていきたいと思います。早速、使っていないパソコンにubuntuを入れてみました。
なんかゴールが遠そうに見えますけどがんばってみます。
行き詰ったら、またコメントにレスキュー依頼のコメをさせていただくかもしれません。
ありがとうございます。 ひろぽん
>ひろぽんさん
はじめまして。
win32版のAsteriskでこの機能が使用できるかどうかは、当方の環境で実施したこともございませんし、あなたのために設定をお知らせする気もございません。
しかしながら、この機能が使用できるかどうかは、あなたがインストールされたAsteriskのフォルダ構成を確認してみればいいかと思いますよ。
asterisk.conf の中に astspooldir という項があれば、そのフォルダ直下にoutgoingフォルダとかを作ってみて、ファイルを投下してみるといいんじゃないですか?
と、うまく釣られる私w
これをやってみたいとおもって、何度かみさせていただいています。
アスタリスクwin32を入れましたが、これでもできるんですか? コールバックだけ使えれば当面いいので。
使っていないパソコンで、リナックスからとも思いましたけど、いずれもとっつきが悪いもので。
できれば、win32でどう設定したらいいかもお知らせいただけると助かります。
よろしく。