AsterskをRaspberryPiに導入する

  • 投稿日:
  • by
  • カテゴリ:

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.今回用意した必要ファイル一式

asterisk18-20230917.zipに纏める。

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.参考にさせていただいたサイト

厚く御礼を申し上げます。

(2023年9月16日)