Asterisk + GSM Modem

Автор: | 2016-10-02

Asterisk + 3G Modem он же Dongle он же донгл он же свисток.

Существует проект chan-dongle, представляющий драйвер для использования c Asterisk  GSM modem как trunk.

Так как драйвер работает только с конкретной версией Asterisk, то при апгрейде последнего придется заапгрейдить и драйвер.

Готовься читать много скучного текста…

Для asterisk версии 11: https://github.com/jstasiak/asterisk-chan-dongle/tree/asterisk11
Для asterisk версии 12 : https://github.com/superles/chan-dongle-asterisk12
Для asterisk версии 13 : https://github.com/oleg-krv/asterisk-chan-dongle/tree/asterisk13

  1. Сборка.

Для установки (апгрейда) драйвера нужно, пойти по соответствующей, указанной выше ссылке, скачать исходный код драйвера (Download ZIP).  Распаковать его в /usr/src.

В принципе процесс установки описан в файле INSTALL, который находится в каталоге исходников chan_dongle.

Необходимо установить, если еще нет, компилятор и сопутствующее.

yum group install "Development Tools"
yum install automake

Для сборки потребуются заголовочные файлы самого Asterisk, соответствующей версии. В данном примере -13.

yum install asterisk13-devel

Переходим в папку с исходниками и последовательно

cd /usr/src/asterisk-chan-dongle-asterisk13 
aclocal
autoconf
automake -a
./configure
make
make install

Для 64 разрядной системы

./configure --libdir=/usr/lib64

2. Установка.

Далее, проверяем что модуль chan_dongle.so скопирован в  папку модулей asterisk. У меня оно ни разу не справилось с этой сложной задачей, пришлось делать это руками. Каталог модулей для i686 32 разрядной системы /usr/lib/asterisk/modules и  /usr/lib64/asterisk/modules для x86_64 соответственно.

Второй момент — копирование конфига dongle.conf в папку конфигурации asterisk (/etc/asterisk). Если там этого файла нет, а его там так же нет, нужно скопировать из /usr/src/asterisk-chan-dongle-asterisk13/etc руками.

Для использования chan_dongle,  необходимо перевести 3G модем в режим «только модем». В системе появится 3 порта, на каждый используемый модем.

Sun Oct 02 13:13:51 root@pbx.localdomain>ls -la /dev/ttyUSB*
crw-rw---- 1 asterisk dialout 188, 0 Oct  2 11:01 /dev/ttyUSB0
crw-rw---- 1 asterisk dialout 188, 1 Oct  2 11:27 /dev/ttyUSB1
crw-rw---- 1 asterisk dialout 188, 2 Oct  2 13:30 /dev/ttyUSB2

3. Настройка.

Редактируем по необходимости /etc/asterisk/dongle.conf


[general]
; Number of seconds between trying to connect to devices
interval=5
;
[defaults]
; context for incoming calls
context=from-trunk
;
; calling group
group=0
;
; increase the incoming volume; may be negative
rxgain=0
;
; increase the outgoint volume; may be negative
txgain=0
;
; auto delete incoming sms
autodeletesms=yes
;
; reset dongle during initialization with ATZ command
; при инициализации устройства производить сброс модема
resetdongle=yes
;
; set ^U2DIAG parameter on device
;    0 = disable everything except modem function
;   -1 = not use ^U2DIAG command
;
u2diag=-1
;
; use the caller ID presentation or not
usecallingpres=yes
;
; set caller ID presentation by default use default network settings
callingpres=allowed_passed_screen
;
; disable of SMS reading from device when received
;  chan_dongle has currently a bug with SMS reception. When a SMS gets in during a
;  call chan_dongle might crash. Enable this option to disable sms reception.
;
;  default = no
disablesms=no
;
; set channel default language
language=ru
;
; if 'yes' send SMS in PDU mode, feature implementation incomplete and we strongly recommend say 'yes'
smsaspdu=yes
;
; minimal interval from end of previews DTMF from begining of next in ms
mindtmfgap=45
;
; minimal DTMF tone duration in ms
mindtmfduration=80
;
; minimal interval between ends of DTMF of same digits in ms
mindtmfinterval=200
;
; if 'yes' allow incoming calls waiting; by default use network settings
; if 'no' waiting calls just ignored
callwaiting=auto
;
; OBSOLETED by initstate: if 'yes' no load this device and just ignore this section
disable=no
;
; specified initial state of device, must be one of 'stop' 'start' 'remote'
;   'remove' same as 'disable=yes'
initstate=start
;
; exten for start incoming calls,
; only in case of Subscriber Number not available!,
; also set to CALLERID(ndid)
;
exten=+7921xxxxxxx
;
; control of incoming DTMF detection, possible values:
;   off       - off DTMF tones detection, voice data passed to asterisk unaltered
;            use this value for gateways or if not use DTMF for AVR or inside dialplan
;   inband - do DTMF tones detection
;   relax  - like inband but with relaxdtmf option
;
;  default is 'relax' by compatibility reason
dtmf=relax
;
; dongle required settings
;
; # ====== Begin of first dongle ===== #

