TCL IVR API Version 2.0 プログラミング ガイド
TCL IVR スクリプトの使用方法
TCL IVR スクリプトの使用方法
発行日;2012/01/11 | ドキュメントご利用ガイド | ダウンロード ; この章pdf , ドキュメント全体pdf (PDF - 2MB) | フィードバック

目次

TCL IVR スクリプトの使用方法

TCL IVR Version 2.0 のしくみ

TCL 拡張機能を使用した IVR スクリプトの作成

TCL IVR スクリプトのプロンプト

TCL IVR スクリプトの例

ステート マシンの初期化とセットアップ

スクリプトのテストとデバッグ

スクリプトのロード

スクリプトと着信ダイヤル ピアとの関連付け

IVR スクリプトに関する情報の表示

IVR スクリプトにおける URL の使用

IVR スクリプトをロードするための URL

音声ファイルをロードするための URL

TCL IVR スクリプトの使用におけるポイント

TCL IVR スクリプトの使用方法

この章では、TCL IVR スクリプトの作成方法と使用方法について説明します。次の項で構成されます。

「TCL IVR Version 2.0 のしくみ」

「TCL 拡張機能を使用した IVR スクリプトの作成」

「TCL IVR スクリプトのプロンプト」

「TCL IVR スクリプトの例」

「ステート マシンの初期化とセットアップ」

「スクリプトのテストとデバッグ」

「スクリプトのロード」

「スクリプトと着信ダイヤル ピアとの関連付け」

「IVR スクリプトに関する情報の表示」

「IVR スクリプトにおける URL の使用」

「TCL IVR スクリプトの使用におけるポイント」


) TCL IVR スクリプトの例は、http://www.cisco.com/cgi-bin/tablebuild.pl/tclware を参照してください。


TCL IVR Version 2.0 のしくみ

TCL IVR Version 2.0 では、スクリプトが、初期化プロシージャ、動作関数、有限状態マシン(FSM)の 3 つの部分に分けられます。

「初期化プロシージャ」は、変数の初期化に使用されます。初期化プロシージャには、次の 2 種類があります。

スクリプトのメイン コード セクションで呼び出される初期化関数。この初期化関数は、スクリプトの実行インスタンスが生成されると一度だけ呼び出されます(「実行インスタンス」とは、スクリプトを実行するために生成される TCL インタプリタのインスタンスです)。グローバル変数の初期化は(スクリプトの実行中に変更されないため)、この初期化関数で行ってください。また、コマンドライン インターフェイス(CLI)パラメータの読み取りも、この初期化関数で行ってください。

実行インスタンスが ev_setup_indication または ev_handoff イベントを受け取ると呼び出される初期化関数で、呼の開始を示します。呼固有の変数の初期化は、この初期化関数で行ってください。

呼処理のためにスクリプトの実行インスタンスが生成されると、実行インスタンスは呼の終了時に削除されずにキャッシュに格納されます。次の着呼は、可能な場合、このキャッシュに格納された実行インスタンスを使用します。このため、最初の呼を処理するときに定義されたグローバル変数は、次の呼処理でも使用されます。一方、呼固有の変数は、ev_setup_indication または ev_handoff に対する動作関数で再初期化する必要があります。

一度初期化する必要のある変数や、呼の間で変更することのない変数は、スクリプトのメイン コード セクションで初期化することができます。たとえば、構成パラメータの読み取りは、ワンタイム プロセスであり、呼単位に行う必要がありません。このため、これらの変数をメイン コードに含めるとより効率的です。

「動作関数」は、FSM の定義に使用される一連の TCL プロシージャです。この関数は、基盤となるシステムのイベントに対応して適切な動作を行います。

「FSM」では、現在の状態で特定のイベントに対応した呼び出しを動作関数に指定することによって、呼の制御フローを定義します。

FSM が(ev_handoff または ev_setup_indication イベントで示される)新しい呼を受信するときの状態が、FSM の開始状態になります。fsm define コマンドによってステート マシン テーブルが登録されると、この状態が定義されます。これ以降は、システムから受け取るイベントによってステート マシンが作動し、現在の状態、および set variable コマンドで定義したときに受け取るイベントに基づいて、適切な動作プロシージャが実行されます。

FSM では、次に示す 2 つのワイルドカード状態と 1 つのワイルドカード イベントがサポートされます。

