Asterisk on RaspberryPI + Centos7 + E173 Modem

Данная статья не претендует на звание детального мануала по установке и настройке, а выступает больше в роли хорошей шпаргалки.

Итак Centos7 мы уже установили, кто не знает как, в моих статьях есть мануал поищите.

Качаем астериск:

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz

Теперь распаковываем:

tar -zxvf asterisk-16-current.tar.gz
cd asterisk-16.0.0

Устанавливаем мр3 поддержку:

yum install svn
./contrib/scripts/get_mp3_source.sh

Подготавливаем астериск к сборке(если у вас возникнет потребность в каких то зависимостях установите их):

sudo contrib/scripts/install_prereq install
./configure --libdir=/usr/lib64 --with-jansson-bundled

Выбираем необходимые параметры для сборки:

make menuselect

Собираем устанавливаем:

make && sudo make install

Устанавливаем основные конфигурационные файлы:

sudo make samples

Если создавали отдельного юзера для запуска астериск, назначим права на папки:

chown asterisk. /var/run/asterisk
chown asterisk. -R /etc/asterisk
chown asterisk. -R /var/{lib,log,spool}/asterisk

Проверяем что мы установили:

sudo service asterisk start
sudo asterisk -rvv

Если все ок то видим следующее:

Asterisk 16.0.0, Copyright (C) 1999 - 2018, Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 16.0.0 currently running on asterisk (pid = 3985)
asterisk*CLI>

Для выхода пишем:

asterisk*CLI> exit

Теперь установим наш USB модем:

cd /home/asterisk/install
yum install git
git clone https://github.com/wdoekes/asterisk-chan-dongle.git
cd asterisk-chan-dongle
./bootstrap
./configure --with-astversion=15.2.2 # Заменить на свою версию астериск
make
sudo make install
sudo cp dongle.conf /etc/asterisk/

Заходим в CLI asterisk и подгружаем наш модуль модема:

asterisk -rvv
> module load chan_dongle.so

Просматриваем наличие модема:

>dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number        
dongle0      0     Free       8    5    4       KYIVSTAR       E173       11.126.85.00.209  86745500000000  255030844000000  +380970000000

Значения IMEI и IMSI прописываем в /etc/asterisk/dongle.conf и закоментируем ;exten=+1234567890.
Небольшой туториал по работе в dongle.conf:

Если указать только IMEI — в этом случае привязка линии будет осуществляться по IMEI модема (мобильного терминала). Вы можете менять SIM-карты или разъемы USB. Линия будет закреплена за модемом.

Если указать только IMSI — в этом случае привязка линии будет осуществляться по IMSI номеру SIM-карты. Вы можете заменить модем на другой, можете поменять разъем USB. Линия будет закреплена именно за SIM-картой.

Если указать интерфейсы audio и data. В этом случае линия будет привязана к контроллеру USB (по факту к гнезду USB). Это очень неудобный способ и оставлен в новых версиях Dongle только для совместимости со старыми версиями и с некоторыми операционными системами, где обнаружение по IMEI и IMSI не работает.

Настройка Asterisk.

Добавим модуль в автозагрузку:

echo "load => chan_dongle.so" >> /etc/asterisk/modules.conf

Делаем базовую настройку sip.conf:

[general]
language = ru
bindport = 5060
callcounter = yes
limitonpeers = yes
dtmfmode = rfc2833
compensate = yes
defaultexpiry = 3600
disallow = all
allow = alaw
tcpenable=yes

[111]
type=friend
host=dynamic
username=111
secret=you password
callerid=100
context=outgoing
canreinvite=yes
dtmfmode=rfc2833
permit=0.0.0.0/0.0.0.0
qualify=yes
transport=udp
nat=force_rport,comedia

Создадим диалплан в extensions.conf тут мы будем принимать и отправлять звонки вместе с SMS:

[general]
static=yes
writeprotect=no
clearglobalvars=no
autofallthrough=yes

[outgoing]
exten => _1XX,1,Dial(SIP/${EXTEN})
exten => _+X.,1,Dial(Dongle/dongle0/${EXTEN})
exten => h,1,Hangup()

[incoming]
exten => _+X.,1,Set(CALLERID(all)=${CALLERID(num)})
;exten => _+X.,n,Goto(ss-noservice,s,1) если эту строку расскоментировать то будет проигрыватся звук с [ss-noservice] и ложить трубку.
exten => _+X.,n,Dial(SIP/111)
exten => h,1,Hangup()
;[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]
;include => dongle-incoming-sms
;include => dongle-incoming-ussd

[ss-noservice]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Background(no-use)
exten => s,n,Hangup()

Для отправки SMS и USSD можно делать так:

asterisk -rx 'dongle sms dongle0 380930000000 Это тестовая СМС'
asterisk -rx 'dongle ussd dongle0 *111#'

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

#Для очистки памяти SIM применяем в консоли последовательно команды:
asterisk -rx 'dongle cmd dongle0 AT+CPMS=\"SM\",\"SM\",\"SM\"'
asterisk -rx 'dongle cmd dongle0 AT+CMGD=1,4'

#Для очистки памяти модема применяем в консоли последовательно команды:
asterisk -rx 'dongle cmd dongle0 AT+CPMS=\"ME\",\"ME\",\"ME\"'
asterisk -rx 'dongle cmd dongle0 AT+CMGD=1,4'

И если у вас на этом же сервере есть PHP и веб сервер, можно читать наши SMS и USSD из WEB скриптик smsr.php:

<?php
echo "SMS<br>";
$file1 = fopen("/var/log/asterisk/sms.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
while(!feof($file1))
  {
    echo fgets($file1). "<br>";
      }
      fclose($file1);
echo "<br>";

echo "USSD<br>";
$file = fopen("/var/log/asterisk/ussd.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
while(!feof($file))
  {
    echo fgets($file). "<br>";
      }
      fclose($file);
?>

P.S. В итоге мы имеем полноценную IP телефонию, на основе USB модема, можем совершать исходящие и принимать входящие звонки, а так же принимать и отправлять SMS.

Оставить комментарий

Please be polite. We appreciate that. Your email address will not be published and required fields are marked