Опрос


Что для Вас Умный Дом?


Результаты


Реклама


Установка программной мини-АТС Asterisk

24/04/2011 01:33:23

Что, опять поврежденье на трассе?
Что, реле там с ячейкой шалят?
Мне плевать, буду ждать, я согласен
Начинать каждый вечер с нуля!

(В.Высоцкий, "Ноль семь")

Нужна ли мини-АТС в частном доме? Мне - нужна. Я попытаюсь объяснить какие задачи могут стоять перед современными системами связи в частном доме.

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

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

Схема IP-телефонии

IP-телефония в доме

Например, я бы хотел иметь возможность с любого телефона в доме звонить не только на городские номера, но в Интернет (Skype), ровно как и принимать звонки из Skype на домашние телефоны. Я бы хотел подключить GSM-шлюз с тем, чтобы когда никого нет дома, звонки из дома перенаправлялись или на телефон на работе или на мобильный телефон. А, выбрав правильно мобильный тариф, можно было бы до минимума сократить затраты на звонки с домашних телефонов на сотовые. Я бы хотел настроить несколько IP-шлюзов так, чтобы междугородние и международные звонки с любых телефонов в доме автоматически маршрутизировались на нужные IP-сервисы для обеспечения минимальной стоимости звонка. Я бы хотел организовать голосовую почту, которую я бы мог прослушать не только через телефон, но и через Интернет или с любого ПК в доме. Я бы хотел организовать автоматическую маршрутизацию всех звонков по CallerID или другим параметрам так, чтобы звонки с работы шли на телефон в кабинете, а звонки из школы - жене. Неплохо было бы организовать голосовое меню с паролем, чтобы иметь возможность управлять любыми устройствами в доме посредством голоса или DTFM. Наконец, даже дверной звонок или звонок на входе можно завести в мини-АТС, чтобы он автоматически отправлялся на мобильный телефон и я мог с чистой совестью сказать, что никого нет дома. Это только малая доля того, что можно реализовать посредством современных программных решений. Существуют много других интересных идей. Например, часто в отелях за рубежом Wi-Fi Интернет бесплатен. Но не у всех есть Skype. Можно посредством Skype соединится с домашним Asterisk и позвонить на нужный городской номер совершенно бесплатно. Полагаю, даже этого небольшого описания достаточно, чтобы согласится с тем, что в своем доме, особенно если он в некотором смысле Умный, бесплатный Asterisk вряд ли будет лишним.

В данной статье я не ставлю задачу сделать подробное описание процесса установки Asterisk в Linux. Ограничусь только некоторыми основными моментами, а более подробно опишу свой опыт и некоторые нюансы, которые могут быть полезны читателям.

Asterisk - это бесплатный программный продукт. Он не включает в себя какое-либо оборудование. Но если к дому подведена телефонная линия, одной только программы будет мало. Необходим шлюз, который бы позволил компьютер (выполняющий роль мини-АТС) подключить к аналоговой телефонной сети. Традиционно такие аппаратные средства называют VoIP-шлюзами. Шлюзы бывают внешними - из самых известных это D-Link, ZyXEL, Linksys, Grandstream, Skypemate и другие и в виде плат, встраиваемых в компьютер: Digium, Yeastar, Sangoma. В шлюзе должен присутствовать хотя бы один FXO-порт. Собственно, к этому порту и подключается телефонная линия. В доме могут использоваться обычные аналоговые телефоны - привычные нам Panasoinc, Siemens или IP-телефоны: LInksys, D-Link, Yearlink, Cisco, Polycom, Fanvil и другие. Для подключения одного аналогового телефона нужно, чтобы в VoIP шлюзе или плате присутствовал FXS-порт. Во внешних шлюзах количество таких портов обычно 1-2, на платы можно установить 4-8 и более FXS портов. Если у нас в доме, скажем, 3 аналоговых телефона, нужно 3 FXS-порта. Совсем другая ситуация с IP-телефонами. Они подключаются в существующую Ethernet-сеть и их может быть сколько угодно. Какие-либо дополнительные порты им не нужны. На текущий момент FXS-порт + хорошие аналоговый телефон стоит примерно столько же сколько IP-телефон (около 2500 руб).

Digium TDM410 + X100M + S110M

Плата Digium TDM410 c двумя мезонинами установлена в медиа-сервер

Таким образом, я купил аналоговую 4-х канальную плату Digium TDM410P и два мезонина (X100M/FXO, S110M/FXS). Сама плата имеет 4 канала, но необходимый функционал каналов создается установкой так называемых мезонинов. На эту плату, например, можно установить 4 мезонина X100M, тогда получится 4 FXO-порта для внешних линий или 3 FXS и 1 FXO. Также я приобрел IP-телефон Cisco SPA504G.

