Главная страница » Raspberry » Установка Asterisk с модемом Huawey на Raspberry Pi

Установка Asterisk с модемом Huawey на Raspberry Pi

Три простых шага для установки Asterisk на малиновый ПК. 
Устанавливать будем на чистый образ только установленной ОС.

Для начала проверим обновления ОС и установим их:

sudo apt-get update
sudo apt-get upgrade

И перезагрузим систему: 

sudo reboot

После перезагрузки, при необходимости, устанавливаем веб-сервер.


Далее устанавливаем необходимые пакеты

sudo apt-get -y install vim mlocate zip unzip gcc make libssl-dev libtiff5-dev libsqlite3-dev subversion libnewt-dev libuuid1 libxslt1-dev liburiparser1 libncurses5-dev libjansson-dev libogg-dev libspandsp-dev libjansson4 libedit-dev uuid-dev libxml2 mime-construct sendmail
sudo apt-get install -y mariadb-server
sudo apt-get install -y unzip automake autoconf

Далее для удобства работаем от имени root, в терминале вводим команду:

sudo -i

Скачиваем кодек для сжатия речевого сигнала, который может использоваться в приложениях «голос-через-интернет» (VoIP) — speex

cd /usr/src/
wget https://ftp.osuosl.org/pub/xiph/releases/speex/speex-1.2rc2.tar.gz
tar xvf speex-1.2rc2.tar.gz
cd speex-1.2rc2
./configure
make
make install

Если ни каких ошибок в процессе не вышло, то переходим к следующему шагу.

После установки кодека возвращаемся обратно в директорию /usr/src/ и устанавливаем Asterisk

cd /usr/src/
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13-current.tar.gz
tar xzf asterisk-13-current.tar.gz
cd asterisk-13.29.1

Устанавливаем зависимости для asterisk

contrib/scripts/install_prereq install
./contrib/scripts/get_mp3_source.sh

Устанавливаем Asterisk

./configure
make menuselect

В открывшемся окне проставляем пункты как на примере:

  • Add-ons: format_mp3, res_config_mysql, app_mysql и cdr_mysql.
  • Core Sound Packages: Выбираем русские звуки RU-WAV.
  • Music On Hold File Packages: Выбираем звук WAV.
  • Extras Sound Packages: Выбираем английский EN-WAV, русского к сожалению нет.

Все остальные настройки оставляем по-умолчанию. Ставится много модулей. Все они не нужны, но мало ли, пригодится что-то в будущем. Неиспользуемые модули можно будет потом отключить в конфигурации.

Продолжаем установку:

make
make install
make samples
make config
ldconfig

Запускаем астериск и проверяем, запустился ли он, зайдя в консоль:

service asterisk start
asterisk -r

Если сервер будет использоваться только внутри локальной сети, к примеру для внутренней связи сотрудников внутри офисе, то просто переходим к следующему шагу. Если планируется использовать телефоны вне локальной сети, то тут по ситуации: 1. Сервер на прямую смотрит в интернет и имеет внешний ip-адрес; 2. Сервер находится за шлюзом, не имеет своего внешнего ip, доступ в интернет с помощью NAT.
В первом случае необходимо позаботиться о безопасности сервера и правильно настроить межсетевой экран и открыть только необходимые для работы порты. Этот вариант рассмотрим в следующий раз в другой статье.
Второй вариант, который я и буду использовать, мы просто пробрасываем порты на наш сервер на нашем шлюзе. Пробрасываем порт 5060 и диапазон 10000:20000. По-умолчанию астериск использует UDP порты, если не планируется их менять, то пробрасывать нужно именно UDP.

Подключение абонентов и проверка внутренних звонков

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

Создаем пользователя. Для этого нам понадобиться отредактировать файл sip.conf, он находится по в каталоге /etc/asterisk/sip.conf. Сам файл достаточно громоздкий, в нем прописаны все необходимые настройки, которые нам могут и не понадобиться. Для удобства, мы его сейчас очистим и укажем только те настройки, которые нам будут необходимы для само простой настройки АТС. Конечно не забудь сохранить копию этого файла, в дальнейшем он тебе может пригодиться, каждый пункт настройки описан, что за что отвечает, правда на английском, но это не критично, при незнании английского языка можно воспользоваться онлайн-переводчиком, которых в интернете множество.

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

