それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

asterisk をインストールして初期設定&050plus を外線に使う

050plus がSIPサーバとして使えることがわかったので、前から試してみたいことを試すことにした

asterisk で、電話をルーティングする。

AsteriskはSIPやアナログ回線など各種音声回線をまとめて取り扱える。
まとめて取り扱えからasterisk=アスタリスク(*)ワイルドカードなんですよね。

とてもヤヤコシイ。

Asteriskはそれなりに、枯れているので使いやそうだと思ったら面倒。


ここが詳しい
http://www.st-asterisk.com/archives/53

初めの第一歩としてはダイアルプランまでうぃ上記サイトを見ながらやった。

アナログ回線は電気通信事業法とか資格とかあるから、勝手につないだらダメなのと、そういう縛りがあるから、ネットに情報が殆ど無いんですね。


今回は、asterisk を使ってみたので すが、make は面倒なので deiban のパッケージを使う。
しかも raspberry pi でやった


インストール

raspberry pi だけど、raspbian なので、通常のdeibanと何も変わらない。

sudo aptitude install asterisk 

設定ファイル

主に触る、設定ファイルは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

Asterisk の設定

準備ができたらAsteriskに050plusの番号を収容する設定します。

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している。

あとは、着発信をテストすればOK

ちゃんと繋がるときは、ちょっとした感動です。

内線⇛内線
外線⇛内線
内線⇛外線

の順番でチェックした。
(050-1)
(050)


着信時のログ

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.