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