Fusion SMARTalk 2回線とひかり電話をpkgsrc/comms/asterisk16で収容してみる

はじめに

楽天モバイル(Fusion) SMARTalkの電話番号が2つあって、これを固定電話で利用したいと考えていた。 もちろん、SIPに対応した固定電話機を購入すれば、2回線を収容するものはそこまで 高くはない。 だが、使わなくなったYamaha RT58iというRJ11で電話機を接続できるルーターを 持っているので、これのSIPクライアント機能を使いたいと思っていた。

また、フレッツ光ネクストのひかり電話を使っているが、微妙に使い勝手の悪い位置に 固定電話機を設置しなくてはいけないのも気に入らなかった。

使わなくなったAndroidのスマートフォンでこれらをまとめて使うことができれば 便利になると考えた。 Androidには標準のSIPクライアント機能は存在しているし、サードパーティーの ソフトフォンのアプリも数多くあるので、それを組み合わせれば 良いと考えて試してみた。 しかし、これはそれぞれ以下のような理由でうまく行かなかった。

  1. ひかり電話については、我が家のホームゲートウェイであるPR-500MI (ファームウェアバージョン07.00.0010)では、 Androidスマートフォンの標準電話アプリのSIPクライアント機能でもZoiPerでも、 flets.comで推奨されているAGEphoneでも、着信が安定してできなかった。
  2. SMARTalkの公式クライアントは、1回線しか収容できない。
  3. 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である。 既存のファイルはバックアップして、以下のように作成した。 ここで、5XXXXXXX5YYYYYYYが 2回線分のユーザーIDであり、電話番号の050を除いた部分と一致する。 それぞれのパスワードがpassword1password2である。

[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はandroidrt58iであり、 パスワードはそれぞれpassword3password4である。

; 電話機との接続
[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回線を利用する機会がないということだ。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

plgarc/wip/llama.cppでpkgsrcのBLASサポートを探る

この記事は、 NetBSD Advent Calendar 2024 の13日目の記事です。 llama.cppを使ってみる 以前に、 NetBSD/amd64でllama.cppを使ってみる という記事で llama.cpp を使ってみていました。 あれか...