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

суббота, 7 ноября 2009 г.

FreeSWITCH, сервис эха.

Обычно эхо делается так:

  • приветствуем

  • бибикаем

  • портим текст записываем в файл

  • бибикаем

  • проигрываем файл

  • откладываем скрипку прощаемся



Во FreeSWITCH есть более изящный вариант - приложение delay_echo. Единственный параметр это длительность задержки (буфера) перед воспроизведением звука обратно. Буфер размещается в памяти, диск не дергается, система не упирается в диск, но любит память. По моему восхитительно, учитывая еще и необходимость файлы стирать.


 1     <extension name="delay_echo">
 2       <condition field="destination_number" expression="^echo123$">
 3         <action application="answer"/>
 4         <action application="sleep" data="1000"/>
 5         <action application="playback" data="/opt/freeswitch/sounds/ru/RU/elena/voicemail/8000/vm-greeting.wav"/>
 6         <action application="playback" data="/opt/freeswitch/sounds/ru/RU/elena/voicemail/8000/vm-record_message.wav"/>
 7         <action application="sleep" data="1000"/>
 8         <action application="gentones" data="%(200,0,800)"/>
 9         <!--action application="sched_broadcast" data="+10 gentones::%(200,0,800)"/-->
10         <action application="sched_transfer" data="+20 after_echo XML public"/>
11         <action application="delay_echo" data="10000"/>
12       </condition>
13     </extension>
14
15     <extension name="delay_echo_next">
16       <condition field="destination_number" expression="after_echo">
17         <action application="sleep" data="1000"/>
18         <action application="playback" data="/opt/freeswitch/sounds/ru/RU/elena/voicemail/8000/vm-goodbye.wav"/>
19         <action application="sleep" data="1000"/>
20         <action application="hangup"/>
21       </condition>
22     </extension>
23

среда, 28 октября 2009 г.

Регистратор SIP на twisted.

Питонисты в курсе, что есть такая чудо библиотека для работы с сетевыми протоколами как Twisted. Она немного сложна поначалу, но после просветления становится совершенно необходимым инструментом.
В стандартной поставке с ней идет множество уже реализованных протоколов - IMAP, XMPP, HTTP (в сочетании с обработкой URL через джанго и какой-нибудь библиотекой шаблонов весьма полезный инструмент) и т.д. Количество же протоколов, которые реализованы на/для Twisted не поддается подсчету. Таким образом Tornado может спать спокойно - сравнивать его с Twisted вообще некорректно.

Среди стандартных протоколов нашел SIP - последний раз обновлялся 3 года назад, есть проект VoIP телефона shtoom, который также заглох. Но тем не менее вот вам регистратор на Twisted:

#!/usr/bin/env python
# coding: utf-8

from twisted.application import internet, service

import sip

DOMAIN='192.168.9.5'

application = service.Application("JuzzCallBack")

sip.RegisterProxy.registry = sip.InMemoryRegistry(DOMAIN)
sip.RegisterProxy.locator = sip.RegisterProxy.registry
sip.RegisterProxy.debug = True
proxy = internet.UDPServer(5060,sip.RegisterProxy())

proxy.setServiceParent(application)

И что удивительнее всего - он работает. На досуге хочется попробовать сделать простейший SIP-телефон, будет интересно. Назову его Shtoom ressurection, он не будет обладать даже функциями предшественника, и сдохнет на версии -0.1, ожидайте!

четверг, 17 июля 2008 г.

Разработчик, возлюби RFC

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

Глюки обнаружились при переходе на FreeSWITCH.
1. Телефоны Linksys SPA901 и SPA921 неправильно называют кодек g729 в SDP (Session Description Protocol). Для того чтобы поправить это, вам нужно зайти на web интерфейс телефона, переключить в режим Admin+Advanced. Далее на вкладке "SIP" в разделе "SDP Payload Types" ищем пункт "G729a Codec Name:" и приводим к виду "g729", то есть убираем "a" на конце.

2. Вообще в интернете не встречал упоминания, но шлюзы Addpac AP1005 (4xFXO) также страдают забавным глюком - они отдают странный SDP при связи друг с другом: a=rtpmap:18 G729/8000/3

Так как FreeSWITCH свято чтит RFC и документ, который будет указан ниже (а быть может эта любовь от SIP стека Sofia, производства компании Nokia), то он прекрасно знает, что rtpmap с номером 18 может означать только G729/8000/1 Никаких "a" или трех звуковых каналов, что вообще забавно смотрится - 3 канала на моно голос это явный перебор.

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

