Показаны сообщения с ярлыком FreeSWITCH. Показать все сообщения
Показаны сообщения с ярлыком FreeSWITCH. Показать все сообщения

среда, 1 февраля 2017 г.

centos 7: собираем mod_shout

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

Суть в том, что штатно не собрать mod_shout, так как не хватает библиотек. При сборке скажет что нет libshout, но даже после установки и configure всё-равно модуль не соберётся. Потому что в зависимостях:
libshout
mpg123
lame

И всё печально. В freeswitch.spec видим
Requires:       libshout >= 2.3.1
Requires:       libmpg123 >= 1.20.1

Первая есть в base, вторую и третью надо ставить отдельно.
lame можно взять тут
yum -y install http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
или просто скачать либы с
http://li.nux.ro/download/nux/dextop/el7/x86_64/
можно так
yumdownloader lame-\*
(нужно всё кроме lame-mp3x)

mpg123 там тоже слишком стар, ибо там 1.15, а configure смотрит
checking for libmpg123 >= 1.16.0... no

Качаем отсюда
wget ftp://fr2.rpmfind.net/linux/atrpms/el7-x86_64/atrpms/stable/mpg123-1.18.1-1.el7.x86_64.rpm
wget ftp://fr2.rpmfind.net/linux/atrpms/el7-x86_64/atrpms/stable/mpg123-devel-1.18.1-1.el7.x86_64.rpm

Для сборки
yum install -y libshout-devel
rpm -Uvh *.rpm

Теперь переходим в сорцы и заново делаем bootstrap, configure итд.

пятница, 18 ноября 2016 г.

FreeSWITCH: меняем правила voicemail

