Re: IVR не правильно воспринимает входные данные
Добавлено: 11 авг 2014, 21:53
идей море - но проще посмотреть одним глазком чем гадать неделю
Русский форум Asterisk сообщества
https://forum.asterisk.ru/
Код: Выделить всё
[ Context 'ivr-1' created by 'pbx_config' ]
'0' => 1. Goto(ivr-1,s,1) [pbx_config]
'1' => 1. Goto(ext-queues,301,1) [pbx_config]
'2' => 1. Goto(ext-queues,302,1) [pbx_config]
'4' => 1. Goto(ext-queues,303,1) [pbx_config]
'5' => 1. Goto(ext-queues,304,1) [pbx_config]
'h' => 1. Hangup() [pbx_config]
'hang' => 1. Playback(vm-goodbye) [pbx_config]
2. Hangup() [pbx_config]
'i' => 1. Set(INVALID_LOOPCOUNT=$[${INVALID_LOOPCOUNT}+1]) [pbx_config]
2. GotoIf($[${INVALID_LOOPCOUNT} > 3]?final) [pbx_config]
3. Set(IVR_MSG=custom/invalidnumber_002) [pbx_config]
4. Goto(s,start) [pbx_config]
[final] 5. Playback(custom/invalidnumber_002) [pbx_config]
6. Goto(app-blackhole,hangup,1) [pbx_config]
'return' => 1. Set(_IVR_CONTEXT=${CONTEXT}) [pbx_config]
2. Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT_${CONTEXT}}) [pbx_config]
3. Set(IVR_MSG=custom/Privetstvie_002) [pbx_config]
4. Goto(s,start) [pbx_config]
's' => 1. Set(TIMEOUT_LOOPCOUNT=0) [pbx_config]
2. Set(INVALID_LOOPCOUNT=0) [pbx_config]
3. Set(_IVR_CONTEXT_${CONTEXT}=${IVR_CONTEXT}) [pbx_config]
4. Set(_IVR_CONTEXT=${CONTEXT}) [pbx_config]
5. Set(__IVR_RETVM=) [pbx_config]
6. GotoIf($["${CDR(disposition)}" = "ANSWERED"]?skip) [pbx_config]
7. Answer() [pbx_config]
8. Wait(1) [pbx_config]
[skip] 9. Set(IVR_MSG=custom/Privetstvie_002) [pbx_config]
[start] 10. Set(TIMEOUT(digit)=3) [pbx_config]
11. ExecIf($["${IVR_MSG}" != ""]?Background(${IVR_MSG})) [pbx_config]
12. WaitExten(10,) [pbx_config]
't' => 1. Set(TIMEOUT_LOOPCOUNT=$[${TIMEOUT_LOOPCOUNT}+1]) [pbx_config]
2. GotoIf($[${TIMEOUT_LOOPCOUNT} > 2]?final) [pbx_config]
3. Set(IVR_MSG=custom/invalidnumber_002&custom/Privetstvie_002) [pbx_config]
4. Goto(s,start) [pbx_config]
[final] 5. Playback(custom/timeout_002) [pbx_config]
6. Goto(app-blackhole,hangup,1) [pbx_config]
Include => 'ivr-1-custom' [pbx_config]
Include => 'from-did-direct-ivr' [pbx_config]
Затем, почемуто в фоновом режиме играется сообщение, о том что пользователь ввел неверную комбинацию, но т.к. сообщение в фоне то пока оно играется поступает 11(оставшееся от 611) и звонок без проблем улетает на внутренний номер 11. Вот в этом и косяк. Если бы в самом начале была команда Set(TIMEOUT(digit)=3) или сообщение воспроизодилось не в фоне а Playback то косяка бы не было.http://asterisk.ru/knowledgebase/Asterisk+cmd+DigitTimeout
Команда DigitTimeout() - вместо нее, используйте: 'Set(TIMEOUT(digit)=timeout)' -
Обратите внимание, что если пользователь ввел последовательность цифр, которые представляют собой правильный номер екстеншена, то ввод будет сразу же завершен, без ожидания, заданного этой командой, времени. Следовательно, факт возникновения этого таймаута означает, что, возможно, набран неполный или неправильный номер и этот факт следует учесть при дальнейшей обработки ввода пользователя.