さて、いよいよ電話システムの中核となるPBXをインストールします。
PBXとしてセットアップするのはAsteriskです。
オープンソースのPBXとしては最も使われているソフトウエアなので、ネットを検索すれば多くの情報を得ることができます。
インストールは他のLinuxソフトウェアと同様にAPTリポジトリからダウンロード・インストールできます。
インストール後は、各コンフィギュレーションファイルに必要な定義を行います。
Asteriskのインストール
sudo apt-get install asterisk
Asteriskのコンフィギュレーション
ローカライズの指定を行います。
留守録(VoiceMail)で日本語のファイル(ディレクトリ)が使われるよう指定します。
ファイルパス:/etc/asterisk/asterisk.conf
設定内容:
[options]
languageprefix = yes
defaultlanguage = ja
親SIPサーバーや子機との通信パラメーターを定義します。
ファイルパス:/etc/asterisk/pjsip.conf
設定内容:
・ひかりモデムSIPサーバーとの接続定義:
[hikari-trans]192.168.1.10はRaspberryPiのひかりモデム側のIPアドレスに合わせてください。
type=transport
protocol=udp
bind=192.168.1.10:5060
[hikari-denwa]
type=registration
transport=hikari-trans
outbound_auth=hikari-trunk
server_uri=sip:192.168.1.1
client_uri=sip:3@192.168.1.1
retry_interval=60
[hikari-trunk]
type=auth
auth_type=userpass
password=<ひかりモデムに登録したパスワード>
username=0003
[hikari-trunk]
type=aor
contact=sip:192.168.1.1
[hikari-trunk]
type=endpoint
transport=my-transport
context=from-hikari
disallow=all
allow=ulaw
outbound_auth=hikari-trunk
aors=hikari-trunk
direct_media=no
from_user=3
from_domain=192.168.1.1
dtmf_mode=inband
[hikari-trunk]
type=identify
endpoint=hikari-trunk
match=192.168.1.1
3@192.168.1.1はひかり電話RV-230SEの設定で定義した内線番号@SIPサーバーに合わせてください。
0003はひかり電話RV-230SEの設定で定義したユーザーIDに合わせてください。
・子機共通のトランスポート定義:既存の定義のコメントアウトを外します。
[internal-trans]192.168.0.10はRaspberryPiのLAN側のIPアドレスに合わせてください。
type=transport
protocol=udp ;udp,tcp,tls,ws,wss
bind=192.168.0.10:5060
・子機の定義:transport以外のendpoint,auth,aorの3つを定義します。
- 接続する子機(スマホやIP電話機)毎に定義します。
- 下記は子機(1001)1台を定義しています。
[1001]1001は子機の内線番号に合わせてください。
type=endpoint
context=from-internal
disallow=all
allow=ulaw
transport=internal-trans
auth=1001
aors=1001
rtp_symmetric = yes
rewrite_contact = yes
direct_media = no
fax_detect=yes
[1001]
type=auth
auth_type=userpass
password=<子機接続認証用の任意のパスワード>
username=1001
[1001]
type=aor
max_contacts=1
remove_existing=yes
発信・着信時の動作を定義します。
ファイルパス:/etc/asterisk/extensions.conf
設定内容:
・定数の定義
[globals]5000は留守電の内線番号で、後述「留守電の定義」の内容に合わせてください。
NTTNUMBER=<自局電話番号>
SPEAKINGCLOCK=3117
ECHOTEST=3333
VOICEMAILMENU=5000
3117は時刻、3333はエコーテストの任意の内線番号を設定してください。
・ひかり電話(外線)からの着信
- 全ての子機を一斉に20秒間呼び出します。
- 何れの子機も受話しない場合、留守電を起動します。
- FAXを検出した場合、これを受信します。
; Receive from hikari1001と1002は子機名で、実際の構成に合わせてください。前述”子機の定義”のセクション名に対応します。
[from-hikari]
exten => s,1,Dial(PJSIP/1001&PJSIP/1002,20,Tt)
same => n,Answer()
same => n,Wait(1)
same => n,Voicemail(5000)
same => n,Hangup
; Receive fax data
exten => fax,1,Dial(IAX2/iaxmodem)
same => n,Hangup
iaxmodemは後述"FAXサーバー/IAXmodemとの通信(iax)の定義"のセクション名に対応します。
・内線から発信(内戦、外線、その他機能)
- 要求先に応じた子機を呼び出します。
- 国際電話は無視します。
- 0から始まる番号は外線に対して呼び出します。
- その他の機能(時刻読上げ、エコーテスト、留守電操作)に対応する番号については、これを行います。
; Receive from internal5000は留守電の内線番号で、後述「留守電の定義」の内容に合わせてください。
[from-internal]
exten => 1001,1,Dial(PJSIP/1001,,Tt)
same => n,Hangup
exten => 1002,1,Dial(PJSIP/1002,,Tt)
same => n,Hangup
; Disable international call
exten => _001,1,Playback(vm-goodbye)
same => n,Hangup
; to outer
exten => _0.,1,Set(CALLERID(num)=${NTTNUMBER})
same => n,Set(CALLERID(name)=${NTTNUMBER})
same => n,Dial(PJSIP/${EXTEN}@hikari-trunk)
; Speaking Clock
exten => ${SPEAKINGCLOCK},1,Answer()
same => n,Wait(1)
same => n,Set(FutureTime=$[${EPOCH} + 5])
same => n,SayUnixTime(${FutureTime},Japan,bdAPIM)
same => n,Playback(jp-desu)
same => n,playback(beep)
same => n,Hangup
; Echo Test
exten => ${ECHOTEST},1,Answer()
same => n,Wait(1)
same => n,Playback(demo-echotest)
same => n,Playback(beep)
same => n,Echo
same => n,Playback(demo-echodone)
same => n,Playback(vm-goodbye)
; VoiceMail Menu
exten => ${VOICEMAILMENU},1,Answer()
same => n,Wait(1)
same => n,VoicemailMain(5000,s)
same => n,Hangup
ここでは子機は1001と1002ついて定義していますが、実際の運用に合わせてください。
・FAX送信
- 国際電話は無視します。
- 0から始まる番号は外線に対して呼び出します。
[fax-out]
; Disable international call
exten => _001,1,Playback(vm-goodbye)
same => n,Hangup
exten => _0.,1,Set(CALLERID(num)=${NTTNUMBER})
same => n,Set(CALLERID(name)=${NTTNUMBER})
same => n,Dial(PJSIP/${EXTEN}@hikari-trunk,300,T)
same => n,Hangup
ファイルパス:features.conf
設定内容:
- 通話中に"*1"ボタンを押すと、直後に指定した内線にブラインド(転送先と会話なしに)転送します。
- 通話中に"#"ボタンを押すと、直後に指定した内線に仲介転送します。
[featuremap]
blindxfer => *1 ; direct transfer
atxfer => # ; transfer
ファイルパス:/etc/asterisk/iax.conf
定義内容:
・一般定義
[general]"maxregexpire"はソフトウェアモデムのセットアップのIAXmodemのコンフィギュレーション"refresh"に合わせてください。
bindport=4569
iaxcompat=yes
language=jp
bandwidth=medium
disallow=all
allow=ulaw
allow=alaw
allow=slinear
allow=gsm
jitterbuffer=no
maxregexpire=300
autokill=yes
・FAX用ソフトウェアモデム(IAXmodem)との通信の定義
[iaxmodem]iaxmodemはIAXmodemの認証用ユーザーIDです。secretと同様にソフトウェアモデムのセットアップIAXmodemのコンフィギュレーションに合わせてください。
type=friend
username=iaxmodem
secret=iaxmodemの認証パスワード
host=dynamic
disallow=all
allow=ulaw
allow=alaw
;allow=slinear
allow=gsm
requirecalltoken=no
context=fax-out
使用しない機能のモジュールをロードしないように定義します。
これをしないと、廃止されたモジュールをロードしようとしたり、使用しないプロトコルを使おうとしたりでログにエラーが出力されます。
ファイルパス:/etc/asterisk/modules.conf
設定内容:
下記定義を追加します。
[modules]
・・・
noload => res_config_ldap.so
noload => chan_sip.so
noload => chan_mgcp.so
noload => res_monitor.so
noload => res_adsi.so
noload => app_adsiprog.so
noload => app_url.so
noload => app_nbscat.so
noload => app_getcpeid.so
noload => app_macro.so
noload => app_ices.so
noload => app_image.so
noload => res_pjsip_publish_asterisk.so
noload => chan_skinny.so
noload => cel_sqlite3_custom.so
noload => cdr_sqlite3_custom.so
noload => cel_tds.so
noload => cdr_pgsql.so
noload => cdr_radius.so
noload => cel_radius.so
noload => cdr_tds.so
noload => chan_unistim.so
noload => pbx_dundi.so
noload => res_hep_rtcp.so
noload => res_hep_pjsip.so
留守電(VoiceMail)の動作を指定します。
ファイルパス:/etc/asterisk/voicemail.conf
設定内容:
下記定義を追加します。
[general]5000は留守電に付ける任意の内線番号で、ダイヤルプランの定義で指定します。
format=wav49
attach=yes
maxmsg=100
maxsecs=120
maxgreet=60
skipms=3000
maxsilence=10
silencethreshold=128
maxlogons=3
charset=UTF-8
emailsubject=[PBX]: 留守電に新着メッセージが入りました。--- ${VM_NAME}/${VM_MAILBOX} ---
emailbody=自宅の留守番電話(${VM_NAME})からのお知らせです。:\n\n\t新しいメッセージが入りました。\n\t\t着信日時:${VM_DATE}\n\t\t録音時間:${VM_DUR}\n\t\t発信元:${VM_CALLERID}\n\n\tメールボックス(内線:${VM_MAILBOX})には${VM_MSGNUM}件のメッセージがあります。\n\t--- ${VM_NAME}/${VM_MAILBOX} ---
${VM_MSGNUM})\nin mailbox ${VM_MAILBOX} from ${VM_CALLERID}, on ${VM_DATE},\n${IF($["${VM_CIDNUM}" = "${ORIG_VM_CIDNUM}"]?so:(originally sent by ${ORIG_VM_CALLERID} on ${ORIG_VM_DATE})\nso)} you might want to check it when you get a chance. Thanks!\n\n\t\t\t\t--Asterisk\n
emaildateformat=%Y/%m/%d %r
pagerdateformat=%A, %B %d, %Y at %r
mailcmd=/usr/sbin/sendmail -t
sendvoicemail=yes ; Allow the user to compose and send a voicemail while inside
[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
central=America/Chicago|'vm-received' Q 'digits/at' IMp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM
japan=Japan|Q PHM 'jp-ni' 'vm-received'
[default]
5000 => 1234,Rusuden,<通知先メールアドレス>,,attach=yes|tz=japan|locale=ja_JP.UTF-8
emailsubject、emailbodyは通知メールの件名や本文を自由に定義します。
日本語音声のインストール
留守電の日本語音声メッセージは、Asteriskのインストールに含まれていません。
決められたファイル名、フォーマットであれば、自身で用意して置き換えることが可能です。
asteriskのサイトには日本語のファイルがアップされていますので、今回はこれを使用します。
サイトアドレス:http://downloads.asterisk.org/pub/telephony/sounds/
ファイル名:asterisk-core-sounds-ja-gsm-current.tar.gz
配置先:/usr/share/asterisk/sounds/にjaディレクトリを作成して、解凍したすべてのファイルを配置
フォルダ名:jaは前述「言語・ロケールの定義」で指定した値に対応します。
cd usr/share/asterisk/sounds
sudo mkdir ja
cd ja
sudo wget http://downloads.asterisk.org/pub/telephony/sounds/asterisk-core-sounds-ja-gsm-current.tar.gz
sudo tar xvzf asterisk-core-sounds-ja-gsm-current.tar.gz
Asteriskの起動(再起動)
sudo service asterisk restart
Asteriskの起動の確認
sudo service asterisk statusactive (running)になっていれば、無事起動しています。
Asteriskの自動起動登録
sudo systemctl enable asterisk
SIPクライアント(子機)のセットアップ
PBXのセットアップが終わると、後はSIPクライアントをセットアップすれば、これを使って通話ができます。私は、Androidスマートホンと固定電話タイプのVoIP機器を繋ぎました。
当初はスマートホンだけでもいいかなと思っていましたが、AndroidOSがディープスリープするようになって、その間はアプリも完全に無反応になり、着信できない問題が発生しました。
アプリの設定で、ディープスリープを抑制することもできますが、バッテリーの持ちと引き換えになってしまいます。
外で自宅の電話を受ける必要性もあまりないので、スマホでの着信の確実性をあきらめ、自宅に固定電話タイプの機器を設置するのが最善と判断しました。
無料で使えるSIPクライアントアプリはいくつかあります。わたしはMIZUDROIDを使いました。
他のアプリでも同様に設定できると思います。
・ログイン情報を設定します。
192.168.0.10はRaspberryPiのLAN側のIPアドレスに合わせてください。
1002とPasswordは子機のusername, passwordに合わせてください。
・アプリの活動頻度を設定します。
項目を設定すると、それに合わせた複数の項目が自動的に設定されます。
私は通常、"Auto-adapt"を設定していますが、これだとディープスリープを抑制できないので、着信を取りこぼすことがあります。
必用に応じて、"Always Runninng"に切り替えています。着信の取りこぼしはなくなりますが、バッテリーは消費します。
わたしはPanasonicのKX-123Nを使いました。
他の機器も同様に設定できると思います。
webサーバーを有効([設定]モードで#534をキーイン)にして、PC等のブラウザーから接続(KX-123NのIPアドレス)します。
192.168.0.10はRaspberryPiのLAN側のIPアドレスに合わせてください。
1001とパスワードは子機のユーザ名、パスワードに合わせてください。