Перевод звонков в asterisk

Русификация голоса

По умолчанию, Asterisk может идти с набором голосовых записей на английском языке. Они находятся в каталоге /var/lib/asterisk/sounds/en. Для добавления русского голоса, открываем список языковых архивов и копируем ссылку на архив с нужным языком:

Используя ссылку, скачиваем архив:

wget https://downloads.asterisk.org/pub/telephony/sounds/asterisk-core-sounds-ru-wav-current.tar.gz

Создаем каталог для нашего языка:

mkdir /var/lib/asterisk/sounds/ru

Распаковываем архив в созданную папку:

tar -xvf asterisk-core-sounds-ru-wav-current.tar.gz -C /var/lib/asterisk/sounds/ru/

В конфигурационном файле sip.conf добавим:

vi /etc/asterisk/sip.conf

language=ru

Перечитаем конфигурацию:

asterisk -x «sip reload»

При необходимости, чтобы язык менялся только для определенной очереди, менять настройку нужно в диалплане:

vi /etc/asterisk/extensions.conf


exten => 111,n,Set(CHANNEL(language)=ru) 

И перезапустить dialplan:

asterisk -x «dialplan reload»

Настройка плана набора (dialplan)

Отправка звонка в очередь

Чтобы при звонке на нужный нам номер звонящий попадал в нашу очередь, добавляем правило в диалплане:

vi /etc/asterisk/extensions.conf

exten => 111,1,Answer()
exten => 111,n,Ringing
exten => 111,n,Wait(2)
exten => 111,n,Queue(support)
exten => 111,n,Hangup

* где:

  • Answer — установка соединения. С скобках может быть задан период задержки в миллисекундах.
  • Ringing — воспроизводим звонок, сигнализирующий ожидания взятие трубки.
  • Wait — ждем (в данном примере 2 секунды).
  • Queue — добавляем звонок в очередь.
  • HangUp — отбой.

* в данном примере, при звонке на короткий номер 111 мы услышим на 2 секунды звонок, сигнализирующий, что мы дозвонились; после абонент направляется в нашу очередь support.

Перечитываем конфиг:

asterisk -x «dialplan reload»

Приветствие

Для того, чтобы проиграло приветствие, редактируем наш диалплан, добавив функцию Playback после Answer:

exten => 111,1,Answer()
exten => 111,n,Playback(queue-callswaiting)
exten => 111,n,Ringing

* где queue-callswaiting — название файла из каталога /var/lib/asterisk/sounds/<язык>/.

Перечитываем конфигурацию:

asterisk -x «dialplan reload»

Приоритеты звонков

Мы можем создать два входящих номера, звонки на которые обрабатываются одной и той же очередью, но с разными приоритетами. Например, внутренние номера 120 и 130 — диалплан выглядит так:

exten => 120,1,Answer()
exten => 120,1,Playback(welcome)
exten => 120,n,Ringing
exten => 120,n,Wait(2)
exten => 120,2,SetVar(QUEUE_PRIO=100)
exten => 120,3,Queue(support)
exten => 120,n,Hangup
exten => 130,1,Answer()
exten => 130,1,Playback(welcome)
exten => 130,n,Ringing
exten => 130,n,Wait(2)
exten => 130,2,SetVar(QUEUE_PRIO=50)
exten => 130,3,Queue(support)
exten => 130,n,Hangup

* в данном примере, звонки на номер 120 являются более приоритетными; QUEUE_PRIO — собственно, и является переменной, в которой хранится значение приоритета звонка.

Создание временной группы

Далее создаются необходимые временные группы. Настройки производятся на вкладке Applications>Time Groups: в поле Description вводится описание временной группы — целесообразно в описании указывать временной диапазон, который будет использоваться. Затем настраиваются параметры времени: Time to start/Time to finish — время начала/окончания работы группы (время можно выставлять с точностью до минуты), Week Day start/Week Day finish — день недели началы/окончания работы. Для примера возьмем с понедельника по пятницу с 9:00 до 18:00.

