Asterisk コールパーキング

提供: VoIP-Info.jp
2024年12月11日 (水) 11:11時点における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が設定されていますので該当する番号のキーは赤点灯になります。
パークされている呼と通話するには赤点灯しているキーを押すとできます。
複数の電話機を同様に設定しておくと、どこかの電話機でパークした呼を他の電話機で取ることができます。

キーを持たない電話機対応

BLFキーを持たない電話機(単純なIP電話機やソフトフォンなど)でコールパーキングを使用したい場合にはDTMFシーケンスでAsteriskに処理させます。例えば以下のように設定します。
features.confにfeaturemapとして

[featuremap]
parkedcall => #7

のように登録すると、"#7"がパーク動作として設定されます。通話中にこの機能を使うにはDial()時のオプションを設定する必要があり

k - 'called' 呼ばれた側(着信側)に使用させる
K - 'calling' 呼んだ側(発信側)に使用させる

のふたつが指定できます。このためDialを呼び出す際の方向に注意する必要があります。例えば外線から内線を呼び出した場合には"called"側で、内線から外線発信した場合には"calling"側に許可します。内線間発信ならば双方に許可してもかまいませんが、内線をパーク保留する用途があるかどうかをよく考えてください。

Dial(PJSIP/phone10,,k)

上の例では着信した側で通話中に#7をダイヤルするとパーキングされます。番号がアナウンスされ、そのロット番号にパークされます。
パークされている呼を取り戻すにはロット番号(701~708)をダイヤルするだけです。

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

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で計算してロット番号を決めています。

電話機設定

例としてGRP-2604を使います。BLFの設定とおなじように多目的キーを設定します。このときキーの種類としては"CallPark"を選び、アカウントと番号を設定します。
GRP2604-fixpark.png
通話中に該当するキーを押すとそのキー位置でパーク保留、通話していない状態でキーを押すと保留されている呼を取ることができます。

キーを持たない電話機対応

キーを持たない電話機で、固定位置にコールパークするには転送が一番簡単です。指定したパーク位置にパークするにはその番号に転送(例えば801)し、その呼を取り戻すには、その番号をダイヤルします。
ただしこの場合、各キーの状態が『見えない』ので無条件に転送してしまうと、すでにパーク中のロットに転送してしまうという問題が起こります。そうすると通話中の相手がパーク中の相手と繋がってしまうというよろしくない状況が発生してしまうので、これは避けたいです。その場合には以下のようにします。転送した場合には通話が切れますので運用には注意してください。

;固定パーク
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),NoOp
exten => _80[1-4],n,GotoIf($["${SIPTRANSFER}"!=""]?end)
exten => _80[1-4],n,GotoIf($["${BLINFTRANSFER}"!=""]?end)
exten => _80[1-4],n,Goto(fpark${PNUM},80${LOT},1)
exten => _80[1-4],n(end),Hangup