Для установки Asterisk в Debian можно воспользоваться репозиторием.
Update статьи от 10.11.2013. Установка Asterisk в Debian 7 (Wheezy).

Установить Asterisk в ОС Debian достаточно просто. Но есть один нюанс, связанный с модулями DAHDI.

apt-get install asterisk  asterisk-dahdi dahdi dahdi-firmware-nonfree  dahdi-linux  dahdi-source

Пакет dahdi-source необходимо загрузить обязательно, иначе модуля wctdm24xxp у вас не будет. Для успешной загрузки dahdi-firmware-nonfree потребуется добавить non-free в конфигурационный файл source.list менеджера apt.

После установки всего этого хозяйства запускаем команду dahdi_genconf modules
Но модули еще требуется скомпилировать. Для этого запустим следующую магическую команду (компилирование модуля с помощью module-assistant)

m-a a-i dahdi

А уже после этого можно запускать скрипт

/etc/init.d/dahdi start

Настройка Asterisk, установленного из репозитория в точности такая же, как и при установке из исходников.

Кому-то может показаться, что в репозитории Debian содержится достаточно древняя версия этого ПО, поэтому можно скомпилировать Asterisk самостоятельно. Необходимо с официального сайта Asterisk скачать последнюю версию Asterisk и драйверов DAHDI (если у нас будут использоватья аналоговые платы).
Процедура установки Asterisk из исходных кодов была описана 24.04.2011 и в текущий момент может содержать неактуальную информацию.

Поскольку мы собираемся компилировать Asterisk сами, то нужно, чтобы в системе присутствовал весь необходимый для этого инструментарий: gcc, g++, build-essential, make, libncurses5-dev и прочее (ставится с помощью apt-get install). Далее все просто:

Скачиваем дистрибутив драйвера DAHDI
Распаковываем его с помощью команды tar -xvzf имя_архива
Переходим в распакованную папку

./configure
make
make install

Скачиваем дистрибутив Asterisk.
Распаковываем его с помощью команды tar -xvzf имя_архива
Переходим в распакованную папку

./configure

Теперь настроим все плагины, которые, начиная с версии 1.8, устанавливаются с помощью menuconfig

Asterisk. make menuconfig

make menuconfig
make
make install
make samples
make config

Собственно, все. Запускается Asterisk автоматически или с помощью команды
/etc/init.d/asterisk start (в Debian)

А вот дальше намного сложнее. Драйвер DAHDI можно настроить с помощью команды

dahdi_genconf

Скрипт сам пропишет конфигурационные файлы согласно установленного оборудования (речь именно о платах TDM).

Настройка Asterisk

С конфигурированием Asterisk все не так просто. Достаточно зайти в папку /etc/asterisk чтобы оценить масштаб настроек.
Но, несмотря на все разнообразие, основные параметры содержатся файлах users.conf, sip.conf и extensions.conf

Описать внешнюю линию, а также FXS-порт (аналоговый телефон) и IP-телефоны можно в users.conf. Многие пользователи вносят эти настройки в sip.conf. Asterisk обрабатывает оба файла. Я же отталкиваюсь от того, что Asterisk GUI делает изменения именно в users.conf.

; Описываем внешнюю линию (FXO)
; Мезонин X100M установлен на канале 2
[trunk_1]
group = 1
context = DID_trunk_1
busydetect = yes
busycount = 3
busypattern = 500,500
ringtimeout = 8000
progzone = ru
usecallerid = yes
cidstart = ring
cidsignalling = bell
flash = 750
rxflash = 1250
callerid = asreceived
dahdichan = 2
trunkstyle = analog
allow = all
group = 1
signalling = fxs_ks
channel = 2

; Описываем аналоговый телефон Panasonic c номером 101
; Мезонин S110M установлен на канале 1
[101]
context = DLPN_DialPlan1
transfer = yes
mailbox = 101
call-limit = 100
type = friend
fullname = Panasonic (Analog)
callgroup = 1
cid_number = 101
threewaycalling = yes
pickupgroup = 1
signalling = fxo_ks
flash = 750
rxflash = 1250
linenumber = 1
LINEKEYS = 1
callcounter = yes
dahdichan = 1
disallow = all
allow = alaw,gsm

