Asterisk コールパーキング

2024年12月5日 (木) 16:05時点におけるTakahashi (トーク | 投稿記録)による版 (設定)

Asteriskにおけるコールパーキング機能とその活用方法。
なおこの説明は新しい(res_parkingを使う)ものについて説明します。

目次

基本のコールパーキング

Asteriskでの基本的なコールパーキングは動的スロット式です。よく使用される番号は700,701~なのでこれを例に説明します。
コールパーキングではパーク用番号とパークされた呼を『取り戻す』ロット番号があります。

通話---転送--> 700 (パーク用番号)
                |
                |ロット番号割り当て
                +--> 701

現在通話中の呼をパーク用番号に転送すると空いているロット番号が自動的に割り当てられて、呼はそこに『パーク』されます。
パークされた呼は保留状態でロット番号に置かれます。この呼と繋ぐにはロット番号をダイヤルします。

内線など--ダイヤル--> 701(ロット番号)

空いている番号からロット番号にダイヤルすると保留されていた呼を「取り戻す」ことができます。
ロット番号は動的割り当てなので、使用されているロット番号があるとAsteriskは次の空きロット番号を割り当てます。

設定

基本のコールパーキングの設定を説明します。includeする設定ではなくextenにベタ書きする例を示します。

res_parking.conf

[general]

;デフォルトのパーキングロット
[default]
context => parkedcalls
;パークさせる番号は700
parkext => 700
;パークされる位置は701-708
parkpos => 701-708
;パーキングのhintを自動生成する
parkinghints => yes
;タイムアウトしたら元を呼び返す設定
parkingtime => 60
comebacktoorigin => yes

パーク用の番号を700、ロット番号を701~708の7個とします。パーキング用のhintは自動生成されます。パークされたまま放置されると60秒で呼び戻しが行われます。

extenには以下の例のように書きます。内線が到達できるcontext内に書きます。
extensions.conf

;コールパーク
exten => 700,1,Goto(parkedcalls,700,1)
exten => _70X,1,Goto(parkedcalls,${EXTEN},1)

コールパークの番号は@parkedcallsというcontextにありますので内線からそれぞれの番号がダイヤルされた場合にはGotoでジャンプさせます。700がダイヤルされた場合にパーク、パークされた呼を取り戻すには701~708をダイヤルします。

電話機

特殊なキーを持たない電話機でもコールパーキングを使用することができます。パークする場合には転送を使うかfeatures.confの設定でDTMFを使ってパークすることが可能です。パークされた呼を取得するには該当する内線番号をダイヤルするだけです。
ですがBLF機能を持つ電話機を使用することでより便利に使うことができます。ここではGrandstream GRP-2604Pを例に説明します。ただしBLF押下時の挙動はメーカーによって若干異なることがありますので注意してください。
GXP-2604Pの『多目的キー』設定で行います。この例では本体右下のキー部分の左側、5個のキーを使用します。一番上のキーがパーク用、2番目から4つをロット用に割り当てます。

extensions.conf

先ほどのパーク用exteに加えて電話機(BLF)が参照するためのhintを設けます。

;コールパーク
exten => 700,1,Goto(parkedcalls,700,1)
exten => _70X,1,Goto(parkedcalls,${EXTEN},1)
;コールパークhints
exten => 701,hint,park:701@parkedcalls
exten => 702,hint,park:702@parkedcalls
exten => 703,hint,park:703@parkedcalls
exten => 704,hint,park:704@parkedcalls

res_parkingの設定でhintは自動生成されていますが、これを内線のcontextから参照(SUBSCRIBE)できるようにします。

BLF(電話機)設定

画面のように多目的キーを設定します。パーク用キーは『転送』、それぞれの番号はビジーランプフィールド(BLF)で設定します。なお、この例では"アカウント2"を使っていますが、自分が使用しているSIPアカウントに対応するアカウントを選択してください。 GRP2604-BLF.png

操作

通話中に多目的キーの1番を押すとパークされます。パークされた呼は空いているロットに送られそこでパークされます。この時、パーク番号はBLFが設定されていますので該当する番号のキーは赤点灯になります。
パークされている呼と通話するには赤点灯しているキーを押すとできます。
複数の電話機を同様に設定しておくと、どこかの電話機でパークした呼を他の電話機で取ることができます。

