Содержание

Настройка Астериск для работы "параллельных" телефонов

Область применения

У меня возникла ситуация, когда абоненты имеют несколько телефонов и все они должны работать "параллельно". У одного абонента два телефонных аппарата в разных комнатах, и еще некоторые пользуются кроме стационарного телефонного аппарата еще и программные телефоны на своих мобильниках.

Канонический способ

Согласно документации Астериск позволяет подключать несколько аппаратов с одним и тем же аккаунтом на них и они должны работать одновременно - одновременно принимать входящие и обрабатывать исходящие звонки. Для того, чтоб это работало должны быть выполнены следующие условия:

  1. для подключения телефонов должен использоватся канальный модуль chan_pjsip
  2. в настройках аккаунтов в файле pjsip.conf в разделе AOR нужно указать значение max_contacts больше 1
...
[template_aor](!) ;В данном случае определяем шаблон Address Of Records
type=aor
max_contacts=2 ;Максимальное число телефонов подключенных к аккаунту
...

Данный метод может оказаться неподходящим, если абоненту нужно иметь разные номера телефонов.

А в моем случае это не сработало видимо из-за какого-то бага в моей установке Астериск. Подключенные таким способом аппараты не звонили одновременно. Звонок приходил только на один телефон, как я разобрался только на первый контакт в списке SIP-контактов в Астериск (контакты можео увитеть с помощью команды Астериск CLI: pjsip show contacts).

Метод 1 (использование префикса)

Этот способ хорошо подходит для случая, если у абонента есть стационарный аппарат и одновременно подключенный к Астериск мобильный.

Делаем для абонента два SIP-аккаунта: первый (к примеру 111) будет на стационарном телефоне, а второй с таким же номером, но с добавленным префиксом (например префиксом будет 0, а номер аккаунта 0111). Затем в диалплане (extensions.conf) в команду Dial добавляем вызов еще и номера с префиксом

exten => _1XX,n,Dial(PJSIP/${EXTEN}&PJSIP/0${EXTEN}) 

В принципе вполне рабочий способ, но на аккаунты без параллельных телефонов будет выводить в консоль Астериск ругань. Это никак не влияет на работу АТС, но отвлекает во время отладки. Кроме того не подходит для случая, когда два телефона с номерами не вписывающимися в схему с префиксом.

Для второго (и всех последующих, если имеются) аккаунта абонента в настройках endpoint в pjsip следует сделать настройку callerid, с указанием первого(основного) номера абонента. Так для аккаунта 0111 нужно вписать:

callerid=Имя Абонента <111>

Есть способ устранить ругань в консоли для аккаунтов без параллельных телефонов, правда он несколько загромождает диалплан

exten => _1XX,n,ChanIsAvail(PJSIP/0${EXTEN},s) ;Проверка подключен ли дополнительный номер
exten => _1XX,n,GotoIf($[${AVAILSTATUS} != 1] ?noalias)
exten => _1XX,n,Set(alias_${EXTEN}=&PJSIP/0${EXTEN})
exten => _1XX,n(noalias),Dial(PJSIP/${EXTEN}${alias_${EXTEN}})

Метод 2 (использование переменных в диалплане)

Данный способ больше, чем предыдущий подходит к случаям, если у абонента несколько телефонов в разных комнатах. Хотя для мобильных клиентов тоже подходит.

Пусть у нас есть абонент с двумя телефонными номерами: 111 и 222 В файле extensions.conf в секции globals вписываем на каждого абонента с несколькими телефонами переменные следующего вида:

alias_111=&PJSIP/222
alias_222=&PJSIP/111

Затем в месте вызова Dial пишем такую конструкцию:

exten => _XXX,n,Set(aliasname=alias_${EXTEN})
exten => _XXX,n,Dial(PJSIP/${EXTEN}${${aliasname}})

Здесь мы присваиваем переменой aliasname название имени переменной, содержащей дополнительные адреса абонента. Затем в вызове Dial добавляем значение переменной имя которой содержится в aliasname (да-да, жуткое двойное разименование ${${aliasname}}).

Можно и в одну строку:

exten => _XXX,n,Dial(PJSIP/${EXTEN}${${alias_${EXTEN}}})

Финт ушами с callerid как в предыдущем методе стоит сделать и здесь тоже.

Метод 3 (использование ветвления в диалплане)

Этот способ сильно загромождает диалплан (особенно если нужно много параллельных телефонов), поэтому привожу его только для полноты картины.

exten => _XXX,n,GotoIf($[${EXTEN} != 111]?NEXT_XXX) ;если звонят на 111, то звонит и 222
exten => _XXX,n,Set(ADDEXTEN=&PJSIP/222)
exten => _XXX,n,Goto(NEXT_XXX)
exten => _XXX,n,GotoIf($[${EXTEN} != 111]?NEXT_XXX) ;если звонят на 222, то звонит и 111
exten => _XXX,n,Set(ADDEXTEN=&PJSIP/111)
exten => _XXX,n(NEXT_XXX),Dial(PJSIP/${EXTEN}${ADDEXTEN})