1.概要
- コロナ禍を経てリモートワークに向けてのハードやソフトが発展した。さらに、企業ではTeams、個人ではLineを使ったりする。さらには、クラウド上のsipサーバーのサービスもある。となると、敢えて自宅やSOHOでAsteriskでPBXを立てる理由も薄れてきた。さらにはSIPポート(5060)を巡回するポートスキャナが居たりするので無断海外電話される危険がある。が、従来通りAsteriskサーバを立ててみる。
- これまではapt-get install asteriskで導入できたが、Packageが見つからず、asterisk.orgよりソースコードをダウンロードしてコンパイルした。
- 当初sipクライアントの設定としたが、外線発信と内線通話ができるものの、外線の着信ができない症状に悩まされたが、zoiper側をiax2に変更することで解決した。
- confファイルは、extensions.conf, iax.conf, pjsip.conf, pjsip_trunk_hgw.conf, featurees.conf の5つを準備する。残りは、githubに公開されているファイル群で大丈夫な様子だ。
2.想定する環境
- クライアントに使い慣れた"Zoiper"(Androidとios混在)を使う。
- NTT東から借りているPR-500Niに接続し、NTT東のひかり電話から発信する。
- 子機は3~4台。よってPR-500Miに直接接続しないでAsteriskで内線通話する。
(子機1~2台だったらクライアントにAgePhoneで直接接続したほうが良さそう) - RaspberryPi 2B 、Debian (bookworm) 32bit環境 にインストールする。
3.ソースコードのダウンロード
・Asterisk18を https://www.asterisk.org/downloads/ よりダウンロードする。
(Asterisk20も使用できるようである)
・メールアドレスの入力を促されるので入力。
・今回、ダウンロードされるtar,gzを.usr/local/srcで展開した。
4.必要pakageを予めインストールする。
・apt-get の様に依存するpackageを導入してくれないので、予め導入しておく。
以下は管理者権限で実行
apt-get install build-essential libedit-dev uuid-dev libxml2-dev -y
apt-get install ncurses-dev libsqlite3-dev sqlite3 -y
apt-get install libssl-dev subversion git -y
今回はこれらを導入した。(過不足あるかも...少々自信なし)
5.ソースコードのコンパイル
以下の手順で進める。これも管理者権限で実行した。
tar xzvf asterisk-18-current.tar.gz
cd /usr/local/src/asterisk-18.19.0/
./configure
make menuselect
menuselectで日本語音声(japanese ...の全部)を選択し、導入する。
make
make install
make samples
と進める。
6.設定ファイルひながたのダウンロード
http://www.voip-info.jp/ から辿れるgithubからconfファイル群を取り寄せる。
git clone https://github.com/takao-t/asterisk-conf
Asterisk13用の様だ。
なお導入後、sip.conf はリネームして無効化しておくこと。
7.今回用意した必要ファイル一式
8.pjsip.confとpjsip_trunk_hgw.confの例
一式ファイルのうち、pjsip.conf にインクルードされるpjsip_trunk_hgw.conf の例を以下に。
まずはpjsip.conf
[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5070
local_net = 192.168.0.0/16[acl]
type=acl
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/16#include "pjsip_trunk_hgw.conf"
次にpjsip_trunk_hgw.confの例
;トランク設定
;pjsip.confにtransportを設定しておくこと;ひかり電話HGW
;
[hikari-hgw]
type = aor
; sip:内線番号@HGWのIPアドレス
contact = sip:4@192.168.0.1
qualify_frequency = 30
authenticate_qualify = no[hikari-hgw]
type = auth
auth_type = userpass
;内線のユーザ名(4桁数字)
username = 0004
;内線のパスワード
password = Password[hikari-hgw]
type = identify
endpoint = hikari-hgw
;HGWのIPアドレス
match = 192.168.0.1[hikari-hgw]
type = registration
transport = transport-udp
outbound_auth = hikari-hgw
; sip:HGWのIPアドレス
server_uri = sip:192.168.0.1
; sip:内線番号@HGWのIPアドレス
client_uri = sip:4@192.168.0.1
retry_interval = 60[hikari-hgw]
type = endpoint
transport = transport-udp
context = from-hikari-hgw
dtmf_mode = inband
disallow = all
allow = ulaw
direct_media = no
send_pai = yes
inband_progress = yes
; HGWの内線番号
from_user = 4
; HGWのIPアドレス
from_domain = 192.168.0.1
language = ja
outbound_auth = hikari-hgw
aors = hikari-hgw
パスワードは適宜設定のこと。
9.extentions.confの例
extentions.confの例を以下に。
[general]
writeprotect=no
priorityjumping=no[globals]
ALLMEMBERS=IAX2/201&IAX2/202&IAX2/203&IAX2/204&IAX2/205&IAX2/206&IAX2/207&IAX2/208&IAX2/209;自局の着信番号を設定する
;[incoming]セクションを参照
;ひかり電話HGWの番号(着信番号:自分の番号)
MYNUMBER1=XXXXXXXX
;FUSION OpenGateの番号(050を取ったもの)
;MYNUMBER2=XXXXXXXX[default]
;200番台を内線に割り当てています
;グループ着信
exten => 200,1,NoOp(内線代表着信)
exten => 200,n,Dial(${GROUP1},60)
exten => 200,n,Hangup;内線呼び出し
exten => _20Z,1,NoOp(内線呼出)
;下行のSIPでIAX2と書き改める
exten => _20Z,n,Dial(IAX2/${EXTEN},60)
exten => _20Z,n,Hangup;300番台は特番で機能に割り当てています
;音声会議
exten => 301,1,NoOp(音声会議)
exten => 301,n,Answer()
exten => 301,n,Confbridge(${EXTEN})
exten => 301,n,Hangup;PIASTでのページング
;ALSAサウンドを持つLinux機でも使用可能
exten => 309,1,NoOp(ページング)
exten => 309,n,GoTo(paging,s,1);700番台はコールパーキング用です
;コールパーキング
exten => 700,1,NoOp(コールパーキング)
exten => 700,n,Park()
;パーキングロットをインクルードしておく
include => parkedcalls;0発信をひかり電話にする場合の例(03--でダイヤル)
exten => _0.,1,NoOp(ひかり電話0発信)
exten => _0.,n,Set(CALLERID(num)=${MYNUMBER})
exten => _0.,n,Set(CALLERID(name)=${MYNUMBER})
;@hikari-trunkを@hikari-gwとし{EXTEN:1}を{EXTEN}に
exten => _0.,n,Dial(PJSIP/${EXTEN}@hikari-hgw);9発信をFUSIONにする場合の例(9+03--でダイヤル)
;exten => _9.,1,NoOp(OpenGate 9発信)
;exten => _9.,n,Set(CALLERID(num)=${MYNUMBER2})
;exten => _9.,n,Set(CALLERID(name)=${MYNUMBER2})
;exten => _9.,n,Dial(SIP/${EXTEN:1}@fusion1);外線着信用コンテキスト
[incoming]
;着信番号毎に処理を書くこと;ひかり電話着信例
exten => ${MYNUMBER1},1,NoOp(うちの代表番号)
exten => ${MYNUMBER1},n,Macro(cidnamecheck)
exten => ${MYNUMBER1},n,Dial(${GROUP1},60);FUSION OpenGate着信例
;exten => ${MYNUMBER2},1,NoOp(FUSION着信)
;exten => ${MYNUMBER2},n,Macro(cidnamecheck)
;exten => ${MYNUMBER2},n,Dial(${GROUP1},60);ひかり電話HGW用前処理
[from-hikari-hgw]
;exten => s,1,NoOp(ひかり電話着番処理)
;exten => s,n,Set(DESTNUM=${PJSIP_HEADER(read,To)})
;exten => s,n,NoOp(着信To: ${DESTNUM})
;着信番号の桁数が異なる場合には以下の行を調整のこと
;exten => s,n,Set(DESTNUM=${DESTNUM:1:10})
;exten => s,n,NoOp(着信番号: ${DESTNUM})
;exten => s,n,Goto(incoming,${DESTNUM},1)
exten => s,1, Dial(${ALLMEMBERS},12,Tt)
exten => s,n, Hangup;CID(番号)から名前を取得するマクロ
;AstDBのcidnameに番号と名前を入れておくこと
[macro-cidnamecheck]exten => s,1,NoOp(CID参照マクロ)
exten => s,n,Set(CIDNAME=${DB(cidname/${CALLERID(num)})})
exten => s,n,GotoIf($["${CIDNAME}" = ""]?noname)
exten => s,n,Set(CALLERID(name)=${CIDNAME})
exten => s,n,Goto(endmacro)
exten => s,n(noname),Set(CALLERID(name)=不明)
exten => s,n(endmacro),MacroExit;PIASTページング用
[paging];リレーをONしてページング実行、ページング前にビープを鳴らす
exten => s,1,NoOp(Paging Start)
;exten => s,n,System(/home/piast/relayon.sh)
exten => s,n,Dial(Console/0,,A(beep));ハングアップ後にビープを鳴らす
exten => h,1,NoOp(Paging Hangup)
exten => h,n,System(asterisk -rx 'channel originate Console/0 application Playback beep')
;exten => h,n,System(/home/piast/relayoff.sh)
ダイアルプランは雛形ファイルを踏襲した。
10.iax.confの例
sipではなく、iax2でZoiper子機を収容する。
[general]
;sip(5060)およびpjsip(5070)と重複せぬよう。
bindport=4589
bindaddr=0.0.0.0
iaxcompat=yes
language=ja
bandwidth=medium
disallow=all
allow=ulaw
allow=gsm
allow=speex
jitterbuffer=no
;dropcount=2
;maxjitterbuffer=500
;maxexcessbuffer=80
;minexcessbuffer=10
;jittershrinkrate=1
;tos=lowdelay
;mailboxdetail=yes
calltokenoptional=0.0.0.0/0.0.0.0
minregexpire = 300
maxregexpire = 300[201]
type=friend
username=201
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=201[202]
type=friend
username=202
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=202[203]
type=friend
username=203
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=203[204]
type=friend
username=204
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=204[205]
type=friend
username=201
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=205[206]
type=friend
username=206
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=206[207]
type=friend
username=207
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=207[208]
type=friend
username=208
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=208[209]
type=friend
username=209
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=209
各子機のパスワードは各々設定のこと。
11.features.confの例
sipフォンだとファンクションキーに各種動作を定義できるが、今回使うzoperには転送ボタンが定義されていない。そこで、
*7 を押下し保留後、他のAsterisk転送先(自分を除く201~209)とダイアル+会話して繋ぐ
*8 を押下し保留後、他のAsterisk転送先(自分を除く201~209)をダイアルして転送する
の2つを実現する。以下、features.confの例
[general]
[featuremap]
atxfer => *7 ; Attended transfer
blindxfer => *8 ; Blind transfer
として、転送ができるようになった。
12.参考にさせていただいたサイト
- http://voip-info.jp/index.php/Asterisk_18 Asterisk18のページ
- https://www.mousou.org/node/494 令和3年度最新版 asterisk で電話であそぶ(その1)
厚く御礼を申し上げます。
(2023年9月16日)
コメント