22 июл. 2011 г.

Настойка связки FreeBSD 8.2+Asterisk 1.8.5+модем Huawei E150

Речь пойдёт о связке FreeBSD 8.2+Asterisk 1.8+модем Huawei E150. Цель - принимать входящие и осуществлять исходящие вызовы и принимать SMS. Модем Huawei E150 практически аналогичен модему Huawei E1550. Единственное различие - отсутствие кардридера для MisroSD-карт памяти.

Кроме непосредственно операционной системы и Asterisk необходим драйвер модема. К сожалению, найти его в портах не удалось, равно как и архива с исходным кодом, поэтому был установлен пакет devel/subversion и скачана последняя версия с сайта разработчика. Итак, проделываем следующие шаги.

cd {путь для исходных текстов}
svn checkout http://asterisk-chan-dongle.googlecode.com/svn/trunk/ asterisk-chan-dongle-read-only
asterisk-chan-dongle-read-only
./configure
gmake
gmake install
cp etc/dongle.conf /usr/local/etc/asterisk

Установка модема на сервер прошла успешно. Система сразу же определила несколько устройств. В том числе 4 порта COM (cuaU0.x) и CD-накопитель. Судя по этому модем можно не перепрограммировать модем если наличие виртуального CD в системе не смущает.

Настраиваем /usr/local/etc/asterisk/dongle.conf:

[general]
interval=15

[datacard0]
context=incoming-utel           ; Контекст для вызовов. Должен быть описан в дайлплане.
audio=/dev/cuaU0.1  ; Порт для аудио
data=/dev/cuaU0.2  ; Порт для команд
group=1
rxgain=3
txgain=3
autodeletesms=yes
resetdatacard=yes
u2diag=0
usecallingpres=yes
callingpres=allowed_passed_screen

[datacard1]
context=incoming-motiv
audio=/dev/cuaU3.1
data=/dev/cuaU3.2
group=2
rxgain=0
txgain=0
autodeletesms=yes
resetdatacard=yes
u2diag=0
usecallingpres=yes
callingpres=allowed_passed_screen

Большинство параметров я взял из шаблона [datacard1]. Всё лишнее удалил.

По непонятной мне причине при первом включении оказалось 4 порта cuaU для каждого модема. Изначально было указано audio - cuaUx.2, для data cuaUx.3.

Для того, чтобы Asterisk получил доступ к портам дадим пользователю asterisk доступ к ресурсам группы dialer.

# pw usermod asterisk -G dialer

Дальше всё просто. Настраиваем дайлплан. Для хранения информации по дайлплану я использовал extensions.ael:

context incoming-utel {
s => {
Set(CALLERID(all)=$[CALLERID(num)]);
Dial(SIP/903&SIP/900,60,t);
};
sms => {
Verbose(Incoming SMS from ${CALLERID(num)} ${SMS});
System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt);
Hangup();
};
}

По команде Dial в моём варианте вызов будет поступать на внутрениие номера 903 и 900. Кто первый ответит, тот и будет разговаривать. Замените номера своими. Естественно, здесь можно использовать все варианты команды Dial, т.е. можно отправлять вызов и на внешние направления. Всё зависит от вашей фантазии и финансов. Как правило вызовы на сеть ТФОП и сотовые телефоны не бесплатные, а платить вы будете за исходящий вызов, поэтому будьте внимательными.

Команда Set нужна для того, чтобы определялся номер звонящего на SIP-телефоне. Если эту строку удалить, то вместо номера будет указано "datacard0". Возможно вам это покажется полезным если вы планируете использовать Asterisk в качестве основы Call-центра - ваши операторы не будут видеть кто им дозванивается и не смогут игнорировать "плохих" клиентов. В любом случае узнать позже номер звонящего абонента можно в файлах CDR.

SMS принимаются и в файл /var/log/asterisk/sms.txt. Можете заманить команду echo любой командой и выполнять необходимые вам действия при приёме SMS.

Если Asterisk сообщает, что хранилище SMS переполнено: [datacard0] SMS storage is full - удалите все сообщения с помощью команды в консоли Asterisk:

# asterisk -r
tavda*CLI> dongle cmd datacard0 AT+CMGD=1,4

Теперь можем проверить работоспособность входящего канала:

tavda*CLI> dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI      IMSI      Number        
datacard1    1     Free       18   3    3       MOTIV      E150       11.609.82.02.143  35210...  25035...  Unknown       
datacard0    1     Free       27   3    3       Utel       E150       11.609.82.02.143  35210...  25017...  +790225...

