Как стать автором
Обновить

Быстрый набор в asterisk

Дома уже давно использую ip-телефонию вместо простого стационарного аппарата, и решил сделать себе «быстрый набор».


Быстрый набор при использовании сотового телефона — обычно это просто нажатие одной из десяти цифр на клавиатуре, и он сразу позвонит на определенный номер. Мы будем реализовывать быстрый набор «через звездочку». Что хотелось получить:
  • *2 — быстрый набор на номер из «второй ячейки»;
  • **2 84957555755 — записать нужный номер во «вторую ячейку».

Получилось простое решение, которое дописал в контекст исходящих вызовов:
exten => _*X,1,Goto(${DB(fastdial/${CALLERID(num)}/${EXTEN:1})},1)
exten => _**X.,1,Set(DB(fastdial/${CALLERID(num)}/${EXTEN:2:1})=${EXTEN:3})

Первая строка — берет номер из внутренней базы данных, в моей ситуации из «fastdial/101/2», и возвращается в этот-же контекст, «как будто мы набрали этот номер».
Вторая строка — умеет сохранять в эту-же ячейку во внутренней базе данных.

После этого захотелось небольшой интерактивности:
  • чтоб он мог проговаривать номер, на который установлен быстрый набор;
  • возможность удаления быстрого набора
  • если пытаюсь позвонить на не установленную цифру быстрого набора — сообщал мне об этом.


Получилось такое:
; fast dial 10
exten => _*X,1,GotoIf($[ "${DB(fastdial/${CALLERID(num)}/${EXTEN:1})}" != "" ]?${DB(fastdial/${CALLERID(num)}/${EXTEN:1})},1)
exten => _*X,n,Playback(tt-weasels) ; если не установлен быстрый набор - произносим об этом сообщение

; установка быстрого набора, **2 84957555755
exten => _**X.,1,Set(DB(fastdial/${CALLERID(num)}/${EXTEN:2:1})=${EXTEN:3})
exten => _**X.,n,Playback(auth-thankyou) ; говорим "спасибо" за то что установили быстрый набор

; удаление быстрого набора, **2 0
exten => _**X0,1,NoOp(${DB_DELETE(fastdial/${CALLERID(num)}/${EXTEN:2:1})})
exten => _**X0,n,Playback(vm-deleted) ; говорим что "номер удален"

; произнесение номера, куда установлен быстрый набор, **2
exten => _**X,1,Answer
exten => _**X,n,Wait(2)
exten => _**X,n,SayDigits(${DB(fastdial/${CALLERID(num)}/${EXTEN:2:1})})


Появились дополнительные возможности:
  • *2 0 — удалить клавишу быстрого набора;
  • *2 — произнести номер, на который установлен быстрый набор;
  • и научили говорить о выполненных событиях.

Примечание: у меня дома используется голосовой шлюз AddPac 190, и для быстрого набора пришлось немного дописать настройки, и изменить диал-план, чтоб не было паузы после набора номера:
В режиме конфигурирования:
dial-peer ipaddr-prefix n
!
dial-peer voice 14 voip
 destination-pattern [*][0-9]
 session target sip-server
 session protocol sip
 voice-class codec 1
 dtmf-relay rtp-2833
 no vad
!
dial-peer voice 15 voip
 destination-pattern [*][*]T
 session target sip-server
 session protocol sip
 voice-class codec 1
 dtmf-relay rtp-2833
 no vad
!

Первая строка — по умолчанию у адпаков включен «прямой набор» по ip-адресу, когда можно набрать *192*168*1*1*5060, и позвонить по sip на этот адрес. Отключаем.
Остальное — правим диал-план, чтоб не было ожидания после набора короткой комбинации *X.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.