[dongle0]
;
; tty port for audio connection
;     no default value
audio=/dev/ttyUSB1
;   
; tty port for AT commands
;    no default value
data=/dev/ttyUSB2
;
; or you can omit both audio and data together
;  and use imei=123456789012345
;  and/or imsi=123456789012345
;
;  imei and imsi must contain exactly 15 digits !
;  imei/imsi discovery is available on Linux only
;
; imei=xxxxxxxxxxxxxxx
; imsi=xxxxxxxxxxxxxxx
;
; if audio and data set together with imei and/or imsi audio and data has precedence
;   you can use both imei and imsi together in this case exact match by imei and imsi required
; # ====== End of first dongle ===== #
; # ====== Begin of second dongle ===== #
; [dongle1]
;;
; audio=/dev/ttyUSB4
; data=/dev/ttyUSB5
;;
;; imei=xxxxxxxxxxxxxxx
;; imsi=xxxxxxxxxxxxxxx
; # ====== End of second dongle ===== #

Как определить, какой из ttyUSB указывать в параметре data, а какой — в audio?
На момент загрузки модуля это не важно,  на тестовом звонке станет понятно, правильно ли мы выбрали параметры.  Если номер даже не набирается, то надо менять параметр data. Если номер набирается, но нет звука — параметр audio соответственно.

Каждый раз, при настройке любого параметра dongle необходимо перезагружать модуль в asterisk:

asterisk -rx "module unload chan_dongle.so"
asterisk -rx "module load chan_dongle.so"

или “брутально”

service asterisk restart

Существенный параметр,  context, должен соответствовать контексту Asterisk (FreePBX), для входящих вызовов.

Параметр exten отвечает за тот экстен, который описан у в контексте входящих вызовов, именно НА НЕГО будут приходить все входящие звонки через 3G модем. такой DID.

4. Проверка

Sun Oct 02 14:35:51 root@pbx.localdomain>asterisk -x "dongle show devices"
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number      
dongle0      0     Free       10   5    4       MegaFon RUS    E173       11.126.85.00.209  3xxxxxxxxxxxxxx  250xxxxxxxxxxxx  Unknown

5. Настройка FreePBX

Создаем транк типа custom. Все как обычно, в секции custom Settings указываем способ совершения исходящих вызовов.

freepbx-dongle-trunk
freepbx-dongle-trunk
Custom Dial String:  Dongle/dongle0/$OUTNUM$

Здесь:

Dongle — использовать модуль драйвера

dongle0 — имя идентификатор донгла. указанное в /etc/asterisk/dongle.conf.  Соответственно  можно для красоты переименовать (и там и тут) в NWGSM, MTS, Bee, номер сим карты.

Если используется  несколько модемов, то каждому нужно задать имя идентификатор в /etc/asterisk/dongle.conf, добавлением персональной секции описывающей соответствующие порты data/audio и каждый нужно завести отдельным транком.

Все остальное — как обычно.

6. Отправка SMS и USSD

Естественным образом можно отправлять и получать SMS.

6.1 Отправка

USSD:  dongle ussd dongle0 *100#

pbx*CLI> dongle sms dongle0 +79xxxxxxxxx test test test

[dongle0] SMS queued for send with id 0x7f33600029c0
    -- [dongle0] Successfully sent SMS message 0x7f33600029c0

[2016-10-02 08:45:25] NOTICE[7193]: at_response.c:257 at_response_ok: [dongle0] Successfully sent SMS message 0x7f33600029c0

/* тут потерялся скриншот с балансом минус 25 тысяч рублей */

Кхм. Проверка баланса показала что пора бы НЕМНОГО пополнить счет.

SMS: dongle sms dongle0 +79xxxyyyzzz test test test
pbx*CLI> dongle sms dongle0 +79xxxxxxxxx test test test

[dongle0] SMS queued for send with id 0x7f33600029c0

    -- [dongle0] Successfully sent SMS message 0x7f33600029c0

[2016-10-02 08:45:25] NOTICE[7193]: at_response.c:257 at_response_ok: [dongle0] Successfully sent SMS message 0x7f33600029c0

6.2 Прием.

В соответствующем входящем диалплане прописываем
(Для FreePBX это нужно сделать в /etc/asterisk/extensions_override_freepbx.conf )

[from-trunk]
include => incomming-sms
include => incomming-ussd
include => from-pstn

Примерно такого содержания
(Для FreePBX это нужно сделать в /etc/asterisk/extensions_custom.conf )

[incomming-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() ; [incomming-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()

7. Готово.

Набор кубиков готов, можно строить свою систему.

0. Возможные траблы

При загрузке модуля chan_dongle может появиться сообщение вида:

at_response.c:1420 at_response_smmemfull: [dongle0] SMS storage is full

Это значит, что память SMS переполнена. Есть 2 хранилища SMS: на SIM карте и в самом модеме.

Для очистки памяти SIM чере консоль астериска дать команды:

dongle cmd dongle0 AT+CPMS=\"SM\",\"SM\",\"SM\" dongle cmd dongle0 AT+CMGD=1,4

Для очистки памяти модема через консоль астериска дать команды:

dongle cmd dongle0 AT+CPMS=\"ME\",\"ME\",\"ME\" dongle cmd dongle0 AT+CMGD=1,4

В консоли asterisk (CLI) должно появиться сообщение вида:

[dongle0] 'AT+CMGD=1,4' Command queued for execute [dongle0] Got Response for user's command:'OK'

На основе хорошей статьи http://linux.mixed-spb.ru/asterisk/dongle_part1.php