any_state。状態遷移における開始状態としてのみ使用でき、状態イベントの組み合わせがまだ処理されていないすべての状態に対応します。

same_state。状態遷移における終了状態としてのみ使用でき、同じ状態を維持します。

ev_any_event。スクリプトが受け取るすべてのイベントを表すのに使用できます。

たとえば、未処理のイベントに対してデフォルト ハンドラを生成するには、次のスクリプトを使用できます。

set callfsm(any_state,ev_any_event)”defaultProc,same_state”
 

いずれかのコール レッグに対して切断を受信した場合に呼のクローズを命令するには、次のスクリプトを使用できます。

set callfsm(any_state,ev_disconnected) “cleanupCall,CLOSE_CALL”
 

次の例では、デフォルトで、ev_disconnected イベントを受け取ると呼をクローズします。ただし、media_playing の状態で ev_disconnected イベントを受け取る場合、プロンプトが終了してから呼をクローズします。

set callfsm(any_state,ev_disconnected) “cleanupCall,CLOSE_CALL”
set callfsm(MEDIA_PLAYING,ev_disconnected) “doSomthingProc,MEDIA_WAIT_STATE”
set callfsm(MEDIA_WAIT_STATE,ev_media_done) ”cleanupCall,CLOSE_CALL”

イベントの詳細については、 第5章「イベントとステータス コード」 を参照してください。

ゲートウェイは、呼を受信すると、システムに構成されているアプリケーションにその呼を受け渡します。アプリケーションが TCL IVR API Version 2.0 を使用した TCL スクリプトの場合、そのアプリケーション(またはスクリプト)の実行インスタンスが生成されて実行されます。

スクリプトが実行されると、TCL インタプリタは、スクリプト内のプロシージャを読み取り、メイン セクション(グローバル変数の初期化を含む)を実行します。このとき、fsm define コマンドによってステート マシンと開始状態が登録され、この初期化された実行インスタンスに呼が受け渡されます。これ以降(call close コマンドまで)は、イベントを受け取ると、呼の現在の状態とスクリプトが受け取るイベントに従って、適切な動作プロシージャが呼び出されます。

1 つの実行インスタンスは、1 つの呼のみ処理することができます。このため、システムが同じスクリプトで 10 の呼を処理する場合、そのスクリプトのインスタンスの数が 10 になります。呼の間では、次の呼処理のために、実行インスタンスがキャッシュに格納されます。キャッシュに格納された実行インスタンスは、アプリケーションがリロードされるときに削除されます。また、CLI パラメータや属性と値(AV)のペアの変更、削除、追加を行った場合やアプリケーションの構成を解除した場合にも削除されます。


) TCL IVR API の旧バージョンでは、スクリプトの実行インスタンスはすべて Cisco IOS プロセスで実行されていました。このため、100 の呼を処理するには 100 のプロセスが必要となり、各プロセスで 1 つの実行インスタンスを実行していました。これに対し、TCL IVR API Version 2.0 では、複数の実行インスタンスが同じ Cisco IOS プロセスを共有します。ただし、システムのリソースや呼の数に応じて、複数の Cisco IOS プロセスを実行して負荷を分散することもできます。


TCL 拡張機能を使用した IVR スクリプトの作成

TCL を使用して IVR スクリプトを作成する前に、IVR スクリプトにおける TCL 拡張機能について理解しておく必要があります。TCL IVR スクリプトの作成には、いずれのテキスト エディタを使用してもかまいません。TCL スクリプト作成の標準規則に従い、必要に応じて、TCL IVR コマンドを組み込んでください。

このセクションのスクリプト例で、TCL IVR API Version 2.0 のコマンドの使用方法を示します。


) 発信者が電話を切ると、スクリプトの実行が終了し、コール レッグは消去されます。スクリプトは、それ以上処理を行いません。


TCL IVR スクリプトのプロンプト

TCL IVR API Version 2.0 では、メモリ ベースと RTSP ベースの 2 種類のプロンプトを使用できます。

メモリ ベースのプロンプトの場合、プロンプト(音声ファイル)は、メモリに読み込まれてから、必要に応じて該当するコール レッグに対して再生されます。読み込みが可能なメモリは、フラッシュ メモリ、TFTP サーバ、および FTP サーバです。

