Файлы и стандартные контексты freepbx

Возврат звонка при переводе | 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-адрес ИКС.

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

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

Рассмотрим ситуацию: абонент А звонит абоненту Б и пообщавшись с ним, просит перевести его на абонента С. Если абонент Б (делая 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 – задержка между попытками вернуть звонок абоненту Б.

Проброс порта (forward) на другой компьютер в локальной сети

Включим поддержку форвардига для протокола ipv4 в файле /etc/sysctl.conf

 net.ipv4.ip_forward = 1

Применим:

 # sysctl -p /etc/sysctl.conf

Пример для порта 80 TCP:

iptables -A FORWARD -i enp5s2 -o enp4s0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT &&
iptables -A FORWARD -i enp5s2 -o enp4s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT &&
iptables -A FORWARD -i enp4s0 -o enp5s2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT &&
iptables -t nat -A PREROUTING -i enp5s2 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.2 &&
iptables -t nat -A POSTROUTING -o enp4s0 -p tcp --dport 80 -d 192.168.0.2 -j SNAT --to-source 192.168.0.1

Проброс с одного порта на другой

Легенда:

  • external interface — enp5s2

  • internal interface — enp4s0

  • internal interface ip — 192.168.0.1

  • forwarding ip — 192.168.0.2

  • source ip — 123.123.123.123

  • external port — 8080

  • forwarding port — 80

Разрешим форвардинг между интерфейсами:

iptables -A FORWARD -i enp5s2 -o enp4s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i enp4s0 -o enp5s2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Перепишем запрос на порт 8080 внешнего интерфейса,

на адрес и порт компьютера в локальной сети: 192.168.0.2:80.

iptables -t nat -A PREROUTING -i enp5s2 -p tcp -s 123.123.123.123/32 --dport 8080 -j DNAT --to-destination 192.168.0.2:80

Перенаправим запрос c внешнего интерфейса enp5s2 на внутренний интерфейс enp4s0.

iptables -I FORWARD 1 -i enp5s2 -o enp4s0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT

Отправим запрос с внутреннего интерфейса на адрес 192.168.0.2 порт 80

iptables -t nat -A POSTROUTING -o enp4s0 -p tcp --dport 80 -d 192.168.0.2 -j SNAT --to-source 192.168.0.1

Будет работать только для запросов с адреса 123.123.123.123

Классная картика:

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

Заходим в веб-интерфейс, 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, звонок пробует дозвониться сразу до всех перечисленных мобильных номеров, если никто не поднимает — происходит завершение вызова.

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

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

Клиент за NAT


В простейшей ситуации SIP клиент находясь за NAT, обращается к внешнему интерфейсу Asterisk. SIP клиент при регистрации на сервере создает запись в таблице трансляций, которая сохраняется, пока проходит хотя бы один пакет в минуту. В файле sip.conf требуется определить параметры сети и свойства удаленного пира.

localnet=192.168.0.0/255.255.255.0 ; локальная сеть
externip=x.x.x.x                   ; внешний ip адрес

             
nat=yes
qualify=300                    ; проверять соединение каждые 300 мс.

Начиная с версии Asterisk 11: ‘nat=yes’ устарело, используйте ‘nat=force_rport,comedia’ nat=force_rport,comedia

nat=force_rport,comedia
directmedia=nonat

При такой конфигурации Asterisk использует внешний IP адрес externip для вызовов клиентов с параметром nat=yes . Дополнительно параметр qualify=yes поддерживает соединение, не позволяя удалять запись из таблицы трансляций.

Настройка 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

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

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

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

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)

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

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

В текущей версии поддерживаются два вида каналов — 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *