Raspberry Pi をSIPサーバ化して無料通話
Raspberry Pi にSIPサーバ「Asterisk」をインストールして、内線電話を構築してみる。
参照:Session Initiation Protocol - Wikipedia
目標は、スマートフォンを使って外に居ても、家の電話(スマートホン/タブレットを含む)と無料通話を行えることだ。
この構成では、スマートフォンのインターネット回線を使って、内線電話のように家の電話を呼べるので、パケホーダイに入っていれば、実質無料で通話し放題になる。
スマホ使うなら Line とか Skype でいいじゃない、と言われそうですが、この構成なら、家で使っている普通の電話機も内線電話仲間になるので、無料で通話できるというメリットがある。
Asteriskは高機能なPBXソフトなので、もし家の電話がSIP系(ひかり電話とか、050とか)なら、外線発信もできるように設定できるが、今回は設定しない。(家の電話がアナログ回線としておきます)
# もし、Asteriskで外線も収容するなら、不正アクセスに注意しましょう...。
まずは、Raspberry Pi を内線電話サーバにするため、asterisk をインストール。
途中で国番号を聞かれるので、日本であれば「81」と答える。
インストールが終わったら、「sip.conf」で内線電話の設定をする。
[general]と書かれた行があるので、その下に以下の3行を追加する。
今回は、インターネット回線越しに、外からスマートフォンで接続する予定なので、「externhost」にドメイン名、「localnet」にLAN側のIPアドレスを入力する。
参照:Raspberry Piを公開サーバ化(ドメイン取得)
ちなみに、固定グローバルIPアドレスを持っているなら「externhost」ではなく、「externip」と書いてIPアドレスを指定しても良い。
また「bindport」は書かなければ自動でデフォルトのポート番号(5060/UDP)になるが、適当に変えても良い。
# Yamaha系ルータの SIP-NAT 機能を使うなら 5060から変えちゃだめ。
また、同じ「sip.conf」のファイル末尾に、内線番号の設定を追加する。
とりあえず、4台分だけ内線番号を確保して、各々、31番、32番、33番、34番にした。
ちなみに「secret」はパスワードなので、適宜、複雑なものにする。
次は、互いに内線電話をかけることができるように「extensions.conf」を編集する。
[default]と書かれた行があるので、その下に以下の行を追加する。
ついでに「include => demo」と書かれた行をコメントにして無効にする。
この設定で、内線番号(30-39)をかけると、SIPクライアントが30秒間呼ばれるようになる。
また、呼ばれた内線番号が無効(クライアントなし)なら切断、話中ならBusyトーンが返る。
また、RTP(Real-time Transport Protocol)のポート番号も変更しておく。
これで、Asterisk側の基本設定は終了。再起動しておく。
次は、ルータの設定。
インターネット越しに接続できるように、「sip.conf」の「bindport」で指定したポート(UDP)と、「extensions.conf」の「rtpstart」「rtpend」で指定した範囲のポート(UDP)を開けておく。また、それらのポートへのアクセスを、Raspberry Pi に送るようにルータを設定する。
次はスマートホンの設定。Android 2.3以降ではSIPクライアント機能が搭載されているが、なぜか標準の機能では片通話(相手の声はAndroidで聞こえるが、Android側で話した声が相手に届かない)が起きた。
しかたないので、Android標準の機能はあきらめて、SIPクライアントソフト「3CXPhone Android」をインストールした。
このソフトは、パソコン版、iPhone版もあるので、それらの機器もSIPクライアントにできる。
設定したのは以下。
「ID」:内線番号(sip.conf の「username」)
「Password」:パスワード(sip.conf の「secret」)
「External PBX IP」:ドメイン名
「PBX port」:SIPポート番号(sip.conf の「bindport」)
また「Local PBX IP」にRaspberry Pi のIPアドレスを指定しておけば、自宅内でWifi経由で繋げることができる。
設定後、「On Hook」と表示されれば正常だ。
複数のスマートフォンで無料通話をしたい場合は、内線番号をずらして1台1台に設定を入れれば使うことができる。
自宅内のタブレットやパソコンでも、同じ設定をすれば内線電話として使える。
最後に、自宅の電話を「RT58i」で繋げる。
# 現行機種の「NVR500」でも同じ設定ができるはず。
上の画面の設定をした後、「VoIPの基本設定」の「VoIP機能」を"使用する"に変えるのを忘れずに。
もし「sip.conf」の bindport 設定で、SIPのポート番号を変更したのであれば、GUI画面から変更できない。
その場合は、詳細設定メニューから「コマンドの実行」を使ってポート番号を指定する。
# 先に「本製品の全設定(config)のレポート作成」で現在の設定内容を確認して、コピー&ペーストすると楽です。
例)
変更前:sip server 1 192.168.1.10 register udp sip:[email protected] 31 "hoge31"
変更後:sip server 1 192.168.1.10:5061 register udp sip:[email protected] 31 "hoge31"
これで、全ての設定は完了。sip.conf に設定した内線番号、31や32をお互いに呼んで通話できればOKだ。
スマートフォン(S51SE)では、低速回線契約の IIJmio 高速モバイル/D を使っているが、まぁまぁ正常に通話できた。
音質は綺麗とは言えないし遅延もあったが、ちゃんと会話できたので実用の範囲という印象だ。
参照:Session Initiation Protocol - Wikipedia
目標は、スマートフォンを使って外に居ても、家の電話(スマートホン/タブレットを含む)と無料通話を行えることだ。
この構成では、スマートフォンのインターネット回線を使って、内線電話のように家の電話を呼べるので、パケホーダイに入っていれば、実質無料で通話し放題になる。
スマホ使うなら Line とか Skype でいいじゃない、と言われそうですが、この構成なら、家で使っている普通の電話機も内線電話仲間になるので、無料で通話できるというメリットがある。
Asteriskは高機能なPBXソフトなので、もし家の電話がSIP系(ひかり電話とか、050とか)なら、外線発信もできるように設定できるが、今回は設定しない。(家の電話がアナログ回線としておきます)
# もし、Asteriskで外線も収容するなら、不正アクセスに注意しましょう...。
まずは、Raspberry Pi を内線電話サーバにするため、asterisk をインストール。
途中で国番号を聞かれるので、日本であれば「81」と答える。
pi@raspberrypi ~ $ sudo apt-get install asterisk
パッケージリストを読み込んでいます... 完了
(中略)
この操作後に追加で 35.5 MB のディスク容量が消費されます。
続行しますか [Y/n]? Y
(中略)
パッケージを事前設定しています ...
パッケージの設定
┌───────────────────────┤ libvpb0 を設定しています ├
│ これは電話交換システムが運用される地域に対する整数コードになります (例:
│ 61= オーストラリア、33= フランス)。Voicetronix の電話用ハードウェアが従
│ う必要がある、地域標準のデフォルト値を設定するのに使われます。
│
│ ITU-T 電話コード:
│
│ 81_______________________________________________________________________
│
│ <了解>
│
└───────────────────────────────────────
(中略)
Scanning PCI bus....
Failed to read hardware config: pcilib: Cannot open /proc/bus/pci
lspci: Cannot find any working access method.
asterisk-modules (1:1.8.13.1~dfsg-1) を設定しています ...
asterisk-core-sounds-en-gsm (1.4.22-1) を設定しています ...
asterisk-core-sounds-en (1.4.22-1) を設定しています ...
update-alternatives: /usr/share/asterisk/sounds/en (asterisk-prompt-en) を提供するために 自動モード で /usr/share/asterisk/sounds/en_US_f_Allison を使います
update-alternatives: /usr/share/asterisk/sounds/en_US (asterisk-prompt-en-us) を提供するために 自動モード で /usr/share/asterisk/sounds/en_US_f_Allison を使います
asterisk (1:1.8.13.1~dfsg-1) を設定しています ...
Adding system user for Asterisk
ユーザ `asterisk' をグループ `dialout' に追加しています...
ユーザ asterisk をグループ dialout に追加
完了。
ユーザ `asterisk' をグループ `audio' に追加しています...
ユーザ asterisk をグループ audio に追加
完了。
Starting Asterisk PBX: asterisk.
(中略)
インストールが終わったら、「sip.conf」で内線電話の設定をする。
[general]と書かれた行があるので、その下に以下の3行を追加する。
pi@raspberrypi ~ $ sudo vi /etc/asterisk/sip.conf
[general]
bindport=5060
externhost=www.rasp.tk
localnet=192.168.1.0/255.255.255.0
今回は、インターネット回線越しに、外からスマートフォンで接続する予定なので、「externhost」にドメイン名、「localnet」にLAN側のIPアドレスを入力する。
参照:Raspberry Piを公開サーバ化(ドメイン取得)
ちなみに、固定グローバルIPアドレスを持っているなら「externhost」ではなく、「externip」と書いてIPアドレスを指定しても良い。
また「bindport」は書かなければ自動でデフォルトのポート番号(5060/UDP)になるが、適当に変えても良い。
# Yamaha系ルータの SIP-NAT 機能を使うなら 5060から変えちゃだめ。
また、同じ「sip.conf」のファイル末尾に、内線番号の設定を追加する。
とりあえず、4台分だけ内線番号を確保して、各々、31番、32番、33番、34番にした。
ちなみに「secret」はパスワードなので、適宜、複雑なものにする。
pi@raspberrypi ~ $ sudo vi /etc/asterisk/sip.conf
[31]
type=friend
username=31
secret=hoge31
canreinvite=no
host=dynamic
[32]
type=friend
username=32
secret=hoge32
canreinvite=no
host=dynamic
[33]
type=friend
username=33
secret=hoge33
canreinvite=no
host=dynamic
[34]
type=friend
username=34
secret=hoge34
canreinvite=no
host=dynamic
次は、互いに内線電話をかけることができるように「extensions.conf」を編集する。
[default]と書かれた行があるので、その下に以下の行を追加する。
ついでに「include => demo」と書かれた行をコメントにして無効にする。
pi@raspberrypi ~ $ sudo vi /etc/asterisk/extensions.conf
[default]
;
; By default we include the demo. In a production system, you
; probably don't want to have the demo there.
;
;include => demo
exten => _3X,1,Dial(SIP/${EXTEN},30)
exten => _3X,2,Congestion
exten => _3X,102,Busy
この設定で、内線番号(30-39)をかけると、SIPクライアントが30秒間呼ばれるようになる。
また、呼ばれた内線番号が無効(クライアントなし)なら切断、話中ならBusyトーンが返る。
また、RTP(Real-time Transport Protocol)のポート番号も変更しておく。
pi@raspberrypi ~ $ sudo vi /etc/asterisk/rtp.conf
;
; RTP Configuration
;
[general]
;
; RTP start and RTP end configure start and end addresses
;
; Defaults are rtpstart=5000 and rtpend=31000
;
rtpstart=10000
rtpend=10010
これで、Asterisk側の基本設定は終了。再起動しておく。
pi@raspberrypi ~ $ sudo service asterisk restart
Stopping Asterisk PBX: asterisk.
Starting Asterisk PBX: asterisk.
次は、ルータの設定。
インターネット越しに接続できるように、「sip.conf」の「bindport」で指定したポート(UDP)と、「extensions.conf」の「rtpstart」「rtpend」で指定した範囲のポート(UDP)を開けておく。また、それらのポートへのアクセスを、Raspberry Pi に送るようにルータを設定する。
次はスマートホンの設定。Android 2.3以降ではSIPクライアント機能が搭載されているが、なぜか標準の機能では片通話(相手の声はAndroidで聞こえるが、Android側で話した声が相手に届かない)が起きた。
しかたないので、Android標準の機能はあきらめて、SIPクライアントソフト「3CXPhone Android」をインストールした。
このソフトは、パソコン版、iPhone版もあるので、それらの機器もSIPクライアントにできる。
設定したのは以下。
「ID」:内線番号(sip.conf の「username」)
「Password」:パスワード(sip.conf の「secret」)
「External PBX IP」:ドメイン名
「PBX port」:SIPポート番号(sip.conf の「bindport」)
また「Local PBX IP」にRaspberry Pi のIPアドレスを指定しておけば、自宅内でWifi経由で繋げることができる。
設定後、「On Hook」と表示されれば正常だ。
複数のスマートフォンで無料通話をしたい場合は、内線番号をずらして1台1台に設定を入れれば使うことができる。
自宅内のタブレットやパソコンでも、同じ設定をすれば内線電話として使える。
最後に、自宅の電話を「RT58i」で繋げる。
# 現行機種の「NVR500」でも同じ設定ができるはず。
上の画面の設定をした後、「VoIPの基本設定」の「VoIP機能」を"使用する"に変えるのを忘れずに。
もし「sip.conf」の bindport 設定で、SIPのポート番号を変更したのであれば、GUI画面から変更できない。
その場合は、詳細設定メニューから「コマンドの実行」を使ってポート番号を指定する。
# 先に「本製品の全設定(config)のレポート作成」で現在の設定内容を確認して、コピー&ペーストすると楽です。
例)
変更前:sip server 1 192.168.1.10 register udp sip:[email protected] 31 "hoge31"
変更後:sip server 1 192.168.1.10:5061 register udp sip:[email protected] 31 "hoge31"
これで、全ての設定は完了。sip.conf に設定した内線番号、31や32をお互いに呼んで通話できればOKだ。
スマートフォン(S51SE)では、低速回線契約の IIJmio 高速モバイル/D を使っているが、まぁまぁ正常に通話できた。
音質は綺麗とは言えないし遅延もあったが、ちゃんと会話できたので実用の範囲という印象だ。
【送料無料】Asterisk運用・開発ガイド... |
コメント
コメントの投稿