; Описываем IP-телефон Cisco SPA504G
[102]
context = DLPN_DialPlan1
cid_number = 102
hassip = yes
secret = mypass
macaddress = 1CDF0F4B27F5
autoprov = yes
linenumber = 1
LINEKEYS = 4
callcounter = yes
username = 102
transfer = yes
mailbox = 102
call-limit = 100
type = friend
fullname = Cisco SPA504G
registersip = no
host = dynamic
callgroup = 1
type = friend
disallow = all
allow = alaw,gsm

Теперь нужно прописать правила набора, маршруты в файле extensions.conf

[DLPN_DialPlan1]
;Если набран номер 101 - отправлять звонок в канал 1 TDM410P
exten => _101,1,Dial(DAHDI/1/${EXTEN})
;Если набран номер 102 - отправлять звонок на IP-телефон
exten => _102,1,Dial(SIP/${EXTEN})
;Если набрано 6 цифр (городской номер), отправлять звонок в канал 2 TDM410P
exten => _NXXXXX,1,Dial(DAHDI/2/${EXTEN:0})

; Прописываем куда отправлять звонок с городской линии
; в данном случае на IP-телефон с номером 102
[DID_trunk_1]
exten => s,1,DIAL(SIP/102,20)
exten => s,2,Hangup()

Собственно, на этом базовая настройка Asterisk, которая позволяет осуществлять звонки внутри дома и на внешние телефоны, закончена.

После любых изменений в конфигурационных файлах, необходимо дать команду Asterisk для перезагрузки настроек. Это можно сделать так

/etc/ini.d/asterisk reload

или с помощью программы asterisk

asterisk -r
reload

Вообще говоря, для Asterisk есть несколько Web-интерфейсов для визуальной настройки. Это прежде всего FreePBX и Asterisk-GUI. FreePBX можно скачать с официального сайта проекта, а Asterisk GUI через subversion командой

svn checkout http://svn.digium.com/svn/asterisk-gui/branches/2.0

Настройка через Web-интерфейс сильно упрощает процедуру, но как любой автомат, делает это не всегда правильно. Автоконфигурирование поможет сформировать основу, а тонкую настройку придется все же осуществить в ручном режиме.

Asterisk GUI

Asterisk GUI

Первое тестирование показало, что все работает достаточно хорошо. Звонки внутри домашней сети между аналоговым и цифровым телефоном проходили. Каждый из них мог звонить на городские номера. Качество связи хотя и не было идеальным, все же было достаточно неплохим. В процессе экспериментов было замечено, что при звонках с IP-телефона Cisco ощущалась какая-то "урезанность" звука. Чего-то не хватало.

Здесь нужно сказать несколько слов о кодеках. Asterisk позволяет работать с массой разных кодеков. Самый распространенный во всем мире кодек G.711 (который был создан аж в 1972 году). Этот кодек является, пожалуй, одним из самых качественных кодеков, так как практически не использует компрессию. Если позволяют каналы связи, а для работы кодека нужна полоса в 64Кбит/с, лучше использовать именно его. К тому же при использовании G.711 нагрузка на аппаратную часть минимальна, так как объем вычислений ничтожно мал. G.711 всегда присутствует в двух вариантах: ulaw (использующийся в США, Канаде и Японии) и alaw (во всем остальном мире). Все цифровое оборудование в России использует alaw. Преобразование из ulaw в alaw всегда происходит с ухудшением качества звука. По умолчанию в Asterisk и IP-телефонах часто стоит G.711u. После того, как я везде установил приоритет alaw, качество звука улучшилось, но осталась какая-то приглушенность.

Cisco SPA504G

Поиск в сети подтвердил, что это общая проблема телефонов серии SPA500. Некоторые пользователи подключали к этому телефону трубки от аналоговых телефонов и наблюдали при этом улучшение качества и громкости звука. Компания Cisco, видимо, проблему признала и выпустила прошивку, в которой была сделана попытка исправить ситуацию. После установки прошивки и изменения параметра Input Gain в закладке Phone Web-интерфейса телефона ситуация в значительной степени улучшилась.

Примечания к прошивке 7.4.6
A deep bass audio setting for handsets was added in the web-based configuration utility and the phone user interface
There are three choices:
- Default—Enables deep bass on the phone.
- HiDef—Enables a redesigned equalizer that has improved high frequency.
- Standard—Enables an equalizer that emulates a narrow-band handset.

Качество звука и субъективные ощущения при разговоре вполне меня устроили, хотя я бы и не дал наивысшую оценку. Единственное, что еще в некоторой степени мешало - появляющееся эпизодически эхо.

SPA500 Web-интерфейс
Настройка громкости звука (Input Gain)

