Написать сие чтиво меня побудило собственные мытарства по обтачиванию напильником АТС на основе Asteriska для собственных нужд предприятия . На сегодня проблема стоит уже не протягиванию дополнительных пар в соседние кабинеты для телефонов , а более глобально - например оперативная телефонная связь с отделом в другом городе .
Для связи с внешним миром и удешевления исходящих вызовов будем использовать GSM модемы типа Huawei 1550 и Huawei 153 . Хочется сказать , что заработали обе модели модемов , хотя информации по 153 хайвею о совместимости я признаться честно не нашел - наверное плохо искал . Качество голоса такого решения для транков в GSM сети получается не очень , но если учитывать стоимость одного GSM модема в размере до 30 у.е и стоимость аналогичных специализированных решений например от ATCOM c ценником , который начинается от 300 у.е , то выбор будет однозначен для многих в пользу дешевых модемов с активированной функцией передачи голоса .
При установке будем использовать дистрибутив Elastix 2.4.0 . В основе дистрибутива лежит CentOS 5 ветки с ядром 2.6.18 , которое не корректно работает с устройствами USB , что приводит к отсутствию звука в направлении Sip -> GSM или сильным искажениям звука до неразборчивости . На модемах предварительно следует отключить все устройства (CD и кардридер ) поскольку они будут мешать нормально определиться USB устройствам в системе под операционной системой Linux .
Мне лично было намного удобней отключить ненужные функции из под форточек , поскольку разлочить и активировать голосовые фунции все равно пришлось под управлением Windows . Предполагается , что у вас разлоченный модем с активированной функцией голоса . Отключим не нужные нам виртуальный CD-ROM и Card Reader модема . Для подключения используем Huper Terminal OS Windows .
Обновим ядро системы до 2.6.39 , проблемы с модемами исчезают по разным источникам от версии ядра выше 2.6.32 . Установим необходимые пакеты для обновления ядра
yum install -y ncurses-devel gcc make rpm-build redhat-rpm-config
Перейдем в каталог с исходниками
cd /usr/src
Загрузим исходники ядра 2.6.39
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.bz2
Разархивируем его
tar -xf linux-2.6.39.tar.bz2
Создадим симлинк на исходники ядра
ln -sf /usr/src/linux-2.6.39 /usr/src/linux
Скопируем конфиг от активного ядра
cd linux
cp /boot/config-`uname -r` .config
Запустим конфигуратор ядра
make menuconfig
И вносим небольшую корректировочку без которой новое ядро не взлетит:
- в разделе
"General setup --->" активируем опцию "enable deprecated sysfs features which may confuse old userspace tools"и
"enable deprecated sysfs features by default"
Выходим из кофигуратора
Создаем папки для rpm файла:
mkdir -p /usr/src/redhat/SRPMS
mkdir -p /usr/src/redhat/RPMS/{i386,x86_64}
Редактируем файл
nano scripts/package/mkspec
добавляя в его конец следующее:
echo "%post"
echo "/sbin/new-kernel-pkg --package kernel --mkinitrd --depmod --install "$KERNELRELEASE" || exit \$?"
echo ""
echo "%preun"
echo "/sbin/new-kernel-pkg --rminitrd --rmmoddep --remove "$KERNELRELEASE" || exit \$?"
echo ""
Сохраняемся {CLTR} X Подтверждаем Y и наконец {ENTER}
Собираем ядро (заодно контролируем время сборки):
time make rpm
На довольно слабой машинке типа селерона 2.6 это заняло около 2 часов :) .
По окончании устанавливаем новое свежее красивое ядро.
rpm -ihv /usr/src/redhat/RPMS/i386/kernel-2.6.39-1.i386.rpm
Проверяем правильно ли оно прописалась в настройк grub'а
[root@voip ~]# cat /boot/grub/menu.lst
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/hdc
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.39)
root (hd0,0)
kernel /vmlinuz-2.6.39 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.39.img
title Elastix (2.6.18-194.3.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-194.3.1.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-194.3.1.el5.img
Перезагружаемся , надеюсь все собралось удачно и паники ядра нет , хотя всегда можно загрузиться со старым ядром
reboot
После перезагрузки проверяем версию текущего ядра
[root@voip ~]# uname -a
На момент написания статьи проэкт chan_datacard http://code.google.com/p/datacard/ гласил , что он закрыт и переехал на chan_dongle . Загрузим chan_dongle
wget http://asterisk-chan-dongle.googlecode.com/files/chan_dongle-1.1.r14.tgz
Разархивируем
Конфигурим
./configure
Установим
make install
Надеюсь у вас все собралось без ошибок
Копируем файл dongle.conf в папку /etc/asterisk/
Внесем секцию [incoming-datacard] в файл /etc/asterisk/extensions_custom.conf , которая описывает поведение наших модемов при входящих СМС и звонках , подробней об этом на форуме http://asteriskforum.ru/viewtopic.php?p=61558 .
[incoming-datacard]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()
exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()
exten => s,1,Goto(from-pstn,${IMEI},1)
Обратите внимание на последнюю строку секции [incoming-datacard] , использование ее в таком виде обеспечит возможность обрабатывать звонки в очередях и прочих возможностях астериска с веб морды еластикса . В просторах инета валяется масса вариантов описания диалпланов , но к сожалению они не такие элегантные и как правило выглядят топорно .
В CentOS есть небольшая неприятность , связанная с правами на устройства USB , в результате чего пользователь asterisk не имеет прав на чтение файлов устройств
/dev/ttyUSB....
Для решения этой неприятности подправим напильником файл 50-udev.rules
nano /etc/udev/rules.d/50-udev.rules
Внесите в файл содержимое этих строк , не забыв удалить или закаментить соответствующий старый кусок в файле . Вопросы с правами на устройства USB будут решены
KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", KERNELS=="1-2:1.0", SYMLINK+="hw-modem-0", MODE="0666", OWNER="asterisk", GROUP="uucp"
KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", KERNELS=="1-2:1.1", SYMLINK+="hw-audio-0", MODE="0666", OWNER="asterisk", GROUP="uucp"
KERNEL=="ttyUSB*", SUBSYSTEMS=="usb", KERNELS=="1-2:1.2", SYMLINK+="hw-data-0", MODE="0666", OWNER="asterisk", GROUP="uucp"
Не забудьте отключить пин код с карточек :).
Перезагрузим систему
[root@asterisk ~]#reboot
Войдем в консоль астериска
[root@asterisk ~]#asterisk -r
asterisk*CLI> datacard show devices
Итак, что же такое IP-телефония? IP-телефония – это технология, которая связывает воедино преимущества телефонии и Интернет. До недавнего времени сети с коммутацией каналов (телефонные сети) и сети с коммутацией пакетов (IP-сети) существовали практически независимо друг от друга и использовались для различных целей. Телефонные сети использовались только для передачи голосовой информации, а IP-сети – для передачи данных. Технология IP-телефонии объединяет эти сети посредством устройства, называемого шлюз или gateway. Шлюз представляет собой устройство, в которое с одной стороны включаются телефонные линии, а с другой стороны – IP-сеть (например, Интернет).
В общих чертах передача голоса в IP-сети происходит следующим образом. Входящий звонок и сигнальная информация из телефонной сети передаются на пограничное сетевое устройство, называемое телефонным шлюзом, и обрабатываются специальной картой устройства голосового обслуживания. Шлюз, используя управляющие протоколы семейства H.323, перенаправляет сигнальную информацию другому шлюзу, находящемуся на приемной стороне IP-сети. Приемный шлюз обеспечивает передачу сигнальной информации на приемное телефонное оборудование согласно плану номеров, гарантируя сквозное соединение. После установления соединения голос на входном сетевом устройстве оцифровывается (если он не был цифровым), кодируется в соответствии со стандартными алгоритмами ITU, такими как G.711 или G.729, сжимается, инкапсулируется в пакеты и отправляется по назначению на удаленное устройство с использованием стека протоколов TCP/IP. Приходящие на приемный шлюз IP-пакеты преобразуются обратно в телефонный сигнал и принимающий абонент получает вызов. Конечные потребители услуги могут даже не догадываться о том, КАК осуществляется этот звонок.
Поскольку при IP-телефонном звонке никак не задействован международный (междугородний) телефонный оператор, стоимость этого звонка на порядок меньше стоимости традиционного телефонного соединения.
Asterisk - программная АТС (PBX), бесплатный продукт, позволяющий быстро и легко, с минимальными затратами попробовать и использовать современные возможности передачи голоса по сети или через интернет - VoIP.
Нам понадобится: Установленная операционная система Ubuntu 8.04LTS.
В Ubuntu 8.04 пакет с Asterisk поддерживаеться в apt-get и устанавливаеться довольно просто:
apt-get install asterisk
После установки смотрим версию и проверяем запустился ли наш Asterisk:
asterisk -r
Видим версию, у меня на момент написания статьи из репозитариев Ubuntu устанавливаеться версия 1.4.17 (не самая новая), и попадаем в консоль управления нашей АТС (Asterisk CLI).
Далее выходим из консоли: quit
Теперь нам нужен Asterisk GUI - web-интерфейс управления нашей программной телефонной станцией. Его мы будем брать из репозитариев с помощью svn.
Если у вас не установлен пакет subversion, ставим его: apt-get install subversion
mkdir -p ~/downloads/asterisk-gui
cd ~/downloads/asterisk-gui
svn checkout http://svn.digium.com/svn/asterisk-gui/branches/2.0/
Откомпилируем и соберем полученный исходный код:
cd 2.0
./configure
make
make install
Думаю что не лишним будет напомнить, что для компиляции и сборки из исходных текстов нужно иметь установленными gcc и make.
Сделаем резервную копию наших конфигурационных файлов для Asterisk:
cp -r /etc/asterisk /etc/asterisk.backup
Редактируем /etc/asterisk/manager.conf для разрешения веб-интерфейса и добавления пользователя:
enabled = yes
webenabled = yes
[administrator]
secret = YoUrPaSwOrD
read = system,call,log,verbose,command,agent,user,config
write = system,call,log,verbose,command,agent,user,config
Редактируем /etc/asterisk/http.conf чтобы сказать Asterisk на каком порту и каком интерфейсе будет работать наш веб сервер:
enabled=yes
enablestatic=yes
bindaddr=127.0.0.1
Запускаем checkconfig для проверки наших настроек:
make checkconfig
Видим, что все у нас хорошо с конфигурацией.
Далее делаем дополнительный шаг, который заключаеться в создании символьной ссылки на static-http которую Asterisk ищет в /usr/share/asterisk вместо /var/lib/asterisk где она в действительности имеется:
rm /usr/share/asterisk/static-http
sudo ln -s /var/lib/asterisk/static-http/ /usr/share/asterisk/
После этого добавляем права на запись для каталога usr/share/asterisk/static-http/config
Перезапускаем наш Asterisk командой:
/etc/init.d/asterisk restart
Теперь вебинтерфейс управления Asterisk PBX доступен нам по адресу:
http://127.0.0.1:8088/asterisk/static/config/index.html
Замените 127.0.0.1 на ваш ip-адрес.
Далее вам нужно создать хотябы один DialPlan и несколько пользователей (Users). Минимальная настройка закончена. АТС готова к работе.
После этого можно пробовать седениться с нашей АТС с помощью программного телефона, например такого как X-Lite.