Fusion回線 をAsteriskに収容する

Asteriskで内線電話環境構築したわけですが、実はここからが本当にやりたかったことで、Fusion IP-Phone Smart を Asterisk に収容して基本料無料の固定電話を実現させる予定です。

Fusionアカウントの設定

sip.conf の general セクションに Fusion の設定を追加します。

register => SIPアカウント:SIPアカウントパスワード@smart.0038.net

SIPアカウントの部分は、Fusionから提供されるSIPアカウント名(050を抜いた電話番号)になります。パスワードはFusionアカウントのパスワードではなく、Fusionから提供されるSIPアカウントのパスワードになります。

次に、新しいセクションを作成します。名前は任意ですが、ここではfusionと仮定します。

[fusion]
type=friend
username=SIPアカウント
fromuser=SIPアカウント
secret=SIPアカウントパスワード
host=smart.0038.net
fromdomain=smart.0038.net
context=fusion-in
insecure=port,invite
canreinvite=no
dtmfmode=rfc2833

SIPアカウントの情報を平文で保存しておくのは精神衛生上あまりよくないですね。

私の環境では、FirewallでSIPプロトコルの許可と、5060番にきた通信をAsteriskが動いているサーバへフォワーディングしてやる設定を追加する必要がありました。このままですと、SIPアカウントの情報が漏れると有料電話かけ放題になってしまいます。ところが、ファイアウォールで5060番を許可するアドレスを絞ってしまうと、音声通話できない&10秒ほどで通話が切れてしまうのでした。どうもFusionからの着信はIPが固定されていないようです。
ぐぬぬ。。。

insecure=port, invite
peerとの接続に関する設定のようです。 portを設定しておくと、どのポートからのアクセスでも許可するようになります。invite を設定しておくと着信時の認証が不要になるようです。

dtmfmode=rfc2833
いわゆるピポパの設定です。inband、rfc2833、info、auto、が設定できます。とりあえずrfc2833がデファクトスタンダードらしいのでこれにしていますが、動くかどうかはわかりません。今度郵便の不在票が届いた時に運送会社の自動再配達受付で試してみる予定です。

前回までの設定も含めた、sip.conf は以下のようになります。

[general]
context=default
port=5060
binaddr=0.0.0.0

disallow=all
allow=ulaw
allow=alaw
allow=gsm

register => SIPアカウント:パスワード@smart.0038.net

[01]
type=friend
defaultuser=01
username=01
secret=pass
canreinvite=no
host=dynamic

[02]
type=friend
defaultuser=02
username=02
secret=pass
canreinvite=no
host=dynamic

[03]
type=friend
defaultuser=03
username=03
secret=pass
canreinvite=no
host=dynamic

[fusion]
type=friend
username=SIPアカウント
fromuser=SIPアカウント
secret=パスワード
host=smart.0038.net
fromdomain=smart.0038.net
context=fusion-in
insecure=port,invite
canreinvite=no
dtmfmode=rfc2833

着信の設定

extensions.conf に着信の設定を追加します。この、着信時の定義を仮に fusion-in とします。

[fusion-in]
exten => SIPアカウント,1,Dial(SIP/01&SIP/02&SIP/03,60)
exten => SIPアカウント,2,Congestion

基本的には、内線の時と同じような設定しかしていません。fusionアカウントに着信があった場合は、内線電話の01~03を一斉に鳴動させます。60秒でとらない場合は切ります。Dialの引数に、SIP/番号&SIP/番号…と並べていけば一斉鳴動させることができます。たぶん正規表現も使えると思います。

ここまでで着信のテストをして、外線着信で一斉鳴動することと、外線で通話できることを確認しました。Fusion IP Phone Smart はクレジットカードの枚数分アカウントを作れるので、実験用にもう1つアカウントを作成しました。Fusion IP Phone 同士の通話は無料なので、1つを携帯用にすれば、家にVPNを張らなくても、家と携帯間の通話が無料になります。

発信の設定

extensions.conf に発信の設定を追加します。

exten => _0.,1,Dial(SIP/${EXTEN}@fusion

@以下は sip.conf で定義したセクション名です。
この設定では、0で始まる番号はfusionアカウントで発信するという設定になっています。ここの設定をいじることで、例えばfusionアカウントのみへの発信や、家族の携帯のみへの発信などに制限することができます。

このままの設定だと、アカウントとパスワードがわかっていまうと有料通話できてしまうので、せめてプレフィックスで外線発信が簡単にできないようにしようと思います。ということでさっきの設定は消して。

;exten => _0.,1,Dial(SIP/${EXTEN}@fusion
exten => _999.,1,Set(CALLERID(num)=電話番号)
exten => _999.,1,Set(CALLERID(name)=電話番号)
exten => _999.,n,Dial(SIP/${EXTEN:2}@fusion1)

電話番号は050も含めた電話番号を記述します。

ちょっとした気休めなのですが、こうすることで999をつけないと外線発信できないようになります。
${EXTEN:2}はプログラミングのスライスみたいな感じですね。最初の3桁の数字はプレフィックスですよーという意味になるっぽいです。0から数えるので3桁の場合は2に、4桁の場合は3になります。

というわけで、最終的に extension.conf は以下のようになりました。

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

[globals]
MYNUMBER=050xxxxxxxx ;電話番号はグローバル変数に格納してみた

[fusion-in]
exten => SIPアカウント,1,Dial(SIP/01&SIP/02&SIP/03,60)
exten => SIPアカウント,2,Congestion
exten => SIPアカウント,102,Busy ;話中の設定も足してみた。

[default]
exten => 01,1,Dial(SIP/01,60)
exten => 01,2,Congestion
exten => 01,102,Busy

exten => 02,1,Dial(SIP/02,60)
exten => 02,2,Congestion
exten => 02,102,Busy

exten => 03,1,Dial(SIP/03,60)
exten => 03,2,Congestion
exten => 03,102,Busy

;exten => _0.,1,Dial(SIP/${EXTEN}@fusion1)
exten => _999.,1,Set(CALLERID(num)=${MYNUMBER})
exten => _999.,1,Set(CALLERID(name)=${MYNUMBER})
exten => _999.,n,Dial(SIP/${EXTEN:2}@fusion)

スモールオフィスとかはもうこれで十分ですね。