Порядок исполнения диалплана - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть следующий контекст в моем плане набора звездочек.

[start-call]
exten => _X.,1,AGI(agi://localhost:4000)
exten => _X.,n,GotoIf($["${AGISTATUS}" = "FAILURE"]?redirect)
exten => _X.,1000(redirect),Hangup(31)    
exten => 900,n,Goto(start-call,${EXTEN},1)
exten => h,n,Hangup

У меня есть приложение AGI, которое подключает вызов и собирает входы DTMF, и устанавливаю этот номер в качестве добавочного номера с помощью команды SET EXTENSION agi (строка 1). Я установил AGISTATUS на FAILURE, только когда нет DTMF-входа. Если нет ввода, I таймаут и зависание (строка 3). Но если введено 900, я возвращаюсь в контекст начального вызова и выполняю некоторые действия в приложении AGI (строка 4).

Проблема в том, что прямо сейчас, даже если я ввожу 900, звонок просто зависает. И не из строки 3, а из последней строки. Так что его пропуск строки 4 как-то. Если я переместлю расширение 900 (строка 4) до того, которое помечено как redirect (строка 3), оно будет работать.

Я думал, что звездочка автоматически увеличивает приоритет ' n ' и ожидала, что это будет работать в порядке, указанном выше. Я здесь не прав?

Ответы [ 3 ]

3 голосов
/ 05 января 2012

n повторяется автоматически - добавляет 1 к предыдущему приоритету . По этой же причине вам необходимо инициализировать инкрементор с приоритетом 1 в первой строке.

Когда вы ставите приоритет 1000 где-то посередине (что полностью допустимо), следующая строка с n добавляет к этому 1, что приводит к приоритету 1001 - который никогда не срабатывает, как уже объяснено другими.

Ваш диалплан можно прочитать, как показано ниже:

[start-call]
exten => _X.,1,AGI(agi://localhost:4000)
exten => _X.,2,GotoIf($["${AGISTATUS}" = "FAILURE"]?redirect)
exten => _X.,1000(redirect),Hangup(31)    
exten => 900,1001,Something()                                          ; not 3!
exten => h,1,Hangup

Чтобы исправить это, вы должны либо переупорядочить свои расширения, как объяснено другими, либо использовать оператор + для приоритетов:

[start-call]
exten => _X.,1,AGI(agi://localhost:4000)                               ; 1
exten => _X.,n,GotoIf($["${AGISTATUS}" = "FAILURE"]?redirect)          ; 2
exten => _X.,n+1000(redirect),Hangup(31)                               ; 1002
exten => 900,n,Something()                                             ; 3
exten => h,1,Hangup

Кстати, вы также можете использовать текстовые метки в качестве расширений, что сделает ваши диалпланы более читабельными:

[start-call]
exten => _X.,1,AGI(agi://localhost:4000)                               ; 1
exten => _X.,n,GotoIf($["${AGISTATUS}" = "FAILURE"]?agi_failure,1)     ; 2
exten => 900,n,Something()                                             ; 3

exten => agi_failure,1,DoSomething()
exten => agi_failure,n,DoEvenMore()

exten => h,1,Hangup
1 голос
/ 29 декабря 2011

Диалплан должен быть последовательным.Ext 1000 никогда не срабатывает - следовательно, звездочка падает до h exten.

0 голосов
/ 03 января 2012

Да, диалплан должен быть последовательным, и как только вы начинаете серию "n", вам нужно придерживаться ее. Я предполагаю, что расширение 900 является примером ввода DTMF - это новое расширение всегда должно начинаться с приоритетом 1. Расширение «h» также должно начинаться с приоритетом 1

[start-call]
exten => _X.,1,AGI(agi://localhost:4000)
exten => _X.,n,GotoIf($["${AGISTATUS}" = "FAILURE"]?redirect)
exten => _X.,n,**if input received do something here**
exten => _X.,n(redirect),Hangup(31)    

exten => 900,1,Goto(start-call,${EXTEN},1)
exten => h,1,Hangup
...