SCROLL
Среднее время на прочтение: 5 мин.

Подключение GSM-модема USB Huawei E1550 к Asterisk 13 + chan_dongle на Debian.

Появилась интересная задача, которая заключается в том что нужно подключить GSM-модем USB HUAWEI E1550 к Asterisk 13 работающий на Debian 8 Jessie. Настроить возможность принимать/отправлять SMS, принимать/звонить с номера находящегося в GSM-модеме.

 Рекомендуется чтобы GSM-модем HUAWEI E1550 работал на прошивке версии: 11.608.12.00.143, а так же чтобы работал только в режиме "только модем".

На момент написания статьи используемая версия Asterisk — 13.25.0, который развернут на Debian 8 Jessie (как развернуть Asterisk 13 на Debian 8 Jessie, можно по этой статье)

Настройка системы и GSM-модема

Обновляем систему до актуального состояния:

apt-get update && apt-get upgrade -y

Устанавливаем необходимые пакеты для работы с USB GSM шлюзом:

apt-get install usb-modeswitch minicom
usb-modeswitch необходима для автоматического переключения устройства из режима, minicom необходима для подключения к последовательным портам (COM).

Подключаем GSM-модем HUAWEI E1550, проверяем появились ли устройства ttyUSB*:

ls -al /dev | grep ttyUSB

crw-rw---- 1 root dialout 188, 0 фев 27 11:34 ttyUSB0
crw-rw---- 1 root dialout 188, 1 фев 27 11:33 ttyUSB1
crw-rw---- 1 root dialout 188, 2 фев 27 12:37 ttyUSB2

Теперь необходимо перевести GSM-модем HUAWEI E1550 в режим работы «только модем».

В случае если GSM-модем HUAWEI E1550, уже находится в режиме работы "только модем", то пропускайте данный пункт и переходите к установке модуля chan_dongle.

Запускаем утилиту для подключения к последовательным портам (COM):

minicom -s

Выбираем пункт "Настройка последовательного порта":

            +-----------[конфигурация]-----------+
            | Каталоги и файлы                   |
            | Протоколы                          |
            | Настройка последовательного порта  |
            | Модем и дозвон                     |
            | Экран и клавиатура                 |
            | Сохранить настройки как dfl        |
            | Сохранить настройки как...         |
            | Выход                              |
            | Выход из Minicom                   |
            +------------------------------------+

Нажимаем "A" для выбора имени устройства COM порта, вводим название устройства "/dev/ttyUSB0"

    +-----------------------------------------------------------------------+
    | A - Последовательный порт          : /dev/ttyUSB0                     |
    | B - Размещение lock-файла          : /var/lock                        |
    | C - Программа при выходе           :                                  |
    | D - Программа при запуске          :                                  |
    | E - Скорость/Чётность/Биты         : 115200 8N1                       |
    | F - Аппаратное управление потоком  : Да                               |
    | G - Программное управление потоком : Нет                              |
    |                                                                       |
    |    Какую настройку изменить?                                          |
    +-----------------------------------------------------------------------+
            | Экран и клавиатура                 |
            | Сохранить настройки как dfl        |
            | Сохранить настройки как...         |
            | Выход                              |
            | Выход из Minicom                   |
            +------------------------------------+

Нажимаем 2 раза ENTER и выбираем "Сохранить настройки как..."

            +-----------[конфигурация]-----------+
            | Каталоги и файлы                   |
            | Протоколы                          |
            | Настройка последовательного порта  |
            | Модем и дозвон                     |
            | Экран и клавиатура                 |
            | Сохранить настройки как dfl        |
            | Сохранить настройки как...         |
            | Выход                              |
            | Выход из Minicom                   |
            +------------------------------------+

Вводим название профиля, нажимаем ENTER и выбираем пункт "Выход из Minicom"

Подключаемся к сохраненному профилю (я сохранил профиль как e1550):

minicom e1550

В терминале, вводим команду AT, нажимаем ENTER, должен вернутся результат —  "ОК".

Обратите внимание, что символы, которые вводим, могут не отображаться на экране! Однако, после ввода команды и нажатия Enter, GSM-модем должен отобразить результат.

