050plus がSIPサーバとして使えることがわかったので、前から試してみたいことを試すことにした
asterisk で、電話をルーティングする。
AsteriskはSIPやアナログ回線など各種音声回線をまとめて取り扱える。
まとめて取り扱えからasterisk=アスタリスク(*)ワイルドカードなんですよね。
とてもヤヤコシイ。
Asteriskはそれなりに、枯れているので使いやそうだと思ったら面倒。
ここが詳しい
http://www.st-asterisk.com/archives/53
初めの第一歩としてはダイアルプランまでうぃ上記サイトを見ながらやった。
アナログ回線は電気通信事業法とか資格とかあるから、勝手につないだらダメなのと、そういう縛りがあるから、ネットに情報が殆ど無いんですね。
今回は、asterisk を使ってみたので すが、make は面倒なので deiban のパッケージを使う。
しかも raspberry pi でやった
設定ファイル
主に触る、設定ファイルは2つ⇛ sip.conf extension.conf
場所は /etc/asteriskにある。
まずは、デフォルトの初期設定を退避
cp /etc/asterisk/sip.conf /etc/asterisk/sip.conf.original cp /etc/asterisk/extension.conf /etc/asterisk/extensions.conf.original
長ったらしい初期設定は消しておいた
sudo rm /etc/asterisk/sip.conf sudo rm cp /etc/asterisk/extension.conf
ソフトフォンからつないで内線
まずまSIPクライアントから、Asteriskにつないで内線で遊んでみる。
ソフトフォンを子機登録するためにユーザーと番号を作る
sip.conf
[general] context=default port=5060 bindaddr=0.0.0.0 language=ja [201] type=friend defaultuser=201 secret=pass canreinvite=no host=dynamic [202] type=friend defaultuser=202 secret=pass canreinvite=no host=dynamic [203] type=friend defaultuser=203 secret=pass canreinvite=no host=dynamic
これは、以下のような意味だそうだ
内線番号 201 を ユーザー名 201 パス pass 内線番号 202 を ユーザー名 202 パス pass 内線番号 203 を ユーザー名 203 パス pass
内線を同じパスで3つそれぞれ作った。
でも、これだけでは、内線番号として通話できるわけでもない
ダイアルプランと呼ばれるものを書く必要がある。
ダイアルプランの作成
ここがAsteriskがなんでもできると言われる所以であるらしい。が、一方一番複雑でもある。
内線通話で遊んでみる
最初に作るダイアルプランは、シンプルに内線通話。
内線番号 201 にかかってきたら 通話 内線番号 202 にかかってきたら 通話
とかいて、201 ⇛ 202 に発信して実験する。
/etc/asterisk/extensions.conf
[default] exten => 201,1,Dial(SIP/201,30,r) exten => 201,2,Hangup() exten => 202,1,Dial(SIP/202,30,r) exten => 202,2,Hangup()
これで、通話ができるようになる。
設定したら再起動
sudo service asterisk restart
reload ではなぜか設定が反映されないので、ちゃんとrestart
debian パッケージ作者relaod定義を 消してないだけじゃないのかな。
内線子機のソフトフォンの設定
内線同士で通話するには2台必要なので設定した。
今回は、 OSX の Linphoneと、iPhoneアプリのZoiperを使った。
SIPサーバーには、Asteriskのインストールホスト
ユーザーには、内線番号
パスワードには、pass
設定したので、これだけでまず通話してみる。UDPで接続した。
登録したら発信する。
もしもし
ちゃんとコールされる瞬間はちょっと感動
次に、自動応答 HelloWorldを設定する。
ダイアルプランには色々とあるのだが、基本の自動音声応答でHelloWorldをする。
着信ダイアルプランに、次を追加。
先程番号だけつくって使ってなかった内線203番を使う。
/etc/asterisk/extensions.conf
[default] exten => 203,1,Answer() exten => 203,2,Playback(hello-world) exten => 203,3,Hangup()
これで、201の子機から203番にコールすると、Hello-Worldの音声が流れる。
別の音声に変えてみて色々やってみた
音声ファイルの場所
別のファイルを再生してみる
Debianパッケージの場合
音声ファイルは以下の場所にあります。
takuya@raspberrypi:~$ ls /usr/share/asterisk/sounds/ -l 合計 20 lrwxrwxrwx 1 root root 36 9月 3 07:55 custom -> ../../../local/share/asterisk/sounds lrwxrwxrwx 1 root root 36 9月 23 23:11 en -> /etc/alternatives/asterisk-prompt-en lrwxrwxrwx 1 root root 39 9月 23 23:11 en_US -> /etc/alternatives/asterisk-prompt-en-us drwxr-xr-x 8 root root 20480 9月 23 23:06 en_US_f_Allison lrwxrwxrwx 1 root root 31 9月 3 07:55 recordings -> /var/lib/asterisk/sounds/custom
音声は、GSMのみ。GSMはマイクロソフトがライセンスを保持しているので、フリーウェアでは音声変換が実装されていないので悲しいところ。Mp3を使うプラグインとかあるっぽい
自動応答のダイアルはオモチャになる。
Raspberry Piなので、本気でおもちゃになると思う。
電話をかけて、番号入力して・・・あれこれスクリプト動かせるので楽しそうだ。
自動応答メニューを作って遊べるじゃん。
- LEDチカチカ
- SSHをオン・オフ
- 本体再起動
- faxをメールに転送
- iptablesのオン・オフ
- 録画予約
- チケット争奪戦
電話をかけて、リモート・ポートを開くとか便利そう。
リモートから制御するのに、専用UIやアプリが不要になって楽ちんですね。
050番号でAsteriskを世界をつなぐ
リモートから操作しようと思ったら、電話番号が必要ですよね。
また、チケット争奪戦などの電話戦争に使うにも電話番号が必要ですよね。
050plus を外線に使う。
今回は050plusを外線に使います。
やること
090/070/080/06/03 など0始まりの番号をダイアルしたら、外線に繋げたい。
外線に利用するのはアナログではなく、050plus SIP回線
下準備
050plusのアカウント設定
050plus のログイン情報 ⇛前回を参照した050plus のログイン情報
TLS通信に必要なあれこれを準備
ここを参考にTLS対応にする。
mkdir /etc/asterisk/keys ./ast_tls_cert -C pbx.mycompany.com -O "My Super Company" -d /etc/asterisk/keys
ast_tls_cert は debian のapt に含まれななかったので、github から持ってきた⇛https://github.com/rillian/asterisk-opus/blob/master/contrib/scripts/ast_tls_cert:github/ast_tls_cert
sip.conf
[general] context=default port=5060 bindaddr=0.0.0.0 ; 050plus and tls maxexpirey=3600 defaultexpirey=3600 context=default tlsenable=yes tlsbindaddr=0.0.0.0 tlscertfile=/etc/asterisk/keys/asterisk.pem tlscafile=/etc/asterisk/keys/ca.crt tlscipher=ALL tlsclientmethod=tlsv1 tlsdontverifyserver=yes register => tls://fmcXXXX:***sipPwd***:<sipID>@60.37.58.170:5061/200 [050plus] type=friend secret=***sipPwd*** port=5061 defaultuser=<sipID> fromuser=<fmcXXXX> host=60.37.58.170 ;host=kar-f2fcp.050plus.com fromdomain=050plus.com context=default insecure=invite,port dtmfmode=inband canreinvite=no disallow=all allow=ulaw callgroup=1 transport=tls encryption=yes nat=yes [201] type=friend defaultuser=201 secret=pass canreinvite=no host=dynamic [202] type=friend defaultuser=202 secret=pass canreinvite=no host=dynamic
extension.conf
[globals] ;For 050plus MYNUMBER=050XXXX3121 [default] ; Ring phones 202 exten => 200,1,Dial(SIP/201&SIP/202) exten => 200,n,Hangup ;050plus exten => _99.,1,Set(CALLERID(num)=${MYNUMBER}) exten => _99.,n,Set(CALLERID(name)=${MYNUMBER}) exten => _99.,n,Dial(SIP/${EXTEN:2}@050plus,120,T) xten => 201,1,Dial(SIP/201,30,r) exten => 201,2,Hangup() exten => 202,1,Dial(SIP/202,30,r) exten => 202,2,Hangup()
設定ができたら再起動
service asterisk restart
reload はなくrestart 。
SIPサーバーにregist出来た確認します。
外部SIPサーバーに登録できたか調べるには、asterisk コマンドで。
sip show registry
登録結果
起動したら、設定が正しく出来たか確認する。
私の場合、以下のようだった。
takuya@raspberrypi:~$ sudo asterisk -vvvr [sudo] password for takuya: Asterisk 1.8.13.1~dfsg-3+deb7u1, Copyright (C) 1999 - 2012 Digium, Inc. and others. Created by Mark Spencer <markster@digium.com> Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details. This is free software, with components licensed under the GNU General Public License version 2 and other licenses; you are welcome to redistribute it under certain conditions. Type 'core show license' for details. ========================================================================= == Parsing '/etc/asterisk/asterisk.conf': == Found == Parsing '/etc/asterisk/extconfig.conf': == Found Connected to Asterisk 1.8.13.1~dfsg-3+deb7u1 currently running on raspberrypi (pid = 3388) Verbosity was 0 and is now 3 raspberrypi*CLI> sip show registry Host dnsmgr Username Refresh State Reg.Time 60.37.58.170:5061 N fmcXXXXXX 3585 Registered Tue, 24 Sep 2013 02:28:25 1 SIP registrations.
設定のポイント
発信設定
内線登録したSIPソフトフォンから、外線に行くときの設定がコレ
exten => _99.,1,Set(CALLERID(num)=${MYNUMBER}) exten => _99.,n,Set(CALLERID(name)=${MYNUMBER}) exten => _99.,n,Dial(SIP/${EXTEN:2}@050plus,120,T)
頭に 99-090-1234-5678 と99をつけた時に 99 を外して発信するようにした。
とくに99が不要なら
exten => _0.,1,Set(CALLERID(num)=${MYNUMBER}) exten => _0.,n,Set(CALLERID(name)=${MYNUMBER}) exten => _0.,n,Dial(SIP/${EXTEN}@050plus,120,T)
_0. は 0始まりの番号すべてを表す、ワイルドカード
着信設定
外部から着信したら、内線のSIPソフトフォンを一斉に鳴らす。
exten => 200,1,Dial(SIP/201&SIP/202) exten => 200,n,Hangup
これは、内線200番に着信し、200番に着信したら、内線201と内線202を両方鳴らす。
200番着信するのはsip.confで定義
register => tls://fmcXXXX:***sipPwd***:<sipID>@60.37.58.170:5061/200
200番に050plus をregisterしている。
着信時のログ
050の外線から、Asterisに着信した時のログ。
1 SIP registrations. == Using SIP RTP CoS mark 5 -- Executing [200@default:1] Dial("SIP/050plus-00000000", "SIP/201&SIP/202") in new stack == Using SIP RTP CoS mark 5 -- Called SIP/201 == Using SIP RTP CoS mark 5 -- Called SIP/202 -- SIP/202-00000002 is ringing -- SIP/201-00000001 is ringing == Spawn extension (default, 200, 1) exited non-zero on 'SIP/050plus-00000000'
発信時のログ
Asteriskの内線SIPフォンから、050 経由で、一般回線に発信した時のログ。
raspberrypi*CLI> == Using SIP RTP CoS mark 5 -- Executing [99090XXXXXX@default:1] Set("SIP/202-00000005", "CALLERID(num)=050XXXXXXX") in new stack -- Executing [99090XXXXXX@default:2] Set("SIP/202-00000005", "CALLERID(name)=050XXXXXXXX") in new stack -- Executing [99XXXXXXX929@default:3] Dial("SIP/202-00000005", "SIP/090XXXXXXXX@050plus,120,T") in new stack == Using SIP RTP CoS mark 5 -- Called SIP/09XXXXXx929@050plus -- SIP/050plus-00000006 is making progress passing it to SIP/202-00000005 == Spawn extension (default, 99090XXXXXXXX, 3) exited non-zero on 'SIP/202-00000005'
設定をミスった時のログ
chan_sip.c:22753 handle_request_invite: Call from 'XXXXX' (60.37.58.170:5061) to extension '200' rejected because extension not found in context 'default'.
このときは、外線から着信したけど、内線200番の呼び出し先が見つからない
chan_sip.c:22753 handle_request_invite: Call from 'XXXXXX' (60.37.58.170:5061) to extension 's' rejected because extension not found in context 'default'.
この時は、外線から着信したけど、内線の呼び出し先が見つからない
あと、nat = route 時のエラーは流れちゃって消えっちゃった。。。
備考
nat=route は 1.8 以降では使えない。最新版では以下のようになる。
nat = no ; Default. Use rport if the remote side says to use it. nat = force_rport ; Force rport to always be on. nat = yes ; Force rport to always be on and perform comedia RTP handling. nat = comedia ; Use rport if the remote side says to use it and perform comedia RTP handling.
参考資料
https://wiki.asterisk.org/wiki/display/AST/Secure+Calling+Tutorial
http://www.aconus.com/~oyaji/suse9.3/asterisk_suse9.3_4.htm
http://zakkuri.sakura.ne.jp/blog/2010/01/asterisk%E3%81%A7%E9%9F%B3%E5%A3%B0%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96/
http://shanghai.at.webry.info/201205/article_4.html
https://github.com/rillian/asterisk-opus/blob/master/contrib/scripts/ast_tls_cert
http://btmn.jp/2012/03/14/050plus-asterisk/
http://www.pc-links.com/blog/asterisk/raspi/