[general]
;внешний ip адрес
externaddr=123.45.67.89:5060
;используем русскую озвучку
language=ru
context=default
allowoverlap=no
udpbindaddr=0.0.0.0
tcpenable=no
tcpbindaddr=0.0.0.0
transport=udp
srvlookup=yes
allowguest=no
limitonpeers=yes

[authentication]

;Создаем шаблон для телефонов бухгалтерии
[buh-phones](!)
type=friend
context=call-out
secret=12345
host=dynamic
nat=no
qualify=yes
canreinvite=no
callgroup=1
pickupgroup=1
call-limit=2
dtmfmode=auto
disallow=all
allow=alaw
allow=ulaw
allow=g729
allow=g723
allow=g722

В файле используются группы номеров, где задаются общие настройки для группы. Далее просто создаются пользователи и указываются их принадлежность к группе. К пользователям подтягиваются настройки этой группы, по этому необходимость прописывать каждому пользователю настройки отпадает. В конце файла я указал как можно использовать настройки для каждого пользователя.

Для групп я указал один и тот же пароль. Это удобно, если используются стационарные телефоны и находятся они в офисе, и настраивает их только системный администратор. Я привел только пример использования тех или иных настроек, в некоторых случаях так делать нельзя.

Уточню некоторые параметры.

  • callgroup и pickupgroup задают группу перехвата звонков. Люди из одной группы пользователей могут перехватывать звонки друг друга. Удобно заводить в одну группу людей, сидящих в одной комнате. Так они видят, что человека нет на месте и перехватывают его звонок. Эти параметры можно индивидуально задать для каждого пользователя в отдельности, если разбивка по шаблонам настроек не соответствует реальной рассадке людей в офисе.
  • callerid можно задать кириллицей, но могут возникнуть проблемы с некоторыми телефонами и с mysql, когда будет вестись статистика звонков.
  • call-limit=2 задает количество одновременных соединений на линию. В некоторых ситуациях есть необходимость получать звонок, когда линия занята. Большинство телефонов поддерживает вторую линию, так что, если человек будет разговаривать по телефону и в этот момент ему позвонит еще один человек, то он узнает об этом. Но иногда это может отвлекать или в этом нет необходимости, тогда параметр необходимо указать как call-limit=1
  • Все пользователи добавлены в один context. В нашем примере будет использоваться только один внешний номер телефона. Если номеров будет несколько, то контекстами можно разводить звонки на разные номера.

Настроим план звонков, для того, что бы можно было совершать вызовы. Для этого нам понадобится файл extensions.conf. Очищаем его и прописываем в нем:

[general]
static=yes
writeprotect=no
[globals]
[default]

;Вешаем трубку
[handup-sip]
exten => _X!,1,HangUp()

;Исходящие звонки
[call-out]
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
include => handup-sip

Этим мы просто добавили один план звонков на трехзначные номера.

Все готово для совершения внутренних звонков через астериск. Заходим в консоль и перезагружаем его

asterisk -r
reload

или

service asterisk restart

При перезагрузке в консоли появятся ошибки, это не страшно, так как многое еще не настроено. Загружаются модули, которым не хватает настроек. 
Проверим список созданных пользователей

sip show users

Здесь мы видим всех наших созданных пользователей и их пароли.

В софтфоне вводим логин и пароль пользователя и пробуем позвонить. Для этого необходимо запустить сразу два софтфона. Второй я использую на смартфоне. На него я установил ZoiPer. Так как я не открыл доступ к АТС из вне, подключаюсь к локальной сети по Wi-Fi.

Проверим всех подключившихся пользователей командой:

sip show peers

После каждого совершенного звонка, в файле /var/log/asterisk/cdr-csv/Master.csv будет появляться строка типа:

"","124","911","call-out","""Manager 4"" <124>","SIP/124-00000002","SIP/911-00000003","Dial","SIP/911","2019-11-06 19:53:46","2019-11-06 19:53:52","2019-11-06 19:54:08",21,15,"ANSWERED","DOCUMENTATION","1573070026.6",""

В этом файле со временем будет скапливаться статистика всех звонков. В дальнейшем ее можно перенести в mysql.

Устанавливаем модуль chan_dongle для звонков через модем

Модуль chan_dongle не входит в стандартный набор Asterisk, его необходимо устанавливать самостоятельно, его можно найти в интернете, собранные под определенную версию Asterisk, либо скомпилировать его самостоятельно. 

Я использую версию Asterisk 13 и USB-модем Huawei от МТС, который ранее уже был разлочен от оператора и переведен в режим только модем.

В терминале по очереди вводим команды:

git clone https://github.com/wdoekes/asterisk-chan-dongle.git
cd asterisk-chan-dongle
chmod u+x bootstrap
./bootstrap
./configure --with-astversion=13.29.1 # Заменить версию на свою версию
make
sudo make install
cd /usr/src/asterisk-chan-dongle/etc
sudo cp dongle.conf /etc/asterisk/

Рестартим asterisk, запускаем консоль и загружаем модуль chan_dongle:

systemctl restart asterisk
asterisk -r
module load chan_dongle.so

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

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

Вероятнее всего, что модем не будет отображаться в системе корректно, до указания его imei и imsi

CLI> dongle show devices 
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number Beeline      0     Free       10   0    0       
Beeline        E3131      21.158.13.03.143  xxxxxxxxxxxxxxx  xxxxxxxxxxxxxxx  Unknown 

imei и imsi указываем в /etc/asterisk/dongle.conf

В некоторых случаях прописать imei и imsi недостаточно, система все равно не видит модем.
Для этого создаем файл и прописываем в нем следующее:
nano /etc/udev/rules.d/92-dongle.rules

KERNEL=="ttyUSB*", MODE="0666", OWNER="asterisk", GROUP="dialout"
KERNEL=="ttyUSB[0-9]*", ID=="1-2:1.0", SYMLINK+="modem-audio"
KERNEL=="ttyUSB[0-9]*", ID=="1-2:1.0", SYMLINK+="modem-data"

Сохраняем и перезагружаем службу udev:
service udev restart

Важная часть для работы модема у меня такая /etc/asterisk/dongle.conf :

;dongle required settings
[Beeline]
audio=/dev/ttyUSB2
data=/dev/ttyUSB1
context=from-gsm

Настроим план звонков /etc/asterisk/extensions.conf :

[general]
static=yes
writeprotect=no
[globals]
[default]

;Вешаем трубку
[handup-sip]
exten => _X!,1,HangUp()

;Исходящие звонки
[call-out]

;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
include => handup-sip

;Исходящие через модем
exten => _7X.,1,Dial(Dongle/mts/holdother:+${FILTER(0-9,${EXTEN})})
exten => _+7X.,1,Dial(Dongle/mts/holdother:+${FILTER(0-9,${EXTEN})})
exten => _8X.,1,Dial(Dongle/mts/holdother:+7${FILTER(0-9,${EXTEN:1})})
exten => _007X.,1,Dial(Dongle/mts/holdother:+7${FILTER(0-9,${EXTEN:3})})
;exten => h,1,Hangup()

;Входящие звонки на модем
[from-gsm]
exten => s,1,Dial(SIP/911)

Этим мы настроили, что все входящие будут приходить на номер 911. Но можно это сделать и на группу.

После внесения изменений в конфиги, что бы не перезагружать asterisk просто обновляем настройки в консоли:

sip reload
dialplan reload
dongle reload now

Возможные проблемы:

— Исходящие работают, а входящие нет. В консоли нет ни строчки при входящем звонке, а в телефоне слышим что-то вроде «Абонент недоступен…» или идут гутки, но нет ответа. Вводим в консоле:

dongle cmd dongle0 AT^SYSCFG=13,0,3FFFFFFF,0,3

— При вводе команды в консоле dongle show devices вместо номера телефона видим Unknown

Вводим в консоле:

dongle cmd dongle0 AT+CPBS=\"ON\"
dongle cmd dongle0 AT+CPBW=1,\"+123456789\",145