После успешного выполнения команды AT, выполним команду, которая переключит режим работы GSM-модем, в режим работы "только модем":

AT^U2DIAG=0

Доступные режимы работы GSM-модема HUAWEI E1550:

  • AT^U2DIAG=0 (режим только модем)
  • AT^U2DIAG=1 (режим модем + CD-ROM)
  • AT^U2DIAG=255 (режим модем + CD-ROM + Card Reader)
  • AT^U2DIAG=256 (режим модем + Card Reader)

Полезные AT-команды:

  • ATI — Информация о устройстве
  • AT+CIMI — IMSI модема
  • AT+CGSN — IMEI модема

Для выхода из программы нажмите Ctrl+A, затем нажмите Q и подтвердите выход нажатием Enter.

Установка модуля chan_dongle

Скачиваем исходник модуля chan_dongle под Asterisk 13 и разархивируем его:

cd /opt
wget https://github.com/oleg-krv/asterisk-chan-dongle/archive/asterisk13.zip
unzip asterisk13.zip
cd asterisk-chan-dongle-asterisk13

Выполняем сборку модуля, компиляцию и установку модуля:

aclocal && autoconf && automake -a
./configure
make
make install
Не обращаем внимание на строчку automake: error: no ‘Makefile.am’ found for any configure output — это не является ошибкой

Копируем конфигурационный файл dongle.conf в каталог asterisk и назначаем ему нужные права:

cp etc/dongle.conf /etc/asterisk/
chown asterisk:asterisk /etc/asterisk/dongle.conf

Чтобы при подключении GSM-модема, Asterisk имел доступ к нему, необходимо устройству назначать владельца asterisk и группу dialout. Создаем файл /etc/udev/rules.d/92-dongle.rules со следующим содержимым:

cat << EOF > /etc/udev/rules.d/92-dongle.rules
KERNEL=="ttyUSB*", MODE="0666", OWNER="asterisk", GROUP="dialout"
EOF

Перезапустим службу udev и asterisk:

service udev restart && service asterisk restart

Для проверки, переподключим GSM-модем к системе и проверим назначенные права на него:

ls -al /dev | grep ttyUSB

crw-rw-rw- 1 asterisk dialout 188, 0 фев 27 11:34 ttyUSB0
crw-rw-rw- 1 asterisk dialout 188, 1 фев 27 11:33 ttyUSB1
crw-rw-rw- 1 asterisk dialout 188, 2 фев 27 13:09 ttyUSB2

Настройка обработки SMS, USSD, Входящих/Исходящих вызовов

В файле конфигурации /etc/asterisk/dongle.conf опишем параметры подключенного устройства HUAWEI E1550. Для примера скорректируем имеющуюся секцию [dongle0]:

/etc/asterisk/dongle.conf
[dongle0]
audio=/dev/ttyUSB1 ; tty порт для audio соединений;
data=/dev/ttyUSB2 ; tty порт для AT команд; 

context=from-dongle ; используемый контекст
language=ru ; используемый язык

;imei=123456789012345
;imsi=123456789012345
Параметры imei, imsi должны автоматом подхватится при соединении asterisk c GSM-модемом. Если не этого не произошло, то можно в ручную их указать, в строках imei, imsi.

В консоли asterisk, перечитываем конфигурацию chan_dongle и проверяем состояние устройства. Если все было сделано правильно, то подключение к GSM-модему будет осуществлено и устройство будет отображаться в консоли asterisk:

asterisk -rv 

dongle reload now
dongle show devices

ID      Group State RSSI Mode Submode Provider Name Model  Firmware         IMEI     IMSI    Number
dongle0 0     Free  18   5    4       MTS-RUS       E1550  11.608.12.00.143 3588***  2500*** Unknown

Теперь когда соединение с GSM-модемом установлено, настроим dialplan обработки SMS, USSD, входящих и исходящих вызовов. В файле конфигурации /etc/asterisk/extensions.conf добавляем следующее:

