Asterisk 20 サンプル設定ファイル 解説 pjsip


PJSIPの設定は基本がpjsip.confですが可読性を上げるため複数のファイルに分けて#includeしています。
PJSIPの各種パラーメータは Asterisk_pjsip_parameters を参照してください。

目次

pjsip.conf

[system]
type = system
disable_rport = yes

[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
;ITSP/IP電話によってはpermitを指定する必要あり
;SIPメッセージ上で『見える』IPアドレスに注意

;ブラウザフォン用トランスポート(Websocket)
;使う場合にはコメントを外す
;#include "pjsip_wsstransport.conf"

;外線接続用例
;#include "pjsip_trunk_hgw.conf"
;#include "pjsip_trunk_hikari-rtx.conf"

pjsip.conf には基本の設定を記述しています。トランスポートは基本はUDPでポートを5070としています。SIPのデフォルトである5060ではなく5070な点に注意してください。
外線接続時はACLの設定に注意してください。ACLで引っ掛かるとCLIに出ますのでメッセージを確認し所定のアドレスに許可を与えるようにします。
WSS(Websocket)トランスポートはブラウザフォン用です。使用する場合にはコメントを外します。

pjsip_wizard.conf

電話機の収容設定はpjsip_wizard.confで行っています。ただしサンプル設定ファイルのセットではpjsip_wizard.confはスクリプト、pj_phonegen.shで生成できるようにしてあります。
電話機の基本設定は共通部分はテンプレート化してあります。

;電話機用テンプレート(共通設定)
[phone-defaults](!)
type=wizard
transport = transport-udp
accepts_registrations = yes
sends_registrations = no
accepts_auth = yes
sends_auth = no
endpoint/context = default
endpoint/dtmf_mode = rfc4733
endpoint/call_group = 1
endpoint/pickup_group = 1
endpoint/language = ja
endpoint/disallow = all
endpoint/allow = ulaw
endpoint/rtp_symmetric = yes
endpoint/force_rport = yes
endpoint/direct_media = no
endpoint/send_pai = yes
endpoint/send_rpid = yes
endpoint/rewrite_contact = yes
endpoint/inband_progress = yes
endpoint/allow_subscribe = yes
aor/max_contacts = 2
aor/qualify_frequency = 30
aor/authenticate_qualify = no
aor/remove_existing = yes

各パラーメータの意味と内容は Asterisk_pjsip_parameters を参照してください。スラッシュ(/)で区切られているものはそれぞれのセクションに記述すべき内容のことで、例えば endpoint/context= は endpoint セクションに書く context= の意味です。テンプレートは普通の電話機用とブラウザフォン用の2つが用意されています。
各電話機部分は基本、認証情報のみです。

[phone1](phone-defaults)
inbound_auth/username = phone1
inbound_auth/password = f0064c965a91e513fec766ac0d658ed8

phone1はテンプレートにphone-defaultsを使用し、認証情報はusernameとpasswordで行います。
参考:電話機に対してQualifyした際に認証エラーが出る場合(GS電話機など)には電話機に対して認証付きでQualifyを投げます。その際の認証情報は以下のように記述します。

[phone1](phone-defaults)
inbound_auth/username = phone1
inbound_auth/password = f0064c965a91e513fec766ac0d658ed8
outbound_auth/username = phone1
outbound_auth/password = f0064c965a91e513fec766ac0d658ed8

outbound_authも入れるようにシェルスクリプトを修正するのもアリです。

内線の抽象化

今回のサンプル設定ファイルからは少し"難しく"してあり、内線を抽象化しています。これは何かというとPJSIPのエンドポイントと内線番号を"紐付けない"方針です。
従来のサンプル設定ファイルでは次のようにしていました。
まずPJSIPの設定では

[201]
type=endpoint
.
.
[201]
type=auth
.
.

のようにPJSIPのエンドポイントとして内線番号を使っていました。こうすることによりextensions.confでは

exten _2XX,1,Dial(PJSIP/${EXTEN})

のようにDial()することでエンドポイントを呼び出すことができました。この方法はとても簡単であり、かつわかりやすいという特徴を持ちます。
ところが内線番号の『付け替え』等の際にはエンドポイントの設定を書き換える必要があり、電話機の設定も書き換える必要があります。
今回のサンプル設定ファイルではこの「紐付け」をやめ、エンドポイントと内線番号は切り離しています。

phone1 => 内線201

このような紐付けはAsteriskのAstDBで行っています。このため、ある電話機、例えば自分の机の上の電話機の内線番号を201から301に変更したい、というような場合にはAsterisk側の設定(DBコマンドの投入)だけで行え、PJSIPのエンドポイント設定は触る必要がありません。触る必要がないのでAsteriskのリロードも不要です。
唯一問題があるとすれば電話機の液晶表示等が内線番号ではなくphone1のようなエンドポイント名になることですが、これは電話機設定で表示を変更できるものは変更するだけですし、液晶以外にテプラ貼ってたりしませんか?
抽象化の実装方法についてはextensionsの内容をみてください。

rtp.conf

ついでにrtp.confの内容も説明しておきましょう。

[general]
rtpstart=10000
rtpend=11000
rtcpinterval=5000

SIPは呼制御を行うだけですので、実際の音声(メディア)はRTPを使ってやりとりされます。このRTPでAsterisk側が使うポート範囲を指定します。サンプル設定ファイルでRTPは10000~11000の範囲を使います。
RTCPはブラウザフォンの一部がこの設定が必要となっていたため入れてあります。rtcpintervalはRTCPを投げる間隔をミリ秒で指定するので5秒間隔という設定になります。

udplt.conf

DTLSでUDPを使う場合の設定です。

[general]
udptlstart=4000
udptlend=4999
udptlfecentries = 3
udptlfecspan = 3
;use_even_ports = no

DTLSでUDPを使う場合のAsterisk側のポートが4000~4999を使います。
udptlfecentriesはUDPLパケット内のエラー訂正エントリの数を、udptlfecspanはUDPLパケット内のFECでどのパーティが計算されるかのスパンを指定します。
こちらもブラウザフォン等でDTLSを使用する場合の相手にあわせて設定を調整します。