Написать сие чтиво меня побудило собственные мытарства по обтачиванию напильником АТС на основе 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
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.