/etc/asterisk/extensions.conf
[dongle-incoming-sms]
exten => sms,1,Noop(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DONGLENAME} - ${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

[dongle-incoming-ussd]
exten => ussd,1,Noop(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})}) exten => ussd,n,System(echo ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} — ${DONGLENAME}: ${BASE64_DECODE(${USSD_BASE64})} >> /var/log/asterisk/ussd.txt) exten => ussd,n,Hangup()

[dongle-incoming-call]
exten => +7915*****13,1,Answer() exten => +7915*****13,n,Playback(demo-echotest) exten => +7915*****13,n,Echo exten => +7915*****13,n,Playback(demo-echodone) exten => +7915*****13,n,Hangup()

[dongle-outgoing-call]
exten = _X.,1,Dial(Dongle/dongle0/${EXTEN},,t) exten = _X.,n,Hangup()

[from-dongle]
include => dongle-incoming-sms include => dongle-incoming-ussd include => dongle-incoming-call include => dongle-outgoing-call
При поступлении SMS и USSD запросов, данные их будут сохранятся в тестовые файлы /var/log/asterisk/sms.txt, /var/log/asterisk/ussd.txt. При входящем звонке на номер который находится на GSM-модеме, будет запущен «ЭХО тест», при исходящем будет вызван набранный номер.

Для наглядности работы модуля chan_dongle, приведу выводы из консоли asterisk.

Получение SMS:

[dongle0] <strong>Got SMS from +7985*****73: 'ТЕСТОВОЕ СООБЩЕНИЕ'</strong>
-- Executing [sms@from-dongle:1] NoOp("Local/sms@from-dongle-00000002;1", "Incoming SMS from +7985*****73 ТЕСТОВОЕ СООБЩЕНИЕ") in new stack
-- Executing [sms@from-dongle:2] System("Local/sms@from-dongle-00000002;1", "echo '2019-02-27 11:24:31 - e1550 - +7985*****73: ТЕСТОВОЕ СООБЩЕНИЕ' >> /var/log/asterisk/sms.txt") in new stack
-- Executing [sms@from-dongle:3] Hangup("Local/sms@from-dongle-00000002;1", "") in new stack
== Spawn extension (from-dongle, sms, 3) exited non-zero on 'Local/sms@from-dongle-00000002;1'

Пример отправки SMS:

dongle sms dongle0 +7917*****00 HELLO! THIS IS TEST MESSAGE!

[dongle0] SMS queued for send with id 0x7fc348000a90
-- [dongle0] Successfully sent SMS message 0x7fc348000a90
[Feb 27 11:30:22] NOTICE[852]: at_response.c:257 at_response_ok: [dongle0] Successfully sent SMS message 0x7fc348000a90

Пример отправки USSD запроса:

dongle ussd dongle0 *100#

[dongle0] USSD queued for send with id 0x2e44cc0
-- [dongle0] Successfully sent USSD 0x2e44cc0
[Feb 27 11:37:13] NOTICE[852]: at_response.c:267 at_response_ok: [e1550] Successfully sent USSD 0x2e44cc0
[dongle0] Got USSD type 0 'USSD Notify': 'Баланс:5676,62р '
-- Executing [ussd@from-dongle:1] NoOp("Local/ussd@from-dongle-00000004;1", "Incoming USSD: Баланс:5676,62р ") in new stack
-- Executing [ussd@from-dongle:2] System("Local/ussd@from-dongle-00000004;1", "echo '2019-02-27 11:37:15 - e1550: Баланс:5676,62р ' >> /var/log/asterisk/ussd.txt") in new stack
-- Executing [ussd@from-dongle:3] Hangup("Local/ussd@from-dongle-00000004;1", "") in new stack
== Spawn extension (from-dongle, ussd, 3) exited non-zero on 'Local/ussd@from-dongle-00000004;1'

Очистка SMS из памяти SIM и GSM-модема

Периодически рекомендуется очищать SMS из память SIM и GSM-модема.

Для очистки памяти SIM в консоли asterisk, вводим команды:

dongle cmd <dongle_name> AT+CPMS=\"SM\",\"SM\",\"SM\"
dongle cmd <dongle_name> AT+CMGD=1,4

