ようこそゲストさん

無能日記

メッセージ欄

2010年5月の日記

一覧で表示する

asteriskでモーニングコール

はてブ 2010/05/23 18:13 R&D (sip)poti
同僚と焼肉食べてたときに、冗談で初音ミクでモーニングコールサービスとかやればとかいったけど、asteriskでモーニングコールができるようなのでいたずらしてみた

目標

朝9時に同僚に電話をかける
同僚には電話をかけることは知らせない
相手が電話にでると初音ミクの音楽を再生する
相手を???にさせる

準備

必要なものは以下のとおり
  • 1.インターネット環境
  • 2.050な電話番号
  • 3.asteriskを動かすサーバ (LINUX)
  • 4.asterisk server globalアドレスのdnsへの登録
  • 5.asterisk 1.6系
  • 6.mpg123
  • 7.DAHDI
  • 8.再生するmp3ファイル
1は当然ある。
2は別途契約必要。自分の場合はぷららフォン契約して電話番号だけもってる。
3は当然ある。
4,5,6,7,8を新たに用意すればOK。

インストール

mpg123 -> DAHDI -> asteriskの順でインストールすると楽。
CENTOSだと全部yumになかったので、wgetでもってきた。
  • mpg123
./configure
make
make install
  • DAHDI
DAHDIインストール
  • asterisk
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

今回は、以下の音楽を拝借。

【初音ミク】ネガポジサイクル【オリジナル】
選別ポイントは以下の通り
  • 初音ミクの音楽 (犯人が推測できるように)
  • イントロが無い(イントロが長いと状況が分からず切られる可能性がある)
  • 音がうるさすぎない(うるさすぎると電話の残念音質がさらに残念音質になる)
  • 自分の好みの曲

結果

messengerにて

h○l : お前か
○urachik○ : ちょw
: お前か

たぶん成功

今後の課題

  • mydnsを使うのではなく、自分のドメイン(potix)を使う
  • 音楽は長すぎるので、トークロイドネタのほうがよさげ