Вопрос или проблема
У меня есть установка FreePBX 15. Я успешно добавил несколько внутренних номеров.
Числа включают некоторые трехзначные номера и ‘1’ внутренний номер, который является обычным IP-телефоном, как и другие, с точно такой же конфигурацией.
Я могу звонить им без проблем. Я также настроил IVR, который не имеет записей, он просто позволяет напрямую набирать все внутренние номера. Это работает для всех, кроме ‘1’.
Пример для ‘213’:
app_read.c: Пользователь ввел '213'
VERBOSE[6729][C-00000003] pbx.c: Выполнение [s@ivr-1:10] GotoIf("PJSIP/x-00000002", "0?#,1") в новом стеке
VERBOSE[6729][C-00000003] pbx.c: Выполнение [s@ivr-1:11] GotoIf("PJSIP/x-00000002", "0?t,1") в новом стеке
VERBOSE[6729][C-00000003] pbx.c: Выполнение [s@ivr-1:12] ExecIf("PJSIP/x-00000002", "1?Set(LOCALEXT=1)") в новом стеке
VERBOSE[6729][C-00000003] pbx.c: Выполнение [s@ivr-1:13] GotoIf("PJSIP/x-00000002", "0?i,1") в новом стеке
VERBOSE[6729][C-00000003] pbx.c: Выполнение [s@ivr-1:14] GotoIf("PJSIP/x-00000002", "1?from-did-direct-ivr,2137,1") в новом стеке
VERBOSE[6729][C-00000003] pbx_builtins.c: Переход (from-did-direct-ivr,213,1)
И вызов проходит успешно. Однако для ‘1’:
app_read.c: Пользователь ввел '1'
VERBOSE[10123][C-00000004] pbx.c: Выполнение [s@ivr-1:10] GotoIf("PJSIP/x-00000003", "0?#,1") в новом стеке
VERBOSE[10123][C-00000004] pbx.c: Выполнение [s@ivr-1:11] GotoIf("PJSIP/x-00000003", "0?t,1") в новом стеке
VERBOSE[10123][C-00000004] pbx.c: Выполнение [s@ivr-1:12] ExecIf("PJSIP/x-00000003", "1?Set(LOCALEXT=1)") в новом стеке
VERBOSE[10123][C-00000004] pbx.c: Выполнение [s@ivr-1:13] GotoIf("PJSIP/x-00000003", "1?i,1") в новом стеке
VERBOSE[10123][C-00000004] pbx_builtins.c: Переход (ivr-1,i,1)
VERBOSE[10123][C-00000004] pbx.c: Выполнение [i@ivr-1:1] Set("PJSIP/x-00000003", "INVALID_LOOPCOUNT=1") в новом стеке
Я получаю ошибку: недопустимый адрес
Я также пытался добавить запись IVR для ‘1’, чтобы перенаправить ее на внутренний номер ‘1’.
app_read.c: Пользователь ввел '1'
VERBOSE[6334][C-00000002] pbx.c: Выполнение [s@ivr-1:10] GotoIf("PJSIP/x-00000001", "0?#,1") в новом стеке
VERBOSE[6334][C-00000002] pbx.c: Выполнение [s@ivr-1:11] GotoIf("PJSIP/x-00000001", "0?t,1") в новом стеке
VERBOSE[6334][C-00000002] pbx.c: Выполнение [s@ivr-1:12] ExecIf("PJSIP/x-00000001", "1?Set(LOCALEXT=1)") в новом стеке
VERBOSE[6334][C-00000002] pbx.c: Выполнение [s@ivr-1:13] GotoIf("PJSIP/x-00000001", "0?i,1") в новом стеке
VERBOSE[6334][C-00000002] pbx.c: Выполнение [s@ivr-1:14] GotoIf("PJSIP/x-00000001", "1?from-did-direct-ivr,1,1") в новом стеке
VERBOSE[6334][C-00000002] pbx_builtins.c: Переход (from-did-direct-ivr,1,1)
WARNING[6334][C-00000002] pbx.c: Канал 'PJSIP/x-00000001' отправлен на недействительное расширение, но не обработчик недействительных: context,exten,priority=from-did-direct-ivr,1,1
Когда я добавляю запись IVR для ‘2’, чтобы перенаправить на ‘1’, это работает:
app_read.c: Пользователь ввел '2'
VERBOSE[30910][C-00000012] pbx.c: Выполнение [s@ivr-1:10] GotoIf("PJSIP/x-00000011", "0?#,1") в новом стеке
VERBOSE[30910][C-00000012] pbx.c: Выполнение [s@ivr-1:11] GotoIf("PJSIP/x-00000011", "0?t,1") в новом стеке
VERBOSE[30910][C-00000012] pbx.c: Выполнение [s@ivr-1:12] ExecIf("PJSIP/x-00000011", "0?Set(LOCALEXT=1)") в новом стеке
VERBOSE[30910][C-00000012] pbx.c: Выполнение [s@ivr-1:13] GotoIf("PJSIP/x-00000011", "0?i,1") в новом стеке
VERBOSE[30910][C-00000012] pbx.c: Выполнение [s@ivr-1:14] GotoIf("PJSIP/x-00000011", "0?from-did-direct-ivr,2,1") в новом стеке
VERBOSE[30910][C-00000012] pbx.c: Выполнение [s@ivr-1:15] Goto("PJSIP/x-00000011", "2,1") в новом стеке
VERBOSE[30910][C-00000012] pbx_builtins.c: Переход (ivr-1,2,1)
VERBOSE[30910][C-00000012] pbx.c: Выполнение [2@ivr-1:1] Set("PJSIP/x-00000011", "__ivrreturn=0") в новом стеке
VERBOSE[30910][C-00000012] pbx.c: Выполнение [2@ivr-1:2] Goto("PJSIP/x-00000011", "from-did-direct,1,1") в новом стеке
VERBOSE[30910][C-00000012] pbx_builtins.c: Переход (from-did-direct,1,1)
Как видите, у вас нет внутреннего номера 1
недействительное расширение, но не обработчик недействительных: context,exten,priority=from-did-direct-ivr,1,1
Почему его нет – это другой вопрос. Я могу предложить вам найти контекст from-did-direct-ivr и посмотреть, там ли он.
Все файлы находятся в папке /etc/asterisk/
Примечание: from-did-direct-ivr и from-did-direct – это РАЗНЫЕ контексты.
Ответ или решение
Проблема, связанная с невозможностью маршрутизации звонков на номер «1» в вашем установлении FreePBX 15, используя IVR, требует глубокого теоретического и практического анализа, чтобы выявить и устранить причину сбоев. Давайте рассмотрим шаги, которые могут помочь исправить возникшую ситуацию:
Теория
В Asterisk, система обработки вызовов активно использует контексты для организации маршрутизации и обработки вызовов. Контекст определяет набор правил, которые диктуют, что должно произойти, когда поступает вызов. Если вызов не соответствует ни одному правилу в контексте, система отмечает это как «недействительное направление» (invalid extension).
В случае стандартного IP-телефона, для успешного маршрута вызова необходимо, чтобы в соответствующем контексте было наличие определения номера. Очевидно, из вашего пояснения: когда пользователь вводит «1», вы получаете сообщение об ошибке «invalid extension» в контексте от ivr, что означает, что в текущем контексте нет обработки для введенного номинала.
Пример
Из рассмотренных логов видно, что система FreePBX и Asterisk некорректно обрабатывают ввод цифры «1», что приводит к переходу в контекст с отсутствующим маршрутом для «1». Рассмотрим часть лога:
WARNING[6334][C-00000002] pbx.c: Channel 'PJSIP/x-00000001' sent to invalid extension but no invalid handler: context,exten,priority=from-did-direct-ivr,1,1
Этот логный сегмент указывает, что в контексте from-did-direct-ivr
, где предполагается обработка «прямого вызова», номер «1» не обрабатывается, в отличие от других номеров, таких как «213». Проблема еще и в том, что пользователь уже внес IVR-переход к внешнему контексту from-did-direct-ivr
, но обработки, тем не менее, не происходит корректно.
Применение
-
Проверка конфигурации Контекста: Проверьте, существует ли в действительности контекст
from-did-direct-ivr
для определения номера «1». Нужно удостовериться, что указанный контекст содержит необходимые инструкции для направления вызова. Все необходимые файлы находятся в директории/etc/asterisk/
. -
Обновление и отладка маршрутизации: Убедитесь, что Asterisk находит и использует правильные контексты при прямой маршрутизации вызовов. Используйте команды консоли Asterisk для отладки:
asterisk -r dialplan show from-did-direct-ivr
Это покажет вам конфигурацию и последовательность, чтобы проверить, существует ли направляющее правило для номера «1».
-
Создание или правка правила: Если этого правила нет, добавьте вручную следующее в соответствующий конфигурационный файл (например,
extensions_custom.conf
):[from-did-direct-ivr] exten => 1,1,Goto(from-did-direct,1,1)
Этим вы создадите прямую маршрутизацию для входящего вызова с введенной цифрой «1» к существующему внутреннему определению.
-
Перезагрузка конфигурации: После внесения изменений, не забудьте перезагрузить конфигурацию диалплана Asterisk, чтобы изменения вступили в силу:
asterisk -rx "dialplan reload"
-
Проверка корректности определения прав доступа: Проверьте, что у всех участников (включая ваш IP-телефон) есть соответствующие права доступа на использование и набор в рамках предоставленного контекста.
Эти шаги помогут устранить проблему маршрутизации вызовов на IP-телефон с номером ‘1’ в вашей системе и обеспечат корректную работу IVR. Работая с контекстами и маршрутными таблицами Asterisk, важно понимать логику и нюансы работы системы маршрутизации, чтобы эффективно управлять вызовами и устранять возможные сбои.