Эхо в VoIP технологии в случае звонков на аналоговые телефоны является достаточно распространенным, можно даже сказать обычным явлением. Эхо появляется всегда, когда происходит утечка голоса из тракта передачи в тракт приема. Причин такой утечки много. Наиболее распространенная причина возникновения эха - сама природа аналоговой передачи данных, связанная с нарушением баланса, разными характеристиками жил двухпроводных линий. Эхо также возникает в случае, если на принимающей стороне происходит передача голоса из динамика в микрофон. В привычной (аналоговой) телефонии эхо присутствует ничуть не в меньших масштабах, но за счет малой транспортной задержки (менее 50 мс) для человеческого мозга оно не создает какого-либо дискомфорта. В цифровых VoIP сетях, где транспортная задержка существенно выше за счет кодирования звука и передачи по различным цифровым каналам эхо с задержкой в 50-300 мс создает существенные проблемы.

В Asterisk встроено несколько алгоритмов подавления эха. Наиболее популярный в данный момент MG2. Этот алгоритм является бесплатным и устанавливается по умолчанию в последних драйверах DAHDI. Существует еще один хорошо зарекомендовавший себя алгоритм - OSLEC, который разрабатывался специально для TDM400P, но у меня нет данных, работает ли он с платой TDM410P. В целом в моем случае MG2 снижал эхо до приемлемого уровня, но все-таки в некоторых случаях оно было ощутимо.

Поскольку я являюсь обладателем карты TDM410P, производитель, компания DIGIUM, предоставляет всем своим клиентам бесплатную лицензию на фирменный алгоритм эхоподавления HPEC. Для того, чтобы воспользоваться этим алгоритмом необходимо создать аккаунт на сайте Digium и зарегистрировать серийный номер платы. Затем нужно скачать с сайта и установить бинарники HPEC. Подробную инструкцию можно найти на сайте Digium.

Все, что необходимо - это внести изменения в настройки DAHDI. Файл system.conf

echocanceller = hpec,1-8

Со стороны Asterisk следует отредактировать файл chan_dahdi.conf

echocancel=256

В моем случае значение 256 (32 мс) явилось оптимальным.
Тестирование показало, что программный эхоподавитель HPEC работает в значительной степени лучше, чем MG2. В некоторых случаях небольшое эхо было слышно, но его громкость в несколько раз была ниже, чем при использовании MG2.

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

Я продолжил свои эксперименты по улучшению качества голоса и попробовал использовать разные кодеки G711 (alaw, ulaw), G726, G729a, G722. В исходном коде Asterisk отсутствует один из современных кодеков G729, который позволяет сохранить качество голоса на уровне G711 ограничившись при этом полосой всего в 8Кбит/с, но его можно установить из Интернета, скачав предварительно файл codec_g729-ast18-gcc4-glibc-x86_64-core2.so (название файла зависит от разрядности ОС, компилятора и т.д.) и подключить его к Asterisk с помощью команды

module load codec_g729-ast18-gcc4-glibc-x86_64-core2.so

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

sip show channels

Дальнейшие эксперименты показали, что разные кодеки по-разному обеспечивают качество связи. Неплохой результат показал широкополосный кодек G722, который, к слову поддерживается телефоном Cisco SPA504G. Качество связи с G722 кодеком оказалось сравнимым с G711. Таким образом, мой выбор в связке Asterisk 1.8 - DAHDI/TDM410P - Cisco SPA504G - это HPEC и G722 или G711a. Однако нужно учитывать, что с другим провайдером телефонных услуг, с другими линиями связи и телефонами результат может быть иным.

Еще несколько слов о настройке и использовании Cisco SPA504G.

Первое - телефон поставляется без блока питания! Так как данная модель поддерживает технологию PoE (Power On Ethernet), производитель, видимо, посчитал, что блок питания не нужен. Но PoE в моей сети нет. В качестве альтернативного питания в телефоне предусмотрен разъем - 5В DC. Где-то в подвале нашел старый дешевый китайский блок питания 6В/0.8A DC. Телефон заработал, но иногда самопроизвольно перезагружался. Мои подозрения первым делом упали на блок питания. И правда, после замены китайского чуда на качественный блок питания от старого FastEthernet коммутатора Intel InBusiness (5В/3A DC) глюки телефона пропали. Проблема даже не в том, что китайский БП давал 8,2В вместо 6В, а в том, что не отдавал требуемый телефоном ток. "Родной" БП расчитан на ток в 2 ампера. Используйте качественные стабилизированные блоки питания, способные отдавать не менее 2А.

Второе. В самом телефоне на каждую Extension/линию, а их в SPA504G четыре, прописывается свой Dial Plan. По умолчанию он такой.