Пробема с voicemail в том, что диалог вписан в код. Если требуется чуть изменить текст - можно менять фразы, штатно это файлы
/etc/freeswitch/lang/%lang%/vm/sounds.xml
Но структура там - оставили сообщение, а потом "нажмите ... чтобы прослушать, нажмите ... чтобы пометить важным" итд. А нужно скинуть звонок сразу после сохранения.
Второй момент - даже если убирать "лишние" play-file, тишину в 10-15с (ожидание ввода) штатно не убрать.
Но есть хитрость: открываем доку https://freeswitch.org/confluence/display/FREESWITCH/Speech+Phrase+Management и ближе к концу видим  Action functions. Список там конечно небольшой...

  • execute - calls the FreeSWITCH execute API (you can execute any other API's)
  • play-file - play a specific audio file or play a macro using phrase:macro_name
  • say - Call the specific "type" say api as below. The method is used to modify the way the data is annunciated (counted, iterated, or pronounced).
  • speak-text - Speak some text using the TTS engine
  • break - Stop parsing any more input patterns.

Но на помощь нам приходит execute. Итак: ищем блок voicemail_record_file_check, и приводим к виду
      <match>
        <action function="play-file" data="voicemail/vm-message.wav"/>
        <action function="play-file" data="voicemail/vm-saved.wav"/>
        <action function="play-file" data="voicemail/vm-goodbye.wav"/>
        <action function="execute" data="hangup()"/>
      </match>

Всё, теперь скажет "сообщение сохранено, до свидания" и сбросит звонок.

вторник, 18 октября 2016 г.

FreeSWITCH: начало

Что можно прочитать для старта

От @Deepwalker (потом его обидели разрабы и он ушел от FS)
https://habrahabr.ru/post/50091/
https://habrahabr.ru/post/50140/
https://habrahabr.ru/post/50240/

https://voipnotes.ru/instrukcii.html

Перевод доки (уже несколько устаревший, но для знакомства норм)
http://garantum.ru/content/category/8-freeswitch

Ну и разумеется офдока
https://freeswitch.org/confluence/display/FREESWITCH/FreeSWITCH+Explained

Есть старая дока, но части данных там просто нет, и есть шанс что могут просто удалить её. Хотя и там есть крупицы полезного
https://wiki.freeswitch.org/wiki/Main_Page

Каналы @ru_voip, @ru_freeswitch в telegram
канал #freeswitch в IRC, сервера freenode

Далее, ставить лучше всего уже собранные официальные пакеты, начиная с freeswitch-meta-vanilla
запускать
service freeswitch start
Консоль отладки
fs_cli

Показывать сип-пакеты:
sofia global siptrace on
Изменение уровня в консоли и логах (если в логе info, в консоли ниже чем info также не будет):
fsctl loglevel debug
Системная отладка, полезно при проблемах со свичом (в консоль пишется всегда, при любом уровне):
sofia loglevel all 9
Отключить вывод в консоль, но писать в лог как обычно:
/log 0
Также вместо 0-9 можно писать уровень, info, debug, err...

понедельник, 5 сентября 2016 г.

обновление таймзон

Штатный timezones.conf.xml весьма стар.
Хорошая новость: есть скрипт scripts/perl/timezone-gen.pl
Плохая новость: он лежит в сорцах и в штатных пакетах его нет, надо качать сорцы и забирать оттуда.
Для запуска требуется наличие актуального /usr/share/zoneinfo

среда, 3 февраля 2016 г.

чуть про bind_digit_action

<anthm> there are no variants only peer self and both
<anthm> and there can be no space after the , for exec:foo,bar
<anthm> and if you want instant execute you have to use exec[i]:foo,bar


<anthm> bind,#82,exec:digit_action_set_realm,none_b,self,peer
<anthm> self for where to listen to dtmf peer for where to send actions
<anthm> also could be self,both peer,self etc

и пример "пустого" бинда
action application=bind_digit_action, data=none_a,NONE,api:sleep,1

пятница, 15 января 2016 г.

freeswitch: voicemail in mp3

Для включения mp3 требуется загруженный mod_shout.

В документации аж 3 переменных, позволяющих задать формат:
https://wiki.freeswitch.org/wiki/Mod_voicemail#file-extension
https://wiki.freeswitch.org/wiki/Mod_voicemail#vm-message-ext
https://wiki.freeswitch.org/wiki/Mod_voicemail#vm_message_ext

Что куда писать? Можно предположить, но явно это в доке не прописано:
file-extension - param в mod_voicemail, раздел profile
vm-message-ext - param, выставляется в настройках юзера
vm_message_ext - variable, выставляется в originating строке или в диалплане, заменяет собой vm-message-ext.

четверг, 5 ноября 2015 г.

проверяем и синхронизируем даты и время

После ntpdate pool.ntp.org обнаружили неприятную "особенность" - апи стало работать с новым временем, а FS - по прежнему использует старое. Впрочем, правится тоже несложно: из апи или консоли
fsctl sync_clock
или
fsctl sync_clock_when_idle

Для проверки можно использовать такой скрипт:
check-time.py

import freeswitch

import time

def fsapi(session, stream, env, args):

        t = str(int(time.time()*1000))
        print t
        freeswitch.consoleLog('info', 'timestamp: %s\n' % t)

        t = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
        print t
        freeswitch.consoleLog('info', 'sys date: \n%s\n' % t)

класть в скрипты, это может быть /etc/freeswitch/scripts или /usr/share/freeswitch/scripts

Теперь из fs_ctl вызываем:
freeswitch@192.168.10.202@internal> python check-time

и проверяем что даты перед и после sys date совпадают

При необходимости ставим и грузим mod_python

среда, 19 августа 2015 г.

freeswitch arrays

В доке сказано, что можно делать массив так:
Appending to an ARRAY with PUSH
<action application="push" data"myvar,test A"/>
<action application="push" data"myvar,test B"/>
<action application="push" data"myvar,test C"/>

По факту, формат такой
<action application="push" data"myvar=test A"/>

Получить потом можно так
<action application="log" data="INFO ${myvar}"/>
и выглядеть оно будет примерно так
ARRAY::test X|:test Y|:test Z|:test A|:test B|:test C

Можно указать конкретный элемент:
<action application="set" data="myvar[0]=Test A"/>

Вариант добавления в начало, не проверялось, но скорее всего так:
<action application="unshift" data="myvar=test X"/>
(в офдоке снова через запятую, что вероятно неверно)

Есть через regex, тоже не проверялось
<action application="set" data="num=2121231234"/>
<action application="capture" data="myvar|${num}|(\d{3})(\d{3})(\d{4})"/>

Получать через
${myvar}, пример вывода выше
${myvar[2]}

среда, 15 июля 2015 г.

zabbix: мониторим freeswitch

Рабочая версия 2.4, под centos 6 x86_64
Считаем, что у нас уже есть сервер, поднимать будем агентов. Тут речь о настройке.
быстрая установка
идём на http://repo.zabbix.com/, выбираем нужный релиз, в моём случае zabbix-release-2.4-1.el6.noarch.rpm, ставим через rpm -Uvh, потом yum -y install zabbix-agent

Введение-предупреждение: selinux у меня выключен, поэтому если требуется его работа - или настраиваем в режиме permissive, выставляя потом права и создавая правила, или при любой проблеме первым делом проверяем, не он ли мешает работе.

2 метода получения данных:
  1. SNMP
  2. скриптами для агента

понедельник, 22 июня 2015 г.

Freeswitch + debian jessie (8.x)

Если apt-get install freeswitch-meta-vanilla заканчивается с ошибкой, можно поставить
freeswitch-meta-bare и затем freeswitch-init-systemd

Или наоборот, как вариант. Суть в том, что до установки freeswitch-init уже должен стоять хоть какой-то инит пакет.

Ошибка выглядит примерно так
# apt-get install -f
Reading package lists... Done
Building dependency tree    
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
2 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up freeswitch-sysvinit (1.4.20~34-1~jessie+1) ...
Job for freeswitch.service failed. See 'systemctl status freeswitch.service' and 'journalctl -xn' for details.
invoke-rc.d: initscript freeswitch, action "start" failed.
dpkg: error processing package freeswitch-sysvinit (--configure):
 subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of freeswitch-init:
 freeswitch-init depends on freeswitch-sysvinit (= 1.4.20~34-1~jessie+1); however:
  Package freeswitch-sysvinit is not configured yet.

dpkg: error processing package freeswitch-init (--configure):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 freeswitch-sysvinit
 freeswitch-init
E: Sub-process /usr/bin/dpkg returned an error code (1)

среда, 3 июня 2015 г.

freeswitch 1.6 - основные фишки

https://freeswitch.org/confluence/display/FREESWITCH/FreeSWITCH+1.6+Video
Detailed information on how to properly build and test the new FreeSWITCH™ 1.6 with awesome video conferencing support.
Прежде всего, перерабатывают работу с видео. Правда, штука довольно редко нужна, без учета всяких порночатиков.
Плюс изменили систему сборки, но зачем ради этого менять версию?...

По ссылке - инструкция по установке. Пока версия альфа, 1.5.

freeswitch + docker

Представляет определенный интерес такой продукт как Docker, он умеет пускать фрисвич в контейнере, но не требует всей обвязки openvz. Правда, без проброса группы портов он хорош только в небольших внедрениях, но это "пока"...

https://beingasysadmin.wordpress.com/2014/06/16/dockerizing-freeswitch-docker-enters-telephony-world/

I wouldn't recommend using Docker for a VoIP server before Docker supports port ranges. You need to configure it to map UDP port ranges for RTP, and with current version of Dicker you can only list every port explicitly. In the next release, they promise to support port ranges.
http://stackoverflow.com/questions/27830518/sip-408-request-timeout-for-freeswitch

и пример запуска из комментария

I did the following before running the freeswitch server on docker docker run -d -p 0.0.0.0:2223:22 -p 82:80 -p 5060:5060/tcp -p 5060:5060/udp -p 16384:16384/udp -p 16385:16385/udp -p 16386:16386/udp -p 16387:16387/udp -p 16388:16388/udp -p 16389:16389/udp -p 16390:16390/udp -p 16391:16391/udp -p 16392:16392/udp -p 16393:16393/udp -p 5080:5080/tcp -p 5080:5080/udp --name <container_name_goes_here> <repository_name_goes_here>

четверг, 23 апреля 2015 г.

180, 183, early_media

Early media это информация, которая ходит только в 1 сторону, оно же обычно pre answer. Если медиа нет - телефон сам генерирует гудки, иначе передает то, что прилетает. А это может быть "абонент временно недоступен", просто какая-то информация...

Обычно при установке соединения идут сообщения тип 100 (trying), потом 180 ringing, без медиа, потом 183 session progress, с медиа. Но в рф сотовые и тут выпендрились и медиа у них уже в 180 летит, что несколько ломает поведение фрисвича, хотя по RFC это и допустимо.


Работа с хуками и стартап скриптами

Пример стартап скрипта
con = freeswitch.EventConsumer("CUSTOM","vm::maintenance")
for e in (function() return con:pop(1) end) do
        freeswitch.consoleLog("notice","event\n" .. e:serialize("xml") .. "\n")
        element = nil
        element = e:getHeader("VM-Action")
        if element then
                --
        end
end

Пример хук скрипта
freeswitch.consoleLog("notice","RECORD_STOP\n" .. event:serialize(""))
path = nil
path = event:getHeader("Record-File-Path")
итд.
То есть у нас изначально есть массив event, где лежат все значения ивента. Но при этом недоступны канальные переменные, только глобальные. Можно добавить свои поля в ивент через event:addHeader("API-FileSize", size), и даже сформировать новый ивент (читаем доку), но просто модификация полей не перенесет новые переменные в сессию.

Можно создать привязку к api так:
api = freeswitch.API()
и дальше делать запросы типа
req = urlencode(event:serialize("json"))
data = api:executeString("curl "..  url .. " content-type application/json post " .. req)
Опять же, сессионные переменные будут недоступны, то есть можно сделать eval на строку вида
path =  "$${base_dir}/recordings/archive/${strftime(%Y-%m-%d-%H-%M-%S)}_${caller_id_number}_${destination_number}.wav"
но ${caller_id_number}_${destination_number} будут пустые и на выходе останется только "_". Нужно подобрать подходящие поля в event. Что-то можно заранее в ивент (и сип заголовки) выставить через application=set data="sip_h_X-Caller=12345", появится поле X-Caller.

Есть ещё метод вызова, через lua или luarun, тогда доступны сессионные переменные через массив session, самый простой пример
session:execute("playback", mySound)
в отличии от api:execute, выполняется в контексте текущей сессии, где доступны все переменные.

Также нужно быть предельно аккуратными с freeswitch.EventConsumer -- если такая конструкция появится в хуке на ивент, фрисвич начнёт падать. Точно актуально для 1.4.15, и на момент выхода 1.4.18 никто даже не пытался понять причин. И что самое противное -- падать будет не сразу, а спустя N дней, и при этом КАК БЫ работать. То есть поступает звонок, в логе есть инвайт, есть ответ на него... и всё. ringing уже не будет. Но cancel примет и обработает!

Ну и помним, что стартап скрипты перечитываются ТОЛЬКО при рестарте всего фрисвича целиком! Увы, просто рестартовать модуль lua нельзя. А вот хуки - читаются при каждом обращении к ним, поэтому для повышения скорости их лучше помещать в tmpfs/shm

линки
https://freeswitch.org/confluence/display/FREESWITCH/mod_lua
https://freeswitch.org/confluence/display/FREESWITCH/Lua+API+Reference

среда, 22 апреля 2015 г.

генерация тонов

Есть для этого спец модуль tone_stream, общий формат
tone_stream://[L=x;][v=y;]%(<on-duration>, <off-duration>, <freq-1> [, freq-2] [, freq-3] [, freq-n] [;loops=x])

Пример использования
<action application="playback" data="tone_stream://L=100;%(100,100,350,440)" />

Примеры

Непрерывный тон
tone_stream://%(10000,0,350,440)

Звонок формата сша, сам тон в константе
tone_stream://$${us-ring}
оно же
tone_stream://%(2000,4000,440,480)
также интересны ru-ring, uk-ring

опционально ;loops=-1 или {loops=-1}tone...

сложный тон (2 тона)
tone_stream://%(275,10,600);%(275,100,300)

бывает даже так
tone_stream://path=${conf_dir}/tetris.ttml

Более подробное описание и совсем сложные примеры:
https://wiki.freeswitch.org/wiki/TGML

понедельник, 20 апреля 2015 г.

lua, execute и curl - получить код ответа

1)
session:execute("curl", some_url)
Код будет в curl_response_code

2)
local response = api:execute("curl", url .. " json timeout 2 get ")
resp = json.decode(response)

if  resp.status_code ~= 200 then ...

среда, 15 апреля 2015 г.

Что за внутренний кодек L16?

В логе можно увидеть такую строку:
[DEBUG] switch_ivr_play_say.c:1314 Codec Activated L16@8000hz 1 channels 20ms

По сути, это чистый WAV, 16 бит на такт, 8кГц, линейное преобразование. Каждые 20 мс сигнала собираются в 1 пакет.
Промежуточный внутренний кодек фрисвича, когда нужно транскодирование, микширование итд.

HD - те же 16 бит, но полоса больше, допустимые значения 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000