キー位置固定コールパーキング

Asteriskの基本コールパーキングは動的ロット割り当てですが、日本国内では固定位置でのコールパーキングが好まれる傾向があります。この動作は次のようなものです。

通話中------------> [キー1] を押下
                       |
通話[パーク1]<---------+ パーク位置へ


通話[パーク1]       [キー1] を押下
       |               |
       +<--------------+ パーク1の位置で保留されている呼を取りにいく

要するに通話中に所定のキーを押すと、そのキー位置で保留され、保留されているキーを押すと保留されていた呼が取れるようにするものです。
Asteriskの場合『場所決め』でパークさせる方法としてはロット指定でのパーキングができるので、これをうまく使えばできなくもないのですが、指定してパーキングさせた時にその番号がすでに使用中だと次の番号へ滑ってしまうので、あまりよろしくありません。
res_parkingを使うコールパーキングでは複数のパーキングロットを指定することができます。これを利用してひとつしか使えないロットを複数並べてキー位置固定パーキングをつくることができます。
ただしこれを行うには電話機側の対応も必要で、単純BLFではなく"CallPark"や"CallParking"機能をもったキーが必要です。Grandstreamでは動作を確認していますが、最近のSIP電話機ではこの機能を持つものが多いと思います。これはBLF+転送のような動作でBLFでランプ状態を監視(SUBSCRIBE)しつつ、通話中にキーが押されると転送、通話していないときにキーが押されると単純発信するようなものです。

設定

res_parking.conf では『ロットが1つしかない』パーキングcontextを複数並べます。が、この実装例では以下の前提で実装します。

  • パーク番号は 801~804 の4つ
  • ロット番号は パーク番号+4 (805~808)
  • 各パークは1つのロットだけを持つ
;キー固定パーク用
[fpark1]
context => fpark1
parkext => 801
parkpos => 805-805
parkinghints => yes

[fpark2]
context => fpark2
parkext => 802
parkpos => 806-806
parkinghints => yes

[fpark3]
context => fpark3
parkext => 803
parkpos => 807-807
parkinghints => yes

[fpark4]
context => fpark4
parkext => 804
parkpos => 808-808
parkinghints => yes

パークの数を増やす場合にはロット番号を+8や+16にしてください。

extensions.conf ではパーク番号がダイヤルされた場合、すでにパークされているかどうかで処理を分けます。そのキー位置でパークされていない場合にはパークを実行、パークされている場合には呼を取り戻します。
また、hintを定義しますが、CallParkキーがSUBSCRIBEしてくる先はパーク用番号なので、参照する先はロットにします。

;固定パーク
exten => _80[1-4],1,NoOp(固定パーク)
;パーク番号は内線番号の最後の桁
exten => _80[1-4],n,Set(PNUM=${EXTEN:-1})
;ロット番号はパーク番号+4の位置
exten => _80[1-4],n,Set(LOT=${MATH(${PNUM}+4,int)})
;ロットのステートによって処理分け
exten => _80[1-4],n,GotoIf($["${DEVICE_STATE(park:80${LOT}@fpark${PNUM})}"="NOT_INUSE"]?park)
exten => _80[1-4],n,GotoIf($["${DEVICE_STATE(park:80${LOT}@fpark${PNUM})}"="INUSE"]?pickup)
exten => _80[1-4],n,Goto(end)
;パーク実行
exten => _80[1-4],n(park),Park(fpark${PNUM})
exten => _80[1-4],n,Goto(end)
;パークされている場合は取り戻し
exten => _80[1-4],n(pickup),Goto(fpark${PNUM},80${LOT},1)
exten => _80[1-4],n(end),Hangup

;固定コールパークhints
exten => 801,hint,park:805@fpark1
exten => 802,hint,park:806@fpark2
exten => 803,hint,park:807@fpark3
exten => 804,hint,park:808@fpark4

ちょっとわかりにくいかもしれませんが、番号によって処理をそれぞれ書くのではなく、_80[1-4] で801~804までの処理を行っています。パーク番号+4をロット番号にしているので+4で計算してロット番号を決めています。