В остальном телефоны и шлюзы впечатление оставляют самое приятное - телефоны работают как от них ожидается, шлюзы Addpac чудесно гибкие в настройке. Но все же - чем им так не угодили RFC?

Как я подозреваю, большинство реализаций смотрит только на номер rtpmap, и ничуть не заботится разбором последующих конструкций. А вот это зря - например кодеки g726-xx статического номера не имеют, а шлюзы Addpac для g726-16 другой номер, кроме как 116, не воспринимают. Это противоречит RFC и этому документу.

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

На этом внеочередное заседание любителей RFC объявляю закрытым.

вторник, 15 июля 2008 г.

FreeSWITCH

Тема VoIP стала на данный момент ближе моему сердцу, чем Kerberos, а виной тому, наверное, инструмент. Мне кажется странным, что мало кто слышал о FreeSWITCH (далее FS), ведь этот наследок Asterisk несет в себе куда более продуманную архитектуру. Нет, что вы, это не очередной форк от Asterisk как вы уже было подумали, вовсе нет. Это вынужденный ход одного из бывших разработчиков Asterisk, он просто решил, что из за кривизны изначальной архитектуры Asterisk проще будет переписать все с нуля.

И знаете, я уже давно не смотрю новые версии Asterisk, так как желание отбито давно и крепко (кто скажет что не ловил ни разу segmentation fault, или глюки с памятью, или же третье пусть считает себя везунчиком, FS vs Asterisk на ЛОРе). В общем с той поры как я решил, что Asterisk не стоит моих нервов, я пересмотрел много альтернатив. Был в списке и CallWeaver, но так как это просто форк Asterisk, то ничего нового в мой опыт он не привнес. Работал я с SipXpbx (с названиями и их сменой у данного продукта мне разбираться лень), тут главной сложностью было его собрать, так как SipXConfig тянет за собой тонны зависимостей и все из мира Java, в котором я полный ноль. Но гибкости в нем нет, это красивое решение, хороший конфигуратор, соответствие стандартам, но нельзя крутить его настройку теми адскими способами, что в FS.

FreeSWITCH мне порекомендовали в самарской news конференции (nntp еще кто то помнит? В Самаре отлично помнят : )) ). Я сразу ожидал что соберу его через неделю, как SipX, но я был невероятно удивлен, когда в директории слитой с svn я увидел столь любимую мной папку debian! А самой главное чудо, что debian/rules binary сработали, лишь пару библиотечек вроде бы доставить пришлось.

Итак, я получил deb пакеты, и поставил их используя dpkg -i. Еще я немного покрутил директорию debian для сборки mod_python (ну любимый инструмент, что поделаешь), если кому то будет интересно могу описать.

В итоге получается практически готовый сервер - в поставку входит демонстрационный Dialplan (план нумерации наверное буду его называть), настроены учетные записи пользователей. То есть можно сразу начинать работать с FS. Если вы ставили из пакетов, то установится FS в папку /opt/freeswitch, конфигурация хранится в директории conf.

Для начала можно настроить любой IP телефон на учетку 1000 с паролем 1234 и попробовать поиграться с голосовыми меню, с голосовой почтой, с конференциями (никаких модулей ядра не нужно) - все прекрасно работает, правда, как это водится, без намека на русский язык. Впрочем, если кому то будет интересно, можем попробовать сделать русскую локализацию сообща.

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

Теперь немного по первичной настройке SIP. Для работы с SIP используется mod_sofia (а он используется open source библиотеку от Nokia), загружен по умолчанию. Для работы нужны профили (conf/sip_profiles). Например если вам нужно чтобы на ваш SIP сервер могли звонить все кому придется без регистрации, то вы создаете профиль, настраиваете его, проставляете ему контекст(context), и перезапускаете FS. Профили должны использовать разные порты.

Контексты это отдельные планы нумерации - у профиля прописан контекст по умолчанию, у пользователей могут быть указаны свои (то есть отличающиеся от профиля по умолчанию). План нумерации хранится в conf/dialplan, очень сильно рекомендуется к изучению - там очень много интересного.