Для очистки памяти GSM-модема в консоли asterisk, вводим команды:

dongle cmd <dongle_name> AT+CPMS=\"ME\",\"ME\",\"ME\"
dongle cmd <dongle_name> AT+CMGD=1,4

Обсуждение

7 комментариев
  • Здравствуйте. Спасибо за пост, вроде всё по делу. Не подскажете ли, в чем может быть дело, если мне не удается получить смски с помощью донгла (у меня модем E173) в процессе работы Asterisk?

    Имею в виду, что если отправить устройству смс, астериск увидит её только если его перезапустить, видимо, при инициализации модема. Отправка при этом работает нормально..

    • Это ответ на комментарий Сергей

      сложно сказать почему у вас так, но на тот момент когда я реализовал, вроде все работало нормально. А сейчас даже не могу подсказать.

  • Зачем делать контекст для входящих для проигрывания демо-теста и ложить трубку? Так круто?

    [dongle-incoming-call]
    exten => +7915*****13,1,Answer()
    exten => +7915*****13,n,Playback(demo-echotest)
    exten => +7915*****13,n,Echo
    exten => +7915*****13,n,Playback(demo-echodone)
    exten => +7915*****13,n,Hangup()

    • Это ответ на комментарий gpu

      Очевидно же что это просто для примера было так написано, если не догадались..

  • Привет всем. У меня такой вот вопрос. Звонит человек извне на номер, привязанный к аналоговому транку DAHDI (Openvox A800p). Еще существует транк chan_dongle на основе модема Huawei E171. Возможно ли его звонок перенаправить каким-либо образом с DAHDI в билайновский chan_dongle, по определенным временным условиям?
    ситуация простая, здесь, где я нахожусь, нет возможностей интернета абсолютно, SIP гуляет только от поднятого FreePBX13+Asterisk11 и только внутри. Наружу работают только аналоговая плата OpenVox (один FXO) и усб-модем вышеуказанный. Хотелось бы сделать, чтобы все входящие после восьми часов вечера на основной телефон, который включен в DAHDI инициировал бы дозвон по определенному сотовому номеру донгловский транк и потом как-то их контачил между собой. Звонки c внутренних sipовских экстеншнов нормально проходят по условиям исходящей маршрутизации на chan_dongle. Но , возможно ли осуществить вот такой коннекшн транков ?
    простите, я новичок. начал изучение с FreePBX, а не с астера :'( может быть поэтому — туплю

  • Похоже вы что-то не договариваете в заметке
    root@debian:/opt/dongle# aclocal && autoconf && automake -a
    aclocal: warning: autoconf input should be named ‘configure.ac’, not ‘configure.in’
    automake: warning: autoconf input should be named ‘configure.ac’, not ‘configure.in’
    configure.in:50: installing ‘./compile’
    configure.in:6: installing ‘./config.guess’
    configure.in:6: installing ‘./config.sub’
    configure.in:7: installing ‘./install-sh’
    configure.in:7: installing ‘./missing’
    automake: error: no ‘Makefile.am’ found for any configure output
    root@debian:/opt/dongle# lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description: Debian GNU/Linux 9.8 (stretch)
    Release: 9.8
    Codename: stretch
    root@debian:/opt/dongle# uname -a
    Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
    root@debian:/opt/dongle# asterisk -rx «core show version»
    Asterisk 15.7.2 built by root @ debian on a x86_64 running Linux on 2019-03-01 13:11:50 UTC
    root@debian:/opt/dongle#

    • Это ответ на комментарий Kuzya

      Похоже что вы пытаетесь сделать на Asterisk 15.7.2 + Debian 9, хотя в заметке явно указано что все описанное применимо к Asterisk 13 + Debian 8 Jessie!

      Лично у меня на Asterisk 13 + Debian 8 Jessie, все прекрасно заводится, делая в точности по шагам заметки. На других версиях не пробовал и не могу знать что там за подводные камни могут быть.

      К примеру указанный в статье модуль chan_dongle поддерживает Asterisk 13, поддержку Asterisk 15, насколько я знаю никто не делал..