FreeSWITCH

 

  1. Setup FreeSWITCH
    1. Install FreeSWITCH with mod_verto.
    2. Setup mod_verto
    3. For screen sharing, please, add new extension in the default context:
      <extension name="screen_sharing">
            <condition field="destination_number" expression="^(\d )-screen$">
              <action application="set" data="effective_caller_id_number=${caller_id_number}-screen"/>
              <action application="transfer" data="$1 XML default"/>
            </condition>
          </extension>
      
  2. Install chrome Application and Extension.
  3. Setup Your login, password and WebSocket Uri:
  4. Make a call:

В предыдущих статьях я рассказал о том, что такое Docker и как оно все работает. Так же, рассмотрели пример запуска простого Webitel-приложения в контейнере. Сегодня я покажу практический пример, как быстро запустить FreeSWITCH в контейнере.

Для Webitel мы уже давно используем Docker как основной инструмент управления приложением. Для FreeSWITCH я сделал базовый образ, на основание которого строится автоматически образ для Webitel. Недавно, я расширил его еще и под задачи установки vanilla конфигурации FreeSWITCH. Вы можете его использовать для быстрого разворачивания приложения. Как это сделать – опишу ниже.

Используя телефоны Yealink, никогда особо не обращал внимание на такую полезную функцию как Мелодии:

Мелодии
Мелодии

Прелесть этого функционала заключается в том, что Вы можете создать группы (до 10) с индивидуальными звуковыми файлами. Все, что нужно, так это на стороне CallManager отправить в SIP пакете заголовок “Alert-info” с указанием нужной группы. И телефон зазвонит!

На Webitel мы можем строить любые сценарии поведения звонка с помощью LUA-скриптов. Если я хочу, чтобы при определенном входящем вызове зазвучала мелодия из группы test4, я вызываю всего 1 строчку в скрипте:

session:execute("export", "alert_info=< http://localhost/>;info=test4")

Теперь, для разных групп абонентов из Terrasoft CRM, я могу установить разные мелодии. Правда, удобно? 😉

Установил на своем SIP-телефоне последнюю прошивку от Yealink (v.61) и увидел новый пункт меню: MulticastIP. Проверим как он работает! В диалплан FreeSWITCH добавлю новый пункт с Multicast Paging группой, на который звонить будет по номеру 7243:

 <action application="answer"/>
 <action application="esf_page_group" data="224.168.168.168 34567"/>

В Yealink можно прописать 10 Multicast групп. Прописываем нашу группу “Селектор” на объявленный в диалплане IP 224.168.168.168 и порт 34567:

Звоним и любуемся (и говорить не забываем): Прошивка 61 – англоязычная, если для Вас это помеха, тогда ждем скорого выхода (в ноябре обещали) русскоязычной версии 70 от IP.Matika.

Продолжая серию публикаций о SMS, сегодня хочу рассказать о еще одной удобной функции, которую легко реализовать в АТС. Типовая ситуация: менеджер звонит на мобильный клиента, а тот просит sms-кой скинуть свои контакты… Мы уже говорили о SMS-визитках, но это же исходящий звонок, здесь наш сценарий не сработает! Как быть? Просто, воспользуемся уже знакомым bind_meta_app application. В dialplan, когда звоним на мобильные, добавим вызов вот такого action:

В самом JavaScript сценарии у меня будет простенькая визиточка, но Вы сможете делать даже личные sms для каждого менеджера! Вот пример кода для моего провайдера:

use("CURL");

var CallerID = session.destination;
var SMS = " \
 \
Nashy kontakty: (044)591-92-81, (032)232-77-57, office@it-sfera.com.ua, www.it-sfera.com.ua" ;

console_log("info","Send SMS Card: \n" + SMS + "\n");
var curl = new CURL();
curl.run("POST", "http://sms.it-sfera.com/websend/", SMS);

Теперь менеджер во время разговора с клиентом может просто нажать *0 на SIP-телефоне и клиент получает SMS-визитку на свой телефон. Удобно, вчера дважды сам воспользовался этой функцией!

FreeSWITCHДумаю, что многие используют переадресацию звонков на мобильный, когда вне офиса. Да, это очень удобная функция современной АТС: уходишь, включил переадресацию на мобильный (или по расписанию) и принимаешь важные звонки… Но, одним из неудобных моментов такой переадресации – отсутствие понимания с какого номера пришел звонок (у нас то всегда отображается офисный номер!). Для себя я решил этот вопрос следующим образом: приходит переадресованный звонок, разговариваю, надо узнать номер звонящего – нажимаю *9 и получаю SMS. Как это работает? В предыдущем посте я описал как отправить SMS о пропущенном звонке, так что останавливаться на самом SMS не буду. Все, что нужно, это добавить в dialplan, когда срабатывает переадресация, вызов вот такого action:

&lt;action application=&quot;bind_meta_app&quot; data=&quot;9 b s lua::smsinfo.lua ${cell}&quot;/&gt;

Я использую application bind_meta_app, который позволяет привязывать в уже отвеченном разговоре на заданную комбинацию DTMF запуск разных сценариев. Вот я и запускаю на *9 Lua скрипт с отправкой SMS:

local CallerName = session:getVariable("caller_id_name")
local CallerNumber = session:getVariable("caller_id_number")

function urlencode (s)
 return (string.gsub (s, "%W",
        function (str)
                return string.format ("%%%02X", string.byte (str) )
        end ))
end