(*xx|[3469]11|0|00|[2-9]xxxxxx|1xxx[2-9]xxxxxxS0|xxxxxxxxxxxx.)

Ничего общего с реальной российской жизьню этот Dial Plan не имеет. В принципе можно заменить его на следующий

(xx.)

Тогда все звонки будет маршрутизировать Asterisk. Но тут есть один нюанс. После набора произвольного номера, прежде чем передать его в Asterisk, телефон определенное время ждет - не наберет ли пользователь еще какую-нибудь цифру. Ничего страшного в этом нет, но создает некоторые неудобства при наборе локальных номеров. Например, набираем номер 102, а телефон звонит только через 1,5-2 секунды. Кроме того, если мы будем набирать длинный номер медленно, телефон может передать его в Asterisk не дождавшись окончания набора. Для решения этой проблемы можно воспользоваться следующим диалпланом.

(1xxS0|[2345679]xxxxxS0|8xxxxxxxxxx.)

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

В следующих статьях я расскажу об опыте дальнейшего внедрения Asterisk в общую информационную систему Умного Дома.

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



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



Сортировка комментариев: Последние сверху | Первые сверху

2011-04-24 08:42:51 | stpavel
Андрей, для написания диалплана в астериске гораздо удобнее использовать AEL.


2011-04-25 16:29:27 | archer
по поводу аппаратов - посмотрите на Siemens Gigaset C470 IP - sip+dect, 6 линий, поддерживается до 6 трубок. трубки, правда, несколько тормознуты, но зато других глюков не выловлено за несколько лет, в отличие от тех же d-link.
по кодекам - g722 - это т.н. wideband кодек, звук намного более живой чем на g711 или g729.
ну и по астериску в целом - уделяйте особое внимание безопасности, ломают их пачками.


2011-04-25 21:56:43 | stpavel
Gigaset C470 IP неплохой аппарат, но при всех прелестях, одновременно пользоваться можно только двумя сип линиями. Еще недавно замечен неприятный глюк. Трубки подключены к астериску через sip. При попытке одновременно звонить скажем на две трубки , которые подключены к одной базе, и при этом по одной из трубок идет разговор, астериск возвращает что якобы обе трубки в данный момент заняты. Пока не нашел решения данной проблемы. Пока приходит в голову только это - перед звонком узнавать состояние с помощью DEVICE_STATE каждой трубы и делать звонок на те устройства, которые не заняты.


2011-05-17 06:05:44 | Владимир
Попробуйте g729 кодек. В Вашем телефоне он должен быть. В случае соединения двух Astrisk он самое то... Особенно если соединение через интернет. Для зашиты Asterisk смотрящего в интернет поставьте fail2ban. Это приложение снизит возможность подбора паролей.


2011-08-09 19:10:18 | Владимир
Попробуйте такой телефон Siemens Gigaset C470 IP поддержка 6 трубок.


2011-08-09 21:26:24 | Andrey_B
Спасибо, Владимир!
Мы изначально обсуждали этот вариант в форуме. Но вот чем мне не нравятся трубки, так это тем, что они вечно теряются, валяются по всему дому. И с ними трудно работать в плане адресации. Например, когда телефон связан проводом и у него стационарное местоположение, можно сказать АТС осуществлять роутинг по определенным условиям. Когда у телефона нет места, о каком-либо роутинге говорить тяжело. ;)


2011-09-15 22:48:41 | Speed Boy
Вот эта фраза заинтересовала:
"Наконец, даже дверной звонок или звонок на входе можно завести в мини-АТС, чтобы он автоматически отправлялся на мобильный телефон и я мог с чистой совестью сказать, что никого нет дома."

Реализовано ли это, и если да, то каким "звонком" ? Если нет, всё равно, каким звонком это можно сделать? =)


2011-09-16 00:35:21 | Andrey_B
Speed Boy, фактически это реализовано. Немного терпения и я в ближайшее время опубликую статью на эту тему. ;)


2011-10-08 02:35:01 | Siorinex
У 470-и есть ещё одна неприятная особенность:
Если вылетает интернет, то телефоны впадают в ступор и отваливаются от Астериска. В локалке!!! На одном роутере висят!!!
С чем связано - фз, но грешу на всяческие "интернет сервисы" в телефоне.
Очень неприятно, когда при падении инета нет возможности позвонить с телефона провайдеру!

А так - да, очень даже неплохие трубочки!


2016-01-12 13:44:47 | Иван
Здравствуйте! Подскажите как записать приветствие вместо гудка в Asterisk?