После сохранения настроек созданные временные группы отображаются в правом верхнем углу окна. Здесь же находится кнопка Add Time Group при нажатии на которую открывается страница добавления новой временной группы.

Переадресация на мобильные

Заходим в веб-интерфейс, Applications => Ring Groups => Add Ring Group. Создаём группу переадресации на мобильные телефоны инженеров, например, «922»:

Решётка в конце номера даёт нам возможность звонить из основного контекста FreePBX, где позволены исходящие звонки. Fixed CID Value — нужно, если ваш провайдер отбивает неверные CID, потому что передаются внутренние номера абонентов. Стратегия RingAll позволяет звонить всем одновременно, если кто недоступен — пропускаем, если один берёт трубку — у остальных сразу сбрасывается звонок.

Лучше поставить приятную музыку на группу, так как в разных версиях FreePBX делает странные вещи с гудками в группах. Проверить правильность настройки можно позвонив по номеру 922.

Теперь создаём основную группу технической поддержки, например «911»:

Включение Skip Buzy Agent позволяет нам переходить сразу к Destination if no answer, если все сотрудники заняты.
В Destination if no answer выбираем группу переадресации на мобильные.

В итоге получилось, что звонок поступает на группу 911, если сотрудники заняты или никто не поднимает трубку несколько секунд, звонок переходит в группу 922. Поступив в 922, звонок пробует дозвониться сразу до всех перечисленных мобильных номеров, если никто не поднимает — происходит завершение вызова.

MEDIA & RTP Settings

Reinvite Behavior

Поведение ReInvite — см. подробнее >

  • yes: стандартный reinvite;
  • no: никогда не использовать reinvite;
  • nonat: дополнительная опция, разрешающая перенаправить медиа поток (reinvite), но только если пир установлен не за NATом (RTP может определить это на основе ИП адресов абонентов)
  • update: используется специальный SIP пакет UPDATE для принятия решения о перенаправлении вместо пакета INVITE. (Значение yes соответствует = update + nonat)

RTP Timers

rtptimeout. Завершает звонок если в установленное в секундах значение rtptimeout не обнаруживается активности RTP или RTCP в аудио канале и если абонент не поставлен на Hold (ожидание). Это позволяет завершить звонок в случае внезапного исчезновения телефона из сети, например при потере питания или повреждении кабеля Ethernet.

rtpholdtimeout. Завершает звонок если в установленное в секундах значение rtpholdtimeout не обнаруживается активности RTP или RTCP в аудио канале при состоянии on Hold (в ожидании). Значение должно быть > чем rtptimeout.

rtpkeepalive. Посылает пакеты rtpkeepalive в RTP поток для поддержки открытых динамических трансляций NAT в то время, когда RTP поток может например стоять на удержании.

  • 30 (rtptimeout)
  • 300 (rtpholdtimeout)
  • 0 (rtpkeepalive)

Условный перевод

Условный, или контролируемый (attended), перевод осуществляется следующим образом: прежде чем перевести звонок, сторона А сначала соединяется со стороной В, убеждается в том, что там готовы принять звонок, и лишь затем совершает перевод стороны Б на номер В. Таким образом, инициатор перевода полностью контролирует процесс передачи звонка до его завершения. Это полезно, когда инициатор перевода хочет заранее убедиться в том, что принимающая сторона готова принять звонок.

В этом случае используется комбинация клавиш *2#.

Пример

Мария звонит Ивану и просит перевести ее на Петра.


Иван набирает *2. Asterisk подает звуковой сигнал о готовности к переводу.


Иван вводит на номеронабирателе внутренний номер Петра. Asterisk ставит Марию на ожидание и создает канал для Ивана и Петра.


Петр отвечает, они с Иваном разговаривают. Иван получает согласие Петра на перевод звонка и вешает трубку.


Asterisk тут же прерывает связь между Иваном и Марией. Петр получает короткий звуковой сигнал, а Asterisk тем временем создает соединение между Марией и Петром.