RTSP ベースのプロンプトの場合、外部の(RTSP 対応)サーバを使用して、特定の音声ファイルやコンテンツを再生したり、必要に応じて該当するコール レッグに対して音声を流すことができます。一部のプラットフォームでは、RTSP ベースのプロンプトがサポートされません。このようなプラットフォームで RTSP ベースのプロンプトを使用した場合、ev_media_done イベントのステータス コードと共にプロンプトが異常終了します。

冒頭で述べたように、TCL IVR API Version 2.0 では、ダイナミック プロンプトの使用によって、番号、金額、日付、時刻を再生するといった基本的な TTS 機能もいくつか提供されます。異なる言語を使用してプロンプトを分類することもできるため、スクリプトは、特定のプロンプトを再生するように命令されると、使用中または指定された言語でプロンプトを自動再生します。


) スクリプトをセットアップするときは、パフォーマンスが低下しないように、短いプロンプトやダイナミック プロンプトでは RTSP を使用しないことをお勧めします。


TCL IVR スクリプトの例

次の例は、TCL IVR API Version 2.0 のコマンドの使用方法を示します。最初にヘッダー情報を記述することをお勧めします。ヘッダー情報には、スクリプト名、スクリプトが作成された日付と作成者、スクリプトの内容に関する一般的な情報が含まれます。

3 桁方式でスクリプトのバージョンも記述しておくことをお勧めします。この場合、1 桁目はスクリプトのメジャー バージョンを示し、2 桁目はマイナー バージョン(スクリプトの関数の変更など)ごとに増やし、3 桁目はその他の変更を行うたびに増やします。

次のスクリプト例では、ダイヤル トーンを再生し、ディジットを収集してダイヤル プランと照合し、宛先に電話をかけ、2 つのコール レッグで会議通信を行い、電話が切られると会議コール レッグおよび切断コール レッグを破棄します。

# app_session.tcl
# Script Version 1.0.1
#------------------------------------------------------------------
# August 1999, Saravanan Shanmugham
#
# Copyright (c) 1998, 1999 by cisco Systems, Inc.
# All rights reserved.
#------------------------------------------------------------------
#
# This tcl script mimics the default SESSION app
#
#
# If DID is configured, place the call to the dnis.
# Otherwise, output dial-tone and collect digits from the
# caller against the dial-plan.
#
# Then place the call. If successful, connect it up. Otherwise,
# the caller should hear a busy or congested signal.
# The main routine establishes the state machine and then exits.
# From then on, the system drives the state machine depending on the
# events it receives and calls the appropriate Tcl procedure.
 

次に、一連のプロシージャを定義します。

init プロシージャでは、ディジット収集の最初のパラメータを定義します。このプロシージャでは、次の内容が定義されています。

ユーザはプロンプト メッセージが終了する前に情報を入力することができます。

ユーザは*キーを押してプロセスを中止することができます。

ユーザは#キーを押して入力の完了を知らせる必要があります。

proc init { } {
global param
set param(interruptPrompt) true
set param(abortKey) *
set param(terminationKey) #
}
 

ev_setup_indication イベントを受け取ると、act_Setup プロシージャが実行され、電話をかけるために必要な情報を収集します。このプロシージャでは、次の内容が定義されています。

確立通知を着信コール レッグに送信します。

呼がダイレクト イン ダイヤル(DID)の場合、宛先を着信電話番号通知サービス(DNIS)に設定し、システムは、着信レッグの処理メッセージで応答し、leg setup コマンドで発信レッグを確立しようとします。

呼が DID でない場合、着信コール レッグに対してダイヤル トーンを再生し、ディジットを収集してダイヤル プランと照合します。

proc act_Setup { } {
global dest
global beep
set beep 0
leg setupack leg_incoming
if { [infotag get leg_isdid] } {
set dest [infotag get leg_dnis]
leg proceeding leg_incoming
leg setup $dest callInfo leg_incoming
fsm setstate PLACECALL
} else {
playtone leg_incoming tn_dial
set param(dialPlan) true
leg collectdigits leg_incoming param
}
}
 

ev_collectdigits_done イベントを受け取ると、act_GotDest プロシージャが実行されます。収集したディジットがダイヤル プランに適合するかどうかを判別して、適合すれば電話をかけます。このプロシージャでは、次の内容が定義されています。