Итак, вы стартовали и вам понравилось? Я на это надеюсь, и поэтому дам совет как изучать FreeSWITCH - идете в wiki проекта. Можно просто походить по разделам, но гораздо лучше взяться за файл conf/dialplan/default.xml и вставлять из него непонятные конструкции в поиск по wiki - так вы можете сразу узнать для чего та или иная команда.

Надеюсь вам понравится FreeSWITCH, приятного изучения.

четверг, 24 апреля 2008 г.

Addpac, детекция сигнала отбоя

Довольно распространенная проблема - АТС генерирует короткие гудки, дабы человек понял, что разговор окончен, но вот техника это не воспринимает. У шлюзов addpac есть специальная настройка для детекции сигнала отбоя - Clear-down-tone cadence.
Итак, заходим на шлюз:

AP1005# conf
Enter configuration commands, one per line. End with CNTL/Z
AP1005(config)# deb
AP1005(config)# end
AP1005# debug rta voice

Далее звоним через шлюз и кладем трубку со стороны АТС. В момент коротких гудков снимаем нечто вроде:

AP1005# 60 60 60 60 60 60 60 60 60 60 60 60 60 23 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 50 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 22 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 17 50 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 22 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 1616 16 16 16 17 50 60 60 60 60 60 60 60 60 60 60 60 60

Считаем:
сигналов ~=-16 * 35. Умножаем на 35, если кодек g711 или g729 - на 10. У меня последний вариант, так что получаем 350. Это у нас active power, а число зовется Active Time Duration.
сигналов ~=-60 * 34. Здесь тоже самое - получаем 340. Это idle power, число - Idle Time Duration.
Получаем:

voice class clear-down-cadence 1 -16 350 340 3 11

Здесь
1 - число необходимого повторения данно последовательности, у меня (1);
2 - уровень тона, те active power (-16);
3 - ActiveTimeDuration (350);
4 - Idle Time Duration (340);
5 - Active Power Variance - отклонения уровня, у нас не отклоняется, но все равно ставим 3 - на всякий;
6 - Idle Power Variance - отклонения уровня паузы, ставим 11.
Применяем:

AP1005# conf
Enter configuration commands, one per line. End with CNTL/Z
AP1005(config)# voice class clear-down-cadence 1 -16 350 340 3 11

Это собственно все описано в мануале от Addpac, ссылку не припомню, но на английском. Работает метод замечательно.

понедельник, 24 марта 2008 г.

linux в торговле

Уже много лет активно обсуждается применение linux на корпоративном десктопе. Ну что же, это вполне возможно и ни капли не смертельно. Уж я то точно могу об этом сказать, так как проэкспериментировал на собственной фирме.

Не так давно наша фирма решила немного расширить свое розничное направление (а торгует наша компания мебелью), и запустила новый бренд розничной сети. Ну и под этим брендом открываются у нас несколько магазинов. Вообще магазины у нас были довольно таки обкатаной единицей к тому времени - контроллер домена + файлосвалка, офисная АТС, около 4 рабочих станций, около 5 тонких клиентов (Thinstation linux).

Как у любых администраторов, linux был конечно же у всех на слуху (а у кого то и на рабочем месте). Я вообще довольно давно разбирался в вопросах как сделать интегрированую сеть на linux, и наработки были. И решили все таки попробовать.

Стандартную схему переработали, контроллер домена сменили на linux сервер, АТС на него же. Так же linux установили на все рабочие места. Единственной рабочее место с windows, это место "Моделирование кухонь". Многие производители кухонь делают что то на коленке для этих целей, а коленка у них это access, ms jet и иже с ними. В общем wine я под это заточить не сумел, да и с возможными косяками возится не очень то и хотелось - я же все таки ленивый админ или как?

Традиционную телефонию убрали, sipx нам в этом хорошо помог. При ценах на офисные АТС, даже дешевле получилось, ну а плюсы вы можете прочесть в любой из сотен рекламных брошюр по теме. Если еще сюда прибавить, что собственно телефон как отдельный аппарат это опция, то получается совсем уж замечательно.

Ну а самое важное для корпоратива, это конечно же логины, пароли, сетевые папки. Ну это просто достаточно - ldap как хранилище авторизационной информации, kerberos как служба аутентификации, nfs4 как сетевая фс, samba для общения с офисом, который еще не так продвинут (тяжело его продвинуть все таки, магазин он маленький, а офис...).

