вторник, 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, приятного изучения.

18 комментариев:

Анонимный комментирует...

Мы в свое время тоже поплевавшись решили с Аsterisk'ом не связываться. Но мы в качестве альтернативы выбрали YATE. А вы YATE смотрели? Чем не устроил?

Deepwalker комментирует...

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

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

Deepwalker комментирует...

По вопросу, мнение от разработчика:

http://lists.freeswitch.org/pipermail/freeswitch-users/2008-July/004606.html

blacknight_ комментирует...

А как там с интеграцией с LDAP и с sip presence, не подскажите? В этих моментах меня Астериск просто убил.:) Впрочем, никаких других проблем я не замечал. Может быть, правда, это и ничего хорошего не сулит, так как вот-вот перейдём совсем на VoIP, если пойдут косяки, нужно будет искать что-то ещё. Вроде как кругом все расхваливают *, я и не думал смотреть что-то ещё...

Deepwalker комментирует...

По моему там все с этим замечательно. В принципе FreeSWITCH имеет набор всяких фишек типа xml_rpc и xml_curl, которые позволяют при помощи, например, Django сделать интеграцию вообще с чем угодно.

Также FreeSWITCH поддерживает perl, python, lua, javascript - можно некоторую логику в диалплан добавить с их помощью.

xml_curl это вообще отдельная тема для поста. При помощи этого модуля можно отправлять FS за пользователями и номерным планом на некий web сервер. Отсюда сразу рождается идея держать пользователей в базе данных.

Дополнительным плюсом FS можно назвать производительность. Также разработчики легко идут на контакт, готовы исправлять ошибки, если вы им дадите достаточно информации для этого.

FS в отличие от * у меня ни разу не падал и не требовал перезагрузки.

Анонимный комментирует...

Привет.

А как у subj. с поддержкой факсов/T.38 ?

Есть ли варианты кластеризации для резервирования и распределения нагрузки ?

Анонимный комментирует...

умеет ли subj авторизовать пользователей через radius ?

Deepwalker комментирует...

t.38 subj поддерживает, как я понял, через mod_socket.
С radius не очень понятно, попробуйте посмотреть wiki проекта.

Deepwalker комментирует...

Update:
Появился mod_fax в транке.

Есть поддержка скидывания CDR в radius, аутентификацию можно прикрутить от чего угодно сляпав на коленке маленький web сервер. На Django очень даже легко получается.

pavel комментирует...

Я поставил freeswitch и запустил его. потом настроил софтфон, указав прокси с freeswitch. Почему-то не присоединилось

Deepwalker комментирует...

В SIP надо указывать правильно realm (не знаю как лучше перевести, в kerberos чаще всего переводят как сфера), думаю ваша проблема в этом. Ну и еще полезно читать логи (запустите freeswitch в интерактивном режиме - ключ -c), и прикладывать ошибку. Хотя после сообщения об ошибке от unix демона, спрашивать чаще всего уже нет необходимости : )

pavel комментирует...

У меня профиль интернал и экстернал почему-то биндятся к 127.0.0.1 и извне порт закрыт

pavel комментирует...

а куски лога такие
2008-11-10 17:38:07 [NOTICE] sofia.c:1865 config_sofia() Adding Alias
[127.0.0.1] for profile [internal]
и
2008-11-10 17:55:08 [ERR] sofia_glue.c:480 sofia_glue_ext_address_lookup() Stun Failed! stun.freeswitch.org:3478 [Remote Address Error!]
2008-11-10 17:55:08 [ERR] sofia.c:1510 config_sofia() Failed to get external ip
2008-11-10 17:55:08 [ERR] sofia.c:852 parse_gateways() ERROR: username param is REQUIRED!

Анонимный комментирует...

Уже пора написать структуру freeswitch/conf/lang/ru ?
как минимум demo.xml нужен.

Deepwalker комментирует...

Все обсуждения переносим сюда -
http://groups.google.ru/group/freeswitch-ru?msg=new&lnk=gcis&hl=ru
По моему тоже пора заняться поддержкой русского, тем более что можно будет взять наработки из астериска.

Анонимный комментирует...

как только принимающая сторона поднимает трубку вызывающая ее сразу ложит
подскажите как быть

