▼ asteriskでモーニングコール
同僚と焼肉食べてたときに、冗談で初音ミクでモーニングコールサービスとかやればとかいったけど、asteriskでモーニングコールができるようなのでいたずらしてみた
■ 準備
必要なものは以下のとおり- 1.インターネット環境
- 2.050な電話番号
- 3.asteriskを動かすサーバ (LINUX)
- 4.asterisk server globalアドレスのdnsへの登録
- 5.asterisk 1.6系
- 6.mpg123
- 7.DAHDI
- 8.再生するmp3ファイル
2は別途契約必要。自分の場合はぷららフォン契約して電話番号だけもってる。
3は当然ある。
4,5,6,7,8を新たに用意すればOK。
■ インストール
mpg123 -> DAHDI -> asteriskの順でインストールすると楽。CENTOSだと全部yumになかったので、wgetでもってきた。
- mpg123
make
make install
- DAHDI
- asterisk
■ 構成
今回のネットワーク構成は大体以下のとおり
------------------------
| plala phone SIP server |
-----------------------
|
| internet
-------------------------------------------
| |
| plala |asahi
----------- --------
| SEIL/Plus | NAT(pppoe0) | SEIL/X |
| (SMF) | -------
----------- |
| 172.16.50.0/24 |
------------------------------------------
| eth0 |
----------------- --------------
| asterisk server | | windows PC |
----------------- --------------
default -> asahi default -> asahi
asterisk serverがNATの内側にある。
plala phone sip serverからみてasterisk serverの名前が解決できる必要がある。
そのため、NATの外足(SEIL/Plusのpppoe0)をDNSに登録してやる必要があり。
今回は、plalaが動的なアドレスなので、dynamic dnsを使用。phone.mydns.jpとした。
通常sip port(5060)とrtpで使用するポート(15000-1600とした)をsnaptする必要がある。
SEILだと、nat proxy sip add port 5060 protocol tcpudpだけでいけた。
余計なはまりどころは、asterisk serverのデフォルトがasahi向いているので、
必要な通信をplalaに向けてやら無いといけない。
#vi /etc/sysconfig/network-scripts/route-eth0
219.113.8.0/21 via 172.16.50.254 dev eth0
219.113.24.0/23 via 172.16.50.254 dev eth0
218.40.158.48 via 172.16.50.254 dev eth0
windows PCからはsoft phoneを使うことにした。
■ 設定
正直asteriskの設定は項目が多すぎて把握できない。ひとまず、以下のようにした。
# cat /etc/asterisk/asterisk.conf
...snip...
[options]
verbose = 3
debug = 3
documentation_language = en_US
languageprefix=yes
...snip...
# cat /etc/asterisk/sip.conf
[general]
relaxdtmf=yes
echocacel=yes
echocancelwhenbridged=yes
jbforce = yes
allowoverlap=no
udpbindaddr=0.0.0.0
tcpenable=no
tcpbindaddr=0.0.0.0
srvlookup=yes
language=ja
useragent=Fletsphone/2.3 (VOIP_AD 3.00\; NTTEAST/NTTWEST)
register => 05075XXXXXX@ipphone.plala.or.jp:password:id@p5075XX.ipphone.plala.or.jp/05075XXXXXX
[p5075XX.ipphone.plala.or.jp]
type=friend
username=id
secret=password
host=p5075XX.ipphone.plala.or.jp
fromdomain=ipphone.plala.or.jp
fromuser=05075XXXXXX
canreinvite=no
dtmfmode=inband
context=plala-ctx
insecure=invite
progressinband=no
disallow=all
allow=ulaw
nat=yes
externhost=phone.mydns.jp
externrefresh=60
session-expires=300
session-minse=300
[100]
type=friend
username=100
secret=password
host=dynamic
canreinvite=no
dtmfmode=inband
context=plala-ctx
insecure=invite
progressinband=no
disallow=all
allow=ulaw
localnet=172.16.50.0/255.255.255.0
...snip...
# cat /etc/asterisk/rtp.conf
[general]
rtpstart=15000
rtpend=16000
# cat /etc/asterisk/extensions.conf
[general]
static=yes
writeprotect=no
clearglobalvars=no
[globals]
PLALA_NUMBER=05075XXXXXX
[default]
[plala-ctx]
exten => 05075XXXXXX,1,Dial(SIP/100)
exten => _0.,1,Set(CALLERID(num)=$PLALA_NUMBER)
exten => _0.,n,Set(CALLERID(name)=$PLALA_NUMBER)
exten => _0.,n,Dial(SIP/$EXTEN@p5075XX.ipphone.plala.or.jp)
exten => _1.,1,Set(CALLERID(num)=$PLALA_NUMBER)
exten => _1.,n,Set(CALLERID(name)=$PLALA_NUMBER)
exten => _1.,n,Dial(SIP/$EXTEN@p5075XX.ipphone.plala.or.jp)
exten => 9999,1,Set(CALLERID(num)=$PLALA_NUMBER)
exten => 9999,n,Set(CALLERID(name)=$PLALA_NUMBER)
exten => 9999,n,MP3Player(/etc/asterisk/CALL/call.mp3) -- ※1
exten => 9999,n,Hungup
※1の行がmp3を再生するところ。
これで、一通り設定完了。
■ モーニングコール設定
自動発信で、上記の999ダイアルプランを実行してやる必要がある。自動発信は特定のフォーマットのファイルを/var/spool/asterisk/outgoingにおいてやるとできる。
フォーマットは以下の通り。(0ZZXXXXXXXX がかける相手の電話番号)
# cat /etc/asterisk/CALL/call0ZZXXXXXXXX.txt
Channel: SIP/0ZZXXXXXXXXX@p5075XX.ipphone.plala.or.jp
MaxRetries: 4
RetryTime: 5
WaitTime: 15
Context: plala-ctx
Extension: 9999
以下のようにすると、自動発信される。
cp /etc/asterisk/CALL/call0ZZXXXXXXXX.txt /var/spool/asterisk/outgoing
基本的にはこの処理をcronに登録しておくとよい。
ただし、複数の人にコールする場合は、一人づつやるのが無難のようだ。
コールした相手に通話を握られるとその間、別の人に電話がかからずタイムアウトする場合があるようだ。
以下のようなスクリプトをcronに登録することにした。
# cat /root/tools/call.sh
#!/bin/sh
CALL_DIR=/etc/asterisk/CALL
SPOOL_DIR=/var/spool/asterisk/outgoing
MAX_RETRY=600
for file in `ls $CALL_DIR/call*.txt`
do
name=`basename $file`
cp $file $SPOOL_DIR
retry=$MAX_RETRY
while [ -f $SPOOL_DIR/$name ] && [ $retry -gt 0 ]
do
sleep 1
retry=`expr $retry - 1`
done
done
cron設定は以下の通り
# cat /etc/cron.d/call
0 9 * * sun root /root/tools/call.sh
■ 音楽
mp3を以下の場所に設置。/etc/asterisk/CALL/call.mp3
今回は、以下の音楽を拝借。
【初音ミク】ネガポジサイクル【オリジナル】
選別ポイントは以下の通り
- 初音ミクの音楽 (犯人が推測できるように)
- イントロが無い(イントロが長いと状況が分からず切られる可能性がある)
- 音がうるさすぎない(うるさすぎると電話の残念音質がさらに残念音質になる)
- 自分の好みの曲
■ 今後の課題
- mydnsを使うのではなく、自分のドメイン(potix)を使う
- 音楽は長すぎるので、トークロイドネタのほうがよさげ