local SMS = '<?xml version="1.0" encoding="UTF-8" ?> \
<request method="send-sms" login="login" passw="password"> \
<msg id="1" phone="' ..cell.. '" sn="IT-SFERA" encoding="cyr">Абонент: ' ..CallerName.. ' \
Номер: ' .. CallerNumber.. '&lt;/msg>&lt;/request>'

if (cell) then
        api = freeswitch.API();
        local response = api:execute("curl", "http://sms.it-sfera.com/websend/ post " ..urlencode(SMS) )
        freeswitch.consoleLog("DEBUG","Here's response:\n" .. response .. "\n")
end

И получаем SMS:

Абонент на линии
Абонент на линии

FreeSWITCHИнтересной функцией для офисной АТС может стать отправка SMS сотруднику о пропущенном звонке. Я опишу, как реализовать этот функционал на FreeSWITCH.

1. Формат SMS
Мой SMS провайдер принимает сообщения через HTTP XML API. Мне необходимо будет сформировать XML файл и передать его методом POST на URL шлюза. Использовать будем модуль mod_curl. Здесь проблем нет. Только нужна будет функция для преобразования XML в urlencode…

2. Когда и куда отправлять
Что бы ответить на вопрос куда отправить, в directory я к регистрации каждого сотрудника добавил переменную cell с мобильным. Теперь из скрипта можно будет получить эту информацию. А когда отправлять? Здесь 2 проверки:
1. причина разрыва коммутации “ORIGINATOR_CANCEL”
2. возможно абонент Вам оставил голосовое сообщение?

3. Как вызвать скрипт?
Из dialplana 🙂 Просто добавьте вот такой action в extension с локальными пользователями:

4. А теперь сам скрипт на Lua

local send = false
local cell = env:getHeader("cell")
local hangup_cause = env:getHeader("hangup_cause")
local bridge_channel = env:getHeader("bridge_channel")
local CallerName = env:getHeader("Caller-Caller-ID-Name")
local CallerNumber = env:getHeader("Caller-Caller-ID-Number")

function urlencode (s)
 return (string.gsub (s, "%W",
        function (str)
                return string.format ("%%%02X", string.byte (str) )
        end ))
end

local SMS = ' \
 \
'

if (hangup_cause == "ORIGINATOR_CANCEL" and cell) then
        SMS = SMS.. "Вам звонили: " ..CallerName.. " " .. CallerNumber
        send = true
end

if (bridge_channel == "loopback/voicemail-a" and cell) then
        SMS = SMS.. "Новое сообщение от " ..CallerName.. " " .. CallerNumber
        send = true
end

if (send) then
        SMS = SMS.. ""
        api = freeswitch.API();
        local response = api:execute("curl", "http://sms.it-sfera.com/websend/ post " ..urlencode(SMS) )
        freeswitch.consoleLog("DEBUG","Here's response:\n" .. response .. "\n")
end

5. О, sms-ка пришла!

У Вас пропущенный звонок!
У Вас пропущенный звонок!

Недавно мне задали вопрос: “Как можно с помощью FreeSWITCH сделать рассылку факсов по списку номеров?” Я набросаю ключевые пункты, как это сделать.

Во-первых, у Вас должна быть какая-то SQL база со списком номеров. К примеру, берем MySQL с одной табличкой fax, где находиться колонка distination.

Во-вторых, файл, который будем отправлять. Что бы привести его в пригодный нам формат, воспользуемся утилитой convert:

convert -density 204x98 -units PixelsPerInch -resize 1728x1186\! -monochrome -compress Fax my-fax-file.pdf /opt/freeswitch/storage/fax_out/01.tif

В-третьих, напишем LUA-скрипт scripts/send_fax.lua, который будет лезть в базу, выбирать номер и отправлять наш файлик:

local fax_file = "/opt/freeswitch/storage/fax_out/01.tif"

local dbh = freeswitch.Dbh("dsn", "user", "password")
if dbh:connected() then
        freeswitch.consoleLog("NOTICE", "database connected\n")
else
        freeswitch.consoleLog("ERR", "database error\n")
    return
end

local my_query = "select distination from fax "

assert(dbh:query(my_query, function(row)
        freeswitch.consoleLog("NOTICE", "\nSending FAX to " ..row.distination.. "\n")
        send_fax = "originate sofia/gateway/farlep/" ..row.distination.. " &txfax(" ..fax_file.. ")"
        api = freeswitch.API()
        reply = api:executeString(send_fax)
        freeswitch.consoleLog("DEBUG", "\nSending " ..reply.. "\n")
end))

Теперь можем просто из консоли FreeSWITCH выполнить скрипт:

luarun send_fax.lua

Дальше, приправляем на свой вкус: записать результат отправки в базу или еще чего….

Прочитал статью на habrahabr.ru и решил проверить у себя. Вот запись аудио: message.mp3, а вот что пришло на мыло:

добрый день александр трофименко игра 1000 для работы я не могу дойти до 120 инуяша телефону номер
для девчонок которая 3 3 3 он метро смоленская

Прочитав такое, я все равно буду слушать запись 🙂

Все знают о возможности “подслушивать” телефонные разговоры. А как Вам вариант слушать разговор в любимом медиаплеере, как обычное аудио вещание в сети? Оказывается, во FreeSWITCH это возможно! Все, что Вам нужно – включить модуль Mod_shout (о котором я уже писал). С модулем становиться доступная функция telecast . Через webAPI (по адресу http://<Ваш_Сервер>:8080/webapi/telecast/index) Вы сможете увидеть список текущих разговоров:

И открыть выбранный разговор в плеере: