Рисую макрос для IVR, ибо слишком много каналов входящих:
[ Context 'macro-hello' created by 'pbx_config' ]
's' => 1. Answer() [pbx_config]
2. Wait(1) [pbx_config]
3. Read(RESPONSE,dial-exten-tone&vm-reachoper,3,,,10) [pbx_config]
4. Goto(s-${RESPONSE:0:1},1) [pbx_config]
5. Verbose(${GOSUB_RESULT}) [pbx_config]
6. Macro(dahdilg,226) [pbx_config]
's-2' => 1. Macro(dahdilg,${RESPONSE}) [pbx_config]
[ Context 'testing' created by 'pbx_config' ]
'500' => 1. Macro(hello) [pbx_config]
'i' => 1. Answer() [pbx_config]
2. Playback(pbx-invalid) [pbx_config]
Хочу получить обработку неверно введённого номера, к примеру, начинающегося на 5 в макросе hello. К сожалению, экстеншн 'i' в этом макросе не обрабатывается:
[ Context 'macro-hello' created by 'pbx_config' ]
'i' => 1. Answer() [pbx_config]
2. Playback(pbx-invalid) [pbx_config]
's' => 1. Answer() [pbx_config]
2. Wait(1) [pbx_config]
3. Read(RESPONSE,dial-exten-tone&vm-reachoper,3,,,10) [pbx_config]
4. Goto(s-${RESPONSE:0:1},1) [pbx_config]
5. Verbose(${GOSUB_RESULT}) [pbx_config]
6. Macro(dahdilg,226) [pbx_config]
's-2' => 1. Macro(dahdilg,${RESPONSE}) [pbx_config]
с сообщением:
[Oct 11 16:16:28] -- Goto (macro-hello,s-5,1)
[Oct 11 16:16:28] -- Auto fallthrough, channel 'SIP/102-0000002a' status is 'UNKNOWN'
Прочитав про
invalid extension, я понял, что просто так нельзя получить доступ к этому экстеншну.
Тогда я обратил своё внимание на команду
Gosub. Из описания:
Jump to a particular priority, extension, or context, saving the return address.
Т.е., если я правильно понимаю, сия команда прыгает по адресу, а потом, возвращается назад. При этом
Return Codes
Returns 0, or -1 if the given context, extension, or priority is invalid.
1.6 if return is called with a value it is stored in ${GOSUB_RETVAL}
, т.е. если не найдётся экстеншн s-${RESPONSE:0:1}, то после входа в эту команду, мы должны как-то получить 0 или -1. Смотрим:
[ Context 'macro-hello' created by 'pbx_config' ]
's' => 1. Answer() [pbx_config]
2. Wait(1) [pbx_config]
3. Read(RESPONSE,dial-exten-tone&vm-reachoper,3,,,10) [pbx_config]
4. Gosub(s-${RESPONSE:0:1},1) [pbx_config]
5. Verbose(${GOSUB_RESULT}) [pbx_config]
6. Macro(dahdilg,226) [pbx_config]
's-2' => 1. Macro(dahdilg,${RESPONSE}) [pbx_config]
и пытаемся позвонить:
[Oct 11 16:26:23] -- Executing [s@macro-hello:4] Gosub("SIP/102-0000002b", "s-5,1") in new stack
[Oct 11 16:26:23] ERROR[866]: app_stack.c:402 gosub_exec: Attempt to reach a non-existent destination for gosub: (Context:macro-hello, Extension:s-5, Priority:1)
на этом выполнение команды прерывается. Т.о. не только не наблюдается возврат в точку 5. экстеншна 's', но и непонятно, как вообще получить этот самый код возврата.
В чём моя ошибка?