はじめに
楽天モバイル(Fusion)
SMARTalkの電話番号が2つあって、これを固定電話で利用したいと考えていた。
もちろん、SIPに対応した固定電話機を購入すれば、2回線を収容するものはそこまで
高くはない。
だが、使わなくなったYamaha RT58iというRJ11で電話機を接続できるルーターを
持っているので、これのSIPクライアント機能を使いたいと思っていた。
また、フレッツ光ネクストのひかり電話を使っているが、微妙に使い勝手の悪い位置に
固定電話機を設置しなくてはいけないのも気に入らなかった。
使わなくなったAndroidのスマートフォンでこれらをまとめて使うことができれば
便利になると考えた。
Androidには標準のSIPクライアント機能は存在しているし、サードパーティーの
ソフトフォンのアプリも数多くあるので、それを組み合わせれば
良いと考えて試してみた。
しかし、これはそれぞれ以下のような理由でうまく行かなかった。
- ひかり電話については、我が家のホームゲートウェイであるPR-500MI
(ファームウェアバージョン07.00.0010)では、
Androidスマートフォンの標準電話アプリのSIPクライアント機能でもZoiPerでも、
flets.comで推奨されているAGEphoneでも、着信が安定してできなかった。
- SMARTalkの公式クライアントは、1回線しか収容できない。
- SMARTalkは固定電話機にもAndroidスマートフォンと同時に着信して欲しかった。
と言うことで、NetBSDサーバーにAsterisk 16.10.0を導入して、そこに対して
Yamaha RT58iとAndroidスマートフォンのZoiPerを接続することで解決させた。
しかし、PR-500MIでの内線通話は安定して実現はできなかった。
これはソフトフォンの種類やAsteriskの導入の有無によらないので、
PR-500MIに問題があるのかもしれない。あまり使う機能ではないので気にしないことにする。
ウェブを検索してみると、Asteriskの標準であるchan_sip
ドライバー
では、ひかり電話のホームゲートウェイには接続できないらしい。
Asterisk 13以降で標準で提供されるpjsip
ドライバーであれば
問題なく接続できるらしい。
SMARTalkの方は、chan_sip
で接続できるようだ。
そこで、以下のような方針で構築することにした。
- ひかり電話のためのホームゲートウェイとの接続は
pjsip
を利用する
- SMARTalkとの接続は
chan_sip
を利用する
- Yamaha RT58iとZoiPerとの接続は
chan_sip
を利用する
それぞれ、なるべく最小限の設定ファイルにすることを目指したが、
冗長になった部分もあるかもしれない。
Asterisk 16.10.0は、以下のようにインストールした。
# cd /usr/pkgsrc/comms/asterisk16
# make install
ひかり電話接続用の設定
pjsip
の設定ファイルは、/usr/pkg/etc/asterisk/pjsip.conf
であるので、既存のファイルをバックアップして以下のように作成した。
ここで、10.XX.0.1
はホームゲートウェイのLAN側のIPアドレスであり、
ホームゲートウェイの内線3番を事前に有効化してある。その内線3番への接続パスワードが
PASSWORD
である。
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5070 ; 5060 portはchan_sipと競合する。
[hikari-denwa]
type = registration
transport = transport-udp
outbound_auth = hikari-trunk
server_uri = sip:10.XX.0.1
client_uri = sip:3@10.XX.0.1 ; 内線3番
retry_interval = 60
[hikari-trunk]
type = auth
auth_type = userpass
username = 0003 ; 内線3番
password = PASSWORD
[hikari-trunk]
type = aor
contact = sip:10.XX.0.1
[hikari-trunk]
type = endpoint
transport = transport-udp
context = default
disallow = all
allow = ulaw
outbound_auth = hikari-trunk
aors = hikari-trunk
direct_media = no
from_user = 3 ; 内線3番
from_domain = 10.XX.0.1
dtmf_mode = inband
[hikari-trunk]
type = identify
endpoint = hikari-trunk
match = 10.XX.0.1
SMARTalk 2回線接続用の設定
chan_sip
の設定ファイルは、
/usr/pkg/etc/asterisk/sip.conf
である。
既存のファイルはバックアップして、以下のように作成した。
ここで、5XXXXXXX
と5YYYYYYY
が
2回線分のユーザーIDであり、電話番号の050を除いた部分と一致する。
それぞれのパスワードがpassword1
とpassword2
である。
[general]
match_auth_username=yes ; 同じsmart.0038.netに複数のアカウントを持っているので。
; 着信のため
register => 5XXXXXXX:password1@fusion1/5XXXXXXX
register => 5YYYYYYY:password2@fusion2/5YYYYYYY
; 外線
[fusion1]
type=friend
username=5XXXXXXX
fromuser=5XXXXXXX
secret=password1
host=smart.0038.net
fromdomain=smart.0038.net
context=default
insecure=port,invite
canreinvite=no
dtmfmode=inband
qualify=yes
allow=!all,ilbc,g729,gsm,g723,ulaw,alaw
allowguest=no
host=dynamic
[fusion2]
type=friend
username=5YYYYYYY
fromuser=5YYYYYYY
secret=password2
host=smart.0038.net
fromdomain=smart.0038.net
context=default
insecure=port,invite
canreinvite=no
dtmfmode=inband
qualify=yes
allow=!all,ilbc,g729,gsm,g723,ulaw,alaw
allowguest=no
host=dynamic
これにはYamaha RT58iとZoiPer用の設定も追加していく。
内線電話機接続用の設定
内線電話機であるYamaha RT58iとZoiPerから接続を受けるために、
/usr/pkg/etc/asterisk/sip.conf
に以下のように追加した。
それぞれ、ユーザーIDはandroid
とrt58i
であり、
パスワードはそれぞれpassword3
とpassword4
である。
; 電話機との接続
[android] ; Androidスマートフォン
type=friend
username=android
secret=password3
context=default
canreinvite=no
host=dynamic
dtmfmode=rfc2833
qualify=no
[rt58i] ; Yamaha RT58i
type=friend
username=rt58i
secret=password4
context=default
canreinvite=no
host=dynamic
dtmfmode=rfc2833
qualify=no ; Yamaha RT58iから接続するのに必須。
発着信の設定
発着信の設定は、
/usr/pkg/etc/asterisk/extensions.conf
に設定する。
既存ファイルはバックアップして、新規に以下の内容で作成した。
[default]
; 着信
;; 内線
exten => 1290,1,Playback(demo-congrats) ; 動作チェック用の自動音声。内線で1290へ掛けるとお祝いのメッセージを聞ける。動作確認済み。
exten => 101,1,Dial(SIP/android,20,rt) ; 内線番号は設定しただけで動作確認していない。
exten => 102,1,Dial(SIP/rt58i,20,rt) ; 内線番号は設定しただけで動作確認していない。
;; 外線
exten => 5XXXXXXX,1,Dial(SIP/android&SIP/rt58i,20,rt) ; SMARTalkの2回線はYamaha RT58iとZoiPerに着信する、
exten => 5YYYYYYY,1,Dial(SIP/android&SIP/rt58i,20,rt)
exten => s,1,Dial(SIP/android) ; ひかり電話はZoiPerにのみ着信する (実際にはホームゲートウェイに直結された固定電話機にも着信する)。
; 発信
;; SMARTalk1の場合には9で発信する。
exten => _9.,1,Set(CALLERID(num)=${MYNUMBER})
exten => _9.,n,Set(CALLERID(name)=${MYNUMBER})
exten => _9.,n,Dial(SIP/${EXTEN:1}@fusion1,120,T) ; 最初に9をダイアルした場合に9を取って外線へ回す。
;; SMARTalk2の場合には8で発信する。
exten => _8.,1,Set(CALLERID(num)=${MYNUMBER})
exten => _8.,n,Set(CALLERID(name)=${MYNUMBER})
exten => _8.,n,Dial(SIP/${EXTEN:1}@fusion2,120,T) ; 最初に7をダイアルした場合に8を取って外線へ回す。
;; ひかり電話の場合には7で発信する。
exten => _7.,1,Set(CALLERID(num)=${MYNUMBER})
exten => _7.,n,Set(CALLERID(name)=${MYNUMBER})
exten => _7.,n,Dial(PJSIP/${EXTEN:1}@hikari-trunk) ; 最初に7をダイアルした場合に7を取って外線へ回す。
起動させ使用開始する
これで、Asteriskを以下のように起動すれば、それぞれ使えるようになる。
# cp /usr/pkg/share/examples/rc.d/asterisk /etc/rc.d
# echo asterisk=YES >> /etc/rc.conf
# /etc/rc.d/asterisk start
問題はめったにこれら3回線を利用する機会がないということだ。