Обычно на телефонном аппарате предусмотрен способ перевода звонков с помощью специальной клавиши. Это может быть просто * или кнопка “transfer”. Для корректной работы Asterisk этого недостаточно и необходимо использовать сочетания клавиш, прописанные выше. Однако на многих SIP-аппаратах есть возможность самостоятельно настроить кнопку “transfer” и задать ей значение ## или *2 — тогда звонок будет переводиться одним нажатием.

В некоторых софтфонах нужные комбинации набираются по умолчанию. Например, в нашей web-звонилке Софтфон24, реализованной специально для интеграции Битрикс24 и Asterisk, изначально зашиты нужные сочетания клавиш, а пользователю достаточно просто нажать на кнопку перевода и выбрать тип действия. При этом вся информация о звонке автоматически зафиксируется в Битрикс24.

Если этого не происходит, скорее всего, дело в неправильной настройке модуля. В связи с тем, что при переводе звонка Asterisk “разбивает” его на две не взаимосвязанные друг с другом составляющие, часто бывает так, что пользователь CRM видит запись только об одной (первой) части разговора. Чтобы избежать этой ошибки, читайте нашу статью о том, как правильно настроить модуль для передачи полной записи звонка.

С использованием attended transfer вместо blind transfer

Можно переделать attended transfer (сопровождаемый звонок), чтобы в случае неответа абонента звонок возвращался к тому, кто сделал перевод. Для этого в файле features.conf есть опции:

;atxfernoanswertimeout = 15 ; Timeout for answer on attended transfer default is 15 seconds.
;atxferdropcall = no ; If someone does an attended transfer, then hangs up before the transferred
; caller is connected, then by default, the system will try to call back the
; person that did the transfer. If this is set to «yes», the callback will
; not be attempted and the transfer will just fail.
; For atxferdropcall=no to work properly, you also need to
; define ATXFER_NULL_TECH in main/features.c. The reason the
; code is not enabled by default is spelled out in the comment
; block near the top of main/features.c describing ATXFER_NULL_TECH.
;atxferloopdelay = 10 ; Number of seconds to sleep between retries (if atxferdropcall = no)
;atxfercallbackretries = 2 ; Number of times to attempt to send the call back to the transferer.
; By default, this is 2.

Рассмотрим ситуацию: абонент А звонит абоненту Б и пообщавшись с ним, просит перевести его на абонента С. Если абонент Б (делая attended transfer) дожидается ответа абонента С, возможно общается с ним, и отключается — то абоненты А и С связываются между собой и общаются. Это стандартный сопровождаемый перевод.
Если же абонент Б делает attended transfer на абонента С и сразу (не дожидаясь ответа) кладет трубку, то получается примерно та же ситуация, что и в случае blind transfer. Однако, всё хорошо только в случае, если абонент С снял трубку (или абонент А не дождавшись ответа, положил трубку сам).

atxferdropcall = yes — после неответа абонента С (или если этот абонент занят / сбросил вызов) происходит разрыв соединения, и абоненту А надо снова совершать звонок.

atxferdrpcall = no — теоретически, после неответа (или занятости/сброса звонка) абонента С, звонок абонента А должен вернуться обратно. Однако:

  1. пока абонент С не ответит (или абонент А не положит трубку, или пока не истечет время ответа абонента С и связь прервется сама) абонент Б не может разговаривать по телефону, его телефон в состоянии hold (абонент Б не может совершать и принимать вызовы);
  2. вернуться назад звонок (к абоненту Б) тоже не может (поскольку абонент Б положил трубку и теоретически разговор прервался, но его телефон по-прежнему в состоянии hold, т.е. занят), это чётко видно в случае, если стоит лимит на одновременные звонки, call-limit=1

