Дмитрий DarkByte Москин

Мой блог, да.
logo

Настройка FreeBSD 8.2 + Asterisk 1.8 + Huawei E150

Опубликовано 15.09.2012 автором Дмитрий Москин
Всё началось с того, что мне захотелось подключить модем Huawei E150 к роутеру, на котором стоит FreeBSD 8.2 и принимать входящие звонки. Для приёма и обработки звонков было решено использовать Asterisk 1.8.16, а для синтеза речи Festival 1.96. И всё это для того, чтобы можно было звонить на свой сервер и общаться с ним по телефону (:

Для начала скачаем и установим свежую версию Asterisk (на момент написания - 1.8.16, с 10й версией были проблемы с модемом).

wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.8.16.0.tar.gz
tar zxf asterisk-1.8.16.0.tar.gz
cd asterisk-1.8.16.0
./configure
gmake && gmake install && gmake samples

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

Теперь ставим драйвер модема, чтобы Asterisk мог с ним общаться. Драйвер точно работает с модемами Huawei E1550 E169 K3520 K3715 K3765, но т.к. E1550 отличается от E150 только наличием слота для SD карты, то должно прокатить.
svn checkout http://asterisk-chan-dongle.googlecode.com/svn/trunk/ dongle-read-only
cd dongle-read-only
aclocal && autoconf && automake -a
./configure
gmake && gmake install


Осталось поставить Festival, его я ставил из портов
cd /usr/ports/audio/festival
make && make install && make install clean


И дополнительные голосовые файлы
mkdir htstmp
cd htstmp
wget -c http://hts.sp.nitech.ac.jp/archives/2.1/festvox_nitech_us_awb_arctic_hts-2.1.tar.bz2
wget -c http://hts.sp.nitech.ac.jp/archives/2.1/festvox_nitech_us_bdl_arctic_hts-2.1.tar.bz2
wget -c http://hts.sp.nitech.ac.jp/archives/2.1/festvox_nitech_us_clb_arctic_hts-2.1.tar.bz2
wget -c http://hts.sp.nitech.ac.jp/archives/2.1/festvox_nitech_us_rms_arctic_hts-2.1.tar.bz2
wget -c http://hts.sp.nitech.ac.jp/archives/2.1/festvox_nitech_us_slt_arctic_hts-2.1.tar.bz2
wget -c http://hts.sp.nitech.ac.jp/archives/2.1/festvox_nitech_us_jmk_arctic_hts-2.1.tar.bz2
wget -c http://hts.sp.nitech.ac.jp/archives/1.1.1/cmu_us_kal_com_hts.tar.gz
wget -c http://hts.sp.nitech.ac.jp/archives/1.1.1/cstr_us_ked_timit_hts.tar.gz
for t in `ls` ; do tar xvf $t ; done
mv lib/voices/us/* /usr/local/share/festival/lib/voices/us/
mv lib/hts.scm /usr/local/share/festival/lib/hts.scm
cd ..
rm -rf htstmp


Меняем в Festival язык по умолчанию
festival
festival> (set! voice_default 'voice_nitech_us_rms_arctic_hts)
[ctrl+d]


Запускаем Festival как сервер (для теста, потом нужно будет написать скрипт запуска)
festival --server &


Подключаем модем и смотрим как он определился в системе
# usbconfig
...
ugen3.2: at usbus3, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON

# ls /dev/cuaU3*
/dev/cuaU3.0 /dev/cuaU3.0.lock /dev/cuaU3.1.init /dev/cuaU3.2 /dev/cuaU3.2.lock
/dev/cuaU3.0.init /dev/cuaU3.1 /dev/cuaU3.1.lock /dev/cuaU3.2.init


Можно настраивать поддержку модема в asterisk. В файле /usr/local/etc/asterisk/dongle.conf находим секцию [datacard0] и в ней меняем строки audio и data, у меня получилось так:
audio=/dev/cuaU3.1              ; tty port for audio connection;        no default value
data=/dev/cuaU3.2 ; tty port for AT commands; no default value

Так же меняем context на что-нибудь, типа from-modem.

Чтобы Asterisk имел доступ к портам не только из под рута, добавлем его в нужную группу
pw usermod asterisk -G dialer


Для того, чтобы Festival не нагружал каждый раз систему синтезом одних и тех же фраз, включаем кэширование в файле /usr/local/etc/asterisk/festival.conf
usecache=yes
cachedir=/var/tmp/festivalcache/


Осталось написать обработчик звонков, в файле /usr/local/etc/asterisk/extensions.conf добавляем
[from-modem]
exten => s,1,Answer
exten => s,n,Background(beep)
exten => s,n,Festival('Hello World! Press any key to hangup.')
exten => s,n,WaitExten
exten => s,n,Hangup


Запускаем Asterisk, подключаемся к консоли, подгружаем драйвер модема и проверяем его статус
asterisk
asterisk -r

*CLI> module load chan_dongle.so
Loaded chan_dongle.so
NOTICE[60519]: chan_dongle.c:1556 reload_config: [datacard0] Loaded device

*CLI> dongle show devices
ID Group State RSSI Mode Submode Provider Name Model Firmware IMEI IMSI Number
datacard0 0 Free 13 5 4 Utel E150 11.609.82.02.143 352108048260000 250022101510000 +7...


Если Asterisk пишет, что ему не удалось получить ответ от модема, то возвращаемся к настройке dongle.conf и меняем значение полей data и audio местами, после чего выполняем dongle reload. Если модем нормально определился, то можно продолжать.

Вроде бы и всё, можно попробовать позвонить на номер модема. Если всё нормально, то в трубке прозвучит бип, затем текст.

Если в ответ бросают трубку, значит проблема в extensions.conf.
Если слышен бип, то нет голоса, значит проблема где-то в Festival.
Если вообще ничего не слышно, но и трубку не бросают, значит в файле dongle.conf не правильно указан порт audio.

Если вместо номера пишется Unknown, то можно задать номер с помощью команд
*CLI> dongle cmd datacard0 AT+CPBS="ON"
*CLI> dongle cmd datacard0 AT+CPBW=1,"+7902...",145


Для обработки SMS и USSD сообщений используем соответствующие префиксы, например
exten => sms,1,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt);