Когда стоит задача поднять asterisk и мы знаем о том что будут использоваться USB-3G-модемы для голоса, это не проблема, достаточно поставить его на дистрибютиве с новым ядром и потом можно прикрутить панель типа FreePBX или asterisk-gui. Но что делать когда уже стоит готовая сборка Elastix, с кучей настроек и в продакшене, а прикрутить chan_datacard просто необходимо. В этой статье я опишу всю процедуру от начала и до конца для Elastix 2.3.
, а chan_datacard обещает работать нормально с ядром не меньше 2.6.33. Можно конечно взять исходники необходимого ядра и скомпилировать его, но учитывая то, что Elastix был установлен на дохленький Atom и предвидя 2-3 часа компиляции, я отказался от этого варианта (мы ведь помним, АТС в продакшене, и простой должен быть минимальным) и пошел другим путем, установив новое ядро из добавленного репозитария.
Актуальное ядро в этом репозитории на момен написания этой статьи 3.0.88, нам вполне подходит.
Ядро установили, но перезагружаться рано, надо скачать все необходимое и подготовить, что бы после перезагрузки сразу начать компиляцию необходимых модулей, так как после загрузки в новое ядро не будет работать dahdi (если Вы не используете этот модуль можно смело перезагружаться и продолжать).
необходимо скачать dahdi
отсюда — на момент написания актуальная версия 2.7:
# cd /usr/src
# wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
# tar -xzvf dahdi-linux-complete-current.tar.gz
# ln -s dahdi-linux-complete-2.7.0+2.7.0 dahdi
так же нам понадобиться поддержка oslec для DAHDI(модуль эхо-подавления), скачиваем:
# svn co http://svn.astfin.org/software/oslec/trunk/ oslec
далее переходим к подготовке DAHDI:
# mkdir -p /usr/src/dahdi/linux/drivers/staging/echo
# cp -fR /usr/src/oslec/kernel-test/* /usr/src/dahdi/linux/drivers/staging/echo/
# cp -fR /usr/src/kernels/3.0.88-1.el5.elrepo-x86_64/drivers/staging/echo/* /usr/src/dahdi/linux/drivers/staging/echo/
Скачиваем исходники chan_datacard
# svn co http://www.makhutov.org/svn/chan_datacard/trunk/ /usr/src/chan_datacard
Собственно, мы все подготовили, можем перезагружаться в новое ядро.
сразу после перезагрузки надо скомпилировать DAHDI:
# cd /usr/src/dahdi
# make
# make install
# make config
# /etc/init.d/asterisk stop
# /etc/init.d/dahdi restart
# /etc/init.d/asterisk start
все должно пройти без проблем, смотрим:
# asterisk -vvvvr
CLI> dahdi show channels
получаем примерно такое:
На данный момент мы поставили новое ядро и драйвера DAHDI, то есть вернули систему в рабочее состояние но с новым ядром. Теперь необходимо установить chan_datacard:
# cd /usr/src/chan_datacard
# ./configure
# make
# make install
# cp etc/datacard.conf /etc/asterisk/
на 64-битной системе установка не произошла, потому как была попытка произвести установку в /usr/lib/asterisk/modules , а такого пути нет, копируем модуль ручками:
# cp chan_datacard.so /usr/lib64/asterisk/modules/
Я использовал модем huawei E1750 не привязанный к оператору, девственный как слеза
Стоит упомянуть, что перед использование модем необходимо переключить в режим «только модем», отправив ему команду AT^U2DIAG=0, через minicom например.
Переходим к настройке chan_datacard:
в файле /etc/asterisk/datacard.conf комментируем или удаляем все после строки:
;-----------------------------------------------------------------------------------
и вставляем:
[datacard1]
context=from-gsm ; context для входящих звонков
audio=/dev/ttyUSB1 ; tty порт для аудио подключения
data=/dev/ttyUSB2 ; tty порт для управляющих AT комманд модема
group=4 ; Группа вызова
rxgain=6 ; Изменение громкости динамика
txgain=6 ; Изменение громкости микрофона
resetdatacard=yes ; Перезагрузка модема при перезапуске модуля
autodeletesms=yes ; Удаление смс с симкарты при перезапуске
usecallingpres=yes ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation
сохраняем и закрываем файл.
переходим к редактированию файла /etc/asterisk/extensions_custom.conf , добавляем в конец файла:
[from-gsm]
exten => s,1,goto(from-trunk,${IMEI},1)
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 -%- ${USSD} -%-' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()
Этот context будет принимать звонки и подставлять IMEI модема вместо DID, так что мы запросто сможем создавать правила входящих звонков прямо в панели управления Elastix. Так же будут приниматься смс и ussd и складываться в файлы /var/log/asterisk/sms.txt и /var/log/asterisk/ussd.txt соответственно. Позже мы будем обрабатывать данные файлы и посылать письма с пришедшими sms и ussd.
Осталось перезапустить asterisk:
# /etc/init.d/asterisk restart
заходим в консоль asterisk-а и проверяем:
# asterisk -vvvr
CLI> datacard show device datacard1
получим примерно следующее, не торопитесь, карта должна успеть инициализироваться 1-2 минуты:
Осталось прикрутить исходящие звонки, для этого заходим в панель Elastix-а , добавляем Custom Trunk:
И добавляем в Outbound Routes новое правило для звонков:
Теперь при выходе через 8, мы будем звонить через наш 3G-модем.
для настройки входящих звонков, делаем правило, используя в качестве DID IMEI-номер модема, и принимаем звонки по своему желанию, на номер, группу или очередь.
Следующим этапом будет настройка отправки пришедших смс и ussd на почту. Здесь я воспользовался скриптом
отсюда, чуть изменив.
Создаем файл /var/www/html/sms.php следующего содержания — не забудьте изменить адрес отправки:
<?php
$file_name = '/var/log/asterisk/sms.txt';
if (filesize($file_name)>0) {
$fobj = fopen($file_name,"r+");
$text = fread($fobj, filesize($file_name));
$text1 = explode("-%-", $text);
$array = array_chunk($text1, 4);
$mes1 = "<table border='1' bordercolor='#000000' cellspacing='0' cellpadding='2'>";
$mes2 = "<tr align='center' valign='middle
'><td width='160'>Дата и время сообщения</td><td width='140'>Номер отправителя</td><td width='230'>Сообщение</td></tr>";
for ($i = 0; $i <= count($array)-2; $i++)
{
$sms = $array[$i];
$sms1[] = "<tr valign='middle
'><td align='center'>".$sms[0]."</td><td align='center'>".$sms[2]."</td><td align='left'>".$sms[3]."</td></tr>";
}
for ($mes3 = '', $j = 0; $j <= count($sms1); $j++)
{
$mes3 = $mes3.$sms1[$j];
}
$mes4 = "</table>";
$date = date("d.m.Y");
$time = date("H:i:s");
$to = "your@email.com";
$subject = "New SMS Message(s) - ".$date." - ".$time;
$message = $mes1.$mes2.$mes3.$mes4;
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= "From: SMS Gate <sms@your-domain.org>\r\n";
if (mail($to, $subject, $message, $headers)) {
echo "Soobshenie ojidaet otpravki";
ftruncate ($fobj, 0);
} else {
echo "Oshibka pri otpravke";
}
fclose($file_name);
}
else { echo "Sms soobshenii net..."; }
?>
ставим задание в cron, каждые 5 минут делать проверку:
*/5 * * * * /usr/bin/wget --no-check-certificate -O /dev/null -q https://192.168.10.190/sms.php
Посылаем sms на вставленный в модем номер и ждем пока нам придем сообщение на почту. Всё должно пройти успешно.
Аналогичный файл создаем для ussd, меняя тему письма, например. Теперь Вы можете полноценно использовать свой номер в модеме, звонить и принимать звонки, принимать смс. Отправлять смс можно командой в панели Elastix-а или в asterisk-cli, либо написать свой фротн-энд для этого, но текст должен содержать только латиницу. Входящие же sms могут быть и на кириллице.
Отправить sms или ussd можно следующим образом, из asterisk-cli или панели Elastix-а (PBX->Tools->Asterisk-Cli)
После пары дней тестов, я заметил, что один раз модем завис, посему наваял простенький скрипт для проверки регистрации модема и сброса его в случае её отсутствия, создаем файл /root/bin/test-restart-dc со следующим содержимым:
#!/bin/bash
dclogfile=/root/bin/dc.log
dcdate=`/bin/date "+%Y-%m-%d %H:%M:%S"`
dcstatus=`/usr/sbin/asterisk -rx "datacard show device datacard1"|grep "GSM Registration Status"|grep "Registered"`
RES1=$?
if [ $RES1 -ne 0 ];then
/usr/sbin/asterisk -rx "datacard reset datacard1"
echo "Reset "$dcdate >>$dclogfile
echo $dcdate" -%- datacard1 -%- RESET -%- Datacard Resetted -%-" >> /var/log/asterisk/ussd.txt
exit 1
else
echo "OK "$dcdate >>$dclogfile
exit 0
fi
выставляем ему права на выполнение chmod a+x /root/bin/test-restart-dc ,и ставим в крон, проверку каждый час:
3 * * * */root/bin/test-restart-dc
В случае, если скрип отработает reset карты, Вам придет письмо на почту, для этого просто добавляется строка в файл /var/log/asterisk/ussd.txt , который мы обрабатываем выше. Так же результаты проверки пишутся в лог — /root/bin/dc.log , с указанием даты и времени.
Вот и всё!
Удачи в настройках.
© shadow_alone
UPD: Я так и не смог собрать chan_datacard на Elastix 2.4 с обновленным ядром 3.2.63, пришлось искать другой метод. Помогла решить проблему статья ниже:
Написать сие чтиво меня побудило собственные мытарства по обтачиванию напильником АТС на основе 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 --->"
Создаем папки для 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
Разархивируем
tar -xvfz 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
©
extime.vn.ua