====== Настройка Астериск для работы "параллельных" телефонов ====== ===== Область применения ===== У меня возникла ситуация, когда абоненты имеют несколько телефонов и все они должны работать "параллельно". У одного абонента два телефонных аппарата в разных комнатах, и еще некоторые пользуются кроме стационарного телефонного аппарата еще и программные телефоны на своих мобильниках. ===== Канонический способ ===== Согласно документации Астериск позволяет подключать несколько аппаратов с одним и тем же аккаунтом на них и они должны работать одновременно - одновременно принимать входящие и обрабатывать исходящие звонки. Для того, чтоб это работало должны быть выполнены следующие условия: - для подключения телефонов должен использоватся канальный модуль chan_pjsip - в настройках аккаунтов в файле 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}) {{tag>asterisk}}