Страница 1 из 2

Оптимизация dialplan'а

Добавлено: 28 май 2020, 12:19
diman321
Всем доброго дня!

Есть такая схема: АТС - е1 - cisco_voip - sip - asterisk. На атс некоторые номера заворачивают на е1, в циске прописан диал-пир который всё приходящее по е1 засылает на asterisk по сипу. Схема работает, всё нормально. Проблема в том, что нет никакого четкого плана нумерации и на астера могут зарулить любой номер (номера семизначные), абоненты при этом должны звонить другим абонентам как внутри астера, так и с астера на атс по полным семизначным номерам. Поэтому имею некую проблему с тем, что не могу нормально написать dialplan в extension.conf.

Сейчас реализовал это так:

Код: Выделить всё

[call-out]
exten => _72101,1,Dial(SIP/${EXTEN})
exten => _72136,1,Dial(SIP/${EXTEN})
exten => _72201,1,Dial(SIP/${EXTEN})
exten => _XXXXX,1,Dial(SIP/${EXTEN}@CISCO_GW)
Т.е. при заведении нового абонента приходится добавлять новую строчку в extension.conf. Можно ли как-то оптимизировать этот процесс указав, что если звонок идет с внутреннего номера астера на внутренний номер астера его не надо засылать на циску? Подскажите куда копать, что прочитать.

Re: Оптимизация dialplan'а

Добавлено: 28 май 2020, 14:33
ded
diman321 писал(а):на астера могут зарулить любой номер (номера семизначные),
Тут у вас вроде 5-ти значные?
Книга о будущем телефонии, Глава 6.

Код: Выделить всё

[call-out]
exten => _72XXX,1,Dial(SIP/${EXTEN},,t)
exten => _ZXXXX,1,Dial(SIP/CISCO_GW/${EXTEN},,t)
Не надо бы использовать формулу SIP URI
Dial(SIP/${EXTEN}@CISCO_GW)
лучше
Dial(SIP/CISCO_GW/${EXTEN})

Re: Оптимизация dialplan'а

Добавлено: 03 июн 2020, 10:10
diman321
Книга о будущем телефонии, Глава 6.

Код: Выделить всё

[call-out]
exten => _72XXX,1,Dial(SIP/${EXTEN},,t)
exten => _ZXXXX,1,Dial(SIP/CISCO_GW/${EXTEN},,t)
В этой главе написано, что правила отрабатываются по более полному совпадению. Если рассматривать конкретный пример, абонент с астера набирает номер 72555 который находится на АТС. Как в данном случае отработает алгоритм? Я думал, что оно пойдёт по первой строчке и до второй не дойдёт.

Re: Оптимизация dialplan'а

Добавлено: 04 июн 2020, 14:16
ded
Я думал - звучит хорошо! Cogito - ergo sum. Мыслю - следовательно существую. В этом случае действительно пойдёт по первой строчке Dial(SIP/${EXTEN},,t), но перескочит на вторую строчку, если в первой будет отлуп.

Надо проверять как это Астериск понимает, командой
CLI> dialplan show 72555@call-out

Re: Оптимизация dialplan'а

Добавлено: 07 июн 2020, 08:21
diman321
Чую делаю что-то не так, но не перескакивает...

asterisk -rx 'dialplan show'
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:

Код: Выделить всё

[ Context '__func_periodic_hook_context__' created by 'func_periodic_hook' ]
  'beep' (CID match '') =>  1. Answer()                                   [func_periodic_hook]
                    2. Playback(beep)                             [func_periodic_hook]
  'hook' (CID match '') =>  1. Set(EncodedChannel=${CUT(HOOK_CHANNEL,-,1-2)}) [func_periodic_hook]
                    2. Set(GROUP_NAME=${EncodedChannel}${HOOK_ID}) [func_periodic_hook]
                    3. Set(GROUP(periodic-hook)=${GROUP_NAME})    [func_periodic_hook]
                    4. ExecIf($[${GROUP_COUNT(${GROUP_NAME}@periodic-hook)} > 1]?Hangup()) [func_periodic_hook]
                    5. Set(ChannelToSpy=${URIDECODE(${EncodedChannel})}) [func_periodic_hook]
                    6. ChanSpy(${ChannelToSpy},qEB)               [func_periodic_hook]

[ Context 'from-cisco' created by 'pbx_config' ]
  '_XXXXX' =>       1. Dial(SIP/${EXTEN})                         [extensions.conf:17]

[ Context 'call-out' created by 'pbx_config' ]
  '_72XXX' =>       1. Dial(SIP/${EXTEN},,t)                      [extensions.conf:11]
  '_ZXXXX' =>       1. Dial(SIP/CISCO_GW/${EXTEN},,t)             [extensions.conf:12]
  Include =>        'handup-sip'                                  [pbx_config]

[ Context 'handup-sip' created by 'pbx_config' ]
  '_X!' =>          1. HangUp()                                   [extensions.conf:8]

[ Context 'default' created by 'pbx_config' ]

-= 6 extensions (12 priorities) in 5 contexts. =-

asterisk -rx 'dialplan show 72555@call-out'
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:

Код: Выделить всё