ダイヤル プランに適合するディジットの収集に成功した(cd_004)場合、呼の確立を処理します。

それ以外の場合、エラーをレポートし、呼を終了します。その他のディジット収集ステータス値のリストについては、「ディジット収集ステータス」を参照してください。

proc act_GotDest { } {
global dest
set status [infotag get evt_status]
if { $status == "cd_004" } {
set dest [infotag get evt_dcdigits]
leg proceeding leg_incoming
leg setup $dest callInfo leg_incoming
} else {
puts "\nCall [infotag get con_all] got event $status collecting destination"
call close
}
}
 

ev_setup_done イベントを受け取ると、act_CallSetupDone プロシージャが実行され、呼に時間制限があるかどうかを判別します。このプロシージャでは、次の内容が定義されています。

呼が正常終了(ls_000)の場合、スクリプトが残り通話時間を取得します。

unlimited または uninitialized 以外の値が戻される場合、タイマーを開始します。

呼が正常終了でない場合、エラーをレポートし、呼をクローズします。その他のレッグ確立ステータス値のリストについては、「レッグの確立ステータス」を参照してください。

proc act_CallSetupDone { } {
global beep
set status [infotag get evt_status]
if { $status == "ls_000"} {
set creditTimeLeft [infotag get leg_settlement_time leg_outgoing]
if { ($creditTimeLeft == "unlimited") ||
($creditTimeLeft == "uninitialized") } {
puts "\n Unlimited Time"
} else {
# start the timer for ...
if { $creditTimeLeft < 10 } {
set beep 1
set delay $creditTimeLeft
} else {
set delay [expr $creditTimeLeft - 10]
}
timer start leg_timer $delay leg_incoming
}
} else {
puts "Call [infotag get con_all] got event $status while placing an outgoing call"
call close
}
}
 

an ev_leg_timer イベントを受け取ると、act_Timer プロシージャが実行されます。このプロシージャは、残り通話時間が 10 秒になると使用され、残り時間が少ないことをユーザに警告し、限界に達すると呼を終了します。このプロシージャでは、次の内容が定義されています。

残り時間がある間、電子音を発してユーザに残り時間が少ないことを警告します。

残り時間がなくなると、"out of time" 音声ファイルを再生し、ステート マシンに呼の切断を命令します。

proc act_Timer { } {
global beep
global incoming
global outgoing
set incoming [infotag get leg_incoming]
set outgoing [infotag get leg_outgoing]
if { $beep == 0 } {
#insert a beep ...to the caller
connection destroy con_all
set beep 1
} else {
media play leg_incoming flash:out_of_time.au
fsm setstate CALLDISCONNECTED
}
}
 

ev_destroy_done イベントを受け取ると、act_Destroy プロシージャが実行され、着信コール レッグに対して電子音を発します。

proc act_Destroy { } {
media play leg_incoming flash:beep.au
}
 

ev_media_done イベントを受け取ると、act_Beeped プロシージャが実行され、着信コール レッグと発信コール レッグの接続を確立します。

proc act_Beeped { } {
global incoming
global outgoing
connection create $incoming $outgoing
}
 

ev_create_done イベントを受け取ると、act_ConnectedAgain プロシージャが実行され、着信コール レッグのタイマーを 10 秒に再設定します。

proc act_ConnectedAgain { } {
timer start leg_timer 10 leg_incoming
}
 

act_Ignore プロシージャによって、「Event Capture」をレポートします。

proc act_Ignore { } {
# Dummy
puts "Event Capture"
}
 

ev_disconnected イベントを受け取ったとき、および状態が CALLDISCONNECTED のときに、act_Cleanup プロシージャが実行され、呼をクローズします。


) スクリプトは、ev_disconnected イベントを受け取ると、leg disconnect コマンドでレッグを消去するまで 15 秒間待ちます。15 秒後にタイマーが時間切れになると、スクリプトは終了し、コンソールにエラー メッセージが表示されます。このため、切断後にレッグが消去されていないという事態が避けられます。


proc act_Cleanup { } {
call close
}
 

最後に、すべてのプロシージャをメイン ルーチンに組み込みます。メイン ルーチンでは、状態とイベントの多様な組み合わせに対する実際の状態の移行を定義した TCL 配列を定義し、呼を制御するステート マシンを登録します。メイン ルーチンでは、次の内容が定義されています。

