今日は、Ciscoルータの音声メニュー(
IVR )について話します。これはTCLで記述し、Cisco 3845に接続します。
まず、基本を見てみましょう
IOS 12以降、シスコは音声メニューを操作するために
VXMLおよび
TCLスクリプトの両方をサポートしています。 ただし、
VXMLとは異なり、
TCLスクリプトは
Cisco IVR APIとの相互運用性がはるかに高くなってい
ます 。 ハイブリッド
IVRスクリプトを、
TCLスクリプト内の
VXMLコードの組み込み部分と接続することもできます。
偶然受け取ったCisco IVRに関連するすべてのドキュメントは、
ここからダウンロードでき
ます 。
FSM
1つ目は
FSMの移行です。
有限状態マシンは抽象的なオートマトンであり、可能な内部状態の数は有限です。
次のようになります。
set ivr_fsm(CALLCOMES,ev_setup_indication) "act_Setup same_state"
トランジションは好きなだけ作成でき、
TCLスクリプトの最後にあります。
それが何であるかを見てみましょう。
このコマンドの一般的な構文は次のとおりです。
set array(CURRSTATE, curr_event) “act_proc NEXTSTATE”
ここで:
arrayは
FSMアレイの名前です。
CURRSTATEは、
curr_eventイベントが
受信される現在の状態の名前です。
act_proc -
curr_eventイベントを
受信したときに実行する必要がある関数の名前。
NEXTSTATEは、
act_procの実行後に確立される状態の名前です。
言い換えれば、
FSMは、CiscoがAPIから
curr_eventで受信したイベントと
CURRSTATEで現在のステータスを比較するマーカーであり、FSMの移行で記述されている場合、
act_procプロシージャが
呼び出され、状態が
NEXTSTATEに変わります。
これで最も重要なことは、現在のイベントと状態が
同時に説明
されるすべての
FSM変遷と比較されるという
ことです。 つまり シスコの場合、FSMトランジションが配置される順序は重要ではなく、すべて非同期で処理されます。
機能
2番目のポイントは関数自体であり、スクリプトを初期化する前に記述する必要があります。
すべてのコマンドと状態の目的は、
ここからダウンロードできるtcl_ivr_2.0_programming_guideファイルで詳細に説明されています。スクリプトで直接使用するものについてのみ詳しく説明します。
1)スクリプトの初期化
TCL IVRスクリプトの先頭には、
initプロシージャが含まれてい
ます。私の例では、この関数は次のようになります。
proc init { } { puts "\n proc Init start" global param }
ここでは、基本的に、画面にコマンド
puts "..."とグローバル変数
paramの定義が表示されます
。スクリプトの初期化は、すべての関数の説明の後に行われ、
init関数の起動から始まります。 この単純なことが終わった後、すべてがもっと面白くなっています。
スクリプトの最後の実行可能行は、開始
FSM遷移および開始状態を決定するための行である必要があります。 私たちの場合、それは:
fsm define ivr_fsm CALLCOMES
これは、
FSMアレイの名前が
ivr_fsmに設定され、開始状態が
CALLCOMESであることを意味します。 初期化を終了すると、何が起こっているかが明確になります(願っています)。
2)ご挨拶
proc Play_Welcome { } { puts "\n\n IVR - proc Play_Welcome start \n\n" global playng_files global param global pattern global numbers global workingtime
ここですべてを詳しく説明します。
この手順の結果は、
leg setupack、leg procedure、leg connectコマンドによる着信回線のシスコへの
接続、および
メディアプレイleg_incomingコマンドによる着信回線への音楽ファイルの損失です。
押されたキー、
leg collectdigit 、および
タイマーを収集するプロセスは、
タイマー開始コマンドで
すぐに 開始されます。
そして、
GetDate関数を呼び出して、現在の稼働時間をチェックします。
proc GetDate { } { global workingtime
勤務時間かどうかに応じて、発信者に再生される音楽ファイルを変更します。
この例では、
fsm define ivr_fsm CALLCOMESとして開始状態が設定されている
ため 、3つの
FSMがすぐに開始されます。
set ivr_fsm(CALLCOMES,ev_setup_indication) "Play_Welcome, same_state" set ivr_fsm(CALLCOMES,ev_collectdigits_done) "CheckDestanation, same_state" set ivr_fsm(CALLCOMES,ev_named_timer) "GoToReception, same_state"
ev_setup_indicationイベントは、コールが到着すると発生し、
Play_Welcomeプロシージャが起動します。これは、押された数字の収集プロセスの開始とタイマーの開始を説明します。
サブスクライバーに音楽が再生されると、リバースタイマーレポートが開始されます。これは、
param(initialDigitTimeout)パラメーター(
set set param(initialDigitTimeout)15行のすぐ上に設定でき、15秒に設定できます
)によって設定されます。 ここでは指定されていません。その標準値は10秒です。その後、スクリプトは
ev_collectdigits_doneイベントを受け取り、
FSM移行で説明したように、
CheckDestanation関数が実行されます。
Play_Welcomeコマンドで開始されたタイマー:
完了後、
ev_named_timerイベントが生成され、次の
FSM移行によって処理されます。
set ivr_fsm(CALLCOMES,ev_named_timer) "GoToReception, same_state"
GoToReceptionプロシージャが
呼び出されます。
3)入力した番号を確認します
proc CheckDestanation { } { puts "\n\n IVR - proc CheckDestanation start \n\n" global playng_files global numbers global digit
発信者が番号をダイヤルした後に呼び出されるCheckDestanationプロシージャでは、ダイヤル中に受信した番号を設定と比較し、
fsm setstateコマンドを使用してスクリプトを適切な状態に変換します。
関数に分類されるすべての状態は、次のFSM遷移に分類されます。
set ivr_fsm(CALLCONNECTED,ev_setup_done) "CallIsConnect, same_state" set ivr_fsm(TORECEPTION,ev_media_done) "GoToReception, same_state" set ivr_fsm(TRYAGAIN,ev_media_done) "Play_TakeNumber, TRYING" set ivr_fsm(TRYING,ev_collectdigits_done) "CheckDestanation, same_state" set ivr_fsm(TRYING,ev_named_timer) "GoToReception, same_state"
順番に行きましょう。
1)したがって、最初に、キーストロークの収集手順の完了後に
CheckDestanation関数
が呼び出されます。
2)押されたキーに関する情報は、set digit [infotag get evt_dcdigits]コマンドを使用して数字変数に書き込まれます
同様に、状態変数に回線状態を書き込みます
3)次に、取得した結果を指定された変数と比較し、一致する場合はスクリプトの状態を変更します。
if {$digit == $numbers(fast_reception)} { puts "\n\n IVR - proc CheckDestanation digit = $digit\nGoing to next reception \n\n" fsm setstate CALLCONNECTED leg setup $numbers(reception) callinfo leg_incoming }
4)発信者番号の確認
proc CheckCallersAndConnect {digit} { puts "\n\n IVR - proc CheckCallersAndConnect start \n\n" set callernumber [infotag get leg_ani] switch $callernumber { "9120000000" {set callInfo(displayInfo) "Director(mobile)"} "9130000000" {set callInfo(displayInfo) "Buhgalter(mobile)"} default {} } puts "\n\n IVR - caller is $callernumber connect with $digit\n\n" leg setup $digit callInfo leg_incoming }
この関数を使用すると、呼び出し元の名前を書き込むためのフィールドを変更できます。 審美性のためだけに、電話番号だけでなく加入者IDも書かれていると、より良いものになります。 加入者IDを変更した後、回線は目的の番号に接続されます。
5)番号を接続する
proc CallIsConnect { } { puts "\n\n IVR - proc CallIsConnect start \n\n" global playng_files
この関数は、次のFSM遷移によって呼び出されます。
set ivr_fsm(CALLCONNECTED,ev_setup_done) "CallIsConnect, same_state"
ev_setup_doneイベントは、呼び出し元が必要な回線に接続した後に発生します。
6)再リクエスト番号
proc Play_TakeNumber { } { puts "\n\n IVR - proc Play_TakeNumber start \n\n" global playng_files global numbers global param global pattern
この関数は、呼び出し元が間違っている回数をチェックし、値が
$数値(max_try)未満の場合、番号の再入力
を求めます。
この関数は、次の
FSMによって呼び出されます。
set ivr_fsm(TRYAGAIN,ev_media_done) "Play_TakeNumber, TRYING" set ivr_fsm(TRYING,ev_collectdigits_done) "CheckDestanation, same_state" set ivr_fsm(TRYING,ev_named_timer) "GoToReception, same_state"
7)接続の切断
proc AbortCall { } { puts "\n\n IVR - proc AbortCall start \n\n" call close }
次の
FSMによって呼び出されます。
set ivr_fsm(any_state,ev_disconnected) "AbortCall, same_state" set ivr_fsm(CALLACTIVE,ev_disconnected) "AbortCall, CALLDISCONNECTED" set ivr_fsm(CALLDISCONNECTED,ev_disconnected) "AbortCall, same_state" set ivr_fsm(CALLDISCONNECTED,ev_media_done) "AbortCall, same_state" set ivr_fsm(CALLDISCONNECTED,ev_disconnect_done) "AbortCall, same_state"
8)接続スクリプト
Ciscoルーターへの接続は2段階で行われます。
最初に行うことは、
アプリケーションを定義すること
です :
application service voicemunu flash:voicemenu.tcl param allowed_pattern 5[5-7].. param fastto_reception 1 param reception_number 5501 param fastto_ckp 2 param ckp_number 5604 param fastto_fax 3 param fax_number 5555 param waiting_time 20 param max_try 3 param file_noanswer flash:en_noanswer.au param file_after flash:en_after.au param file_noexist flash:en_noexist.au param file_busy flash:en_busy.au param file_welcome flash:en_welcome.au param file_onhold flash:music-on-hold.au param file_noworking flash:en_takenumber2.au param file_takenumber flash:en_takenumber2.au
次に 、
サービスを
ダイヤルピアに接続し
ます 。
dial-peer voice 200 pots description -= ISP Beeline - INcoming call to number 3300100 =- service voicemunu incoming called-number 3300100
したがって、コールが3300100に到着すると、
voicemunu音声メニューが呼び出さ
れます。
9)スクリプトのフルバージョン
上記では、スクリプトの基本的な機能のみを検討し、次に全文を検討しました。これはほとんど最も簡単なオプションであることに留意してください。