ようこそゲストさん

無能日記

メッセージ欄

分類 【R&D (sip)】 で検索

一覧で表示する

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)を使う
  • 音楽は長すぎるので、トークロイドネタのほうがよさげ

2007/04/21(土) asteriskが死んだ理由

はてブ 2007/04/21 12:57 R&D (sip)poti
em-oneでVPN経由でasteriskから電話かけるとasteriskが落ちてた理由

asteriskに
http://voip.gapj.net/index.php?%A5%CA%A5%AB%A5%E0%A5%E9
ここの1.2.9.1パッチをあてているのが原因だったよう。

@@ -10454,6 +10605,50 @@ のセクションで、
peer = find_peer(NULL, &p->recv, 1);
でpeerにNULLが帰ってきて
if (p->timer_se < peer->min_se) {
のところでセグメンテーションフォルトをおこしていたよう。
とりあえず、
if (peer && p->timer_se < peer->min_se) {
とかやって落ちなくさせている。

でもって、そもそもpeerがNULLになってしまう問題は設定ファイルにありました。
[sip.conf]
localnet=172.16.0.0/16
ローカルネットの設定にVPNネットワークが含まれてない。。。
[sip.conf]
localnet=172.16.0.0/16
localnet=10.0.0.0/8
こうすると解決

2007/04/09(月) asteriskを使ってみた!

はてブ 2007/04/09 18:06 R&D (sip)poti
IP電話に目覚めてみました。
そんなわけで、plalaからIP電話の電話番号だけゲット!

VoIPあだぷたとかそんなものはもってないけど、asteriskがあれば大丈夫!
電話機もないので、ソフトフォンでまかなってみました。

とりあえず、内線ができるようにしてみた後、内線用のSIPとは別に、
内線とplalaの電話番号を統合するためのasteriskを別途たててみました。

設定よくわかんなかったけど、なんとなくやると大体うまくきました(それでいいのか!)。
ただ、内線からの発呼を着信できない。。。何故か悩み中。。。

今度はSIPをskypeに!

コンフィグはsip.conf, extension.conf, rtp.confをいじっただけでした。
以下な感じ
  • 内線用
* sip.conf

[general]
context=default 
recordhistory=yes
realm=hogehoge
port=5060
bindaddr=0.0.0.0
srvlookup=yes
maxexpirey=3600
defaultexpirey=3600
notifymimetype=text/plain
videosupport=yes
disallow=all
allow=ulaw
allow=alaw
allow=gsm
allow=ilbc
musicclass=default
language=jp
relaxdtmf=yes
;rtptimeout=60
;rtpholdtimeout=300
;trustrpid = no 
;progressinband=no
;useragent=Asterisk PBX 
;nat=no 
;dtmfmode=rfc2833
dtmfmode=inband
;promiscredir = no  
regcontext=default
localnet=172.16.0.0/255.255.0.0
rtcachefriends=yes
domain=hogehoge

[010303]
type=friend
regexten=010303
username=010303
secret=fugafuga
;callerid=""
host=dynamic
canreinvite=no

[010304]
type=friend
regexten=010304
username=010304
secret=fugafuga
host=dynamic
canreinvite=no

* extension.conf

[general]
static=yes
writeprotect=no
priorityjumping=yes
autofallthrough=yes

[default]
; 010303
exten => 010303,1,Dial(SIP/010303,12)
exten => 010303,2,Congestion
exten => 010303,102,Busy

; 010304
exten => 010304,1,Dial(SIP/010304,12)
exten => 010304,2,Congestion
exten => 010304,102,Busy

  • 統合用
* sip.conf

[general]
context=default
;realm=xxxxxxxx
bindport=5060
bindaddr=0.0.0.0
srvlookup=yes
domain=barbar
;autodomain=yes         
;pedantic=yes
;tos=184
;tos=lowdelay
;maxexpiry=3600 
;defaultexpiry=3600
;notifymimetype=text/plain
;checkmwi=10
;vmexten=voicemail 
;videosupport=yes
;recordhistory=yes
disallow=all    
allow=ulaw
allow=alaw
allow=gsm
allow=ilbc
musicclass=default
;language=en
;relaxdtmf=yes
;rtptimeout=60
;rtpholdtimeout=300
;trustrpid = no
;sendrpid = yes 
;progressinband=never
useragent=Fletsphone/2.3 (VOIP_AD 3.00\; NTTEAST/NTTWEST)
;promiscredir = no
;usereqphone = no
dtmfmode = rfc2833
;compactheaders = yes   
sipdebug = yes
;subscribecontext = default
;notifyringing = yes
;alwaysauthreject = yes
;regcontext=sipregistrations
register => number@plala-domain:secret:id@plala-server/number
register => 010303@hogehoge:fugafuga:010303@hogehoge/010303
;registertimeout=20
;registerattempts=10
;callevents=no          
;externip = XXXXX
externhost = external-host-name
;externrefresh=10
localnet=172.16.0.0/16
;nat=no 
;rtcachefriends=yes
;rtupdate=yes
;rtautoclear=yes
;ignoreregexpire=yes

[plala-server]
type=friend
username=id
secret=secret
host=plala-server 
fromdomain=plala-domain
fromuser=number
canreinvite=no
dtmfmode=inband
context=incoming-call
insecure=very 
progressinband=no
disallow=all
allow=ulaw
session-expires=300
externhost=external-host-name
externrefresh=300
nat=yes

[epsilon.dcnet]
type=friend
username=010303
secret=pwext010303
host=hogehoge 
fromdomain=hogehoge
fromuser=010303
canreinvite=no
dtmfmode=inband
context=incoming-ext-call
;insecure=very 
;progressinband=no
disallow=all
allow=ulaw
allow=alaw
allow=gsm
allow=ilbc
session-expires=300
externrefresh=300
nat=no

[phone]
type=friend
secret=secret
username=phone
host=dynamic
context=outgoing-call
canreinvite=no

* rtp.conf
[general]
rtpstart=10000
rtpend=10009

* extension.conf

[general]
static=yes
writeprotect=yes
autofallthrough=yes
clearglobalvars=no
priorityjumping=no

[globals]
MYDIAL  => 05075XXXXXXXX
EXTDIAL => 010303
PHONE   => SIP/phone@phone
MAIL    => my@mail.addr

[incoming-call]
exten => ${MYDIAL},1,macro(phone,${CALLERID})

[incoming-ext-call]
exten => ${EXTDIAL},1,macro(phone,${CALLERID})

[outgoing-call]
exten => _0N0XXXXXXXX,1,macro(callout,${EXTEN})
exten => _0ZZXXXXXXX,1,macro(callout,${EXTEN})
exten => 010303,1,macro(ext-callout,010303)
exten => 010304,1,macro(ext-callout,010304)

[macro-phone]
exten => s,1,Dial(${PHONE},9)
exten => s,2,System(echo "${ARG1}" | mail -s CALLING ${MAIL})
exten => s,3,Dial(${PHONE})
exten => s,4,Hangup

[macro-callout]
exten => s,1,Dial(SIP/${ARG1}@plala-server)
exten => s,2,Hangup

[macro-ext-callout]
exten => s,1,Dial(SIP/${ARG1}@hogehoge, 12)
exten => s,2,Hangup