いずれの状態でも、呼が切断されると act_Cleanup プロシージャを呼び出し、状態をそのまま保持します。

CALL_INIT の状態のときに「setup indication」イベントを受け取ると、act_Setup プロシージャを呼び出して(電話をかけるのに必要な情報を収集し)、状態を GETDEST に設定します。

GETDEST の状態のときに「digit collection done」イベントを受け取ると、act_GotDest プロシージャを呼び出して(収集したディジットがダイヤル プランに適合し、電話をかけることが可能かどうかを判別し)、状態を PLACECALL に設定します。

PLACECALL の状態のときに「setup done」イベントを受け取ると、act_CallSetupDone プロシージャを呼び出して(呼に時間制限があるかどうかを判別し)、状態を CALLACTIVE に設定します。

CALLACTIVE の状態のときに「leg timer」イベントを受け取ると、act_Timer プロシージャを呼び出して(残り時間が少ないことをユーザに警告し)、状態を INSERTBEEP に設定します。

INSERTBEEP の状態のときに「destroy done」イベントを受け取ると、act_Destroy プロシージャを呼び出して(着信コール レッグに対して電子音を発し)、状態を INSERTBEEP のまま保持します。

INSERTBEEP の状態のときに「media done」イベントを受け取ると、act_Beeped プロシージャを呼び出して(着信コール レッグと発信コール レッグを再接続し)、状態を INSERTBEEP のまま保持します。

INSERTBEEP の状態のときに「create done」イベントを受け取ると、act_ConnectedAgain プロシージャを呼び出して(着信コール レッグのレッグ タイマーを 10 秒に再設定し)、状態を CALLACTIVE に設定します。

CALLACTIVE の状態のときに「disconnect」イベントを受け取ると、act_Cleanup プロシージャを呼び出して(呼を終了し)、状態を CALLDISCONNECTED に設定します。

CALLDISCONNECTED の状態のときに「disconnect」イベントを受け取ると、act_Cleanup プロシージャを呼び出して(呼を終了し)、状態を CALLDISCONNECTED のまま保持します。

CALLDISCONNECTED の状態のときに「media done」イベントを受け取ると、act_Cleanup プロシージャを呼び出して(呼を終了し)、状態を CALLDISCONNECTED のまま保持します。

CALLDISCONNECTED の状態のときに「disconnect done」イベントを受け取ると、act_Cleanup プロシージャを呼び出して(呼を終了し)、状態を CALLDISCONNECTED のまま保持します。

CALLDISCONNECTED の状態のときに「leg timer」イベントを受け取ると、act_Cleanup プロシージャを呼び出して(呼を終了し)、状態を CALLDISCONNECTED のまま保持します。

init
#----------------------------------
# State Machine
#----------------------------------
set TopFSM(any_state,ev_disconnected) "act_Cleanup,same_state"
set TopFSM(CALL_INIT,ev_setup_indication) "act_Setup,GETDEST"
set TopFSM(GETDEST,ev_collectdigits_done) "act_GotDest,PLACECALL"
set TopFSM(PLACECALL,ev_setup_done) "act_CallSetupDone,CALLACTIVE"
set TopFSM(CALLACTIVE,ev_leg_timer) "act_Timer,INSERTBEEP"
set TopFSM(INSERTBEEP,ev_destroy_done) "act_Destroy,same_state"
set TopFSM(INSERTBEEP,ev_media_done) "act_Beeped,same_state"
set TopFSM(INSERTBEEP,ev_create_done) "act_ConnectedAgain,CALLACTIVE"
set TopFSM(CALLACTIVE,ev_disconnected) "act_Cleanup,CALLDISCONNECTED"
set TopFSM(CALLDISCONNECTED,ev_disconnected) "act_Cleanup,same_state"
set TopFSM(CALLDISCONNECTED,ev_media_done) "act_Cleanup,same_state"
set TopFSM(CALLDISCONNECTED,ev_disconnect_done) "act_Cleanup,same_state"
set TopFSM(CALLDISCONNECTED,ev_leg_timer) "act_Cleanup,same_state"

ステート マシンの初期化とセットアップ

次のコマンドを使用して、ステート マシン(SM)の初期化とセットアップを行います。

fsm define TopFSM CALL_INIT

