お問い合わせ

ブログ

これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。

Asterisk pjsip で内線電話を設定する

okuda Okuda 2 years

Asteriskをつかって基本的ない内線設定をします。 Asterisk 16からPjSIPがデフォルトになっているので「sip.conf」の代わりに「pjsip.conf」を使用します。

pjsip.conf

まずは、「pjsip.conf」を編集します。
アカウント「2001」と「2002」を設定します。    必要な情報は

  • パブリック ip 例)xxx.xxx.xxx.xx
  • プライベート IP 例)yyy.yyy.yyy.yy
  • ポート
    の3つになります。
;トランスポートの設定
[transport-udp]
type=transport
protocol=udp
;デフォルトは5060
bind=0.0.0.0:15060
;パブリックIPを設定
external_media_address = xxx.xxx.xxx.xx
external_signaling_address = xxx.xxx.xxx.xx
;プライベート IPを設定
local_net = yyy.yyy.yyy.yy/255.255.0.0

;AOR
[2001]
type = aor
;このAORに接続可能なコンタクト数
max_contacts=1
;既存のコンタクトを新しいもので上書きするかどうか
remove_existing=yes

;認証情報
[2001]
type = auth
username = 2001
password = 2001

;エンドポイント設定
[2001]
type = endpoint
;使用するトランスポート名
transport = transport-udp
;着信コンテキスト
context = default 
;コーデック設定
disallow = all
allow = ulaw
;このエンドポイントのAOR
aors = 2001
;このレジスタの認証情報
outbound_auth = 2001
;DTMFモード
dtmf_mode=inband
;このエンドポイントでAVP使用を強制するかどうか
force_rport = yes
;NATトラバースにICEを使用
ice_support = yes
;エンドポイント間でのダイレクトメディアを許可
direct_media = no
;このレジスタの認証情報
;その他の設定
rtp_symmetric = yes
rewrite_contact = yes

[2002]
type = aor
max_contacts=1
remove_existing=yes

[2002]
type = auth
username = 2002
password = 2002

[2002]
type = endpoint
transport = transport-udp
context = default 
disallow = all
allow = ulaw
aors =2002
outbound_auth = 2002
dtmf_mode=inband
force_rport = yes
ice_support = yes
direct_media = no
rtp_symmetric = yes
rewrite_contact = yes

extensions.conf

次に「extensions.conf」を編集します。 「[ ]」で括られたセクションのことを「context(コンテキスト)」といいます。 pjsip.confendpointに書かれるcontext = defaultの部分に当たります。

「generalセクション」は全般の設定になります。 「globalsセクション」でコンテキストごとに設定していきます。

エクステンションの書き方

exten => 番号,プライオリティ,アプリケーション

番号

基本的には内線番号になります。 先頭にアンダーバー(_)をつけ、パターンマッチングを使うことができます。

X 0から9までのいずれかの数字
Z1から9までのいずれかの数字
N2から9までのいずれかの数字
[1-3] 範囲指定。左記例では「1、2、3」がマッチ
. ワイルドカード。1つまたは複数の数字

プライオリティ

処理の順番を指定します。 nを記述しておくと自動的に+1となります。

アプリケーション

アプリケーション・コマンドまたは、ファンクションを指定します。

  • アプリケーション・コマンドはモジュールのプレフィクスが app_
  • ファンクションはモジュールプレフィクスが func_

チャネル変数

ダイヤルされた数字を${EXTEN}というチャネル変数に格納されます。引数指定した数字を読み上げるアプリケーションSayDigits()などを使って確認できます。 exten => _20XX,n,SayDigits(${EXTEN})

[general]
;CLIによるextenの変更を許可するか禁止するかを指定
writeprotect = no

[globals]
CONSOLE = Console/dsp
IAXINFO = guest
TRUNK = DAHDI/G2
TRUNKMSD = 1

[default]
;発信する
exten => _20XX,1,Dial(PJSIP/${EXTEN},60,tT)
; 着信に応答
exten => _20XX,n,Answer()
;書かてきた番号をよみあげ
exten => _20XX,n,SayDigits(${EXTEN})
;サウンドファイルを再生
exten => _20XX,n,Playback(hello-world)
;通話を切断
exten => _20XX,n,Hangup()

Dial()アプリケーションについて

Dial()は相手先にコールし、チャネルを結ぶ機能です。 記述は
exten => 2001,1,Dial(SIP/202,10,r,http://xxx.xxx)
のようになります。

第1引数

利用するプロトコル(SIP、PJSIP、IAX等)と内線電話番号を「/」でつないで指定します。
上記は、内線番号「202」であるSIPデバイスとなります。

第2引数(省略可能)

タイムアウトまでの時間(相手を呼び出す時間)を秒数で指定します。 相手を呼び出してから、ここで指定した秒数が経過したら次のプライオリティに制御が移ります。

第3引数(省略可能)

オプション文字列を指定します。 「d」「t」「T」「w」「W」「f」「o」「r」などがあり、 「r」は相手を呼び出している間、発信側にリングバックトーンを流すことを設定しています。

その他のオプション

  • A(音声ファイル): 相手と繋がったら、指定した音声ファイルを着信側に流します。
  • D(数字): 相手と繋がったら、指定した数字をDTMFで送信します。
  • e: 通話が終わったら、プライオリティhを実行します。 (通話の後処理などに有効)
  • h: 着信側が"*"を押すと通話を切れるようにします。 (features.confでカスタマイズ可)
  • H: 発信側が"*"を押すと通話を切れるようにします。 (features.confでカスタマイズ可)
  • t: 着信側に、電話の転送(アテンダントなしの話中転送)を許可します。 '#'を押して転送します。(features.confでカスタマイズ可)
  • T: 発信側に、電話の転送(アテンダントなしの話中転送)を許可します。 '#'を押して転送します。(features.confでカスタマイズ可)
  • m: Ring音の代わりに保留音を流します (メロディコールのようなもの)
  • w: 着信側に、電話の通話録音を許可します。 '*1'を押すと録音を開始します。(features.confでカスタマイズ可)
  • W: 発信側に、電話の通話録音を許可します。 '*1'を押すと録音を開始します。(features.confでカスタマイズ可)

第4引数:URLを指定(省略可能)

指定したURLはINVITEメッセージの中に埋め込まれ、相手側に送られることになります。

設定を反映

アスタリスクをリスタートさせて反映させます。

$ service asterisk restart
Asterisk pjsip で内線電話を設定する 2021-08-23 14:03:03

コメントはありません。

4482

お気軽に
お問い合わせください。

お問い合わせ
gomibako@aska-ltd.jp