2009-05-30 12:27:06 [INFO] mod_dialplan_xml.c:252 dialplan_hunt() Processing 1001->89173919321 in context default
2009-05-30 12:27:06 [NOTICE] switch_channel.c:602 switch_channel_set_name() New Channel sofia/admin/89173919321@172.16.123.200:5061 [ef0a4eaa-4983-4b9c-bd5a-7fb4a3c83113]
2009-05-30 12:27:06 [NOTICE] sofia.c:3067 sofia_handle_sip_i_state() Ring-Ready sofia/admin/89173919321@172.16.123.200:5061!
2009-05-30 12:27:06 [NOTICE] mod_sofia.c:1391 sofia_receive_message() Ring-Ready sofia/admin/1001@172.16.123.11:5060!
2009-05-30 12:27:06 [NOTICE] switch_ivr_originate.c:1768 switch_ivr_originate() Ring Ready sofia/admin/1001@172.16.123.11:5060!
2009-05-30 12:27:21 [NOTICE] sofia.c:3508 sofia_handle_sip_i_state() Channel [sofia/admin/89173919321@172.16.123.200:5061] has been answered
2009-05-30 12:27:21 [NOTICE] switch_ivr_originate.c:1978 switch_ivr_originate() Channel [sofia/admin/1001@172.16.123.11:5060] has been answered
2009-05-30 12:27:21 [WARNING] mod_sofia.c:781 sofia_read_frame() We were told to use ptime 20 but what they meant to say was 30
This issue has so far been identified to happen on the following broken platforms/devices:
Linksys/Sipura aka Cisco
ShoreTel
Sonus/L3
We will try to fix it but some of the devices on this list are so broken who knows what will happen..
2009-05-30 12:27:21 [NOTICE] sofia.c:3563 sofia_handle_sip_i_state() Hangup sofia/admin/89173919321@172.16.123.200:5061 [CS_EXCHANGE_MEDIA] [NORMAL_TEMPORARY_FAILURE]
2009-05-30 12:27:21 [NOTICE] switch_ivr_bridge.c:1008 switch_ivr_multi_threaded_bridge() Hangup sofia/admin/1001@172.16.123.11:5060 [CS_EXECUTE] [NORMAL_TEMPORARY_FAILURE]
2009-05-30 12:27:21 [NOTICE] switch_core_session.c:1085 switch_core_session_thread() Session 148 (sofia/admin/89173919321@172.16.123.200:5061) Ended
2009-05-30 12:27:21 [NOTICE] switch_core_session.c:1087 switch_core_session_thread() Close Channel sofia/admin/89173919321@172.16.123.200:5061 [CS_DESTROY]
2009-05-30 12:27:21 [NOTICE] switch_core_session.c:1085 switch_core_session_thread() Session 147 (sofia/admin/1001@172.16.123.11:5060) Ended
2009-05-30 12:27:21 [NOTICE] switch_core_session.c:1087 switch_core_session_thread() Close Channel sofia/admin/1001@172.16.123.11:5060 [CS_DESTROY]

Totti Totti комментирует...

Народ, выручайте! Мне очень нужна помощь! У меня есть сторонняя программа, с помощью которой я создаю номера и регистрирую телефоны, FS как коммутатор направляет звонки на нужных мне абонентов, но я не могу увидеть где? где?? сохранены и зарегистрированы мои абоненты, команда sofia status выводит нули, директории sip_profiles в директории conf у меня почему-то нет, а я думал что увижу возможно там сгенерированные файлики абонентов *.xml, прочитал из комментариев выше, что возможно обращение к базе данных, хорошо как ее посмотреть??? Вообщем, объясните пожалуйста! Заранее спасибо!) Ну или хотя бы приведи простой банальный пример создания абонента и его просмотра регистрации, увы документации я не понял, можно прям по пунктам, что надо сделать!)

Михаил Кривушин комментирует...

Totti, крутой крик о помощи, но во-первых тут не форум где консультируют, во-вторых невозможно ничем помочь - вы даже не удосужились назвать свою магическую программу, которая вам там чего-то регистрирует.
В гугло группах есть freeswitch-ru - туда стоит написать. Только не в стиле "всё пропало", а так как-будто человечество не освоило телепатию.