スクリプトのテストとデバッグ

スクリプトは、使用する前に十分にテストすることが重要です。スクリプトをテストするには、スクリプトをルータに実装し、電話をかけてスクリプトを起動します。スクリプトをテストするときは、必ず、すべてのプロシージャと、各プロシージャで発生する状況をすべてテストしてください。

ルータで実行される TCL IVR スクリプトに適用されるデバッグ情報を参照することができます。debug voip ivr コマンドを使用すると、参照するデバッグ情報の出力形式を指定できます。デバッグの出力結果を参照するには、特権 Exec モードで次のコマンドを入力してください。

[no] debug voip ivr [states | error | tclcommands | callsetup | digitcollect | script | dynamic | applib | settlement | all]
 

debug voip ivr コマンドの詳細については、『Interactive Voice Response Version 2.0 on Cisco VoIP Gateways』を参照してください。

スクリプトのデバッグ機能が有効な場合、TCL puts コマンドの出力結果が表示されます。

エラーの原因として、次の点が考えられます。

不明なコマンドや入力ミスのコマンド(たとえば、media play を mediaplay と誤って入力した場合)。

構文エラー(たとえば、引数に無効な数字を指定した場合)。

無効な状態でのコマンド実行(たとえば、プロンプトが再生されていないときに media pause コマンドを実行した場合)。

無効な適用範囲での情報タグの使用(たとえば、ev_collectdigits_done イベントを処理していないときに evt_dcdigits を指定した場合)。情報タグの詳細については、 第4章「情報タグ」 を参照してください。

多くの場合、上記のエラーが発生すると、基盤となるインフラストラクチャがコール レッグを切断して終了します。

スクリプトのロード

アプリケーションと TCL IVR スクリプトを関連付けるには、次のコマンドを使用してください。

(config)# call application voice application_name script_url
 

アプリケーションと TCL IVR スクリプトを関連付けたら、次のコマンドを使用してパラメータを設定してください。

(config)# call application voice application_name script_url [parameter value]
 

このコマンドでは、次のようにパラメータを設定します。

application_name には、着信ダイヤル ピアに送信される呼に対してシステムが使用する TCL アプリケーションの名前を指定します。TCL IVR スクリプトと関連付けられる名前を入力してください。

script_url は、スクリプトが格納されているパス名です。格納場所のパス名を入力してから、スクリプトのファイル名を入力してください。TCL IVR スクリプトは、フラッシュ メモリや、URL で参照可能な TFTP サーバなどのサーバに格納することができます。

parameter value には、言語や PIN 長など、特定のパラメータの値を設定することができます。

call application voice コマンドの詳細については、『Interactive Voice Response Version 2.0 on Cisco VoIP Gateways』を参照してください。

次の例では、「test」という名前のアプリケーションが、tftp://keyer/debit_audio/に格納されている newapp.tcl という名前の TCL IVR スクリプトに関連付けられています。

(config)# call application voice test tftp://keyer/debit_audio/newapp.tcl

) スクリプトをロードできない場合、そのスクリプトは再試行キューに格納され、システムは定期的にロードを再試行します。スクリプトを変更する場合、(config)# call application voice load script_name のように、スクリプト名だけを使用してスクリプトを再ロードすることができます。


call application voice および call application voice load コマンドの詳細については、『Interactive Voice Response Version 2.0 on Cisco VoIP Gateways』を参照してください。

スクリプトと着信ダイヤル ピアとの関連付け

TCL IVR スクリプトを実行して呼を処理するには、設定済みのアプリケーションと着信ダイヤル ピアを関連付けることが必要です。スクリプトと着信ダイヤル ピアを関連付けるには、設定モードで次のコマンドを入力してください。

(config)# dial-peer voice number voip
 
(conf-dial-peer)# incoming called-number destination_number
 
(conf-dial-peer)# application application_name
 

これらのコマンドでは、次のようにパラメータを設定します。

number は、ダイヤル ピアを一意に識別します(この番号は、ローカルでのみ有効です)。

destination_number には、宛先の電話番号を指定します。有効なエントリは、E.164 電話番号を指定した一連の数字です。

application_name は、アプリケーションをロードするときに割り当てた略称です。

たとえば、次のコマンドは、IP ネットワークからの発信で宛先の電話番号が 125 である呼に対して「newapp」という名前のアプリケーションを実行することを示しています。