Вот это то наверное и буду описывать в дальнейшем, для этого и завел себе блог. Но сразу стоит оговориться, что коробочного толкового решения я еще не видел, чтоб хоп, как в windows, пару раз мышкой щелкнули, и машина в домене. Сейчас активно разрабатываются FreeIPA, Mandriva DS, но первый минус этой кухни - работает в одном каком то конкретном дистрибутиве (fedora и mandriva, конечно же), а второе - еще не допилено до конца. Можно сказать , что у меня есть предвзятое отношение, но mandriva у меня всегда вызывала опасения. Возможно я не прав, и руки у них за столько лет стали прямее, но ранний опыт использования не впечатлил. Fedora же довольно последовательно строит свой каталог, и уважение корпоративщиков к ее старшему брату, существует видимо неспроста.

А пока я строю свой каталог на коленке из openldap и heimdal kerberos, но об этом в следующих сериях.

SipX, стоит обратить внимание

Не многие знают об этом продукте, а между тем, работает он, на мой взгляд, лучше asterisk.
Ниша его - корпоративная VoIP связь. В отличие от ser, который может применятся для создания публичных VoIP сервисов, SipX имеет в своем составе голосовую почту, группы дозвона, хороший web интерфейс для управления. Также есть возможность настройки телефонов через тот же интерфейс (телефоны будут забирать все настройки через dhcp + tftp). Есть и еще пара полезных фич, о которых вы можете прочесть сами. Главные отличия от asterisk - поддерживает только sip (но уж ближе к rfc его не поддерживает практически никто), нет никаких reinvite (те сервер просто не пропускает поток rtp через себя, и именно поэтому не имеет проблем с джиттерами и кодеками).

Самым сложным для меня в отоношениях с sipx была его установка. Но есть уже готовые пакеты для rpm дистрибутивов. Мне же, как любителю debian, пришлось порядком повозиться с доустановкой дополнительных пакетов и настройкой odbc и java. Впрочем, в wiki есть основные моменты.

Данная запись это не подробное описание продукта. Это скорее повод посмотреть на него, для тех, кому VoIP интересен.

Мои личные впечатления от SipX крайне положительны. Его эксплуатация в тестовом режиме за несколько месяцев не выявила никаких паталогий. Могу только вспомнить неприятность с телефоном Addpac IP100, который не сохранял CSeq, и из за этого не мог зарегистрироваться на сервере после перезагрузки. Перезагружать SipX из за глюков не приходилось.

Из переписки

Глянуть можно, но в головном офисе он пока стоит на моей машине, хотя и обслуживает все звонки. Те это тестовая установка, по моему мнению, потому как выделенного сервера пока под него нет. Но вроде как сбоев при этом не было.

Я его на данный момент расставляю в филиалах, где обычной телефонии нет в принципе. А так связь на данный момент через шлюзы, прицепленные к атскам в старых филиалах (у нас сейчас куча новых открывается, в них вот как раз АТСки офисной нет, есть шлюз на городские номера и ip фоны на рабочих местах).

Почему не астериск - был плохой опыт его использования. Много глюков от его привычки пускать вначале соединение через себя. Те он проксирует rtp поток. Из этого получается, что он должен понимать все кодеки, а это не так. Потом он rtp пытается перевести с помощью функции reinvite, и это самый большой источник глюков. Победить это все можно, если желание есть. У меня нет : )

SipX настраивается через web морду, удобно, просто (астериск тоже умеет). Потоки через себя не пропускает, что избавляет от части проблем - меньше нагрузка на сервер, нет возни с jitter буферами и тп (пусть этим производители железок озабачиваются). А оно ему и не надо. Всякие штуки типа звонка сразу на 5 телефонов держит легко. Есть что то для ivr и тп, пока не требовалось, полный переход на ип телефонию планируется после обкатки решения на филиалах. Намного более asterisk'a соответствует rfc. В общем именно как офисная АТС прекрасен. Можно делать кластер и тп.

По части сервера, смотрящего в мир (ну там по типу skype, sipnet) я бы наверное не рекомендовал. Тут больше ser подходит, особенно по сравнению с астериском, ибо в нем уже вообще нечему глючить. Вот только ser не совсем тривиален в настройке - это вообще конструктор еще тот. Конфиг - программа на си подобном языке. Но уж наконфигурить можно все что угодно. Но тут подводный камень - это sip router именно, а потому делать специфичные вещи типа звонков на несколько номеров ему тупо не под силу. В общем для публичного сервиса хорош, для офиса не очень.