Если есть желание, то можно задать номер телефона для сим-карт с номером Unknown:

tavda*CLI> dongle cmd datacard1 AT+CPBS=\"ON\"
tavda*CLI> dongle cmd datacard1 AT+CPBW=1,\"+795273XXXXX\",145

Для осуществления исходящих вызовов через модемы просто используйте соответствующие шаблоны в extensions.ael:

_89022[5-7]XXXXX => Dial(Dongle/datacard0/${EXTEN});
_895304XXXXX => Dial(Dongle/datacard1/${EXTEN});

Вот собственно и всё. Больше ничего от модема мне не требовалось. При желании можете найти варианты настройки Asterisk для работы с модемом Huawei E1550. Настройки дайлплана для E150 будут аналогичные.

И будьте внимательны - поскольку исходящие вызовы через сотовую платные не давайте доступ к ним кому попало, а если есть доступ к серверу из интернета, пользуйтесь стойкими паролями хотя бы для тех, кто будет пользоваться исходящей связью.

P.S. Первоначальный вариант статьи от 22.12.2010 03:41 был переработан. Вместо chan_datacard теперь используется chan_dongle. Также произведён переход с FreeBSD 8.1 на 8.2 и Asterisk 1.8.0 на 1.8.5. По большей части всё описанное выше справедливо и для старых версий. Однако рекомендую при установке пользоваться свежими версиями.

15 комментариев:

  1. Позитивная статейка, однозначно пригодится - модемы только предстоит прикручивать.

    ОтветитьУдалить
  2. А как отправить СМС кирилицей?

    ОтветитьУдалить
  3. какое количество модемов может проглотить данная схема?
    сейчас стабильно работают только три. как только включаю еще один модем, они начинают виснуть, и астер их теряет.
    ps: кстати, победил ли кто-нибудь перемешивание модемов? пока прикрутил костыль, но хотелось бы от него уйти.

    ОтветитьУдалить
    Ответы
    1. Увы, ничего не могу сказать. У меня работало одновременно только 3: E150, E150 и E1550. Один из них был под атакой СМС в течении месяца. Пришло порядка 3,5 тысяч сообщений.
      Перемешивание модемов действительно имеет место. Один из трёх модемов был включен на время проведения СМС голосования и потом изъят. В обоих случая после перезагрузки система работала только частично до правки конфигов.

      Удалить
    2. у меня та же проблема, удалось ее как-то победить? и можно подробнее насчет костыля?

      Удалить
    3. Используйте chan_dongle.

      Удалить
    4. Использую. Все равно иногда отваливаются модемы, причем не все, а начиная с определенного номера и те, что за ним следуют. Как с эти бороться? Модемов всего 5 штук, вот начиная с 3 и по порядку за ним иногда пропадают из астера и даже консоль начинает чудить и не реагировать на команды. Иногда помогает только перезагрузка компа.

      Удалить
    5. Если вам ещё интересно, то под Linux есть такая замечательная штука, как привязка модемов к каналам по IMEI. Правда у меня возникли проблемы с модемами E150 теми же самыми - односторонняя слышимость. Пока так и не решил.

      Удалить
    6. Александр, модемы могут отваливаться от недостатка питания по USB порту компа. Вам поможет активный (с дополнительным питанием) USB хаб. Я использую D-Link DUB-H7

      Удалить
  4. Можно ли проработать вариант комммерческой отправки смс? Скажем есть интернет-магазин и наступает время уведомить постоянных клиентов о чем-то ... как всем послать смс?

    ОтветитьУдалить
    Ответы
    1. Любой каприз за ваши деньги. Отрпавляйте СМС со своей сим карты, пока ваш сотовый оператор не заблокирует.

      Удалить
  5. Спасибо за гайд.
    Ошибочка тут:
    tavda*CLI> dongle cmd datacard0 AT+CMGD=1,4
    Надо
    tavda*CLI> dongle cmd dongle0 AT+CMGD=1,4

    ОтветитьУдалить
  6. Может кто знает, как заблокировать опсосу определение модели устройства, т.е. USB-донгла?

    ОтветитьУдалить
    Ответы
    1. Насколько я знаю, никак.Модель устройства закодирована в IMEI который передается в сеть опсоса. Как вариант, менять IMEI девайса. Благо, в E1550 это элементарно делается. Но это незаконно ;)

      Удалить