(config)# dial-peer voice 3 voip
(conf-dial-peer)# incoming called-number 125
(conf-dial-peer)# application newapp
 

着信ダイヤル ピアの詳細については、Cisco IOS ソフトウェアのマニュアルを参照してください。

IVR スクリプトに関する情報の表示

ルータに設定されている音声アプリケーションのリストを参照するには、show call application voice コマンドを使用します。各アプリケーションの一覧情報が、1 行ずつ表示されます。

show call application voice [ [name] | [summary] ]
 

このコマンドでは、次のようにパラメータを設定します。

name には、参照する IVR アプリケーションの名前を指定します。特定のアプリケーション名を入力すると、そのアプリケーションに関する情報が表示されます。

一覧情報を参照するには summary を指定します。summary キーワードを指定すると、各アプリケーションの一覧情報が 1 行ずつ表示されます。このキーワードを省略した場合、指定のアプリケーションに関する詳細な説明が表示されます。

次の例は、show call application voice コマンドの出力結果です。

router# show call application voice session2
Idle call list has 0 calls on it.
Application session2
The script is read from URL tftp://dirt/sarvi/scripts/tcl/app_session.tcl
The uid-len is 10 (Default)
The pin-len is 4 (Default)
The warning-time is 60 (Default)
The retry-count is 3 (Default)
It has 0 calls active.
The Tcl Script is:
------------------
# app_session.tcl
#------------------------------------------------------------------
# August 1999, Saravanan Shanmugham
#
# Copyright (c) 1998, 1999 by cisco Systems, Inc.
# All rights reserved.
#------------------------------------------------------------------
#
# This tcl script mimics the default SESSION app
#
#
# If DID is configured, just place the call to the dnis
# Otherwise, output dial-tone and collect digits from the
# caller against the dial-plan.
#
# Then place the call. If successful, connect it up, otherwise
# the caller should hear a busy or congested signal.
# The main routine just establishes the state machine and then exits.
# From then on the system drives the state machine depending on the
# events it receives and calls the appropriate tcl procedure
#---------------------------------
# Example Script
#---------------------------------
proc init { } {
global param
set param(interruptPrompt) true
set param(abortKey) *
set param(terminationKey) #
}
proc act_Setup { } {
global dest
global beep
set beep 0
leg setupack leg_incoming
if { [infotag get leg_isdid] } {
set dest [infotag get leg_dnis]
leg proceeding leg_incoming
leg setup $dest callInfo leg_incoming
fsm setstate PLACECALL
} else {
playtone leg_incoming tn_dial
set param(dialPlan) true
leg collectdigits leg_incoming param
}
}
proc act_GotDest { } {
global dest
set status [infotag get evt_status]
if { $status == "cd_004" } {
set dest [infotag get evt_dcdigits]
leg proceeding leg_incoming
leg setup $dest callInfo leg_incoming
} else {
puts "\nCall [infotag get con_all] got event $status while placing an outgoing call"
call close
}
}
proc act_CallSetupDone { } {
global beep
set status [infotag get evt_status]
if { $status == "CS_000"} {
set creditTimeLeft [infotag get leg_settlement_time leg_outgoing]
if { ($creditTimeLeft == "unlimited") ||
($creditTimeLeft == "uninitialized") } {
puts "\n Unlimited Time"
} else {
# start the timer for ...
if { $creditTimeLeft < 10 } {
set beep 1
set delay $creditTimeLeft
} else {
set delay [expr $creditTimeLeft - 10]
}
timer start leg_timer $delay leg_incoming
}
} else {
puts "Call [infotag get con_all] got event $status collecting destination"
call close
}
}
proc act_Timer { } {
global beep
global incoming
global outgoing
set incoming [infotag get leg_incoming]
set outgoing [infotag get leg_outgoing]
if { $beep == 0 } {
#insert a beep ...to the caller
connection destroy con_all
set beep 1
} else {
media play leg_incoming flash:out_of_time.au
fsm setstate CALLDISCONNECTED
}
}
proc act_Destroy { } {
media play leg_incoming flash:beep.au
}
proc act_Beeped { } {
global incoming
global outgoing
connection create $incoming $outgoing
}
proc act_ConnectedAgain { } {
timer start leg_timer 10 leg_incoming
}
proc act_Ignore { } {
# Dummy
puts "Event Capture"
}
proc act_Cleanup { } {
call close
}
init
#----------------------------------
# State Machine
#----------------------------------
set TopFSM(any_state,ev_disconnected) "act_Cleanup,same_state"
set TopFSM(CALL_INIT,ev_setup_indication) "act_Setup,GETDEST"
set TopFSM(GETDEST,ev_digitcollect_done) "act_GotDest,PLACECALL"
set TopFSM(PLACECALL,ev_setup_done) "act_CallSetupDone,CALLACTIVE"
set TopFSM(CALLACTIVE,ev_leg_timer) "act_Timer,INSERTBEEP"
set TopFSM(INSERTBEEP,ev_destroy_done) "act_Destroy,same_state"
set TopFSM(INSERTBEEP,ev_media_done) "act_Beeped,same_state"
set TopFSM(INSERTBEEP,ev_create_done) "act_ConnectedAgain,CALLACTIVE"
set TopFSM(CALLACTIVE,ev_disconnected) "act_Cleanup,CALLDISCONNECTED"
set TopFSM(CALLDISCONNECTED,ev_disconnected) "act_Cleanup,same_state"
set TopFSM(CALLDISCONNECTED,ev_media_done) "act_Cleanup,same_state"
set TopFSM(CALLDISCONNECTED,ev_media_done) "act_Cleanup,same_state"
set TopFSM(CALLDISCONNECTED,ev_disconnect_done) "act_Cleanup,same_state"
set TopFSM(CALLDISCONNECTED,ev_leg_timer) "act_Cleanup,same_state"
fsm define TopFSM CALL_INIT
 

