Asterisk IVR:如何在不使用“i”扩展名的情况下定义/有效密钥?

时间:2013-10-31 16:02:57

标签: validation asterisk ivr

我正在使用Asterisk IVR进行组织内部调查(我们的员工通过按键调用并回答几个问题)。按键被立即转储到数据库中,并不实际连接到扩展或IVR菜单结构。现在,我在没有任何AGI脚本的情况下这样做,如果可能的话,我希望保持这种状态。

示例:

[from-internal-custom]
exten => 1234,1,Answer
exten => 1234,2,Wait(1)
exten => 1234,3,Playback(custom/Welcome_message) 
exten => 1234,4,Authenticate(0000) 
exten => 1234,5,Goto(MyCustomApp,s,1)

[MyCustomApp]
exten => s,1,Set(TIMEOUT(digit)=7)
exten => s,n,Set(TIMEOUT(response)=10)
exten => s,n,Playback(custom/QA1) 
exten => s,n,Read(QA1,beep,1,,3,5) 
exten => s,n,SayDigits(${QA1}) 
exten => s,n,MYSQL(Connect connid 127.0.0.1 DB_USER DB_PASS DB_NAME)
exten => s,n,MYSQL(Query r ${connid} Insert Into question_answers SET question_id='0', user_id=${CALLERID(num)}, result=${QA1}) 

[... more questions and finally hangup ...]

现在的问题是,如果QA1的播放指示呼叫者“按1表示是或2表示否”,但是用户按3,则3被转储到数据库中,这显然没有用。如何限制每个问题的允许密钥?我知道“i”扩展,但我想这不会让我到处都是。有没有办法准确指定哪些键是允许的,哪些不是?最好不要把头包在AGI周围?有些问题是肯定/没有问题,但其他一些问题有更多选择(“如果x小于100按1,小于200按2,小于300按3”等等。)

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你做得很奇怪。只需使用GotoIF就可以将2以上的数据转储到数据库中,你就可以了。

您也可以使用WaitExten& Background

 exten => s,n,Background(message);play message
 exten => s,n,WaitExten(10);wait upto 10 sec for input
 exten => s,n,Noop(no input here)

 exten => 1,1,Noop(1 choice)
 exten => 2,2,Noop(2 choice)

答案 1 :(得分:0)

这就是我完成所需工作的方式(例如,对于选项1,2,3和4的问题):

[...]

exten => s,3,Playback(custom/QA1)
exten => s,4,Read(QA1,beep,1,,3,5)
exten => s,5,SayDigits(${QA1})
exten => s,6,GotoIF($[ "${QA1}" = "1" | "${QA1}" = "2" | "${QA1}" = "3"  | "${QA1}" = "4" ]?s,9:s,7)
exten => s,7,Playback(pbx-invalid)
exten => s,8,Goto(s,3)
exten => s,9,MYSQL(Connect connid 127.0.0.1 USER PASSWORD DB)
exten => s,10,MYSQL(Query r ${connid} Insert Into TABLE_NAME SET question_id='0', user_id='${CALLERID(num)}', result='${QA1}')

[...]