Три простых шага для установки 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
Полный список в файле: sip.conf
В файле используются группы номеров, где задаются общие настройки для группы. Далее просто создаются пользователи и указываются их принадлежность к группе. К пользователям подтягиваются настройки этой группы, по этому необходимость прописывать каждому пользователю настройки отпадает. В конце файла я указал как можно использовать настройки для каждого пользователя.
Для групп я указал один и тот же пароль. Это удобно, если используются стационарные телефоны и находятся они в офисе, и настраивает их только системный администратор. Я привел только пример использования тех или иных настроек, в некоторых случаях так делать нельзя.
Уточню некоторые параметры.
- 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