IVR スクリプトにおける URL の使用

IVR スクリプトでは、スクリプトの呼び出しや、スクリプトで再生される音声ファイルの呼び出しに、URL を使用します。VoIP システムでは、音声ファイルの読み込みに Cisco IOS File System(IFS)を使用しています。このため、TFTP、FTP、ルータのデバイスへのポインタなど、IFS がサポートされている URL はすべて使用できます。


) フラッシュ メモリではエントリが 32 に制限されるため、すべての音声ファイルをフラッシュ メモリにコピーできるとは限りません。


IVR スクリプトをロードするための URL

IVR スクリプトの URL は、スクリプトの格納場所を示す標準 URL です。次に例を示します。

flash:myscript.tcl--myscript.tcl という名前のスクリプトを、ルータのフラッシュ メモリからロードします。

slot0:myscript.tcl--myscript.tcl という名前のスクリプトを、ルータのスロット 0 にあるデバイスからロードします。

tftp://BigServer/myscripts/betterMouseTrap.tcl--betterMouseTrap.tcl という名前のスクリプトを、BigServer という名前のサーバの、tftpboot ディレクトリ内の myscripts という名前のディレクトリからロードします。

音声ファイルをロードするための URL

音声ファイルのロードで使用する URL は、IVR スクリプトのロードで使用する URL と異なります。音声ファイルの URL について、次に示します。

スタティック プロンプトの場合、「IVR スクリプトをロードするための URL」で説明したとおり、IFS がサポートされている URL を使用できます。

ダイナミック プロンプトの場合、media play コマンドや言語 CLI 構成コマンドで指定したパラメータからの情報を使用して、ソフトウェアによって URL が生成されます。

TCL IVR スクリプトの使用におけるポイント

ここでは、TCL IVR スクリプトの使用に関する FAQ に対して回答を提供します。

RADIUS サーバから TCL IVR スクリプトに情報を得るにはどうすればよいか。

認証と許可が完了すると、infotag get コマンドによって、RADIUS サーバが保持する預金残高、残り通話時間、原因コードを取得することができます。

スクリプトにエラーがある場合はどうなるのか。

スクリプトにエラーがあると、TEMPORARY_FAILURE (41)の原因で呼が消去されます。IVR アプリケーションが着呼をすでに受信している場合、発信者には何も聞こえません。スクリプトが着呼を受信していない場合、発信者には高速なビジー信号が聞こえます。

スクリプトがエラーのために終了すると、(「スクリプトのテストとデバッグ」で説明したように)IVR デバッグ機能が有効な場合はスクリプト内のエラーの場所がコマンドラインに表示されます。