[ Context 'call-out' created by 'pbx_config' ]
  '_72XXX' =>       1. Dial(SIP/${EXTEN},,t)                      [extensions.conf:11]
  '_ZXXXX' =>       1. Dial(SIP/CISCO_GW/${EXTEN},,t)             [extensions.conf:12]
[ Included context 'handup-sip' created by 'pbx_config' ]
  '_X!' =>          1. HangUp()                                   [extensions.conf:8]


-= 3 extensions (3 priorities) in 2 contexts. =-
Проверял ещё так: когда звоню с абонента астера на 72555 слушаю tcpdump'ом интерфейс который идёт на циску, никакого трафика там не появляется. Когда звоню на номер который не попадает под маску _72XXX, например на 68192 - на интерфейсе появляется сип трафик в сторону циски. Из этого делаю вывод, что не перескакивает на _ZXXXX при отлупе на _72XXX. Клиент при звонке на 72555 говорит service unavailable. Чего я делаю не так?

Re: Оптимизация dialplan'а

Добавлено: 07 июн 2020, 23:14
ded
diman321 писал(а):Когда звоню на номер который не попадает под маску _72XXX, например на 68192 - на интерфейсе появляется сип трафик в сторону циски.
Но это и соответствует вашему условию
diman321 писал(а):если звонок идет с внутреннего номера астера на внутренний номер астера его не надо засылать на циску
Вы позвонили на 68192 - он пошёл по шаблону
'_ZXXXX' => 1. Dial(SIP/CISCO_GW/${EXTEN},,t) - появился сип трафик в сторону циски.
Позвонили на 72555 - пошёл на
'_72XXX' => 1. Dial(SIP/${EXTEN})
Что не так?

Re: Оптимизация dialplan'а

Добавлено: 08 июн 2020, 06:26
diman321
Всё так, кроме того, что 72555 не на астере, а на атс и судя по посту выше при звонке на него в строчке _72XXX' => 1. Dial(SIP/${EXTEN}) должен быть отлуп и переход на строчку ниже, а этого не происходит почему-то, ну или я не так понял. Я вот про это:
ded писал(а):Я думал - звучит хорошо! Cogito - ergo sum. Мыслю - следовательно существую. В этом случае действительно пойдёт по первой строчке Dial(SIP/${EXTEN},,t), но перескочит на вторую строчку, если в первой будет отлуп.

Re: Оптимизация dialplan'а

Добавлено: 08 июн 2020, 10:50
ded
Каждый понимает отлуп по своему. Я вот не знал, что 72555 не существует как пира SIP/72555.
Система отработает совершенно по разному если а) такой пир есть но он не доступен, и б) его нет в природе.
_72XXX' => 1. Dial(SIP/${EXTEN}) - здесь посмотрите по CLI что сообщает система при verbose 10. В вашем случае там будет выход как-бы вбок - Spawn extension (call-out, 72555, 1) exited non-zero, а не переход к следующему шаблону в контексте, и Hangup.

Варианты есть. Если должен быть отлуп и переход на другой шаблон, можно использовать обработку ответов и экстены
s-CONGESTION
s-NOANSWER
s-BUSY
или
application 'ChanIsAvail'

Код: Выделить всё

[Description]
This application will check to see if any of the specified channels are
available.
This application sets the following channel variables:
${AVAILCHAN}: The name of the available channel, if one exists
${AVAILORIGCHAN}: The canonical channel name that was used to create the
channel
${AVAILSTATUS}: The device state for the device
${AVAILCAUSECODE}: The cause code returned when requesting the channel

Re: Оптимизация dialplan'а

Добавлено: 08 июн 2020, 14:22
diman321
В случае с application 'ChanIsAvail' делаем так:

Код: Выделить всё

[call-out]
exten => _XXXXX,1,ChanIsAvail(SIP/${EXTEN}&SIP/CISCO_GW/${EXTEN})
exten => _XXXXX,2,Dial(${AVAILCHAN}),,t)
В правильном направлении мыслю?

Re: Оптимизация dialplan'а

Добавлено: 08 июн 2020, 14:58
ded
Иммануил Кант в своей работе "Критика чистого разума" разделил суждения на синтетические/аналитические и априорные/апостериорные.

* синтетические — суждения, несущие новое знание, отсутствующее в понятии, которое является их субъектом;
* аналитические — суждения, которые всего лишь раскрывают свойства, присущие понятию субъекта, содержащиеся в нём самом, и не несут нового знания;
* априорные суждения (лат. a priori, до опыта) не нуждаются в опытной проверке своей истинности,
* для апостериорных (лат. a posteriori, после опыта ) необходима эмпирическая верификация.

Исходя из этих определений посмотрите на то, как вы мыслите. Теорию (мануал) не читаете, примеры не смотрите, состояние переменных ${AVAILCHAN} ${AVAILSTATUS} в результате вызова через NoOp не проверяете.
Используется модель "волшебный порошок": вот так напишу диалплан - вдруг получится?
Или, " поможите, мы сами не местные, кто чем может - по строчке, а скопипастить я сумею, не сумлевайтесь!"

Что заставляет тут писать, вместо того, чтобы уже попробовать?