Эту проблему призвана пофиксить (насколько я понимаю, это временное решение!) переменная ATXFER_NULL_TECH в файле features.c, который находится в каталоге main с исходными кодами астериска. Достаточно сделать поиск по этому файлу, и раскомментировать (убрать символы «//») строку:
//#define ATXFER_NULL_TECH 1
после чего пересобрать (и перезапустить разумеется) астериск.

Только в случае включения этой переменной, пересборки астериска и выставления atxferdrpcall = no, другие переменные имеют смысл:
atxfercallbackretries — количество попыток вернуть звонок абоненту Б (если он уже снова занят)
atxferloopdelay — задержка между попытками вернуть звонок абоненту Б.

Создание правил по времени

Теперь можно перейти на страницу создания Временных правил: Applications>Time Conditions. В поле Time Condition name задается имя правила, например, worktime. В поле Time Group выбирается созданная на предыдущем шаге временная группа. Поле Destination if time matches (Назначение если время совпадает) — соответственно выставляет назначение куда будет направлен входящий звонок при совпадении времени — в данном случае будет завернут в IVR-day. Поле Destination if time does not match (Назначение если время не совпадает) — соответственно выставляет назначение куда будет направлен входящий звонок при не совпадении времени — в данном случае будет завернут в IVR-night.

Наведение входящих вызовов на звонившего внутреннего абонента

Внутренний абонент Asterisk вызывает внешнего. Когда внешний абонент перезванивает на городскую линию Asterisk, его вызов направляется непосредственно на звонившего внутреннего абонента

Для определения внутреннего номера звонившего абонента, используется стандартная БД CDR FreepBX — asteriskcdrdb.

exten => _X.,1,Set(CHANNEL(language)=ru)
exten => _X.,n,Set(CALLID=${CALLERID(num):-11})
exten => _X.,n,MYSQL(Connect connidcdr localhost userdb passworddb asteriskcdrdb utf8)
;; All CALL
exten => _X.,n,MYSQL(Query resultidcdr ${connidcdr} SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' ORDER BY calldate DESC)
;; NOANSWER CALL ONLY
;;exten => _X.,n,MYSQL(Query resultidcdr ${connidcdr} SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' AND disposition LIKE 'NO ANSWER' ORDER BY calldate DESC)
;;
exten => _X.,n,MYSQL(Fetch fetchid ${resultidcdr} accid calldate clid src dst)
exten => _X.,n,Set(number=${src})
exten => _X.,n,NoOp(caller --> ${clid} callee --> ${dst})
exten => _X.,n,GOTOIF($?nodst:dst)
exten => _X.,n(dst),MYSQL(Clear ${resultidcdr})
exten => _X.,n,MYSQL(Disconnect ${connidcdr})
exten => _X.,n,Dial(SIP/${number},20,tT)
exten => _X.,n,GotoIf($?nodst)
exten => _X.,n,GotoIf($?nodst)
exten => _X.,n,GotoIf($?nodst)
exten => _X.,n(nodst),MYSQL(Clear ${resultidcdr})
exten => _X.,n,MYSQL(Disconnect ${connidcdr})
exten => _X.,n,Goto(from-trunk,${DID},1)
exten => h,1,hangup()

Выборка данных за последние 120 минут

 SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' AND calldate >= DATE_SUB(NOW(), INTERVAL 120 MINUTE) ORDER BY calldate DESC;

или за три часа:

 SELECT * FROM cdr WHERE dst LIKE '%${CALLID}%' AND calldate >= DATE_SUB( NOW(), INTERVAL 03 HOUR) ORDER BY calldate DESC;

Вывод консоли Asterisk при маршрутизации по cdr БД:

 -- Executing  Goto("SIP/samsung-00001694", "dynamic_did,3216111,1") in new stack
    -- Goto (dynamic_did,1111,1)
    -- Executing  Set("SIP/samsung-00001694", "CHANNEL(language)=ru") in new stack
    -- Executing  Set("SIP/samsung-00001694", "CALLID=8129981138 ") in new stack
    -- Executing  MYSQL("SIP/samsung-00001694", "Connect connidcdr localhost userdb passworddb asteriskcdrdb utf8") in new stack
    -- Executing  MYSQL("SIP/samsung-00001694", "Query resultidcdr 11 SELECT * FROM cdr WHERE dst LIKE '%8129981138%' AND calldate >= DATE_SUB(NOW(), INTERVAL 03 HOUR)") in new stack
    -- Executing  MYSQL("SIP/samsung-00001694", "Fetch fetchid 12 accid calldate clid src dst") in new stack
 WARNING: app_mysql.c:498 aMYSQL_fetch: ast_MYSQL_fetch: More fields (24) than variables (5)
    -- Executing  Set("SIP/samsung-00001694", "number=1000") in new stack
    -- Executing  NoOp("SIP/samsung-00001694", "кто звонил --> 1000 кому звонил --> 8129981138") in new stack
    -- Executing  GotoIf("SIP/samsung-00001694", "0?nodst:dst") in new stack
    -- Goto (dynamic_did,1111,9)
    -- Executing  MYSQL("SIP/samsung-00001694", "Clear 12") in new stack
    -- Executing  MYSQL("SIP/samsung-00001694", "Disconnect 11") in new stack
    -- Executing  Dial("SIP/samsung-00001694", "SIP/1000,20,tT") in new stack

Настройка FreePBX (Добавление SIP-транка)

В WEB-консоли FreePBX добавляем новый SIP-транк.

На вкладке «Общие» в поле «Название транка» вводим название (прим. SIP-RT), в поле «Исходящий CallerID» вводим внешний номер телефона.

Переходим во вкладку «sip Общие настройки» вкладка «Исходящий«. В поле «Название транка» указывает произвольное название (прим. RT), в поле «опции для PEER» указываем следующие данные:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

username=user1
type=friend
secret=Aa1234567
regsecond=600
qualify=3000
nat=force_rport,comedia
insecure=invite,port
host=998***.14.rt.ru
fromuser=user1
fromdomain=998***.14.rt.ru
dtmfmode=rfc2833
disallow=all
directmedia=yes
defaultuser=user1
context=from-trunk
canreinvite=no
allow=alaw&ulaw

ИНФОРМАЦИЯ. В поля username, fromuser, defaultuser указываем логин вашего пользователя (если использовали отличный по-умолчанию user1), в поле secret указываем заданный пароль от логина пользователя, в поля host, fromdomain указываем ваше название домена.

Переходим на вкладку «Входящий«. В поле «Строка регистрации» вводим следующее:

1 user1:Aa1234567@998***.14.rt.ru/74951***282

ИНФОРМАЦИЯ. Структура строки регистрации — <логин>:<пароль>@<домен>/<внешний номер>. Подставляем свои данные для регистрации.

Сохраняем и применяем изменения. Результат подключения можно посмотреть в консоли asterisk:

1
2

4
5
6

asterisk*CLI> sip show peers
Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description

 
asterisk*CLI> sip show registry
Host                                    dnsmgr Username       Refresh State                Reg.Time

Несколько команд Dial

Для всех номеров в диалплане после команды Dial выполняется проверка результатов звонка, и если переменная DIALSTATUS не равна ANSWER (т.е. абонент занят, номер недоступен, на звонок не ответили и т.п.), то выполненяется следующая команда Dial, соединяющая абонента например, с секретарем. В случае неответа секретаря (что тоже возможно) выполняется третья команда Dial, ну и так далее.

;файл extensions.conf:

exten => _XXXX,1,Answer()
exten => _XXXX,n(begin),Dial(SIP/${EXTEN},240,tTg) ; g — после окончания звонка независимо от результата продолжить выполнение сценария
; если DialStatus = Answer (звонок отвечен), то кладем трубку:
exten => _XXXX,n,GotoIf($?end:)
exten => _XXXX,n,Dial(SIP/100,240,tTg) ; 100 — номер секретаря
exten => _XXXX,n,GotoIf($?end:)
exten => _XXXX,n,Dial(SIP/101,240,tTg) ; 101 — номер второго секретаря
exten => _XXXX,n,GotoIf($?end:)
exten => _XXXX,n,Dial(SIP/102,240,tTg) ; 102 — номер третьего секретаря
; если никуда не дозвонились, кладем трубку (или можем сделать goto на begin и продолжать по кругу до бесконечности)
exten => _XXXX,n(end),Hangup()

Внешние каналы

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

В текущей версии поддерживаются два вида каналов — SIP и IAX и аналогично два вида туннелей. Туннели это те же провайдеры, но служат обычно для упрощенного соединения между двумя ИКС. Чтобы настроить новый канал, нажмите кнопку «Добавить».

Провайдер SIP позволяет настроить сервер подключения, телефонный номер, при необходимости указать логин и пароль. Флажок Автоматически создавать правило, используя префикс служит для указания префикса внешнего звонка по умолчанию. Данный префикс представляет собой цифру, по которой модуль ориентируется, направлять ли звонок во внешнюю сеть. Например, звонок на номер 555-3333 при указанном префиксе 9 будет набираться клиентом как 9-555-3333. Опции режим DTMF, insecure, canreinvite позволяют настроить режимы тонального набора. Если провайдер имеет специфические настройки, то вы можете полностью прописать строку регистрации, установив соответствующий флажок.

Важно: в некоторых случаях провайдер SIP-телефонии не может распознать абонента, набирающего внешний вызов. Если при регистрации провайдера у вас работают входящие звонки, но не проходят исходящие, то в поле fromUser необходимо указать номер телефона либо логин подключения (в зависимости от особенностей провайдера).

Параметр «поддерживать подключение» указывает, доступно ли удаленное устройство для совершения вызовов

Asterisk периодически будет отправлять SIP сообщение типа OPTIONS, для проверки доступности. Если данное устройство, не ответит в течении заданного периода (или периода по умолчанию в 2000 мс) в миллисекундах, тогда Asterisk рассматривает это устройство как выключенное и недоступное для совершения вызовов. Данная опция используется только если телефония стоит за NAT.

Параметр «поддерживать подключение» указывает, доступно ли удаленное устройство для совершения вызовов. Asterisk периодически будет отправлять SIP сообщение типа OPTIONS, для проверки доступности. Если данное устройство, не ответит в течении заданного периода (или периода по умолчанию в 2000 мс) в миллисекундах, тогда Asterisk рассматривает это устройство как выключенное и недоступное для совершения вызовов. Данная опция используется только если телефония стоит за NAT.

IAX2 (Inter-Asterisk eXchange protocol) — протокол обмена VoIP данными между IP-PBX Asterisk. Наиболее приспособлен к трансляции сетевых адресов NAT, в отличие от SIP и H.323 использует только один порт 4569 протокола UDP для сигнализации и медиапотока. Аналогично провайдеру SIP, провайдер IAX в качестве параметров запрашивает сервер подключения, телефонный номер, при необходимости логин и пароль и внешний префикс. Опция, отличная от настроек провайдера SIP — режим работы. Если вы используете канал связи для подключения к внешнему серверу провайдера, то необходимо использовать опцию «клиент». В случае, когда к ИКС подключаются другие клиенты по внешнему каналу, используйте опцию «сервер».

Туннели в целом аналогичны соответствующим провайдерам, в них спрятаны лишние опции, которые не требуются для настройки. Один из ИКС выбирается сервером, а второй клиентом. Останая настройка их аналогична настройке провайдера SIP или IAX.

Возврат звонка при переводе | Asterisk

Как не потерять клиента

3 минуты чтения

Как известно, в телефонии существует два основных вида перевода (или трансфера – transfer) входящих звонков, это:

Attendant Transfer/ consultative transfer – Перевод звонка, при котором оператор, получив информацию от звонящего, ставит звонок на удержание, затем инициирует второй вызов третьей стороне (абоненту, с которым хочет соединиться звонящий), уведомляет о входящем вызове и лишь после разрешения третьей стороны, соединяет с вызывающим абонентом. После этого, оператор кладет трубку и больше никак не влияет на переведенный вызов. Таким образом, оператор остается уверенным в том, что звонящий соединен с нужным абонентом. В случае, если у оператора не получается дозвониться до вызываемого абонента или он сообщает, что не может в данный момент принять звонок, оператор снимает звонящего с удержания и просит его перезвонить позднее.

Blind Transfer – Даже из названия становится понятно, что данный вид перевода является “слепым”, т.е оператор переводит звонок, не уведомляя третью сторону в входящем вызове. Не трудно догадаться, что если вызываемый абонент занят или не отвечает, то вызов попросту обрывается.

Согласитесь, ситуация крайне нежелательная, клиентам приходится заново набирать номер, общаться с оператором, объяснять, что разговора не состоялось и т.д. Теряется время, лояльность клиентов и интерес.

В IP телефонии на базе Asterisk с данной проблемой познакомились, когда начали осуществлять миграцию с аналоговых АТС. Дело в том, что аналоговые АТС по умолчанию поддерживают так называемый Transfer Recall. Данный функционал заставляет АТС перезванивать оператору, если звонок между вызывающим и вызываемым абонентами, по каким то причинам не состоялся. Оператор, в свою очередь, просил вызывающего абонента перезвонить.

Проблема с потерянными вызовами после “слепого” перевода имела место быть вплоть до Asterisk версии 1.6, когда в файл feature.conf в Attended Transfer (atxfer) не был введен дополнительный функционал atxferdropcall , со значениями yes и no

atxferdropcall = yes – Звонок не будет возобновлен после неудачного перевода

atxferdropcall = no – Звонок будет возобновлен после неудачного перевода

По умолчанию в Asterisk данная переменная имеет значение yes. Таким образом, чтобы решить проблемы с потерянными вызовами при переводе, нужно просто изменить файл feature.conf следующим образом:

Где, atxfernoanswertimeout – Время, которое необходимо для дозвона обратно; atxfercallbackretries – Количество попыток повторного дозвона

Пожалуйста, расскажите почему?

Нам жаль, что статья не была полезна для вас Пожалуйста, если не затруднит, укажите по какой причине? Мы будем очень благодарны за подробный ответ. Спасибо, что помогаете нам стать лучше!

Подпишитесь на нашу еженедельную рассылку, и мы будем присылать самые интересные публикации Просто оставьте свои данные в форме ниже.

В случае сопровождаемого перевода звонка (attended transfer) всё довольно просто: оператор переводит абонента А на абонента Б, общается какое-то время с абонентом Б (или ждет, пока тот ответит или не ответит) и когда оператор кладет трубку, абоненты А и Б начинают общаться между собой. В случае, если абонент Б занят или не отвечает, оператор снова соединяется с абонентом А и сообщает ему о невозможности соединиться с абонентом Б.

В случае «слепого» перевода звонка (unattended transfer или blind transfer) всё сложнее: оператор переводит абонента А на абонента Б, и сразу после такого перевода оператор отключается. При этом абонент А остается предоставлен судьбе: если абонент Б ему отвечает, то всё хорошо. Если же нет (например, абонент Б занят или не отвечает), то у абонента А в трубке раздаются короткие гудки, после чего ему остается только повесить трубку и попытаться еще раз дозвониться до оператора. Однако для фирм, которым важен каждый звонок, крайне нежелательны такие обрывы связи. Что же делать?

Есть несколько вариантов решения проблемы (подход только один: чтобы звонки не «терялись», т.е. в случае неответа/занятости абонента звонок переходил куда-либо, пока на него не ответят):

  1. Несколько команд Dial
  2. С использованием attended transfer вместо blind transfer
  3. С использованием TRANSFER_CONTEXT

Общие сведения

VoIP — система связи, передающая аудио-сигнал по IP-сетям. Сигнал по каналу связи передаётся в цифровом виде и, как правило, перед передачей преобразовывается с целью удаления избыточности.

За обработку VoIP-данных в ИКС отвечает модуль «Телефония», разработанный на базе сервера ip-телефонии Asterisk. Это свободное решение компьютерной телефонии с открытым исходным кодом, оно достаточно надежное и давно зарекомендовавшее себя с положительной стороны. В настоящее время модуль поддерживает передачу данных по протоколам SIP и IAX.

При входе в модуль отображается его состояние, кнопка «Выключить» (или «Включить» если модуль выключен) и последние сообщения в журнале.

Важно: если модуль находится в состоянии «не настроен», то необходимо настроить DNS-зону в ИКС таким образом, чтобы имя системы в модуле Система резолвилось в ip-адрес ИКС.

С использованием TRANSFER_CONTEXT

Это, вероятно, самый интересный вариант с возвратом звонков после «слепого» перевода. Зачастую необходимость перевести звонок на другого абонента возникает не только у секретаря. Представьте себе фирму (к примеру, тот же call-центр), в котором осуществляются консалтинговые услуги. При этом множестов «секретарей» переводят звонки на специалистов, специалисты могут переводить звонки друг на друга, и зачастую нет времени (и желания) переведя звонок, дожидаться ответа того, на кого этот звонок переводится — а хочется перенаправить звонок на нужного сотрудника, чтобы в случае, если человека нет на месте (или он занят) звонок вернулся обратно автоматически. Таким образом, звонок должен возвращаться не «кому-нибудь», а именно тому человеку, который его перевел.

В этом случае для всех переводимых звонков настраивается отдельный контекст, в котором они будут обрабатываться (задав значение переменной TRANSFER_CONTEXT). При этом контролируется, был ли ответ на этот переведенный звонок, и при необходимости (используя переменную BLINDTRANSFER) можно вернуть звонок тому абоненту, который осуществлял перевод вызова:

TRANSFER_CONTEXT=blind_transfer_mikhed_ringback

; контекст локальных звонков
exten => _XXXX,1,Answer()
exten => _XXXX,n,Dial(SIP/${EXTEN},45,tT)
exten => _XXXX,n,Hangup()

; в этот контекст попадают все переводимые звонки:

exten => _X.,1,NoOp(«Blindtransfer: » ${BLINDTRANSFER})
exten => _X.,n,Set(ExtLength=${LEN(${EXTEN})}).
; ${BLINDTRANSFER} — это не оригинальный номер, а оригинальный канал, например: SIP/1111-433242424242
exten => _X.,n,Set(OrigNumber=${BLINDTRANSFER:4:${ExtLength}})
; делаем основной звонок:
exten => _X.,n,Dial(SIP/${EXTEN},45,tTg)
; если он удался, то вешаем трубку, если нет — возвращаем тому, кто переводил звонок:
exten => _X.,n,GotoIf($?hangup:callback)
exten => _X.,n(callback),Dial(local/${OrigNumber}@local_phones,45,tT)
; Обратите внимание: здесь делается только одна попытка вернуть звонок. ; Однако на самом деле к моменту возврата звонка сотрудник может быть уже занят.
; Так что имеет смысл делать несколько попыток, или перенаправлять звонки куда-либо еще.
exten => _X.,n(hangup),Hangup().
…. Обратите внимание: в данном примере возможны переводы звонков только на «реальных» людей (т.е

только на SIP-абонентов). В общем же случае Вы можете захотеть переводить звонки на группы номеров, либо на номера с обработкой (в extensions.conf) до или после вызова. В этом случае Вы можете обратиться за консультацией к автору сайта, на нашем предприятии это реализовано (и работает)

Обратите внимание: в данном примере возможны переводы звонков только на «реальных» людей (т.е. только на SIP-абонентов)

В общем же случае Вы можете захотеть переводить звонки на группы номеров, либо на номера с обработкой (в extensions.conf) до или после вызова. В этом случае Вы можете обратиться за консультацией к автору сайта, на нашем предприятии это реализовано (и работает).

Внимание: в описанном выше способе возврата звонка с помощью transfer_context обнаружен небольшой баг, ну или особенность реализации: номер того, кто переводит звонок и номер, куда переводят звонок, должны совпадать по длине. Если (например) у Вас в организации 4-значные номера и Вы переводите звонок на мобильный, то в случае, когда человек не дозвонился, звонок не вернется обратно (будет неправильный номер в OrigNumber)

А если (вдруг) у Вас в организации используется много номеров и они могут различаться по длине (например: в одной и той же организации номера 11…19 и 300..399), то описанный выше вариант (с transfer_context) Вам однозначно придется переделывать.

P.S

Обратите также внимание на то, что с точки зрения безопасности asterisk, в контексте перевода звонков использован неправильный шаблон. Подробнее об этом см

статьи по безопасности asterisk в разделе Asterisk.

Статья обновлена: 31.07.2016

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: