Home » Asterisk » Asterisk - SIP АТС для офиса, пошаговая инструкция по настройке с нуля

Asterisk - SIP АТС для офиса, пошаговая инструкция по настройке с нуля

Одним из рабочих инструментов офиса, несмотря на стремительные изменения последних десятилетий, по-прежнему является телефон. Мы займемся пошаговой настройкой с нуля АТС asterisk - современного инструмента для организации телефонии в офисе на основе протокола SIP. Я подробно с примерами и описанием проведу вас по основным параметрам, необходимым для базового функционала.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти .

Данная статья является частью единого цикла статьей про сервер Centos.

Введение

Не буду останавливаться на описании сервера asterisk, в интернете много информации на эту тему. Да и сам я кратко рассказывал в своих предыдущих статьях про установку. Материал будет объемный, поэтому сразу перейдем к сути.

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

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

Сразу хочу обратить внимание на очень важный момент. Я не являюсь профессионалом в настройке asterisk. Данный материал является калькуляцией всех моих знаний на текущий момент, которые я методично шаг за шагом собирал из доступных в интернете источников. По этой статье вы получите рабочий, многофункциональный сервер телефонии, работу которого я проверял на практике. Но это не означает, что все, что здесь настроено, сделано наилучшим образом. Я постоянно учусь и совершенствую свои знания. Если вы увидите ошибки, недочеты, варианты более правильной и удобной настройки, прошу об этом сообщить в комментариях, я проверю и обновлю статью.

Для примера опишем наш воображаемый офис:

  • Работает 30 сотрудников. Номера будут трехзначные, от 100 до 130.
  • У нас будут 3 отдела - менеджеры, техподдержка, руководство и все остальные.
  • Номер секретаря 100, менеджеры 101-110, техподдержка 111-120, руководство 121-130.
  • Мы будем использовать одного SIP провайдера для звонков.

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

Для настройки я буду использовать учетную запись сервиса zadarma.com. Сразу скажу, что в реальной работе я никогда не использовал этот сервис и его качество мне не известно. Беру его для примера, потому что удобно использовать для тестирования конфигурации. Сразу после регистрации вам дают аккаунт, пример настроек для asterisk. Вы можете позвонить на прямой городской номер, ввести добавочный и совершить звонок на свой аккаунт. Это полностью эмулируер работу sip подключения от какого-нибудь провайдера.

В качестве операционной системы у меня выступает CentOS 8. Но для данной статьи это не имеет принципиального значения. Конфигурация астериск кроссплатформенная, без проблем переносится между системами.

Приступаем к нашей работе по настройке сервера телефонии.

Быстрая установка из репозитория

Centos 7

У asterisk не существует официального репозитория пакетов, поэтому предпочтительным способом установки свежей версии является сборка из исходников. Но если вы хотите быстро установить и потестить систему, то можно использовать один из сторонних репозиториев asterisk. К примеру - Tuncy. Я не знаю, кто ведет этот репозиторий, как часто он обновляется и насколько там актуальные версии. На момент актуализации этой статьи (март 2020 года) в репозитории не было свежих пакетов для Centos 8, только для 7-й.

Добавляем репозиторий астериск в систему. Для этого создаем файл /etc/yum.repos.d/tuncy-asterisk-16.repo следующего содержания.

[asterisk-common]
name=Asterisk Common Requirement Packages @ tucny.com
baseurl=https://ast.tucny.com/repo/asterisk-common/el\$releasever/\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://ast.tucny.com/repo/RPM-GPG-KEY-dtucny

[asterisk-16]
name=Asterisk 16 Packages @ tucny.com 
baseurl=https://ast.tucny.com/repo/asterisk-16/el\$releasever/\$basearch/
enabled=1
gpgcheck=1
gpgkey=https://ast.tucny.com/repo/RPM-GPG-KEY-dtucny

Обновляем информацию о репозиториях и устанавливаем астериск.

# yum install asterisk

Установка asterisk из репозитория

Установка из исходников

Centos 8

Вопроса установки asterisk я уже касался ранее в одной из прошлых статей. Но там я использовал связку с панелью управления freepbx. Здесь же мы будем использовать голый астериск, без обвязок. Более того, я не буду использовать никаких дополнительных плат расширения и модемов. Будет только софтовая АТС, которая легко переносится с одного сервера на другой при желании. Считаю, что такой подход наиболее эффективен и к нему стоит стремиться. Настроив виртуальную машину, вы навсегда будете отвязаны от конкретного железа и спокойно можете переносить свой сервер куда угодно, заменив только сетевые настройки.

Таким образом, нам нужно установить непосредственно asterisk и pjproject с jansson. На первоначальном этапе этого достаточно. Если вы предпочитаете сервер debian, то воспользуйтесь отдельной инструкцией по установке asterisk 16 на debian 10. После этого можете сразу же переходить на следующий этап настройки. Приступим.

Первым делом обновляем систему и отключаем SELinux, как рассказано в статье про настройку centos. Установим теперь пакеты, которые нам понадобятся для сборки. В первую очередь подключим репозиторий epel.

# dnf install epel-release

Дальше идет мета пакет Development Tools со всем необходимым для сборки из исходников.

# dnf groupinstall "Development Tools"

Установка Development tools И еще некоторые зависимости, которые будут нужны.

# dnf install git wget net-tools sqlite-devel psmisc ncurses-devel libtermcap-devel newt-devel libxml2-devel libtiff-devel gtk2-devel libtool libuuid-devel subversion kernel-devel kernel-devel-$(uname -r) crontabs cronie-anacron mariadb mariadb-server

Установка зависимостей asterisk 16 Настройте mysql сервер, задав пароль для root.

# systemctl start mariadb
# systemctl enable mariadb
# /usr/bin/mysql_secure_installation

На этом подготовка закончена. Устанавливаем Jansson и pjsip.

# cd ~
# git clone https://github.com/akheron/jansson.git
# cd jansson
# autoreconf -i
# ./configure --prefix=/usr/
# make && make install

Установка Jansson

# cd ~
# git clone https://github.com/pjsip/pjproject.git
# cd pjproject
# ./configure CFLAGS="-DNDEBUG -DPJ_HAS_IPV6=1" --prefix=/usr --libdir=/usr/lib64 --enable-shared --disable-video --disable-sound --disable-opencore-amr
# make dep && make && make install
# ldconfig

Установка pjsip Все готово к установке непосредственно Astersik

Я буду устанавливать LTS версию Asterisk 16. Советую для долгосрочного использования всегда использовать LTS версии. Они в целом стабильнее и дольше срок поддержки. Идем на страницу https://www.asterisk.org/downloads/asterisk/all-asterisk-versions и копируем ссылку на нужную версию. Загружаем ее на сервер.

# cd ~
# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
# tar xfz asterisk-16-current.tar.gz
# cd asterisk-16*/
# contrib/scripts/install_prereq install
# contrib/scripts/get_mp3_source.sh

Устанавливаем на centos 8 пакет libedit-devel.

# dnf config-manager --set-enabled PowerTools
# dnf install libedit-devel

Собираем asterisk.

# ./configure --libdir=/usr/lib64
# make menuselect

Установка Asterisk 16 на Centos 8 Выбирайте необходимые модули и звуки, в зависимости от того, что вам нужно. Я в общем случае указываю:

  • Add-ons: format_mp3, res_config_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

По-умолчанию, asterisk установлен от root и будет запускаться от него же. Я предлагаю для этого создать отдельного пользователя и запускать астериск от него. Для этого создаем пользователя и добавляем его в некоторые группы.

# groupadd asterisk
# useradd -r -d /var/lib/asterisk -g asterisk asterisk
# usermod -aG audio,dialout asterisk
# chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk

Настраиваем Asterisk на запуск под этим пользователем. Для этого добавляем в конфиг /etc/sysconfig/asterisk параметры:

AST_USER="asterisk"
AST_GROUP="asterisk"

Теперь добавим примерно то же самое в сам конфиг астера /etc/asterisk/asterisk.conf.

runuser = asterisk
rungroup = asterisk

Пробуем запустить asterisk:

# systemctl start asterisk

Если нет сообщений об ошибке, скорее всего все в порядке. Проверяем статус службы.

# systemctl status asterisk

Запуск asterisk Asterisk запустился, но есть небольшие ошибки.

radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory

Связаны с тем, что в конфигах неверно указан путь к radiusclient. Сейчас исправим это.

# sed -i 's";\[radius\]"\[radius\]"g' /etc/asterisk/cdr.conf
# sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cdr.conf
# sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cel.conf

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

# asterisk -r

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

# systemctl enable asterisk

Для тех, у кого что-то не получается или не понятно, как сделать, записал видео по приведенной инструкции. Видео подтверждает, что материал актуален и если делать по нему, то все получится. https://youtu.be/9q9RGqBVQbA

Centos 7

Если вы хотите использовать для настройки Asterisk предыдущую версию системы, то смотрите мою статью по установке Asterisk 16 на Centos 7. Там нет принципиальных отличий, но имейте ввиду, что все дальнейшие действия были проделаны и проверены на 8-й вверсии Центос, так что я не ручаюсь, что это так же заработает и на 7-й. Полную проверку и адаптацию материала я сделал для CentOS 8.

Настройка iptables, asterisk за NAT, проброс портов

Сразу же уделим внимание настройке iptables для работы астериск. У нас может быть 2 ситуации, которые требуют двух принципиально различных настроек:

  1. Сервер телефонии имеет свой внешний ip адрес и напрямую смотрит через него в интернет.
  2. Сервер стоит за шлюзом, не имеет своего внешнего адреса, доступ в интернет с помощью NAT.

В первом случае нам нужно открыть на iptables необходимые порты для работы, все остальное закрыть. Подробно вопрос настройки iptables я рассматривал в отдельной статье. Там есть примеры и пояснения, рассказан мой подход к настройке.

Я не могу привести универсальные настройки для всех случаев. У каждого будут свои нюансы. Кто-то, к примеру, будет пользоваться phpmyadmin для настройки базы mysql для хранения статистики звонков. Потом эту же статистику будет просматривать через cdr viewer, установленный на веб сервере. Доступ к этому веб серверу можно открыть через внешний IP адрес, а можно только через локальную сеть. Настройки iptables в данном случае будут разные.

В моем примере сервер будет находиться в локальной сети офиса за nat. Доступ в интернет осуществляется через офисный шлюз, на котором установлены iptables. На нем будет сделан проброс необходимых портов для работы внешних телефонных аппаратов. В случае, если у вас все телефоны будут находиться в локальной сети офиса вместе с сервером телефонии, пробрасывать ничего не нужно. С сервисом zadarma все будет работать без проброса портов. Пиры зарегистрируются на внешнем сервере провайдера и этого будет достаточно для приема и совершения звонков.

С другими провайдерами этого может быть не достаточно. В общем случае для настройки asterisk за nat нужно будет на шлюзе пробросить порт 5060 и диапазон 10000:20000. По-умолчанию астериск использует UDP порты. Если вы не будете менять эти настройки, то пробрасывать нужно именно UDP.

В моем случае получается следующая картина. На шлюзе сделан проброс необходимых портов:

iptables -t nat -A PREROUTING -p udp --dst $WAN_IP --dport 5060 -j DNAT --to 192.168.1.25:5060
iptables -t nat -A PREROUTING -p udp --dst $WAN_IP --dport 10000:20000 -j DNAT --to 192.168.1.25
$WAN_IP Внешний IP адрес на шлюзе
192.168.1.25 Локальный адрес сервера астериск

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

Если вы делаете тестовую установку и настройку asterisk, можете совсем отключить firewalld:

# systemctl stop firewalld
# systemctl disable firewalld
# dnf remove firewalld

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

Астериск у нас установлен, firewall настроен. Можно попробовать подключиться и протестировать работу АТС. Я для отладки использую бесплатную софтовую звонилку 3CXPhone 6-й версии. Не знаю, где ее сейчас найти в интернете. У самого производителя давно уже вышли более новые и платные версии, которые работают только с его АТС. А эта версия универсальная. В ней отличный функционал, удобные настройки, есть дебаг режим с подробным логированием. Пользоваться программой удобно и приятно. Скачиваем ее у меня и устанавливаем.

Теперь нам нужно сделать некоторые общие настройки и добавить пользователей. Работать будем с файлом конфигурации /etc/asterisk/sip.conf. Файлы настроек астера хорошо закомментированы, но мне это мешает с ними работать. Они слишком большие и громоздкие, неудобно прокручивать вверх и вниз, поэтому я их полностью чищу и вношу только те настройки, которые мне нужны. Так удобнее и нагляднее получается. Сохраните на всякий случай куда-нибудь оригинальный файл sip.conf и начинайте новую настройку. Вот мой пример конфига для нашего случая:

[general]
;Внешний ip адрес
externaddr=212.78.136.18: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]

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

;Создаем пользователей менеджеров
[100](managers-phones)
callerid="Number 100" <100>
[101](managers-phones)
callerid="Number 101" <101>
[102](managers-phones)
callerid="Number 102" <102>
[103](managers-phones)
callerid="Number 103" <103>
[104](managers-phones)
callerid="Number 104" <104>
[105](managers-phones)
callerid="Number 105" <105>
[106](managers-phones)
callerid="Number 106" <106>
[107](managers-phones)
callerid="Number 107" <107>
[108](managers-phones)
callerid="Number 108" <108>
[109](managers-phones)
callerid="Number 109" <109>
[110](managers-phones)
callerid="Number 110" <110>

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

;Создаем пользователей техподдержки
[111](support-phones)
callerid="Number 111" <111>
[112](support-phones)
callerid="Number 112" <112>
[113](support-phones)
callerid="Number 113" <113>
[114](support-phones)
callerid="Number 114" <114>
[115](support-phones)
callerid="Number 115" <115>
[116](support-phones)
callerid="Number 116" <116>
[117](support-phones)
callerid="Number 117" <117>
[118](support-phones)
callerid="Number 118" <118>
[119](support-phones)
callerid="Number 119" <119>
[120](support-phones)
callerid="Number 120" <120>

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

;Создаем пользователей топов
[121](top-phones)
callerid="Number 111" <121>
[122](top-phones)
callerid="Number 122" <122>
[123](top-phones)
callerid="Number 123" <123>
[124](top-phones)
callerid="Number 124" <124>
[125](top-phones)
callerid="Number 125" <125>
[126](top-phones)
callerid="Number 126" <126>
[127](top-phones)
callerid="Number 127" <127>
[128](top-phones)
callerid="Number 128" <128>
[129](top-phones)
callerid="Number 129" <129>
[130](top-phones)
callerid="Number 130" <130>

Я немного пояснил комментариями отдельные моменты. Чтобы сократить размер sip.conf, я использую шаблоны групп номеров, где задаю общие настройки для группы. Затем просто создаю пользователей и указываю их принадлежность к группе. Они берут все настройки этой группы. Если вам необходимо будет задать отдельные настройки для какого-то пользователя, как у меня, к примеру, callerid, то вы просто в его разделе указываете эти настройки.

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

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

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

# asterisk -r
CLI> reload

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

CLI> sip show users

sip show users

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

Дальше устанавливайте любую софтовую звонилку на компьютер или можете сразу использовать телефон, если он у вас под рукой. С телефонами удобнее, но не всегда они есть. В 3CXPhone задаем следующие настройки подключения к нашей ip атс:

Пример подключения телефона к asterisk Я сразу открываю дебаг окно для отладки. Корректное подключение к серверу будет выглядеть вот так: Подключение 3CXPhone к астериск Проверим на сервере список подключенных пиров с помощью команды:

CLI> sip show peers

Должна быть строка с подключенным пиром:

100/100                   192.168.1.100                            D  No         No             59891    OK (104 ms)

Если у вас так же, то все в порядке. Чтобы протестировать звонки, нам нужно подключить двух абонентов. Настраивайте еще один телефон или софтофон. Проверяйте в списке подключенных пиров чтобы было 2 подключения и попробуйте позвонить друг другу. Если вы все сделали правильно, то локальные звонки должны работать. Я обычно для тестирования второго клиента настраиваю на мобильном телефоне. Так можно проверить работу звонков через смартфоны.

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

"","101","100","call-out","""Number 101"" <101>","SIP/101-00000000","SIP/100-00000001","Dial","SIP/100","2020-02-27 12:38:35","2020-02-27 12:38:45","2020-02-27 12:38:47",12,2,"ANSWERED","DOCUMENTATION","1582807115.0",""

В этом файле будет накапливаться статистика звонков. Позже мы перенесем ее в mysql. Я позвонил с номера 101 на номер 100, там мне ответили. В файле отражены все основные данные этого звонка.

Один небольшой шажок по настройке voip атс asterisk мы сделали. Будем двигаться дальше.

Настройка sip trunk (транка) и добавление номера

Регистрируемся у какого-нибудь sip провайдера и получаем настройки транков для подключения. Как я говорил выше, я буду использовать провайдера zadarma. После регистрации в личном кабинете в разделе Настройки -> Подключение по SIP я вижу свой логин, пароль для подключения и адрес сервера. Там же можно узнать пример настройки подключения для астериска и номера для тестовых звонков:

  • Номер для эхо-теста: 4444.
  • Информация про остаток на счету: 1111
  • Прямой звонок: Москва +7 (495) 777-66-75 и внутренний номер клиента (логин)

Нам этого будет достаточно для полноценного тестирования конфигурации астериска. Добавляем необходимые настройки sip транка, чтобы выполнить его регистрацию. Редактируем sip.conf, добавляем в самый конец нового пира в соответствии с инструкцией провайдера:

[397945]
host=sip.zadarma.com
insecure=invite,port
type=friend
fromdomain=sip.zadarma.com
disallow=all
allow=alaw
dtmfmode=auto
secret=password
defaultuser=397945
trunkname=397945
fromuser=397945
callbackextension=397945
context=call-in
qualify=400
directmedia=no
nat=force_rport,comedia

В данном случае 397945 мой внутренний номер в сервисе, password - пароль. Сохраняем файл и даем команду астеру перечиать его:

CLI> sip reload

Тут же в консоли, если все в порядке, вы получите сообщение:

chan_sip.c:24403 handle_response_peerpoke: Peer '397945' is now Reachable. (55ms / 400ms)

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

CLI> sip show peers
397945/397945             185.45.152.161                              Auto (No)  No             5060     OK (54 ms)

Все, транк настроили, по сути подключили номер. Но этого не достаточно, чтобы совершать и принимать звонки. Надо отредактировать dialplan.

Dial-plan - пример маршрутизации звонков

Начало построения диалплана для маршрутизации звонков мы уже положили, когда настраивали внутренние звонки. Теперь нужно дополнить dial-plan для совершения исходящих и приема входящих звонков. Редактируем extensions.conf и приводим его к следующему виду:

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

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

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

include => handup-sip

;Входящие звонки
[call-in]
exten => 397945,1,Dial(SIP/100)

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

В нашем примере в контекст исходящих звонков мы добавили правило набора любого номера длиннее трех символов через транк 397954. Если в локальных звонках маска экстеншена задается тремя любыми символами, то тут мы в конец добавили точку, которая означает любое количество символов.

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

Контекст [call-in] описывает поведение при входящем звонке. В нашем случае все входящие звонки с транка 397945 будут направляться на номер секретаря 100. К этому контексту мы еще вернемся позже, когда будем настраивать голосовое меню.

Сохраняем dial-plan и перезагружаем астериск единой командой reload, либо отдельно перезагружаем sip и dialplan командами:

CLI> sip reload
CLI> dialplan reload

Теперь можно попробовать позвонить, к примеру, на тестовый номер zadarma - 4444 для эхотеста. Если все получилось, значит вы правильно настроили исходящие звонки. Для проверки входящего звонка, позвоните в Москве на номер +7 (495) 777-66-75 и введите свой добавочный номер в виде логина. Звонок должен переключиться на номер 100. Чтобы это произошло, необходимо, чтобы peer с номером 100 был подключен к астериску.

Я проверил, без проблем дозвонился и по исходящему номеру, и по входящему. В файле Master.csv появилась информация о совершенных звонках:

"","100","4444","call-out","""Number 100"" <100>","SIP/100-00000002","SIP/397945-00000003","Dial","SIP/4444@397945","2020-02-27 14:13:18","2020-02-27 14:13:20","2020-02-27 14:13:25",6,5,"ANSWERED","DOCUMENTATION","1582812798.3",""
"","79689056505","397945","call-in","""79689056505"" <79689056505>","SIP/397945-00000004","SIP/100-00000005","Dial","SIP/100","2020-02-27 14:14:11",,"2020-02-27 14:14:16",4,0,"BUSY","DOCUMENTATION","1582812851.6",""

После звонков в консоли астера и в логе /var/log/asterisk/messages вы увидите множество ошибок:

res_hep.c: Unable to send packet: Address Family mismatch between source/destination

Чтобы их не было, вам нужно на сервере отключить протокол ipv6.

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

Приветствие и голосовое меню (ivr)

Основной функционал asterisk реализован. Будем его расширять. Практически на всех АТС присутствует голосовое меню, которое встречает звонящего. Я рассмотрю настройку самого простого варианта голосового меню, как его еще называют ivr. Позвонив, человек услышит какое-то приветствие, далее ему будет предложено ввести внутренний номер абонента, если он его знает, либо дождаться ответа секретаря.

Для простоты настройки и отладки, поделюсь способом, который использую я. У проекта zadarma есть клиент под андроид - Zadarma SIP. Скачиваете его на телефон и регистрируете еще одну учетную запись в проекте. Логинитесь под ней в телефоне и можете звонить на свой астериск, просто набирая 6-ти значный номер аккаунта, который используете на сервере. Таким образом вы быстро, удобно и бесплатно эмулируете входящие звонки с внешних линий на свой сервер.

Начнем настройку с того, что создадим возможность для записи приветствия. Вы можете записать его где угодно и потом скопировать на сервер astersik. Но можно поступить удобнее - записать прямо с телефонного аппарата приветствие и использовать его в голосовом меню. Чтобы это сделать, необходимо добавить в dialplan в контекст исходящих звонков, в моем примере это [call-out], в самое начало следующую конструкцию:

;Номер для записи звуков, окончание записи #
exten => _35X, 1, NoOp()
exten => _35X, n, Wait(2)
exten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Wait(1)
exten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Wait(2)
exten => _35X, n, Hangup()

Перезагружаем dialplan:

CLI> dialplan reload

Теперь при звонке на любой из номеров 350-359 вы услышите бип, после которого начнется запись всего, что сказано в трубку. Чтобы завершить запись, нажмите #. После этого вы прослушаете то, что было записано. Файл с записью будет сохранен в папку /temp. Если вы позвоните на номер 351, то файл будет иметь имя music1.wav, если на 355, то music5.wav. Можно записать до 10-ти разных вариантов и потом из них выбирать.

Сохраните подходящую запись с именем ivr-main.wav и разместите его в какой-нибудь папке. Я положил в папку /etc/asterisk/ivr. Добавим пример голосового меню в нашу конфигурацию asterisk. Для этого снова открываем extensions.conf и добавляем в него новый контекст [ivr-main] следующего содержания:

[ivr-main]
exten => s,1,Answer()
;Проигрываем приветствие
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
;Ждем 5 секунд ввода добавочного номера
exten => s,3,WaitExten(5)
;Звоним по введенному добавочному
exten => _XXX,1,Dial(SIP/${EXTEN})
;Если введен не существующий номер, то говорим об этом и отправляем в начало приветствия
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(ivr-main,s,1)
;Если звонящий ничего не вводит, то звоним секретарю
exten => t,1,Dial(SIP/100)

В комментариях я сделал все пояснения. Мы создали контекст для ivr. Теперь его надо добавить в контекст входящих звонков. Для этого изменяем существующий контекст [call-in], заменяя в нем единственную строку на новую:

exten => 397945,1,Goto(ivr-main,s,1)

Перезапускаем диал план и звоним снаружи на внешний номер. Вы должны услышать голосовое приветствие ivr, которое мы только что настроили. После этого этапа ваш файл extensions.conf должен выглядеть примерно так (комментарии вырезал):

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

[handup-sip]
exten => _X!,1,HangUp()

[call-out]
exten => _35X, 1, NoOp()
exten => _35X, n, Wait(2)
exten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Wait(1)
exten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Wait(2)
exten => _35X, n, Hangup()
exten => _XXX,1,Dial(SIP/${EXTEN})
exten => _XXX.,1,Dial(SIP/${EXTEN}@397945)
include => handup-sip

[call-in]
exten => 397945,1,Goto(ivr-main,s,1)

[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten(5)
exten => _XXX,1,Dial(SIP/${EXTEN})
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(ivr-main,s,1)
exten => t,1,Dial(SIP/100)

Включаем голосовую почту

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

На практике я не видел, чтобы голосовую почту активно использовали. Но для полноты картины расскажу про нее, возможно вам она пригодится. Открываем файл voicemail.conf на редактирование. Я не трогал настройки по-умолчанию, просто добавляем в секцию [default] ящики голосовой почты для нужных нам сотрудников в следующем виде:

130 => 1234,Number 130,user130@mail.ru
100 => 1234,Number 100,user100@mail.ru
130 внутренний номер абонента
1234 пароль доступа к ящику голосовой почты
user130@mail.ru почтовый адрес, куда будет отправлено записанное голосовое сообщение

Для корректной отправки почтовых сообщений сразу на внешние почтовые ящики необходимо правильно настроить локальный почтовый сервер, либо использовать внешний. Я рекомендую использовать отдельный сервер, наверняка он есть в организации, либо на локальном использовать какой-то публичный с авторизацией по smtp. Пример такой настройки - отправка почты с авторизацией по smtp в linux.

В консоли перезапускаем модуль голосовой почты и проверяем пользователей:

CLI> voicemail reload
Reloading voicemail configuration...
asterisk*CLI> voicemail show users
Context Mbox User Zone NewMsg
default 130 Number 121 0
default 100 Number 100 0
other 1234 Company2 User 0
3 voicemail users configured.

Наши два добавленных пользователя и один тестовый остался из дефолтной конфигурации. Его можно удалить. Их вообще два должно быть. Одного я уже удалил, второго забыл.

Это пол дела. Теперь нам нужно добавить голосовую почту в dialplan. Причем в 2 разных места. Я буду использовать номер 500 для звонка в панель управления голосовой почтой. Позвонив на этот номер, пользователь введет свой пароль и сможет управлять голосовыми сообщениями (слушать, удалять, менять настройки). Добавим в контекст для исходящих звонков звонок на этот номер. Добавлять следует сразу за номерами для записи, которые мы ранее создали и перед правилом набора трехзначных номеров.

[call-out]
;Номер для записи звуков, окончание записи #
exten => _35X, 1, NoOp()
exten => _35X, n, Wait(2)
exten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Wait(1)
exten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Wait(2)
exten => _35X, n, Hangup()
;Управление голосовой почтой
exten => 500,1,VoiceMailMain()
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN},15)
;Звонок на внешний номер
exten => _XXX.,1,Dial(SIP/${EXTEN}@397945)

Добавленные данные выделил цветом. Обращаю внимание на цифру 15. Ранее этой настройки не было, сейчас я добавил. Она будет означать, что звонок будет длиться 15 секунд. Если за это время никто не ответит, он будет сброшен. До использования голосовой почты, можно было не устанавливать этот параметр, оставить его значение по-умолчанию, оно очень большое, не помню точно сколько по времени. Но сейчас нам нужно при неснятии трубки дольше 15-ти секунд, включать запись голосового сообщения.

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

Пока мы просто добавили номер, куда можно позвонить для управления голосовой почтой. Теперь добавим непосредственно возможность записи голосовых сообщений по событиям. Остановимся на этом пункте поподробнее. Для начала уясним, в каких состояниях может пребывать номер:

  1. Номера вообще не существует на сервере. В нашем случае, к примеру, это любой номер не из диапазона 100-130.
  2. Номер существует, но он не зарегистрирован на АТС, то есть аппарат с этим номером не подключен.
  3. Номер существует, зарегистрирован, но при звонке на него никто не отвечает.
  4. Номер существует, зарегистрирован, но в данный момент занят.

Каждое из этих четырех состояний обрабатывается отдельно. Я считаю, что голосовую почту уместно будет включать по событию номер 3. Но это не обязательно, можно и на занято повесить возможность оставить сообщение. Тут на ваше усмотрение. Я покажу пример, как это делается, а вы сможете настроить так, как вам нужно.

Обработка этих событий не такая простая, как кажется на первый взгляд. Я сразу же столкнулся с трудностью следующего характера. С параметром call-limit=1 при звонке на номер, который занят в данный момент, астериск возвращает статус CHANUNAVAIL, что может означать, к примеру, что канал недоступен. На статус занято BUSY это совсем не похоже. Для разрешения этой ситуации я воспользуюсь функцией ChanIsAvail, которая проверяет не статус пира, а статус канала и возвращает значение 2 или 3, когда он занят.

Для различения несуществующих и не подключенных пиров я буду использовать функцию SIPPEER. Если она ничего не возвращает, значит номера не существует, если значение UNKNOWN, значит номер не подключен. С отсутствием ответа какое-то время проще всего. Если пир возвращает статус NOANSWER, включаем голосовую почту. Собираем все статусы в одно место и добавляем голосовую почту. Для этого в контекст [ivr-main] добавляем новые параметры и приводим его к следующему виду:

[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten(5)
exten => _XXX,1,Dial(SIP/${EXTEN},15)
;Задаем переменную для передачи в голосовую почту
exten => _XXX,n,Set(dstNUM=${EXTEN})
;Проверяем статус пира, существует или нет
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
;Проверяем статус пира, подключен или нет
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
;Проверяем канал на занятость
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)
;Выводим в лог значение функции ChanIsAvail, нужно только для отладки, можно удалить строку
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
;Обрабатываем остальные статусы
exten => _XXX,n,Goto(num-${DIALSTATUS},1)
;Если номера не существует говорим "Ошибочный номер, попробуйте еще раз"
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid)
;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
;Если номер занят, говорим "Занято"
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
;Если номер не отвечает, включаем голосовую почту
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
exten => t,1,Dial(SIP/100,15)

Если вам нужна обработка статусов номеров для внутренних звонков, то скопируйте обработку состояний в контекст [call-out], за исключением последней строки, которая отвечает за звонок секретарю. Полностью контекст внутренних звонков будет выглядеть вот так:

[call-out]
;Номер для записи звуков, окончание записи #
exten => _35X, 1, NoOp()
exten => _35X, n, Wait(2)
exten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Wait(1)
exten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Wait(2)
exten => _35X, n, Hangup()
;Управление голосовой почтой
exten => 500,1,VoiceMailMain()
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN},15)
exten => _XXX,n,Set(dstNUM=${EXTEN})
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
exten => _XXX,n,Goto(num-${DIALSTATUS},1)
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Звонок на внешний номер
exten => _XXX.,1,Dial(SIP/${EXTEN}@397945)
include => handup-sip

Я во всех звонках установил время ожидания ответа 15 секунд. Если вы считаете, что нужно больше, измените этот параметр.

Обращаю ваше внимание, что в контексте голосового меню я не сделал обработку статусов состояния телефона секретаря, хотя это может быть нужно, если у вас будет один секретарь принимать звонки. Ему и голосовая почта может пригодиться. В следующем пункте я расскажу про случай, когда в офисе работают 2 секретаря и обработкой звонков будет заниматься очередь (queue), поэтому статусы в том виде, как они реализованы здесь будут не нужны. Вы можете использовать любую конфигурацию, которая вам подойдет. Например, использовать очередь, но с одним секретарем в ней. Настраивайте по аналогии, я даю базовый функционал. Все возможные случаи разобрать невозможно.

Перечитывайте диалплан и тестируйте конфигурацию. При звонке абоненту и его неответе, звонящий услышит в трубке сообщение о том, что номер не отвечает и предложение оставить голосовую почту. Если звонивший оставит сообщение, то получатель получит это сообщение по email и сможет его прослушать там, либо позвонить на номер 500, ввести свой номер и пароль, заданные в voicemail.conf и послушать сообщение по телефону.

Я сталкивался с ошибкой, когда у пользователя в настройках отключена голосовая почта, но он все равно получал сообщения. У него мигало оповещение на телефонном аппарате. Нужно было оперативно удалить все оставленные сообщения без прослушивания. Как удалить голосовую почту в астериск я написал в отдельной заметке.

На этом настройка голосовой почты окончена. Можно пользоваться, не забывая добавлять новых пользователей в voicemail.conf и перечитывая конфигурацию голосовой почты.

Очереди (queues) входящих звонков

С помощью очередей в астериске можно управлять потоком входящих звонков, перераспределяя их по определенным правилам. В нашей конфигурации asterisk мы настроим очередь (queue) для направления звонка двум секретарям одновременно. Кто первый ответит, тот и будет разговаривать со звонящим. Если один секретарь уже разговаривает, новый звонок поступит к другому. Если оба секретаря будут заняты, звонящий будет слушать мелодию и ожидать, пока кто-нибудь не освободится. Как только один из секретарей освободится, звонящего из очереди направит на освободившийся номер.

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

Открываем файл queues.conf и добавляем в самый конец:

[secretary]
strategy = ringall
member => SIP/100
member => SIP/130

Все остальные настройки оставляю по-умолчанию. Параметр strategy может принимать следующие значения:

ringall вызываются все доступные участники до тех пор, пока кто-то из них не ответит на вызов (по умолчанию).
leastrecent Вызывается первый свободный участник, который меньше всего вызывался из этой очереди.
fewestcalls Вызывается первый свободный участник, который обработал наименьшее количество вызовов из данной очереди.
random случайным образом вызывается не занятый участник, обрабатывающий очередь.
rrmemory циклическое распределение с памятью, запоминается последний участник, ответивший на вызов.

Вы можете выбрать наиболее подходящую вам стратегию распределения звонков в очереди. Дальше нужно добавить в extensions.conf в созданный нами ранее контекст с голосовым меню отправку звонка в очередь с секретарями. Для этого меняем строку в [ivr-main]:

exten => t,1,Dial(SIP/100,15)

на новую:

exten => t,1,Queue(secretary,t)

Если раньше при звонке на внешний номер, звонящий не набирал внутренний номер абонента, то через 5 секунд он перенаправлялся к секретарю с номером 100. Теперь он будет отправляться в очередь secretary, в которую мы завели 2 номера - 100 и 130. Можно добавить и больше номеров, если есть необходимость.

Перечитываем полностью конфигурацию asterisk:

CLI> reload

Состояние созданной очереди:

CLI> queue show secretary
secretary has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
Members:
SIP/100 (ringinuse enabled) (Not in use) has taken no calls yet
SIP/130 (ringinuse enabled) (Not in use) has taken no calls yet
No Callers

Теперь можете позвонить на внешний номер и дождаться перенаправления на секретаря. Зазвонят оба аппарата. Если оба заняты, звонок будет висеть в очереди и ждать освобождения. После звонка статистика очереди изменится:

CLI> queue show secretary
secretary has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 2s talktime), W:0, C:1, A:1, SL:0.0% within 0s
Members:
SIP/100 (ringinuse enabled) (Not in use) has taken 1 calls (last was 63 secs ago)
SIP/130 (ringinuse enabled) (Not in use) has taken no calls yet
No Callers

Вот так легко организовать простую queue (очередь) в asterisk. Более сложные примеры я буду рассматривать в отдельных статьях.

Учет и просмотр статистики звонков (cdr viewer)

Важной и нужной возможностью современной АТС на базе asterisk является сбор и просмотр статистики звонков. По умолчанию, астериск ведет статистику в файле /var/log/asterisk/cdr-csv/Master.csv. Разобрать этот файл и передать куда-то в обработку не очень сложно, если у вас есть что-то или кто-то, кто способен написать на каком-нибудь языке программирования обработку.

Мы будем использовать готовые бесплатные инструменты для просмотра статистики звонков. Все необходимое для этого мы установили в самом начале. Перенесем сбор статистики в mysql базу. Для этого запускаем mariadb сервер, добавляем в автозагрузку и устанавливаем пароль администратора:

# systemctl start mariadb
# systemctl enable mariadb.service
# /usr/bin/mysql_secure_installation

Подключаемся к mysql и создаем пользователя и базу данных:

# mysql -uroot -p
MariaDB [(none)]> create database asterisk;
MariaDB [(none)]> use asterisk;
MariaDB [asterisk]> CREATE TABLE `cdr` (   `id` int(9) unsigned NOT NULL auto_increment,   `calldate` datetime NOT NULL default '0000-00-00 00:00:00',   `clid` varchar(80) NOT NULL default '',   `src` varchar(80) NOT NULL default '',   `dst` varchar(80) NOT NULL default '',   `dcontext` varchar(80) NOT NULL default '',   `channel` varchar(80) NOT NULL default '',   `dstchannel` varchar(80) NOT NULL default '',   `lastapp` varchar(80) NOT NULL default '',   `lastdata` varchar(80) NOT NULL default '',   `duration` int(11) NOT NULL default '0',   `billsec` int(11) NOT NULL default '0',   `disposition` varchar(45) NOT NULL default '',   `amaflags` int(11) NOT NULL default '0',   `accountcode` varchar(20) NOT NULL default '',   `uniqueid` varchar(32) NOT NULL default '',   `userfield` varchar(255) NOT NULL default '',   PRIMARY KEY  (`id`),   KEY `calldate` (`calldate`),   KEY `accountcode` (`accountcode`),   KEY `uniqueid` (`uniqueid`),   KEY `dst` (`dst`),   KEY `src` (`src`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
MariaDB [asterisk]> grant all on asterisk.* to 'asterisk_user'@'localhost' identified by '12345678';
asterisk имя базы данных
asterisk_user пользователь базы данных
12345678 пароль пользователя бд

Теперь нам надо установить odbc коннектор для mysql - mysql-connector-odbc. С этим в Centos 8 есть некоторые трудности, так как нужных пакетов нет в базовых репозиториях. Я в итоге его взял из официальной репы mysql. Для этого скачиваем и подключаем их репозиторий.

# wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
# dnf localinstall mysql80-community-release-el8-1.noarch.rpm
# dnf makecache

Тут я получил ошибку:

Failed to download metadata for repo 'mysql-tools-community'
Error: Failed to download metadata for repo 'mysql-tools-community'

Не стал разбираться, почему этот репозиторий недоступен, так как он мне не нужен. Просто зашел в /etc/yum.repos.d/mysql-community.repo и закомментировал строки с этим репозиторием.

#[mysql-tools-community]
#name=MySQL Tools Community
#baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/8/$basearch/
#enabled=1
#gpgcheck=1
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

После этого благополучно обновил кэш пакетов и установил mysql-connector-odbc на centos 8.

# dnf install mysql-connector-odbc

Теперь редактируем файлы конфигурации. Добавляем в самый конец /etc/asterisk/res_odbc.conf:

[asterisk]
enabled => yes
dsn => MySQL-asterisk
username => asterisk_user
password => 12345678

В конец файла /etc/asterisk/cdr_adaptive_odbc.conf:

[cdr_adaptive_connection]
connection=asterisk
table=cdr
alias start => calldate

Создаем файл /etc/odbc.ini следующего содержания:

[MySQL-asterisk]
Description = MySQL Asterisk database
Driver = MySQL
Server = localhost
User = asterisk_user
Password = 12345678
Socket = /var/lib/mysql/mysql.sock
Database = asterisk

Редактируем файл /etc/odbcinst.ini. Я его не трогал, оставил по-умолчанию, только в самый конец секции [MySQL] добавил две недостающие строки. Я не разбирался нужны они или нет, просто подсмотрел в другой инструкции. Вот как этот файл выглядит у меня:

[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc8.so
Setup = /usr/lib/libodbcmyS.so
Driver64 = /usr/lib64/libmyodbc8a.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1
CPTimeout =
CPReuse =

В последнем конфиге проверьте все пути. Имена файлов могут немного отличаться в зависимости от установленной версии коннектора. Актуализируйте пути и имена файлов. После этого проверьте работу odbc connector. Для этого запустите в консоли команду:

# odbcinst -q -d

Вы должны увидеть список всех настроенных коннекторов, в том числе [Mysql]. Настроим использование нашего часового пояса в записях cdr. По-умолчанию там стоит часовой пояс GTM. Для этого в файле /etc/asterisk/cdr.conf указываем параметр:

usegmtime=no

После этого перезапускаем астериск:

# systemctl restart asterisk

Заходим в консоль и проверяем подключение по odbc.

> odbc show all

Настройка odbc в asterisk

Совершаем звонок и проверяем таблицу mysql. У меня добавилась информация о звонке с номера 100 на 101, когда он был не подключен. Если сделать экспорт, то получится вот такая запись:

INSERT INTO `cdr` (`id`, `calldate`, `clid`, `src`, `dst`, `dcontext`, `channel`, `dstchannel`, `lastapp`, `lastdata`, `duration`, `billsec`, `disposition`, `amaflags`, `accountcode`, `uniqueid`, `userfield`) VALUES
(1, '2020-02-27 19:08:17', '\"Number 100\" <100>', '100', 'num-not-connected', 'call-out', 'SIP/100-0000000e', '', 'Dial', 'SIP/101,15', 6, 4, 'ANSWERED', 3, '', '1582819697.14', '');

Для удобства дальнейшей работы, я настроил web сервер на базе apache. Не буду на этом подробно останавливаться. Чтобы двигаться дальше нам нужен классический web сервер на базе php. Для удобства рекомендую сразу настроить phpmyadmin или любой другой клиент к mysql. Если привыкли работать с mysql через консоль, можете обойтись без него.

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

Запись (record) разговоров

Запись разговоров в asterisk настраивается относительно не сложно. Буквально нужно добавить несколько строк в dialplan. Но мы сразу сделаем более расширенную настройку. Мы будем не просто записывать все разговоры, но станем хранить информацию о звонках в mysql, чтобы их можно было прослушивать через удобную web панель просмотра статистики.

Хранить записи будем в mp3, потому нам понадобится утилита lame, для конвертации файлов из формата wav в mp3. Скачаем ее и установим.

# cd ~
# wget http://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz
# tar zxvf lame-3.*
# cd lame-3.*
# ./configure
# make && make install

В качестве web панели я буду использовать Asterisk-CDR-Viewer-Mod. Очень простая и функциональная штука. Настраивается легко, пользоваться удобно. Скачиваем исходники с github:

# cd ~
# git clone https://github.com/prog-it/Asterisk-CDR-Viewer-Mod

Копируем содержимое репозитория в директорию cdr web сервера.

# mkdir /var/www/html/cdr
# cp -R ~/Asterisk-CDR-Viewer-Mod/* /var/www/html/cdr
# chown -R apache. /var/www/html/cdr

В папке docs подробная инструкция по настройке. Все дальнейшие действия делаются в соответствии с ней. Исправляются только некоторые особенности данной версии системы. Нам необходимо добавить дополнительное поле в таблицу cdr для хранения имени файла. Для этого либо в консоли mysql, либо через phpmyadmin выполните код:

alter table  `cdr` add column `filename` varchar(120) DEFAULT 'none' after `userfield`;

Редактируем файл /etc/asterisk/cdr_mysql.conf, добавляя в самый конец 2 строки:

alias realdst => realdst
alias filename => filename

Дальше редактируем диалплан. Открываем /etc/asterisk/extensions.conf и добавляем в секцию globals переменную, соответствующую папке, где будут храниться записи разговоров.

[globals]
DIR_RECORDS=/mnt/calls/

Добавляем макрос для записи перед контекстами звонков:

[recording]
exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2})
exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3")
exten => s,n,Set(CDR(filename)=${fname}.mp3)
exten => s,n,Set(CDR(realdst)=${ARG2})
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt})
exten => s,n(no),Verbose(Exit record)
exten => s,n,Return()

И редактируем контексты входящих и исходящих разговоров, добавляя туда макрос на запись. Он идет самым первым, перед набором номера. Вот так у меня выглядит контекст локальных звонков и входящих через ivr меню с учетом всех сделанных ранее настроек:

[call-out]
;Номер для записи звуков, окончание записи #
exten => _35X, 1, NoOp()
exten => _35X, n, Wait(2)
exten => _35X, n, Playback(beep)
exten => _35X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _35X, n, Wait(1)
exten => _35X, n, Playback(/tmp/music${EXTEN:2})
exten => _35X, n, Wait(2)
exten => _35X, n, Hangup()
;Управление голосовой почтой
exten => 500,1,VoiceMailMain()
;Звонок на внутренний номер
exten => _XXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXX,n,Dial(SIP/${EXTEN},10)
exten => _XXX,n,Set(dstNUM=${EXTEN})
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
exten => _XXX,n,Goto(num-${DIALSTATUS},1)
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Звонок на внешний номер
exten => _XXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXX.,n,Dial(SIP/${EXTEN}@397945)
include => handup-sip

[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten(5)
exten => _XXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXX,n,Dial(SIP/${EXTEN},10)
exten => _XXX,n,Set(dstNUM=${EXTEN})
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)
exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
exten => _XXX,n,Goto(num-${DIALSTATUS},1)
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => t,n,Queue(secretary,t)

Создаем директорию для записи разговор и назначаем ей права.

# mkdir /mnt/calls
# chown -R asterisk. /mnt/calls

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

# systemctl restart asterisk

Осталось только указать настройки подключения к базе данных cdr viewer. Эти настройки находятся в файле inc/config.php. Для начала создадим его.

# cp /var/www/html/cdr/inc/config/config.php.sample /var/www/html/cdr/inc/config/config.php

Задаем там следующие параметры:

Mysql
$db_type = 'mysql';
$db_host = 'localhost';
$db_port = '3306';
$db_user = 'asterisk_user';
$db_pass = '12345678';
$db_name = 'asterisk';
$db_table_name = 'cdr';

$system_storage_format = 5;
$system_monitor_dir = '/mnt/calls';

Остальные параметры я оставил без изменений. Можно звонить и тестировать запись разговоров, просмотр статистики через Asterisk CDR Viewer Mod. Все записанные файлы складываются в одну папку /mnt/calls. В readme.txt описан пример, как настроить сортировку записей по папкам с датами. Если вам это нужно, сделайте, ничего сложного нет, все рассказано подробно. В web панель можно зайти просто набрав в браузере http://ip/cdr/.

Просмотр статистики и записей звонков

Музыка на ожидании (on hold)

Вы можете назначить любую мелодию для проигрывания во время нахождения звонка в очереди.  Можете крутить мелодию вместо длинных гудков во время вызова, хотя считаю это лишним. Уместней всего мелодию пускать, как я уже сказал, во время ожидания в очереди и во время удержания звонка по какой-то причине. По-умолчанию в эти моменты проигрывается дефолтная мелодия.

За конфигурацию music on hold отвечает соответствующий файл настроек - /etc/asterisk/musiconhold.conf. Изначально он выглядит так:

[general]
[default]
mode=files
directory=moh

Директория указана как moh, полный ее путь /var/lib/asterisk/moh, мелодии проигрываются отсюда. Я не буду менять настройки по-умолчанию. Добавим еще один класс музыки и укажем его в свойствах очереди, где будем ее проигрывать.

Я привожу пример использования. Если у вас везде будет одна и та же мелодия, то отредактируйте канал default. Так вам не придется каждый раз указывать добавленный канал.

Копируем любым способом mp3 файл на сервер в домашнюю директорию root. Создаем директорию /var/lib/asterisk/mohmp3 и кодируем в нее мелодию из mp3 в wav:

# mkdir  /var/lib/asterisk/mohmp3
# lame --decode /root/music.mp3 /var/lib/asterisk/mohmp3/music.wav

Добавляем новый класс в musiconhold.conf в самый конец:

[mp3]
mode=files
directory=mohmp3

Теперь добавим эту мелодию в свойства очереди. Для этого в описание очереди добавьте новый параметр:

[secretary]
music = mp3
strategy = ringall
member => SIP/100
member => SIP/130

Теперь нужно перечитать настройки очереди и мелодии. Проще перезапустить сам астериск:

# systemctl restart asterisk

Можно звонить на внешний номер и ждать попадания в очередь. Вы должны услышать добавленную мелодию во время ожидания.

Чтобы добавить эту мелодию вместо длинного гудка, необходимо отредактировать dialplan, добавив новый параметр в правило набора. Если добавляете свой класс музыки, то указываете его в свойствах:

exten => _XXX,1,Dial(SIP/${EXTEN},15,m(mp3))

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

exten => _XXX,1,Dial(SIP/${EXTEN},15,m)

Для отладки музыки на ожидании, я рекомендую добавить в dialplan в контекст локальных звонков такую конструкцию:

exten => 336,1,Answer
exten => 336,2,MusicOnHold()

336 - любой не занятый реальным пиром номер. При звонке на этот номер, вы услышите заданную дефолтную мелодию в соответствии с настройками в файле musiconhold.conf. Для проигрывания не дефолтного класса, укажите его имя в скобках. Так вы можете прослушать как звучат ваши мелодии, протестировать порядок проигрывания и т.д.

Не забывайте перезагружать диалплан после редактирования. На этом настройка music on hold закончена. Можете добавлять разные мелодии и использовать в необходимых местах диалплана или очередях.

Настройка конференций

Полезным и востребованным функционалом офисной телефонной станции является создание конференций для одновременного разговора нескольких человек. В asterisk конференция настраивается следующим образом. В специальном файле конфигурации задаются параметры комнаты для конференций. В диалплане назначается отдельный номер для комнаты с конференцией.

Создаем конфигурацию конференции. Для этого в файл confbridge.conf добавляем в самый конец:

[confer]
type=bridge
max_members=20
mixing_interval=10
internal_sample_rate=auto
record_conference=yes

В контекст исходящих звонков [call-out] добавляем в самое начало:

exten => 999,1,Answer()
exten => 999,n,ConfBridge(1,confer)

Перезапускаем астериск. Теперь при звонке на номер 999 человек попадает в комнату для конференций. Следующим участникам конференции необходимо будет так же позвонить на номер 999 для участия в совместной конференции. Если вы с кем-то уже разговариваете, хотите создать конференцию и добавить туда еще участников, то необходимо вашего собеседника переадресовать на номер конференции, затем позвонить новому абоненту и его направить туда же. После этого звоните сами на номер конференции и сможете общаться с тремя абонентами одновременно.

Как выполнять переводы и переадресации звонков я расскажу ниже.

Перевод, перехват, переадресация звонка

Рассмотрим несколько необходимых функций и возможностей телефонной станции asterisk. Начнем с перевода звонка. Как перевести звонок на другого абонента? По-умолчанию в астериске для трансфера звонка предусмотрена клавиша #. Посмотреть, так ли это в вашей конфигурации, введите в консоли астера команду:

CLI> features show
Builtin Feature               Default Current
---------------               ------- -------
Pickup                           *8     *8
Blind Transfer                    #      #
Attended Transfer
One Touch Monitor
Disconnect Call                   *      *
Park Call

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

exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)
T дать возможность звонящему (вызывающему) абоненту совершать перевод звонка на другой номер.
t дать возможность вызываемому абоненту сделать перевод звонка на другой номер

В предыдущих примерах я не указывал этот параметр. Сейчас пришло время рассказать о нем и добавить во все участки диалплана, если вам необходимо осуществлять перевод звонков в asterisk.

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

Кнопка перевода звонка

С включенным по-умолчанию Blind Transfer есть проблемы. Например, вы перенаправляете звонок на другой номер, а он не ответил или у него занято. Входящий вызов сбрасывается. В астериске есть другой режим перевода звонка, он называется Attended Transfer, по-умолчанию он выключен. Работает он более изящно. Сначала вы звоните тому, куда хотите перевести номер, разговариваете с ним, убеждаетесь, что он доступен и готов принять звонок. Только после этого переводите звонок на этого абонента. Чтобы включить такое перенаправление вызова, нужно раскомментировать в features.conf строку:

atxfer => *2

Горячую клавишу можно переназначить на любую другую. На этом о переводе звонка в астериске все.

Теперь поговорим о перехвате звонка. Хотя говорить тут особо нечего. В asteerisk перехват работает из коробки и не требует никаких настроек. Для того, чтобы перехватить звонок, нужно снять трубку и нажать комбинацию *8. Комбинация задается в том же файле, что и перехват - features.conf. Перехватывать звонки могут только абоненты в одной группе. Это задается в свойствах пользователя, я об этом рассказывал в самом начале, когда мы создавали sip аккаунты. Напомню, что речь идет о параметрах callgroup и pickupgroup.

Разберем теперь переадресацию звонка на какой-то внешний номер, например, мобильный телефон. Многие телефоны имеют встроенный функционал по перенаправлению звонка. Читаете инструкцию к телефону, смотрите, можно ли на нем установить переадресацию и как, и делаете. Работает это только если ваш телефон подключен к АТС. Он принимает звонок и сам его переадресовывает на указанный номер. Это самый простой и быстрый вариант автоматической переадресации звонка на внешний номер.

Рассмотрим другой случай переадресации на мобильный телефон. Допустим, у нас есть номер 115, который вообще отсутствует в офисе, у него нет стационарного телефона. Нам нужно, чтобы при звонке на этот номер, вызов переадресовывался на внешний номер, а конкретно на мобильный сотрудника. Для этого в dialplan нужно добавить следующую строку:

exten => 115,n,Dial(SIP/89151234567@397945)

Если вы хотите, чтобы переадресация работала только при звонках с внутренних номеров офиса, то добавить эту строку нужно в контекст [call-out] перед общим правилом набора на внутренние номера:

exten => 115,n,Dial(SIP/89151234567@397945)
exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)

Для того, чтобы переадресация на внешний номер работала и для звонков из вне, правило перенаправления на мобильный нужно поставить в контекст с голосовым приветствием [ivr-main]. Ставим туда же, перед строкой набора на внутренние номера:

exten => 115,n,Dial(SIP/89151234567@397945)
exten => _XXX,n,Dial(SIP/${EXTEN},15,Tt)

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

Защита asterisk с помощью fail2ban

Если ваш астериск имеет внешний ip адрес, либо на него сделан проброс портов с внешнего ip, то необходимо обеспечить защиту от перебора учеток и прочих множественных подключений. Организуем защиту с помощью известного и популярного средства fail2ban. Сделать это не сложно, fail2ban поддерживает astersik из коробки. Достаточно просто установить его и активировать некоторые настройки.

Устанавливаем fail2ban на сервер с астериском:

# dnf install fail2ban

Включаем запись в лог файл событий типа security. Для этого открываем файл /etc/asterisk/logger.conf и раскомментируем строку:

security => security

Перечитываем настройки хранения логов:

# asterisk -x "logger reload"

В папке /var/log/asterisk появился новый файл security. Его записи мы будем передавать в fail2ban для анализа. Открываем файл /etc/fail2ban/jail.conf, ищем там секцию [asterisk] и меняем путь к логфайлу и добавляем строку активации джейла:

logpath  = /var/log/asterisk/security
enabled  = true

Запускаем fail2ban и добавляем в автозапуск:

# systemctl start fail2ban
# systemctl enable fail2ban

Чтобы fail2ban работал, у вас должен быть запущен и настроен iptables. Отмечу также, что по-умолчанию fail2ban в centos использует команды firewalld. Если вы его отключили и используете голые iptables, то вам необходимо удалить файл /etc/fail2ban/jail.d/00-firewalld.conf и перезапустить fail2ban. Если этого не сделать, работать он не будет.

На этом подробная и многофункциональная настройка asterisk закончена. Я рассказал все, что запланировал, выделив наиболее востребованные функции.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Время подвести итог проделанной работы. На всякий случай приведу полный конфиг основного файла, с которым мы работали - extensions.conf. Я писал статью почти 2 месяца, что-то добавляя, проверяя, редактируя. Она актуальна полностью на момент написания. Можно простым копипастом переносить конфигурацию и все заработает. Я проверил перед публикацией. Со временем что-то может измениться, но не думаю, что сильно. Синтаксис конфигурационных файлов почти не меняется в разных версиях астера, это позволяет без проблем переносить настройки между версиями, и тем более между операционными системами.

Я планирую раскрыть более широко затронутую тему. У меня есть примеры интересных и полезных конфигураций. По мере возможности буду писать новые статьи по серверу телефонии. На сегодня у меня все, хороших вам настроек  :-)

Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Другие материалы по asterisk:

Онлайн курс по Linux

Если у вас есть желание освоить операционную систему Linux, не имея подходящего опыта, рекомендую познакомиться с онлайн-курсом Administrator Linux. Basic в OTUS. Курс для новичков, адаптирован для тех, кто только начинает изучение Linux. Обучение длится 4 месяца. Что даст вам этот курс:
  • Вы получите навыки администрирования Linux (структура Linux, основные команды, работа с файлами и ПО).
  • Вы рассмотрите следующий стек технологий: Zabbix, Prometheus, TCP/IP, nginx, Apache, MySQL, Bash, Docker, Git, nosql, grfana, ELK.
  • Умение настраивать веб-сервера, базы данных (mysql и nosql) и работа с сетью.
  • Мониторинг и логирование на базе Zabbix, Prometheus, Grafana и ELK.
  • Научитесь командной работе с помощью Git и Docker.
Смотрите подробнее программу по .

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству.

402 комментария

  1. Аватар

    Здравствуйте, я в линухах поный ноль , но очень хочется самому ручками все настроить
    подскажите пожалуйста, в чем может быть проблема, все сделал по вашей инструкции до момента усановки Asterisk-CDR-Viewer-Mod все получалось.
    Тут же проблема в том, что если все делать точно по инструкции , то после настройки, при попытке перехода по http://ваш ip/cdr/.

    браузер ругается

    Not Found
    The requested URL /cdr/ was not found on this server.

    если смотреть по аналогии настройку z.serveradmin.ru ( ваша статья по установке апача и php), то в директорию /etc/httpd/conf.d/ кладется файл конфигурации z.serveradmin.ru.conf
    и апач понимает, где живет z.serveradmin.ru и что с ним надо делать.

    В случае же с установкой Asterisk-CDR-Viewer-Mod
    по инструкции никаких файлов в /etc/httpd/conf.d/ класть не надо
    Но оно не работает в таком случае, либо же настройки лежат где то в другом месте, если да , то где ?

    В общем подскажите куда копать

    • Zerox

      В данном случае в статье подразумевается, что используется дефолтная настройка web сервера, который доступен по ip адресу и отдает исходные файлы из директории /var/www/html/, тогда в случае создания там папки cdr, можно обращаться к ней напрямую через http://ваш ip/cdr/.

      Если вы все делали по статье, то по идее, у вас все должно получиться. Убедитесь, что исходники панели реально лежат в /var/www/html/cdr, а директория /var/www/html/ это корень веб сервера.

      Это азы настройки веб сервера, мне трудно пояснить подробнее. Никакие файлы z.serveradmin.ru.conf вам не нужны и не могут быть примером, так как там речь идет о виртуальных серверах, а тут все это не используется.

      • Аватар

        Да, исходники точно лежат по адресу /var/www/html/cdr
        А еще, у меня по адресу "мойIP" открывается не дефолтная страница , а страница виртуального хоста PhpMyAdmin, который я настроил опять же для asteriska и живет он в директории web/sites/pma.aster.ru/

        в папке /etc/httpd/conf.d соответственно лежит конфиг pma.aster.ru.conf
        больше никаких хостов нет

        Что мне нужно настроить, чтоб он увидел панель ?

      • Аватар

        В итоге создал файл конфигурации в папке /etc/httpd/conf.d следующего содержания
        Alias /cdr/ "/var/www/html/cdr/"

        #
        # AuthName "Asterisk-CDR-Stat"
        # AuthType Basic
        # AuthUserFile /var/www/asterisk-cdr-viewer/.htpasswd
        # AuthGroupFile /dev/null
        # require valid-user
        #

        - заработало
        авторизацию правда не настраивал еще, но уже радует))

  2. Аватар

    Спасибо за статью, по данному описанию собрал рабочую сеть внутри сети.
    Но дело дошло до zadrama и пошли тормоза.
    Выходит ошибка: WARNING[1542]: chan_sip.c:16217 transmit_register: Probably a DNS error for registration to 843987@sip.zadarma.com, trying REGISTER again (after 20 seconds)
    Сделал telnet, проверил открыт у меня порт или нет, порт открыть. попытался ввести
    sip.zadarma.com ввиде IP адреса, тоже не выходит.
    nc -vnzu 185.45.152.174 5060 все работает, но эта ошибка не уходит.

    Связался с техподдержкой, там меня попросили сменить внешний порт на TCP 5065.....
    Тут пошли еще больше проблемы....где его сменить....меняю в sip.conf но он не меняется...
    sip show peers показывает что используется 5060 порт.

    Как решить эту проблему?

    • Zerox

      Провайдер не может блокировать sip трафик? Я много раз с подобным сталкивался.

      • Аватар

        а это каким образом проверить можно?

      • Аватар

        Дело в том что порт открыт, я проверял.

        Неужели они трафик режут?

        • Zerox

          Да, могут мешать именно нормальному хождению трафика. Порт при этом будет открыт. Я с таким сталкивался, приходилось по vpn подключаться sip телефонию. Провайдер просто продавал сам услуги voip, поэтому другим не давал пользоваться чем-то со стороны. Проверить легко - попробуйте подключиться к какому-то другому voip провайдеру. Например, через софтовый клиент на своем компьютере.

  3. Аватар

    Спасибо за статью - реально помогла решить проблему: сервер телефонии - за NAT (сеть офиса) на входе - программный шлюз, телефон в другой локальной сети (офис2) - , тоже за NAT (шлюз на pfsense)! Между сетями поднят OPENVPN - клиенты друг друга видят, все прекрасно. Внешний офис не единственный (уже был ранее настроен доступ из туннеля "офис3 - офис1", но.. В механизм не сработал... Телефон на сервере регистрируется, SIP (5060) проходит из одной локальной сети в другую через канал замечательно, а RTP от сервера идет напрямую через туннель в офис2, а обратно - сигнал хоть тресни отправляется на внешний адрес, указанный в настройках телефонии Х.Х.Х.Х Как итог: в офисе2 звук слышен, от сервера (офис1) приходит, а в офисе1 - в трубке полная тишина...
    И ведь было написано правило прероутинга... Все отличие, что вместо --dst X.X.X.X. стояло -i ensYY - WAN и порты прописаны все одним правилом как -m multiport --dport 5060,10000:20000 НЕ РАБОТАЛО! стоило переписать правила - голос пошел в обе стороны!

    • Zerox

      Круто, что это помогло. Я бы так сходу и не догадался поменять правила. Не очевидно, что ваше не будет работать.

      • Аватар
        nkudrich@gmail.com

        Вот и мне было не очевидно целых две недели))). До правила по SIP, TCPDUMP показывал прохождение пакетов чисто между локальными интерфейсами: офис2_lan:5060 - офис1_lan: 5060. Rtp было асинхронным. Теперь все идёт так: офис2_lan - офис1_wan. (5060, и rtp). И все работает.

  4. Аватар

    Здравствуйте! Изучаю по Вашей инструкции asterisk, за что огромное спасибо! У меня возник вопрос: я записываю(через Record()) сообщения, которое оставляет клиент (тот, кто позвонил нам) и хочу распознать через google cloud stt записанный файл формата wav, но столкнулся с проблемой плохого качества записи (8000 Hz, 1 channels, s16, 128 kb/s) и последующих проблем с распознаванием. Попытался записать в формате mp3, но астер мне сказал, что он умеет только "читать" mp3, но не записывать. Можно ли как то улучшить качество записываемого файла? Или записывать не через Record, а что-нибудь другое, которое записывает в лучшем качестве. Спасибо.

    • Zerox

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

    • Аватар

      Да сейчас столо проще держать переговоры в текстовых файлах!
      Залейте на ютуб и проверьте там распознаваемость.

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

      ;exten => s,n,system(curl -X POST "https://api.telegram.org/bot0000000000:hkjhUIYIUHJK_hkjhUIYIUHJK_gCrOfBU/SendMessage" -d "chat_id=98789798&text=(С Номера: ${DIAL_ID}} дата: ${STRFTIME(${EPOCH},,%d.%m.%Y)} время)
      ;exten => s,n,system(curl -X POST "https://api.telegram.org/bot0000000000:hkjhUIYIUHJK_hkjhUIYIUHJK_gCrOfBU/SendAudio" -F "chat_id=98789798" -F "audio=@/home/record/${fname}" --insecure)

  5. Аватар

    Я не пойму, нужно или нет загружать в mysql /var/www/html/cdr/docs/mysql_cdr.sql?
    Я дошел до "В папке docs подробная инструкция по настройке. Все дальнейшие действия делаются в соответствии с ней." и не пойму, что делать дальше?
    Вроде по данной статье , мы создали таблицу cdr и колонки.

  6. Аватар
    Аноним

    Здравствуйте,
    При звонке с alcatel на asterisk (v16 + freepbx v15), на экране телефона alcatel отображается "SIP", а при поднятии трубку на asteriske, на телефоне alcatel отображется "вызываемый номер" и "SIP". Скажите пожалуйста, в чем может проблема.

    • Zerox

      Сам alcatel куда подключен? К этому же asterisk? Вообще, за информацию на дисплее аппаратов отвечает CALLERID. Надо копать в эту сторону.

      • Аватар
        Аноним

        Да, asterisk подключен к alcatel по sip транку

      • Аватар

        Zerox, здравствуйте,

        Спасибо большое за подсказку, нашли решение.

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

  7. Аватар
    Василий

    Добрый день. Установил астериск 13 и при перезагрузке диалплана не вижу ошибок. всегда пишет pbx_config successfully loaded 33 contexts. Причем я намеренно сделал синтаксическую ошибку, чтобы увидеть в консоле как он про нее пишет. С астром 11 такого не было. Что нужно включить, чтобы он выводил в консоле ошибки в диалпланах?

  8. Аватар

    Здравствуйте.
    Вроде нашёл небольшой недочёт в инструкции.
    Нужно добавить каталог "run" в команду chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool,run}/asterisk /usr/lib64/asterisk
    В 17ой версии Asterisk на CentOS8 после этого проблем нету, стартует без ошибок.
    Спасибо.

    • Аватар

      В инструкции всё хорошо, просто я не отключал SELinux.
      Для тех кому интересно как его настроить, ниже напишу команды.
      Не знаю на счёт "правильности", зато работает.
      semanage fcontext -a -t asterisk_var_run_t '/var/{lib,log,spool,run}/asterisk(/.*)?'
      restorecon -Rv '/var/{lib,log,spool,run}/asterisk'

      • Аватар

        При старте сервиса вот это сообщение "asterisk.service: Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory" никуда не делось, просто asterisk работает и так.

  9. Svetлая

    Здравствуйте Zerox.

    Наблюдаю "интересную" ситуацию с подменой статуса внутреннего номера после звонка. Не могу понять что не правильно.

    Как уже писала, по Вашей статье всё работает. На просторах нашла вкл/выкл безусловной переадресации с использованием актБД. Использовать по назначению не интересно. Интересно интегрировать в Ваш код таким образом, что бы отрабатывалась переадресация по определенным правилам, например если не снимают трубку. В остальных случаях вступают другие правила.

    После обработки этой строки:
    exten => _XXX,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?redirect)
    сигнал BUSY, NOANSWER меняется на CHANUNAVAIL. И как следствие, ситуационное ветвление не отрабатывается.
    Возможно и другие сигналы тоже меняются на CHANUNAVAIL, не проверяла.

    Подскажите пожалуйста что не правильно.
    Спасибо.

    Привожу код диалплана:

    [call-out]
    ; Установить с телефона переадресацию *21
    exten => *21,1,Playback(hello)
    same => n,Playback(vm-enter-num-to-call)
    same => n,Read(cfwd)
    same => n,Playback(beep)
    same => n,Set(DB(REDIRECT/${CALLERID(num)})=${cfwd})
    same => n,Set(DB(REDIRTIMER/TIMER)=5)
    same => n,Playback(you-entered)
    same => n,SayDigits(${DB(REDIRECT/${CALLERID(num))}})
    same => n,Playback(enabled)

    ; Отменить переадресацию с телефона *22
    exten => *22,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})=${cfwd}})
    ;exten => *22,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})})
    same => n,Playback(disabled)

    ;Звонок на внутренний номер
    exten => _XXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
    exten => _XXX,n,Dial(SIP/${EXTEN},5,m,Tt)
    exten => _XXX,n,Set(dstNUM=${EXTEN})
    exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
    exten => _XXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
    exten => _XXX,n,ChanIsAvail(SIP/${EXTEN},s)
    exten => _XXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
    ; Если установлена переадресация *21
    exten => _XXX,n,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})})
    exten => _XXX,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?redirect)
    exten => _XXX,n(redirect),Dial(SIP/12345678/${REDIRECTNUM})
    ;end
    exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
    exten => _XXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
    exten => _XXX,n,Goto(num-${DIALSTATUS},1)

    ; Номер не существует
    exten => num-not-exist,1,Playback(vm-dialout) ;пожалуйста подождите происходит соединение
    exten => num-not-exist,n,Wait(1)
    exten => num-not-exist,n,Queue(secretary,t)
    exten => num-not-connected,1,Wait(2)
    ; номер отключен
    exten => num-not-connected,n,Playback(vm-nobodyavail) ;в данный момент никто не может принять Ваш звонок
    exten => num-not-connected,n,Wait(2)
    exten => num-not-connected,n,Voicemail(${dstNUM},u)
    exten => num-BUSY,1,Wait(2)
    exten => num-BUSY,n,Playback(telephone-number) ;телефонный номер
    exten => num-BUSY,n,Playback(vm-isonphone) ;занят
    exten => num-BUSY,n,Playback(pls-try-call-later) ;попробуйте позвонить познее
    exten => num-BUSY,n,Wait(1)
    exten => num-NOANSWER,1,Voicemail(${dstNUM},u)
    exten => num-CHANUNAVAIL,1,Wait(2)
    exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)

    ;Звонок на внешний номер
    exten => _XXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
    exten => _XXX.,n,Dial(SIP/${EXTEN}@12345678)

    include => handup-sip

    • Svetлая

      Я так понимаю решения нет?

      • Zerox

        Наверняка есть, но у меня нет возможности в этом разбираться и решать вопрос.

        • Svetлая

          Да, есть, спасибо, нашла ответ в Вашей статье "Оповещение о занятости второй линии в asterisk". Увеличила кол-во линий на 2 и всё заработало). Вы в ней как раз про этот нюанс рассказываете.
          Ещё раз Спасибо за Ваш труд!

  10. Аватар

    Исправление: Добрый день, как я могу с уважением поменять язык на испанский или английский с ASTCDR?

    • Zerox

      Не очень понял, о каком языке идет речь? В web панели со статистикой звонков?

      • Аватар

        Да, веб-панель «Asterisk CDR Viewer Mod».
        Я из Латинской Америки, все устанавливаю хорошо, но панель на русском.
        Как я могу изменить его на испанский? Спасибо.

        • Zerox

          Эта панель русскоязычная. У нее нет перевода на другие языки. Так что только вручную переводить. Тут не так много текста, не трудно сделать самому.

          • Аватар

            Спасибо за ваш вклад, я надеюсь, вы настроите биллинг A2 со звездочкой 16 и freepbx. Ура!

  11. Аватар

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

  12. Svetлая

    Здравствуйте Zerox.
    Еще раз огромное спасибо за развёрнутую статью по настройке с нуля!

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

    Спасибо.

    • Zerox

      Для удаленных подключений каких-то особенных настроек делать не надо. Если в свойствах пиров не настроены ограничения по ip для подключения, то они будут разрешены всем. Дальше вам нужно будет пробросить порт 5060 на свой asterisk.

      • Svetлая

        Спасибо!
        Ещё вопрос, Лет семь назад пробовала ip телефонию на аппаратном уровне, станции поддерживала. Кол-во запросов от "халявщиков" забивали интернет.

        Как обстоит дело с безопасностью у астериска сейчас? Перенос порта? Эхо запрос от порта имеет режимы вещания? Можно ли его включить так, что бы сканеры не определяли его как voip?

        Спасибо!

        • Zerox

          В общем случае с безопасностью проблем нет. Я не делаю ничего особенного, кроме настройки fal2ban. Астериски смотрят напрямую в интернет. Единственное, на всякий случай не раздаю удаленный доступ к пирам без необходимости. Если удаленно никто не подключается, то регистрация пиров ограничивается списком локальных ip адресов.

          • Svetлая

            Т.е. имеет смысл привязать все локальные телефоны по ip что бы сократить вероятность подбора?
            Или достаточно указать nat=no? У меня астериск с одним ethernet портом.

            Спасибо.

  13. Аватар

    Здравствуйте помогите пожалуйста.
    Создал Веб-интерфейс через Asterisk-CDR-Viewer-Mod. Все работает кроме записи, не могу прослушать. Стоит типа нет доступа( что делать?
    У Вас есть группа в телеграмме?

    • Zerox

      Кто и где говорит, что нет доступа? Записи реально создаются в папке?

      • Аватар

        Да создается запись. Не могу прослушать.

      • Аватар

        В столб се где запись стоит знак круглый внутри черточка, типа не возможно прослушать. Мне нужно прослушать запись и скачать. как могу это сделать?

        • Svetлая

          Dastan, попробуйте скачать с сервера саму запись и прослушать. У меня в некоторых ситуациях создаются файлы которые не проигрываются физически, эти файлы не отображаются в вебе. (игралась с настройками. Если всё сделано по статье Zerox- работает всё как надо).

          Скачать можно программой WinSCP.

  14. Svetлая

    Спасибо за подробный материал!

    Музыка на ожидании (on hold), нет примера для установки lame. Мелочь, но ... не приятно

    cd ~
    wget http://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz
    tar -xvfz lame-*
    cd lame-3.100
    ./configure –-prefix=/usr/
    make && make install

  15. Аватар
    Шильке Александр

    Большая работа. Спасибо.

  16. Аватар

    Как сделать две очереди? у меня есть два городских номера, в queues.conf прописываю так
    [general]
    persistentmembers=yes
    [queue_callcenter]
    music=default
    strategy=ringall
    ringinuse=yes
    wrapuptime=1
    servicelevel=60
    announce-frequency=60
    announce-holdtime=yes
    reportholdtime=yes
    setqueueentryvar=yes
    member => SIP/101
    member => SIP/102
    member => SIP/106
    [queue_callcenter1]
    music=default
    strategy=ringall
    ringinuse=yes
    wrapuptime=1
    servicelevel=60
    announce-frequency=60
    announce-holdtime=yes
    reportholdtime=yes
    setqueueentryvar=yes
    member => SIP/103
    member => SIP/104
    member => SIP/105
    Когда захожу в asterisk -r и пишу queue show queue_callcenter1 и queue show queue_callcenter
    показывает что есть две очереди, но когда звоню с двух этих городских номеров попадают в одну и туже очередь а именно в [queue_callcenter1], как можно из разделить?

  17. Аватар

    Почему нету кнопки воспроизведения записи в web cdr в папке запись есть, а на сайте нету пути все прописал сделал тупо все как на вашем сайте у вас на скрине видно что можно воспроизвести запись у меня нет. Не могу понять в чем дело подскажите пожалуйста.

    • Zerox

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

      • Аватар

        У меня та же проблема. Запись хранится в mnt/calls
        но на WEB CDR не могу прослушать.
        в настройках var/www/html/cdr/inc/config есть два файла php и php.sample там в (monitor_dir==> прописал mnt/calls) что я еще не правильно сделал ?

        • Zerox

          Может у вас браузер флеш блокирует? Не знаю как сейчас, но раньше там для прослушивания записей использовался flash, который сейчас все браузеры по-умолчанию блокируют.

  18. Аватар

    Когда оператор начинает разговор выходит следующая ошибка Can't send 10 type frames with SIP write, это никак не мешает работе, но получается, что засераются логи, как можно избавиться от данного сообщения версия астера 16

  19. Аватар

    Пишу asterisk -r потом core reload все прекрасно работает, потом куда-нибудь ухожу, приходу через 3 часа пробую позвонить на номер ничего не работает, опять пишу core reload звоню все норм, в чем может быть проблема?

  20. Аватар

    Подскажите пожалуйста. Где копать? почему не записываются разговоры с транка на cdr . Я уже наверно перепробовал все варианты sip.conf и в диалплане. Просто может я не там вообще копаю. транк зарегистрирован как подключенного пользователя астериск видит, но запись не записывается...

    • Zerox

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

      • Аватар

        Так запись идет, но только внутри сети, а по транку от ростелеком записи нету, а понять в чем проблема вообще не могу.
        exten => _XXX.,n,Dial(SIP/${EXTEN}@397945) 397945 - это то что я пишу в sip.conf в fromdomain и host ?

        • Zerox

          Должно быть так:
          exten => _XXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
          exten => _XXX.,n,Dial(SIP/${EXTEN}@397945)
          У меня же в примере показано.

          • Аватар

            exten => _XXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
            exten => _XXX.,n,Dial(SIP/${EXTEN}@397945)
            так у меня то не 397945 поэтому и спрашиваю сюда пишется то что квадратных скобках [397945] или то что я прописываю в fromdomain

            в диал план они вообще предлагают написать так
            exten ? admin,1,Dial(SIP/78461,12,t)
            exten ? admin,n,Dial(SIP/78462,12,t)
            exten ? admin,n,Dial(SIP/78463,12,t)
            exten ? admin,n,Hangup()
            что ставить вместо знаков вопроса тоже не понятно... хотя на сколько я понимаю => я просто пробывал и так и так один фиг запись именно с транка не идет, может вы хотя бы скажите какие строчки отвечают за запись именно разговоров, а то как на стройки не меняй в диал плане и sip.conf один фиг транк работает, а запись нет.

  21. Аватар

    Добрый день! Сделал все как у вас в статье, но почему-то в CDR не записываются разговоры с транка от ростелеком, получается звоню внутри сети к примеру с 101 на 102 все норм, но когда звоню с транка( извините может не правильно выражаюсь) запись не идет, хотя астериск видит подключенного пользователя. Получается что когда набираю sip show registry все норм, в пользователях тоже все норм

    • Аватар

      на сколько я понимаю в cdr идут все записи которые находятся в паке mnt/calls, но почему то звонки по транку туда не записываются, я вот не могу понять как заставить астериск записывать разговоры по транку

    • Аватар

      на сколько я понимаю все записывается в папку mnt/calls , но почему-то при звонке по транку ростелекома в эту папку запись не происходит, подскажите что можно сделать , настройки полностью брал с вашей статьи. то есть получается с 100 на 101 все записывается с транка нет

    • Аватар

      /var/log/asterisk/cdr-csv/Master.csv записи звонка с транка тоже нету почему-то, есть все кроме как с трнка...
      не могу понять в чем проблема может быть

  22. Аватар
    Александр

    Добрый день. Помогите плизз. Года 4 назад настроил ip телефонию, все работало как надо(вроде), а на днях обнаружили сотрудники, что перестал работать Voicemail. Сервер к Интернет не подключен почтовые ящики телефонов находятся на самом сервере. Настройки никто не трогал как я 4 года назад настроил так никто туда не заходил. Я думал место на диске кончилось, но нет мета выше крыши. Стоит asterisk 13.7.1 и freepbx 13.0.115. Обнаружил,что если удалить файл unavail.wav, Voicemail начинает нормально работать. Сравнение логов с файлом и бе выявили, что при отсутствии файла выполняется файла вызов воспроизведения стандартных звуковых файлов, а потом:
    2020-05-22 00:56:49] VERBOSE[4332][C-0000006d] app_voicemail.c: Recording the message
    [2020-05-22 00:56:49] VERBOSE[4332][C-0000006d] app.c: x=0, open writing: /var/spool/asterisk/voicemail/default/2/tmp/VnO0MO format: wav, 0x7f06d0789908
    [2020-05-22 00:56:57] VERBOSE[4332][C-0000006d] app.c: User hung up

    в случае с файлом, происходит его воспроизведение(реально воспроизводится) но вышеуказанные команды не выполняются. Что может быть не так? Последующие команды идентичны в обоих случаях. Спасибо.

    • Zerox

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

      • Аватар
        Александр

        Я думаю как раз наоборот, что то происходит после воспроизведения вызывается исключение и блок:
        2020-05-22 00:56:49] VERBOSE[4332][C-0000006d] app_voicemail.c: Recording the message
        [2020-05-22 00:56:49] VERBOSE[4332][C-0000006d] app.c: x=0, open writing: /var/spool/asterisk/voicemail/default/2/tmp/VnO0MO format: wav, 0x7f06d0789908
        [2020-05-22 00:56:57] VERBOSE[4332][C-0000006d] app.c: User hung up
        пропускается ибо остальной лог в обоих случаях абсолютно идентичен.
        Интересно в каком файле указывается использование unavail.wav
        И почему внезапно перестало работать

        • Аватар

          Ну попробуй не wavа другой формат

          • Аватар
            Александр

            У меня на все голосовые сообщения записаны диктором сообщения они все в wav или Voicemail какойто особенный? надо будит в понедельник попробовать.

  23. Аватар

    здраствуйте
    при проброске портов командой:
    iptables -t nat -A PREROUTING -p udp --dst $WAN_IP --dport 5060 -j DNAT --to 192.168.1.25:5060
    выбивает ошибку "bad argument 5060"
    подскажите пожалуйста что тут надо сделать

  24. Аватар
    сергей

    Добрый день!
    Редкой подробности и структурированности статья. Благодарен вам.
    Можно вопрос - можно ли установить астериск на удаленный сервер - типа на такой на котором хостинг предоставляют. Второй вопрос - для каких целей такая установка может потребоваться? или лучше ставить на собственный сервер?

    • Zerox

      1. Да, можно установить asterisk на арендуемый vps. Единственный нюанс, если вы живете в России, то и арендовать лучше тут же, чтобы были минимальные задержки. Не стоит заказывать в Европе или Америке.
      2. Для целей надежности и стабильности. Это вопрос не в плоскости астериска, а в плоскости темы, где лучше хранить сервера, у себя в серверной или у облачного провайдера. Каждый решает по месту, как ему удобнее. Если у вас арендуется внешний сервер, то при его падении или проблемами с интернетом, внутренней связи тоже не будет.

      • Аватар

        Zerox приветствую:может уделим вниманеи на вашем сайте настройку pjsip:и tls и может быть отключим все ненужные службы у кстериска

        • Zerox

          Я рассматривал недавно вопрос с pjsip. Лично для себя не увидел каких-то явных преимуществ от перехода на него. На обычном sip все работает так, как надо. Так что пока не вижу смысла тратить на него свое время. Если совсем уберут sip из астериска, тогда буду думать. PJSIP просто сложнее настраивать. Должна быть явная выгода от увеличения времени на настройку. А если выгоды нет, зачем тратить время?

  25. Аватар

    Здравствуйте,
    Не могу найти отличия в параметрах externip и externip.
    Когда какой применяется.

  26. Аватар

    Здрассте. У вас в sip.conf есть "[authentication]"
    для чего она и как работает?

  27. Аватар
    Виталий

    Интересно,кто то осилил видеозвонки и видеоконференцию на астере на 16...17 версиях,или это гиблое дело.зависящее от клиента и прочих плюшек астера?

  28. Аватар

    Большое спасибо за подробную статью!
    Не подскажете ли, как настроить видеоконференцию?

  29. Аватар

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

  30. Аватар
    Анатолий

    Здравствуйте! Подскажите если внутренний номер совпадает с внешним, например 102 внутренний и 102 Полиция как зарезервировать 102 как городской номер чтобы при наборе 102 уходили через городской номер, 102 внутренний отключен пытаюсь сделать его как городской.
    exten => _XXX,1,Dial(SIP/${EXTEN},15) шаблон же _ХХХ , как это победить?

  31. Аватар

    Доброе утро! Подскажите пожалуйста, хотел настроить cdr, сделал по инструкции за исключением того, при вводе команды "dnf localinstall mysql80-community-release-el8-1.noarch.rpm" и "dnf makecache" выдавало ошибку:
    Asterisk Common Requirement Packages @ tucny.com 113 B/s | 153 B 00:01
    Failed to download metadata for repo 'asterisk-common'
    Error: Failed to download metadata for repo 'asterisk-common'

    Потом я закомментировал все строки в файле репозитория tucny.com, и все у меня без проблем установилось. Но теперь проблема:
    localhost*CLI> odbc show all

    ODBC DSN Settings
    -----------------

    Name: asterisk
    DSN: MySQL-asterisk
    Last fail connection attempt: 2020-03-13 10:57:39
    Number of active connections: 0 (out of 1)
    Logging: Disabled
    Выдает ошибку. Помогите исправить. К слову я с линуксом впервые сталкиваюсь, не судите строго))

    • Zerox

      В статье все есть. Проверяйте внимательно настройки. Они рабочие. Скорее всего где-то ошиблись.

    • Аватар

      у меня тоже самое, не нашли решение?
      localhost*CLI> odbc show all

      ODBC DSN Settings
      -----------------

      Name: asterisk
      DSN: MySQL-asterisk
      Last fail connection attempt: 2020-04-30 15:58:52
      Number of active connections: 0 (out of 1)
      Logging: Disabled

      • Аватар

        разобрался, нужно сверить пути до библиотек, в /etc/odbcinst.ini
        в секции [MySQL], у меня почему то некоторые пути отличались, вставил как у автора и заработало.

  32. Аватар
    Алексей

    Знаете чего вам не хватает? Кнопочки: "Скачать инструкцию" в PDF :D

    • Аватар
      Алексей

      Знаете чего вам не хватает? Кнопочки: "Скачать инструкцию" в PDF :D
      А кнопочка то есть!!!
      Блин а как коменты удалять??? :D

      • Zerox

        Там, к сожалению, без картинок. После того, как перешел на формат картинок webp, плагин сломался.

  33. Аватар
    Евгений

    Всем привет.
    Когда не чем заняться, можно и Asterisk из исходников собирать, без FreePBX. А потом в VI редактировать sip.conf.
    Но это, как то попахивает прошлым веком.
    Проще скачать ISO образ для установки Asterisk+FreePBX и получить готовую АТС через 15 минут.
    Последний образ от Sangoma за февраля 2020 года.
    Дополнительно , вы получаете возможность обновления Asterisk, через yum update, по мере выхода новых версий LTS.
    Не понятно, ради чего отказываться от FreePBX. Потому, что он не совместим с CentOS 8?
    У меня уже лет 5 работает АТС на CentOS 6, и ничего , функцию свою выполняет.
    Условно к недостаткам такой установки, можно отнести:
    CentOS 7.6
    Устанавливаются коммерческие модули FreePBX(не нужные можно удалить, но жить они не мешают)
    После регистрации Системы, периодически приходя от Sangoma приглашения на вебинары.
    Для справки:
    Sangoma Technologies в 2018 году купил Digium, и теперь ведет Asterisk и FreePBX.

    • Zerox

      Это обсуждения в стиле, зачем настраивать nginx и php-fpm, если можно поставить панель VestaCP. Если вам подходит и устраивает функционал Freepbx, пользуйтесь на здоровье. Мне лично этот продукт не нравится. Я его обслуживал и у него свои недостатки. Многие вещи на чистом asterisk реализовать быстрее и проще.

      С Freepbx вы не сэкономите время настройки, если не знакомы с продуктом. Там тоже нужно потратить время на освоение и настройку. Лично я голый астериск настраиваю быстрее, чем Freepbx. Тут всего-то пару конфигов набросать из готового шаблона и все работает. Страшно может выглядеть, если делаешь первый раз. Но так и с freepbx будет. Когда освоишься, уже другое дело.

      • Аватар
        Евгений

        Ну если пару конфигов, и потом не нужно ни чего делать, тогда GUI не нужен.
        У меня 4 АТС, и приходится постоянно их контролировать.
        А FreePBX значительно проще чем VI.
        И повторюсь, у меня всегда есть возможность обновить Asterisk до последней LTS

        • Zerox

          Во-первых, лично я vi не использую. Во-вторых, тут тоже нет проблем с обновлением до последней LTS.

    • Аватар

      Ох и намаялся я с этим Sangoma Technologies с одной стороны вроде действительно за 15 минут установил а дальше погружаешся в бездну настроек которые не всегда коректно работают... Сюрпризы практически на каждом повороте так как логика разработчиков не всегда понятно и надо убить кучу времени дабы понять как оно работает. Про то что они навыдумывали с защитой я просто умалчу, так как для понимания надо выкурить и выпить много :)
      В результате я лично пришел к выводу что лучше потратить время на изучение чистого Asterisk и иметь действительно стабильныю в работе систему чем ловить вечные сюрпризы и изучать пробукт который сильно заграмажден. Конечно это все относится к тому что использовать свободную версию.
      Все такие поделки которые называются свободные на самом деле мнимая свобода. Разработчики делают свободную версию не для того чтобы вы ей спокойно пользовались а для того чтобы вы ловили глюки им говарили а потом устав приобретали платную версию.

      Еще раз спасибо Владимер за такую хорошую инструкцию.

  34. Аватар

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

    Спасибо большое за статью!

    • Zerox

      У меня нет такой информации, так как она зависит от множества факторов. Но в общем и целом asterisk потребляет очень мало ресурсов в своей работе. Для среднего офиса на 30-50 человек будет достаточно виртуальной машины с 1-2 Cpu и 2-4 Ram.

  35. Zerox

    Обновил и актуализировал полностью статью под Centos 8 и Asterisk 16. Заменил в dialplan Macro, который объявлен deprecated, на GoSub.

  36. Аватар
    Евгений

    Спасибо за статью, остался один вопрос но ivr меню:

    Закольцовка срабатывает только если набирают 3-х значный неверный добавочный номер, если количество цифр другое звонок просто сбрасывается. Как сделать чтобы на любое количество цифр была закольцовка?

  37. Аватар

    Здравствуйте!
    Надо заметить, что устанавливая asterisk на клиента OpenVPN на debian 10, ваша рекомендация при переадресации не внешний номер добавить строку
    exten => 115,n,Dial(SIP/89151234567@397945)
    в контекст [call-out] перед общим правилом набора на внутренние номера - не верна.
    В таком случае, при наборе внутреннего номера, в CLI астериска выпадает сообщение:
    -- Auto fallthrough, channel 'SIP/122-00000000' status is 'UNKNOWN'
    и вызов сбрасывается. А вот если строку с переадресацией вставить после общего правила набора на внутренние номера, то - работает. Но я это заметил только в случае установки внутри OpenVPN. Так и не понял - почему так?

    • Zerox

      Я вообще не понял, при чем тут openvpn. Dialplan вещь в себе и от openvpn точно не зависит.

  38. Аватар

    Добрый день,

    Спасибо за статью, настроил по ней астериск 16 на Ubuntu 18, c поправками конечно.

    Вопрос по статистике звонков.

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

    С точки зрения статистики, все входящие звонки попадающие в голосовое меню считаются отвеченными.
    Как сделать так чтобы отвеченными считались только звонки с которыми общался оператор?

    • Zerox

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

    • Аватар

      https://github.com/revall/queue-stats/ Для статистики колл-центов - за глаза, берите только с гитхаба, ибо у автора только на старом php заведется.

  39. Аватар

    Вопрос таков? Могут ли на сервере блокироваться/переадресовываться и тому подобные вещи происходить с клиентами? А то уж оооооооочень большая конверсия недозвонов, и есть подозрение на воровство клиентов. Заранее благодарен!

    --end msg--
    19:54:25.329    tsx05CBE8EC  ....State changed from Null to Calling, event=TX_MSG
    19:54:25.329    dlg05CBC8CC  .....Transaction tsx05CBE8EC state changed to Calling
    19:54:25.381 sip_endpoint.c !Processing incoming message: Response msg 200/BYE/cseq=25759 (rdata05C3A91C)
    19:54:25.381   pjsua_core.c  .RX 513 bytes Response msg 200/BYE/cseq=25759 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 10.9.15.48:5060;branch=z9hG4bKPjb8eb3dae3f5c44c69a385ac15b964562;received=10.9.15.48;rport=1035
    From: ;tag=68d2a21807844208a1a9670dfa7a43c5
    To: "78125000934" ;tag=as3e457d82
    Call-ID: 313ccc305394ef802968b7f91dccd5aa@149.202.66.110:5060
    CSeq: 25759 BYE
    Server: MOR Softswitch
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
    Supported: replaces, timer
    Content-Length: 0
    
    
    --end msg--
    19:54:25.382    tsx05CBE8EC  .Incoming Response msg 200/BYE/cseq=25759 (rdata05C3A91C) in state Calling
    19:54:25.382    tsx05CBE8EC  ..State changed from Calling to Completed, event=RX_MSG
    19:54:25.382    dlg05CBC8CC  ...Received Response msg 200/BYE/cseq=25759 (rdata05C3A91C)
    19:54:25.382    dlg05CBC8CC  ...Transaction tsx05CBE8EC state changed to Completed
    19:54:25.382    pjsua_aud.c  .....Destroying recorder 0..
    19:54:25.388  pjsua_media.c  .....Call 3: deinitializing media..
    19:54:25.388   strm05C57E54  .......JB summary:
      size=0/eff=0 prefetch=0 level=4
      delay (min/max/avg/dev)=20/240/135/88 ms
      burst (min/max/avg/dev)=2/24/2/1 frames
      lost=10 discard=2 empty=272
    19:54:25.388  pjsua_media.c  .......Media stream call03:0 is destroyed
    19:54:25.389    dlg05CBC8CC  .....Session count dec to 1 by mod-invite
    19:54:25.390    pjsua_aud.c !Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav..
    19:54:25.390   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:54:25.390    pjsua_aud.c  .Player created, id=0, slot=1
    19:54:25.390    pjsua_aud.c  Conf connect: 1 --> 0
    19:54:25.390   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) transmitting to port 0 (Wave mapper)
    19:54:25.604   wav_player.c !File port C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav EOF
    19:54:25.604    pjsua_aud.c !Conf disconnect: 1 -x- 0
    19:54:25.604   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) stop transmitting to port 0 (Wave mapper)
    19:54:25.604    pjsua_aud.c  Destroying player 0..
    19:54:30.382    tsx05CBE8EC !Timeout timer event
    19:54:30.382    tsx05CBE8EC  .State changed from Completed to Terminated, event=TIMER
    19:54:30.382    dlg05CBC8CC  ..Transaction tsx05CBE8EC state changed to Terminated
    19:54:30.382    dlg05CBC8CC  ...Dialog destroyed!
    19:54:30.384    tsx05CBE8EC  Timeout timer event
    19:54:30.384    tsx05CBE8EC  .State changed from Terminated to Destroyed, event=TIMER
    19:54:30.384   tdta05CE5A34  ..Destroying txdata Request msg BYE/cseq=25759 (tdta05CE5A34)
    19:54:30.384    tsx05CBE8EC  Transaction destroyed!
    19:54:38.451    pjsua_acc.c  Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:54:38.451   tdta05CE5A34  Destroying txdata raw
    19:54:53.451    pjsua_acc.c  Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:54:53.451   tdta05CE1A14  Destroying txdata raw
    19:55:08.451    pjsua_acc.c  Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:55:08.451   tdta05CE3A24  Destroying txdata raw
    19:55:23.451    pjsua_acc.c  Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:55:23.451   tdta05CE1A14  Destroying txdata raw
    19:55:31.669 sip_endpoint.c  Processing incoming message: Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:31.669   pjsua_core.c  .RX 860 bytes Request msg INVITE/cseq=102 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    INVITE sip:140034@10.9.15.48:5060;ob SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK627e43c4;rport
    Max-Forwards: 70
    From: "74997540051" ;tag=as1ceed9e2
    To: 
    Contact: 
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    CSeq: 102 INVITE
    User-Agent: MOR Softswitch
    Date: Tue, 04 Feb 2020 16:55:31 GMT
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
    Supported: replaces, timer
    Content-Type: application/sdp
    Content-Length: 265
    
    v=0
    o=root 1792084525 1792084525 IN IP4 149.202.66.110
    s=Asterisk PBX 1.8.32.4
    c=IN IP4 149.202.66.110
    t=0 0
    m=audio 12774 RTP/AVP 8 0 101
    a=rtpmap:8 PCMA/8000
    a=rtpmap:0 PCMU/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-16
    a=ptime:20
    a=sendrecv
    
    --end msg--
    19:55:31.669   pjsua_call.c  .Incoming Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:31.670    tsx05CBC8CC  ...Transaction created for Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:31.670    tsx05CBC8CC  ..Incoming Request msg INVITE/cseq=102 (rdata05C3A91C) in state Null
    19:55:31.670    tsx05CBC8CC  ...State changed from Null to Trying, event=RX_MSG
    19:55:31.670    dlg05CBA8AC  ....Transaction tsx05CBC8CC state changed to Trying
    19:55:31.670    dlg05CBA8AC  ..UAS dialog created
    19:55:31.670    dlg05CBA8AC  ..Module mod-invite added as dialog usage, data=05C4294C
    19:55:31.670    dlg05CBA8AC  ...Session count inc to 3 by mod-invite
    19:55:31.670    inv05CBA8AC  ..UAS invite session created for dialog dlg05CBA8AC
    19:55:31.670    dlg05CBA8AC  ...Session count inc to 3 by mod-pjsua
    19:55:31.670  pjsua_media.c  ..Call 0: initializing media..
    19:55:31.673  pjsua_media.c  ...RTP socket reachable at 10.9.15.48:4034
    19:55:31.673  pjsua_media.c  ...RTCP socket reachable at 10.9.15.48:4035
    19:55:31.673   srtp05C92498  ...SRTP keying SDES created
    19:55:31.673  pjsua_media.c  ...Media index 0 selected for audio call 0
    19:55:31.673  pjsua_media.c  ...Call 0: media transport initialization complete: Success
    19:55:31.673    dlg05CBA8AC  ...Session count dec to 3 by mod-pjsua
    19:55:31.674   pjsua_call.c  ..Call 0: remote NAT type is 0 (Unknown)
    19:55:31.674       endpoint  ...Response msg 100/INVITE/cseq=102 (tdta05CDFA04) created
    19:55:31.674    dlg05CBA8AC  ...Initial answer Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:31.674    inv05CBA8AC  ...Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:31.674    dlg05CBA8AC  ....Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:31.674    tsx05CBC8CC  ....Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04) in state Trying
    19:55:31.674   pjsua_core.c  .....TX 315 bytes Response msg 100/INVITE/cseq=102 (tdta05CDFA04) to UDP 149.202.66.110:5060:
    SIP/2.0 100 Trying
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK627e43c4
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    From: "74997540051" ;tag=as1ceed9e2
    To: 
    CSeq: 102 INVITE
    Content-Length:  0
    
    
    --end msg--
    19:55:31.674    tsx05CBC8CC  .....State changed from Trying to Proceeding, event=TX_MSG
    19:55:31.674    dlg05CBA8AC  ......Transaction tsx05CBC8CC state changed to Proceeding
    19:55:31.674   pjsua_call.c !Answering call 0: code=200
    19:55:31.674 sip_transport.  ..Tx data Response msg 100/INVITE/cseq=102 (tdta05CE5A34) cloned
    19:55:31.674    inv05CBA8AC  ..SDP negotiation done: Success
    19:55:31.674   pjsua_call.c  ...Call 0: remote NAT type is 0 (Unknown)
    19:55:31.674  pjsua_media.c  ...Call 0: updating media..
    19:55:31.674  pjsua_media.c  .....Media stream call00:0 is destroyed
    19:55:31.674    pjsua_aud.c  ....Audio channel update..
    19:55:31.674          rtp.c  .....pjmedia_rtp_session_init: ses=05CCC2F4, default_pt=8, ssrc=0x2f2a2425
    19:55:31.674          rtp.c  .....pjmedia_rtp_session_init: ses=05CBEE7C, default_pt=8, ssrc=0x2f2a2425
    19:55:31.674       stream.c  .....Stream strm011B3B2C created
    19:55:31.674   strm011B3B2C  .....Encoder stream started
    19:55:31.674   strm011B3B2C  .....Decoder stream started
    19:55:31.674  pjsua_media.c  ....Audio updated, stream #0: PCMA (sendrecv)
    19:55:31.674    pjsua_aud.c  ...Conf connect: 1 --> 0
    19:55:31.674   conference.c  ....Port 1 (sip:140034@149.202.66.110) transmitting to port 0 (Wave mapper)
    19:55:31.674    pjsua_aud.c  ...Conf connect: 0 --> 1
    19:55:31.674   conference.c  ....Port 0 (Wave mapper) transmitting to port 1 (sip:140034@149.202.66.110)
    19:55:31.674    inv05CBA8AC  ..Sending Response msg 200/INVITE/cseq=102 (tdta05CE5A34)
    19:55:31.674    dlg05CBA8AC  ...Sending Response msg 200/INVITE/cseq=102 (tdta05CE5A34)
    19:55:31.674    tsx05CBC8CC  ...Sending Response msg 200/INVITE/cseq=102 (tdta05CE5A34) in state Proceeding
    19:55:31.675   tdta05CDFA04  ....Destroying txdata Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:31.675   pjsua_core.c  ....TX 869 bytes Response msg 200/INVITE/cseq=102 (tdta05CE5A34) to UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK627e43c4
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    From: "74997540051" ;tag=as1ceed9e2
    To: ;tag=9599af85fd224309be317df6c2b3c9d5
    CSeq: 102 INVITE
    Contact: 
    Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
    Supported: replaces, 100rel, timer, norefersub
    Content-Type: application/sdp
    Content-Length:   309
    
    v=0
    o=- 3789834931 3789834932 IN IP4 10.9.15.48
    s=pjmedia
    b=AS:84
    t=0 0
    a=X-nat:0
    m=audio 4034 RTP/AVP 8 101
    c=IN IP4 10.9.15.48
    b=TIAS:64000
    a=rtcp:4035 IN IP4 10.9.15.48
    a=sendrecv
    a=rtpmap:8 PCMA/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-16
    a=ssrc:791290917 cname:1c0409e126fd0840
    
    --end msg--
    19:55:31.675    tsx05CBC8CC  ....State changed from Proceeding to Completed, event=TX_MSG
    19:55:31.675    dlg05CBA8AC  .....Transaction tsx05CBC8CC state changed to Completed
    19:55:31.675    pjsua_aud.c  Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav..
    19:55:31.675   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:55:31.675    pjsua_aud.c  .Player created, id=0, slot=2
    19:55:31.675    pjsua_aud.c  Conf connect: 2 --> 0
    19:55:31.675   conference.c  .Port 2 (C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav) transmitting to port 0 (Wave mapper)
    19:55:31.684   strm011B3B2C !Jitter buffer is bufferring (prefetch=0)
    19:55:31.684   strm011B3B2C  Start talksprut..
    19:55:31.699    pjsua_aud.c !Conf disconnect: 2 -x- 0
    19:55:31.699   conference.c  .Port 2 (C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav) stop transmitting to port 0 (Wave mapper)
    19:55:31.699    pjsua_aud.c  Destroying player 0..
    19:55:31.723 sip_endpoint.c !Processing incoming message: Request msg ACK/cseq=102 (rdata05C3A91C)
    19:55:31.723   pjsua_core.c  .RX 426 bytes Request msg ACK/cseq=102 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    ACK sip:10.9.15.48:5060 SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK61f9b725;rport
    Max-Forwards: 70
    From: "74997540051" ;tag=as1ceed9e2
    To: ;tag=9599af85fd224309be317df6c2b3c9d5
    Contact: 
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    CSeq: 102 ACK
    User-Agent: MOR Softswitch
    Content-Length: 0
    
    
    --end msg--
    19:55:31.723    dlg05CBA8AC  .Received Request msg ACK/cseq=102 (rdata05C3A91C)
    19:55:31.723    tsx05CBC8CC  ..Request to terminate transaction
    19:55:31.723    tsx05CBC8CC  ...State changed from Completed to Terminated, event=USER
    19:55:31.723    dlg05CBA8AC  ....Transaction tsx05CBC8CC state changed to Terminated
    19:55:31.723    pjsua_aud.c  ...Creating recorder C:\Users\Zver\Desktop\Recordings\20200204-195531-140034-incoming-140034.wav..
    19:55:31.724   wav_writer.c  ....File writer 'C:\Users\Zver\Desktop\Recordings\20200204-195531-140034-incoming-140034.wav' created: samp.rate=8000, bufsize=4KB
    19:55:31.724    pjsua_aud.c  ....Recorder created, id=0, slot=2
    19:55:31.724    pjsua_aud.c  ...Conf connect: 1 --> 2
    19:55:31.724   conference.c  ....Port 1 (sip:140034@149.202.66.110) transmitting to port 2 (C:\Users\Zver\Desktop\Recordings\20200204-195531-140034-incoming-140034.wav)
    19:55:31.724    pjsua_aud.c  ...Conf connect: 0 --> 2
    19:55:31.724   conference.c  ....Port 0 (Wave mapper) transmitting to port 2 (C:\Users\Zver\Desktop\Recordings\20200204-195531-140034-incoming-140034.wav)
    19:55:31.724    tsx05CBC8CC  Timeout timer event
    19:55:31.724    tsx05CBC8CC  .State changed from Terminated to Destroyed, event=TIMER
    19:55:31.724   tdta05CE5A34  ..Destroying txdata Response msg 200/INVITE/cseq=102 (tdta05CE5A34)
    19:55:31.724    tsx05CBC8CC  Transaction destroyed!
    19:55:34.863 sip_endpoint.c  Processing incoming message: Request msg BYE/cseq=103 (rdata05C3A91C)
    19:55:34.863   pjsua_core.c  .RX 456 bytes Request msg BYE/cseq=103 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    BYE sip:10.9.15.48:5060 SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK12deb1b7;rport
    Max-Forwards: 70
    From: "74997540051" ;tag=as1ceed9e2
    To: ;tag=9599af85fd224309be317df6c2b3c9d5
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    CSeq: 103 BYE
    User-Agent: MOR Softswitch
    X-Asterisk-HangupCause: Normal Clearing
    X-Asterisk-HangupCauseCode: 16
    Content-Length: 0
    
    
    --end msg--
    19:55:34.863    dlg05CBA8AC  .Received Request msg BYE/cseq=103 (rdata05C3A91C)
    19:55:34.863    tsx05CB8084  ...Transaction created for Request msg BYE/cseq=103 (rdata05C3A91C)
    19:55:34.863    tsx05CB8084  ..Incoming Request msg BYE/cseq=103 (rdata05C3A91C) in state Null
    19:55:34.863    tsx05CB8084  ...State changed from Null to Trying, event=RX_MSG
    19:55:34.863    dlg05CBA8AC  ....Transaction tsx05CB8084 state changed to Trying
    19:55:34.863       endpoint  .....Response msg 200/BYE/cseq=103 (tdta05CDE9FC) created
    19:55:34.863    dlg05CBA8AC  ......Sending Response msg 200/BYE/cseq=103 (tdta05CDE9FC)
    19:55:34.863    tsx05CB8084  ......Sending Response msg 200/BYE/cseq=103 (tdta05CDE9FC) in state Trying
    19:55:34.863   pjsua_core.c  .......TX 345 bytes Response msg 200/BYE/cseq=103 (tdta05CDE9FC) to UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK12deb1b7
    Call-ID: 59e5c79c715b019f0e449e4756daa84c@149.202.66.110:5060
    From: "74997540051" ;tag=as1ceed9e2
    To: ;tag=9599af85fd224309be317df6c2b3c9d5
    CSeq: 103 BYE
    Content-Length:  0
    
    
    --end msg--
    19:55:34.863    tsx05CB8084  .......State changed from Trying to Completed, event=TX_MSG
    19:55:34.863    dlg05CBA8AC  ........Transaction tsx05CB8084 state changed to Completed
    19:55:34.863    pjsua_aud.c  ......Destroying recorder 0..
    19:55:34.872  pjsua_media.c  ......Call 0: deinitializing media..
    19:55:34.872   strm011B3B2C  ........JB summary:
      size=0/eff=0 prefetch=0 level=0
      delay (min/max/avg/dev)=0/0/0/0 ms
      burst (min/max/avg/dev)=0/0/0/0 frames
      lost=0 discard=0 empty=160
    19:55:34.872  pjsua_media.c  ........Media stream call00:0 is destroyed
    19:55:34.872    dlg05CBA8AC  ......Session count dec to 3 by mod-invite
    19:55:34.875    pjsua_aud.c !Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav..
    19:55:34.875   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:55:34.875    pjsua_aud.c  .Player created, id=0, slot=1
    19:55:34.875    pjsua_aud.c  Conf connect: 1 --> 0
    19:55:34.875   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) transmitting to port 0 (Wave mapper)
    19:55:35.084   wav_player.c !File port C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav EOF
    19:55:35.092    pjsua_aud.c !Conf disconnect: 1 -x- 0
    19:55:35.092   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) stop transmitting to port 0 (Wave mapper)
    19:55:35.092    pjsua_aud.c  Destroying player 0..
    19:55:38.451    pjsua_acc.c !Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:55:38.451   tdta05CE5A34  Destroying txdata raw
    19:55:48.738 sip_endpoint.c  Processing incoming message: Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:48.738   pjsua_core.c  .RX 860 bytes Request msg INVITE/cseq=102 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    INVITE sip:140034@10.9.15.48:5060;ob SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK74bd4fab;rport
    Max-Forwards: 70
    From: "78124542279" ;tag=as751b3850
    To: 
    Contact: 
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    CSeq: 102 INVITE
    User-Agent: MOR Softswitch
    Date: Tue, 04 Feb 2020 16:55:48 GMT
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
    Supported: replaces, timer
    Content-Type: application/sdp
    Content-Length: 265
    
    v=0
    o=root 1031988256 1031988256 IN IP4 149.202.66.110
    s=Asterisk PBX 1.8.32.4
    c=IN IP4 149.202.66.110
    t=0 0
    m=audio 13466 RTP/AVP 8 0 101
    a=rtpmap:8 PCMA/8000
    a=rtpmap:0 PCMU/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-16
    a=ptime:20
    a=sendrecv
    
    --end msg--
    19:55:48.738   pjsua_call.c  .Incoming Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:48.739    tsx05CBE8EC  ...Transaction created for Request msg INVITE/cseq=102 (rdata05C3A91C)
    19:55:48.739    tsx05CBE8EC  ..Incoming Request msg INVITE/cseq=102 (rdata05C3A91C) in state Null
    19:55:48.739    tsx05CBE8EC  ...State changed from Null to Trying, event=RX_MSG
    19:55:48.739    dlg05CBC8CC  ....Transaction tsx05CBE8EC state changed to Trying
    19:55:48.739    dlg05CBC8CC  ..UAS dialog created
    19:55:48.739    dlg05CBC8CC  ..Module mod-invite added as dialog usage, data=05C455FC
    19:55:48.739    dlg05CBC8CC  ...Session count inc to 3 by mod-invite
    19:55:48.739    inv05CBC8CC  ..UAS invite session created for dialog dlg05CBC8CC
    19:55:48.739    dlg05CBC8CC  ...Session count inc to 3 by mod-pjsua
    19:55:48.739  pjsua_media.c  ..Call 1: initializing media..
    19:55:48.741  pjsua_media.c  ...RTP socket reachable at 10.9.15.48:4036
    19:55:48.741  pjsua_media.c  ...RTCP socket reachable at 10.9.15.48:4037
    19:55:48.741   srtp05C97940  ...SRTP keying SDES created
    19:55:48.741  pjsua_media.c  ...Media index 0 selected for audio call 1
    19:55:48.741  pjsua_media.c  ...Call 1: media transport initialization complete: Success
    19:55:48.741    dlg05CBC8CC  ...Session count dec to 3 by mod-pjsua
    19:55:48.741   pjsua_call.c  ..Call 1: remote NAT type is 0 (Unknown)
    19:55:48.741       endpoint  ...Response msg 100/INVITE/cseq=102 (tdta05CDFA04) created
    19:55:48.741    dlg05CBC8CC  ...Initial answer Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:48.741    inv05CBC8CC  ...Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:48.741    dlg05CBC8CC  ....Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:48.741    tsx05CBE8EC  ....Sending Response msg 100/INVITE/cseq=102 (tdta05CDFA04) in state Trying
    19:55:48.741   pjsua_core.c  .....TX 315 bytes Response msg 100/INVITE/cseq=102 (tdta05CDFA04) to UDP 149.202.66.110:5060:
    SIP/2.0 100 Trying
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK74bd4fab
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    From: "78124542279" ;tag=as751b3850
    To: 
    CSeq: 102 INVITE
    Content-Length:  0
    
    
    --end msg--
    19:55:48.742    tsx05CBE8EC  .....State changed from Trying to Proceeding, event=TX_MSG
    19:55:48.742    dlg05CBC8CC  ......Transaction tsx05CBE8EC state changed to Proceeding
    19:55:48.742   pjsua_call.c !Answering call 1: code=200
    19:55:48.742 sip_transport.  ..Tx data Response msg 100/INVITE/cseq=102 (tdta05CE3A24) cloned
    19:55:48.742    inv05CBC8CC  ..SDP negotiation done: Success
    19:55:48.742   pjsua_call.c  ...Call 1: remote NAT type is 0 (Unknown)
    19:55:48.742  pjsua_media.c  ...Call 1: updating media..
    19:55:48.742  pjsua_media.c  .....Media stream call01:0 is destroyed
    19:55:48.742    pjsua_aud.c  ....Audio channel update..
    19:55:48.742          rtp.c  .....pjmedia_rtp_session_init: ses=05C58144, default_pt=8, ssrc=0x23d045f2
    19:55:48.742          rtp.c  .....pjmedia_rtp_session_init: ses=05CBF684, default_pt=8, ssrc=0x23d045f2
    19:55:48.742       stream.c  .....Stream strm011B3B2C created
    19:55:48.742   strm011B3B2C  .....Encoder stream started
    19:55:48.742   strm011B3B2C  .....Decoder stream started
    19:55:48.742  pjsua_media.c  ....Audio updated, stream #0: PCMA (sendrecv)
    19:55:48.742    pjsua_aud.c  ...Conf connect: 1 --> 0
    19:55:48.742   conference.c  ....Port 1 (sip:140034@149.202.66.110) transmitting to port 0 (Wave mapper)
    19:55:48.742    pjsua_aud.c  ...Conf connect: 0 --> 1
    19:55:48.742   conference.c  ....Port 0 (Wave mapper) transmitting to port 1 (sip:140034@149.202.66.110)
    19:55:48.742    inv05CBC8CC  ..Sending Response msg 200/INVITE/cseq=102 (tdta05CE3A24)
    19:55:48.742    dlg05CBC8CC  ...Sending Response msg 200/INVITE/cseq=102 (tdta05CE3A24)
    19:55:48.742    tsx05CBE8EC  ...Sending Response msg 200/INVITE/cseq=102 (tdta05CE3A24) in state Proceeding
    19:55:48.742   tdta05CDFA04  ....Destroying txdata Response msg 100/INVITE/cseq=102 (tdta05CDFA04)
    19:55:48.742   pjsua_core.c  ....TX 869 bytes Response msg 200/INVITE/cseq=102 (tdta05CE3A24) to UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 149.202.66.110:5060;rport=5060;received=149.202.66.110;branch=z9hG4bK74bd4fab
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    From: "78124542279" ;tag=as751b3850
    To: ;tag=06e98e5e044c47a391fedf901c045d13
    CSeq: 102 INVITE
    Contact: 
    Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
    Supported: replaces, 100rel, timer, norefersub
    Content-Type: application/sdp
    Content-Length:   309
    
    v=0
    o=- 3789834948 3789834949 IN IP4 10.9.15.48
    s=pjmedia
    b=AS:84
    t=0 0
    a=X-nat:0
    m=audio 4036 RTP/AVP 8 101
    c=IN IP4 10.9.15.48
    b=TIAS:64000
    a=rtcp:4037 IN IP4 10.9.15.48
    a=sendrecv
    a=rtpmap:8 PCMA/8000
    a=rtpmap:101 telephone-event/8000
    a=fmtp:101 0-16
    a=ssrc:600851954 cname:4dad01517a4f44c4
    
    --end msg--
    19:55:48.742    tsx05CBE8EC  ....State changed from Proceeding to Completed, event=TX_MSG
    19:55:48.742    dlg05CBC8CC  .....Transaction tsx05CBE8EC state changed to Completed
    19:55:48.743    pjsua_aud.c  Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav..
    19:55:48.743   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:55:48.743    pjsua_aud.c  .Player created, id=0, slot=2
    19:55:48.743    pjsua_aud.c  Conf connect: 2 --> 0
    19:55:48.744   conference.c  .Port 2 (C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav) transmitting to port 0 (Wave mapper)
    19:55:48.744   Master/sound !Underflow, buf_cnt=17, will generate 1 frame
    19:55:48.744   strm011B3B2C  Jitter buffer is bufferring (prefetch=0)
    19:55:48.744   strm011B3B2C  Start talksprut..
    19:55:48.766    pjsua_aud.c !Conf disconnect: 2 -x- 0
    19:55:48.766   conference.c  .Port 2 (C:\Users\Zver\AppData\Local\MicroSIP\ringing2.wav) stop transmitting to port 0 (Wave mapper)
    19:55:48.766    pjsua_aud.c  Destroying player 0..
    19:55:48.786 sip_endpoint.c !Processing incoming message: Request msg ACK/cseq=102 (rdata05C3A91C)
    19:55:48.786   pjsua_core.c  .RX 426 bytes Request msg ACK/cseq=102 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    ACK sip:10.9.15.48:5060 SIP/2.0
    Via: SIP/2.0/UDP 149.202.66.110:5060;branch=z9hG4bK489963ff;rport
    Max-Forwards: 70
    From: "78124542279" ;tag=as751b3850
    To: ;tag=06e98e5e044c47a391fedf901c045d13
    Contact: 
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    CSeq: 102 ACK
    User-Agent: MOR Softswitch
    Content-Length: 0
    
    
    --end msg--
    19:55:48.786    dlg05CBC8CC  .Received Request msg ACK/cseq=102 (rdata05C3A91C)
    19:55:48.786    tsx05CBE8EC  ..Request to terminate transaction
    19:55:48.786    tsx05CBE8EC  ...State changed from Completed to Terminated, event=USER
    19:55:48.786    dlg05CBC8CC  ....Transaction tsx05CBE8EC state changed to Terminated
    19:55:48.786    pjsua_aud.c  ...Creating recorder C:\Users\Zver\Desktop\Recordings\20200204-195548-140034-incoming-140034.wav..
    19:55:48.787   wav_writer.c  ....File writer 'C:\Users\Zver\Desktop\Recordings\20200204-195548-140034-incoming-140034.wav' created: samp.rate=8000, bufsize=4KB
    19:55:48.787    pjsua_aud.c  ....Recorder created, id=0, slot=2
    19:55:48.787    pjsua_aud.c  ...Conf connect: 1 --> 2
    19:55:48.787   conference.c  ....Port 1 (sip:140034@149.202.66.110) transmitting to port 2 (C:\Users\Zver\Desktop\Recordings\20200204-195548-140034-incoming-140034.wav)
    19:55:48.787    pjsua_aud.c  ...Conf connect: 0 --> 2
    19:55:48.787   conference.c  ....Port 0 (Wave mapper) transmitting to port 2 (C:\Users\Zver\Desktop\Recordings\20200204-195548-140034-incoming-140034.wav)
    19:55:48.787    tsx05CBE8EC  Timeout timer event
    19:55:48.787    tsx05CBE8EC  .State changed from Terminated to Destroyed, event=TIMER
    19:55:48.787   tdta05CE3A24  ..Destroying txdata Response msg 200/INVITE/cseq=102 (tdta05CE3A24)
    19:55:48.787    tsx05CBE8EC  Transaction destroyed!
    19:55:51.206   strm011B3B2C !RTP status: badpt=0, badssrc=0, dup=0, outorder=0, probation=-1, restart=0
    19:55:51.224   strm011B3B2C !Jitter buffer starts returning normal frames (after 124 empty/lost)
    19:55:52.145   strm011B3B2C  Jitter buffer empty (prefetch=0), plc invoked
    19:55:52.244   strm011B3B2C  Jitter buffer starts returning normal frames (after 5 empty/lost)
    19:55:53.452    pjsua_acc.c !Sending 2 bytes keep-alive packet for acc 1 to 149.202.66.110:5060
    19:55:53.452   tdta05CE5A34  Destroying txdata raw
    19:55:54.460   pjsua_call.c !Call 1 hanging up: code=0..
    19:55:54.460       endpoint  ..Request msg BYE/cseq=407 (tdta05CE1A14) created.
    19:55:54.460    inv05CBC8CC  ..Sending Request msg BYE/cseq=407 (tdta05CE1A14)
    19:55:54.460    dlg05CBC8CC  ...Sending Request msg BYE/cseq=407 (tdta05CE1A14)
    19:55:54.460    tsx05CBE8EC  ....Transaction created for Request msg BYE/cseq=406 (tdta05CE1A14)
    19:55:54.460    tsx05CBE8EC  ...Sending Request msg BYE/cseq=406 (tdta05CE1A14) in state Null
    19:55:54.460  sip_resolve.c  ....Target '149.202.66.110:5060' type=Unspecified resolved to '149.202.66.110:5060' type=UDP (UDP transport)
    19:55:54.460   pjsua_core.c  ....TX 414 bytes Request msg BYE/cseq=406 (tdta05CE1A14) to UDP 149.202.66.110:5060:
    BYE sip:140034@149.202.66.110:5060 SIP/2.0
    Via: SIP/2.0/UDP 10.9.15.48:5060;rport;branch=z9hG4bKPj188bd5c9ab6e4d24ae22406a7748503c
    Max-Forwards: 70
    From: ;tag=06e98e5e044c47a391fedf901c045d13
    To: "78124542279" ;tag=as751b3850
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    CSeq: 406 BYE
    User-Agent: MicroSIP/3.19.18
    Content-Length:  0
    
    
    --end msg--
    19:55:54.460    tsx05CBE8EC  ....State changed from Null to Calling, event=TX_MSG
    19:55:54.460    dlg05CBC8CC  .....Transaction tsx05CBE8EC state changed to Calling
    19:55:54.503 sip_endpoint.c !Processing incoming message: Response msg 200/BYE/cseq=406 (rdata05C3A91C)
    19:55:54.503   pjsua_core.c  .RX 511 bytes Response msg 200/BYE/cseq=406 (rdata05C3A91C) from UDP 149.202.66.110:5060:
    SIP/2.0 200 OK
    Via: SIP/2.0/UDP 10.9.15.48:5060;branch=z9hG4bKPj188bd5c9ab6e4d24ae22406a7748503c;received=10.9.15.48;rport=1035
    From: ;tag=06e98e5e044c47a391fedf901c045d13
    To: "78124542279" ;tag=as751b3850
    Call-ID: 107994fe7c2662dc393a3c3d7dd842ab@149.202.66.110:5060
    CSeq: 406 BYE
    Server: MOR Softswitch
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
    Supported: replaces, timer
    Content-Length: 0
    
    
    --end msg--
    19:55:54.503    tsx05CBE8EC  .Incoming Response msg 200/BYE/cseq=406 (rdata05C3A91C) in state Calling
    19:55:54.503    tsx05CBE8EC  ..State changed from Calling to Completed, event=RX_MSG
    19:55:54.503    dlg05CBC8CC  ...Received Response msg 200/BYE/cseq=406 (rdata05C3A91C)
    19:55:54.503    dlg05CBC8CC  ...Transaction tsx05CBE8EC state changed to Completed
    19:55:54.503    pjsua_aud.c  .....Destroying recorder 0..
    19:55:54.511  pjsua_media.c  .....Call 1: deinitializing media..
    19:55:54.512   strm011B3B2C  .......JB summary:
      size=0/eff=0 prefetch=0 level=2
      delay (min/max/avg/dev)=20/20/20/0 ms
      burst (min/max/avg/dev)=2/2/2/0 frames
      lost=0 discard=2 empty=129
    19:55:54.512  pjsua_media.c  .......Media stream call01:0 is destroyed
    19:55:54.513    dlg05CBC8CC  .....Session count dec to 1 by mod-invite
    19:55:54.515    pjsua_aud.c !Creating file player: C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav..
    19:55:54.515   wav_player.c  .File player 'C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav' created: samp.rate=8000, ch=1, bufsize=3KB, filesize=3KB
    19:55:54.515    pjsua_aud.c  .Player created, id=0, slot=1
    19:55:54.515    pjsua_aud.c  Conf connect: 1 --> 0
    19:55:54.515   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) transmitting to port 0 (Wave mapper)
    19:55:54.724   wav_player.c !File port C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav EOF
    19:55:54.724    pjsua_aud.c !Conf disconnect: 1 -x- 0
    19:55:54.724   conference.c  .Port 1 (C:\Users\Zver\AppData\Local\MicroSIP\hangup.wav) stop transmitting to port 0 (Wave mapper)
    19:55:54.724    pjsua_aud.c  Destroying player 0..
    19:55:59.503    tsx05CBE8EC !Timeout timer event
    19:55:59.503    tsx05CBE8EC  .State changed from Completed to Terminated, event=TIMER
    19:55:59.503    dlg05CBC8CC  ..Transaction tsx05CBE8EC state changed to Terminated
    19:55:59.503    dlg05CBC8CC  ...Dialog destroyed!
    19:55:59.503    tsx05CBE8EC  Timeout timer event
    19:55:59.503    tsx05CBE8EC  .State changed from Terminated to Destroyed, event=TIMER
    19:55:59.503   tdta05CE1A14  ..Destroying txdata Request msg BYE/cseq=406 (tdta05CE1A14)
    19:55:59.503    tsx05CBE8EC  Transaction destroyed!
  40. Аватар

    Здравствуйте, Владимир! Спасибо вам за ваши туториалы! Но, кажется, в части настройки записи разговоров (record) закралась ошибка. После рестарта астериска и попытки позвонить в командной строке появляется ворнинг -
    [Feb 2 21:59:20] WARNING[1824][C-00000001]: pbx.c:2927 pbx_extension_helper: No application 'Macro' for extension (call-out, 100, 1)
    И, конечно, звонок сбрасывается. При звонке из вне тот же эффект -
    [Feb 2 21:59:55] WARNING[1826][C-00000002]: pbx.c:2927 pbx_extension_helper: No application 'Macro' for extension (ivr-main, 122, 1)
    При проверке после предыдущего этапа (Учет и просмотр статистики звонков (cdr viewer)) всё работало, записи в базу производились.
    Подскажите, может ли это быть от того, что вместо mysql используется mariadb? Там, где надо, конфиги подправил, и база, повторюсь, работала. Или это всё-таки /etc/asterisk/extensions.conf не правильный? Хотя он как у вас - один в один.

    • Zerox

      Mariadb или Mysql точно не имеет значения. У вас ошибка в диалплане где-то. Вот она:

      No application ‘Macro’ for extension (call-out, 100, 1)

      Статья немного устарела в каких-то деталях, могут быть мелкие ошибки. Я планирую полное обновление на современные версии, но пока никак не доходят руки.

    • Аватар

      No application ‘Macro’ for extension - у вас выключен модуль app_macro.so. он признан устаревшим. Его можно добавить, пересобрав астер. Но в консоли он тогда валит предупреждения: ахтунгахтунг оно старое. Замена - GoSub, там все легко и понятно.
      Было на 13 астере Macro(macro-recording,/mnt/ISCSI/call/,${UNIQUEID})
      стало на 16 астере GoSub(macro-recording,s,1(${CALLERID(num)},${EXTEN}))

      внутри макроса тоже изменения больше косметические, в конце надо добавлять
      same => n,Return(), если планируется возврат в exten.

      • Аватар

        Спасибо вам! Насчёт "ахтунгов" - это точно, пересобрал астер и посыпались мол: в следующей версии не будет Macro. Но сделал как вы сказали и... Вуаля! Всё работает без "ахтунгов".

      • Zerox

        Спасибо за информацию. Нужно будет актуализировать статью под свежие lts версии asterisk.

  41. Аватар
    Андрей

    Владимир, а можно вопрос насколько сильно отличаются настройка sip и pjsip или это ничего принципиального в астериске не меняет ?

  42. Аватар
    Евгений

    ошибка команды yum install -y mysql-connector-odbc.x86_64 unixODBC-devel.x86_64

    выдает Отсутствуют совпадения для аргумента: mysql-connector-odbc.x86_64
    Пакет unixODBC-devel-2.3.7-1.el8.x86_64 уже установлен.
    Ошибка: Совпадений не найдено: mysql-connector-odbc.x86_64

    • Аватар

      попробуйте установить mariadb коннектор, либо подсунуть rpm от MYSQL. потом вносите изменения в коннекторы и вуаля. все работает.

      • Аватар

        кстати комментируя автора статьи - "Параметр callerid можно задать кириллицей, но могут возникнуть проблемы с некоторыми телефонами и точно возникнут проблемы, когда вы будете вести статистику звонков в mysql. Я не смог победить эту проблему с кодировками, поэтому использую только латиницу в этом параметре. Туда можно писать либо должность, либо ФИО человека." Если использовать коннектор ODBC mariadb то проблемы с callerid исчезают.

  43. Аватар

    При компиляции ошибка подскажите

    make
    [LD] abstract_jb.o acl.o adsi.o alaw.o alertpipe.o aoc.o app.o ast_expr2.o ast_expr2f.o asterisk.o astfd.o astmm.o astobj2.o astobj2_container.o astobj2_hash.o astobj2_rbtree.o audiohook.o autochan.o autoservice.o backtrace.o bridge.o bridge_after.o bridge_basic.o bridge_channel.o bridge_roles.o bucket.o callerid.o channel.o channel_internal_api.o chanvars.o cli.o codec.o codec_builtin.o config_options.o conversions.o core_local.o core_unreal.o crypt.o data_buffer.o datastore.o db.o devicestate.o dial.o dns.o dns_core.o dns_naptr.o dns_query_set.o dns_recurring.o dns_srv.o dns_system_resolver.o dns_test.o dns_tlsa.o endpoints.o event.o features_config.o file.o fixedjitterbuf.o format.o format_cache.o format_cap.o format_compatibility.o frame.o framehook.o fskmodem.o global_datastores.o hashtab.o heap.o image.o io.o iostream.o jitterbuf.o json.o loader.o lock.o manager_bridges.o manager_channels.o manager_endpoints.o manager_mwi.o manager_system.o max_forwards.o md5.o media_cache.o media_index.o message.o mixmonitor.o mwi.o named_locks.o netsock2.o optional_api.o options.o parking.o pbx.o pbx_app.o pbx_builtins.o pbx_functions.o pbx_hangup_handler.o pbx_ignorepat.o pbx_include.o pbx_sw.o pbx_switch.o pbx_timing.o pbx_variables.o pickup.o poll.o presencestate.o privacy.o rtp_engine.o say.o sched.o sdp_srtp.o security_events.o sem.o sha1.o sip_api.o slinfactory.o smoother.o sorcery.o srv.o stasis.o stasis_bridges.o stasis_cache.o stasis_cache_pattern.o stasis_channels.o stasis_endpoints.o stasis_message.o stasis_message_router.o stasis_system.o stdtime/localtime.o strcompat.o stream.o stringfields.o strings.o stun.o syslog.o taskprocessor.o tcptls.o tdd.o term.o test.o threadpool.o threadstorage.o timing.o translate.o ulaw.o uri.o utils.o uuid.o version.o xml.o xmldoc.o ccss.o cdr.o cel.o config.o dnsmgr.o dsp.o enum.o features.o http.o indications.o logger.o manager.o named_acl.o plc.o sounds.o udptl.o -> asterisk
    [CC] app_mysql.c -> app_mysql.o
    [LD] app_mysql.o -> app_mysql.so
    [CC] cdr_mysql.c -> cdr_mysql.o
    cdr_mysql.c: In function ‘mysql_log’:
    cdr_mysql.c:177:2: error: unknown type name ‘my_bool’; did you mean ‘bool’?
    my_bool my_bool_true = 1;
    ^~~~~~~
    bool
    cdr_mysql.c: In function ‘my_connect_db’:
    cdr_mysql.c:464:2: error: unknown type name ‘my_bool’; did you mean ‘bool’?
    my_bool my_bool_true = 1;
    ^~~~~~~
    bool

    • Zerox

      Эта ошибка в модуле mysql, который давно уже объявлен deprecated и использовать его большого смысла нет. Вместо него надо настраивать подключение к mysql через odbc.

  44. Аватар

    Не сможет заработать статистика пока вы будите видеть эти ошибки

    core reload
    -- Reloading module 'extconfig' (Configuration)
    -- Reloading module 'logger' (Logger)
    Asterisk Queue Logger restarted
    -- Reloading module 'res_odbc.so' (ODBC resource)
    [Jan 11 13:08:58] WARNING[1659]: res_odbc.c:606 load_odbc_config: The 'pooling', 'shared_connections', 'limit', and 'idlecheck' options were replaced by 'max_c onnections'. See res_odbc.conf.sample.
    [Jan 11 13:08:58] WARNING[1659]: res_odbc.c:1067 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=0 [unixODBC][Driver Manager]Can't open lib '/usr/lib64/l ibmyodbc5.so' : file not found
    [Jan 11 13:08:58] NOTICE[1659]: res_odbc.c:706 load_odbc_config: Registered ODBC class 'asterisk' dsn->[MySQL-asterisk]
    -- Reloading module 'res_config_ldap.so' (LDAP realtime interface)

    asterisk-16.6.2 make menuselect
    1 add-ans -> выбрать app_mysql и cdr_mysql

    save
    make
    и вываливаемся в такую ошибку
    make
    [CC] cdr_mysql.c -> cdr_mysql.o
    cdr_mysql.c: In function ‘mysql_log’:
    cdr_mysql.c:177:2: error: unknown type name ‘my_bool’; did you mean ‘bool’?
    my_bool my_bool_true = 1;
    ^~~~~~~
    bool
    cdr_mysql.c: In function ‘my_connect_db’:
    cdr_mysql.c:464:2: error: unknown type name ‘my_bool’; did you mean ‘bool’?
    my_bool my_bool_true = 1;
    ^~~~~~~
    bool
    make[1]: *** [/usr/src/asterisk-16.6.2/Makefile.rules:164: cdr_mysql.o] Error 1
    make: *** [Makefile:383: addons] Error 2

    dnf install unixodbc unixodbc-devel libtool-ltdl libtool-ltdl-devel mysql-connector-odbc
    Last metadata expiration check: 0:45:44 ago on Sat 11 Jan 2020 12:41:30 PM +05.
    No match for argument: unixodbc
    * Maybe you meant: unixODBC
    No match for argument: unixodbc-devel
    * Maybe you meant: unixODBC-devel
    Package libtool-ltdl-2.4.6-25.el8.x86_64 is already installed.
    No match for argument: mysql-connector-odbc
    Error: Unable to find a match

    yum install -y mysql-connector-odbc.x86_64 unixODBC-devel.x86_64
    Last metadata expiration check: 0:48:11 ago on Sat 11 Jan 2020 12:41:30 PM +05.
    No match for argument: mysql-connector-odbc.x86_64
    Package unixODBC-devel-2.3.7-1.el8.x86_64 is already installed.
    Error: Unable to find a match

    libmyodbc5.so

    есть мысли ?

    • Аватар

      в 8 centOS

      Редактируем файл /etc/odbcinst.ini. Я его не трогал, оставил по-умолчанию, только в самый конец секции [MySQL] добавил две недостающие строки. Я не разбирался нужны они или нет, просто подсмотрел в другой инструкции. Вот как этот файл выглядит у меня:

      [MySQL]
      Description = ODBC for MySQL
      Driver = /usr/lib/libmyodbc5.so
      Setup = /usr/lib/libodbcmyS.so
      Driver64 = /usr/lib64/libmyodbc5a.so
      Setup64 = /usr/lib64/libodbcmyS.so
      FileUsage = 1
      CPTimeout =
      CPReuse =

      поменяли с /usr/lib64/libmyodbc5.so на /usr/lib64/libmyodbc5a.so

  45. Аватар

    Сделал все правильно, но один софт фон пишет что нет подключения к серверу другой тупо пишет регистрация и ничего не происходит, делал астериск на WMvare и Hyper-v, пинги идут со всех сторон, но не работает.

    Вот логи которые пишет после перезагрузки астериска:

    localhost*CLI> core reload
    [Dec 7 13:32:48] NOTICE[17799]: res_config_ldap.c:1830 parse_config: No directory user found, anonymous binding as default.
    [Dec 7 13:32:48] ERROR[17799]: res_config_ldap.c:1856 parse_config: No directory URL or host found.
    [Dec 7 13:32:48] NOTICE[17799]: res_config_ldap.c:1774 reload: Cannot reload LDAP RealTime driver.
    [Dec 7 13:32:48] WARNING[17799]: res_config_pgsql.c:1445 parse_config: PostgreSQL RealTime: Not connected
    [Dec 7 13:32:48] NOTICE[17799]: cdr.c:4517 cdr_toggle_runtime_options: CDR simple logging enabled.
    [Dec 7 13:32:48] NOTICE[17823]: sorcery.c:1334 sorcery_object_load: Type 'system' is not reloadable, maintaining previous values
    [Dec 7 13:32:48] WARNING[17799]: res_phoneprov.c:1230 get_defaults: Unable to find a valid server address or name.
    [Dec 7 13:32:48] NOTICE[17799]: chan_skinny.c:8459 config_load: Configuring skinny from skinny.conf
    [Dec 7 13:32:48] ERROR[17799]: ari/config.c:312 process_config: No configured users for ARI
    [Dec 7 13:32:48] NOTICE[17799]: cel_custom.c:95 load_config: No mappings found in cel_custom.conf. Not logging CEL to custom CSVs.
    [Dec 7 13:32:48] NOTICE[17799]: app_queue.c:9144 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.

  46. Аватар

    Добрый день. Не проходят исходящие, подскажите пожалуйста.

    строка регистрации

    register => 1002@user.cnt.ru:password@qwerty.cnt.ru:5060/1002

    [1002]
    defaultuser=1002
    secret=1q2w#E$R
    type=peer
    insecure=port,invite
    host=qwerty.cnt.ru
    fromuser=1002
    fromdomain=qwerty.cnt.ru
    outboundproxy=qwerty.cnt.ru
    context=incoming
    canreinvite=no
    disallow=all
    allow=ulaw
    allow=alaw
    allow=g729
    dtmfmode = rfc2833

    строка в дуалплане

    exten => _XXX.,1,Dial(SIP/${EXTEN}@1002)
    include => handup-sip

    что может быть не нак

    • Zerox

      Нужно лог в первую очередь смотреть, чтобы понять, почему звонки не проходят.

      • Аватар

        При наборе выдаёт такую ошибку:
        Received response: "Forbidden" from

        при перезагрузки:

        NOTICE[1067]: res_config_ldap.c:1830 parse_config: No directory user found, anonymous binding as default.
        [Nov 26 15:53:42] ERROR[1067]: res_config_ldap.c:1856 parse_config: No directory URL or host found.
        [Nov 26 15:53:42] NOTICE[1067]: res_config_ldap.c:1774 reload: Cannot reload LDAP RealTime driver.
        [Nov 26 15:53:42] WARNING[1067]: res_config_pgsql.c:1445 parse_config: PostgreSQL RealTime: Not connected
        [Nov 26 15:53:42] NOTICE[1067]: cdr.c:4501 cdr_toggle_runtime_options: CDR simple logging enabled.
        [Nov 26 15:53:42] NOTICE[1068]: sorcery.c:1334 sorcery_object_load: Type 'system' is not reloadable, maintaining previous values
        [Nov 26 15:53:42] WARNING[1067]: res_phoneprov.c:1230 get_defaults: Unable to find a valid server address or name.
        [Nov 26 15:53:42] NOTICE[1067]: chan_skinny.c:8459 config_load: Configuring skinny from skinny.conf
        [Nov 26 15:53:42] ERROR[1067]: ari/config.c:312 process_config: No configured users for ARI
        [Nov 26 15:53:42] NOTICE[1067]: cel_custom.c:95 load_config: No mappings found in cel_custom.conf. Not logging CEL to custom CSVs.
        [Nov 26 15:53:42] NOTICE[1067]: app_queue.c:9144 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.

  47. Аватар

    Здравствуйте! уже подключена виртуальная АТС. Телефоны поддерживают работу в двух sip (1,2). Возможно ли по второму каналу подключить только внутреннею телефонию без выхода в интернет. т. е не настраивать iptables И так далее, а только прописать номера внутренних телефонов и все. Получится так что по одной линии телефон подключен к виртуальной атс, а по второй только внутрення аст (астерикс). надеюсь понятно объяснил)).

    • Zerox

      Объяснили понятно. Это без проблем можно сделать, но пользоваться будет не так удобно, потому что нужно будет линии каждый раз на аппарате выбирать, по которым звонить. Если это устраивает, то можно настраивать.

      А по хорошему все внешние транки заводятся на астериск, а пользователи только к нему подключаются. Так и звонить удобнее, и управлять всем хозяйством. Ничего особо сложного в этом нет. У меня в статье как раз про это подробно и написано.

  48. Аватар
    Outsider2019

    Добрый день. Спасибо за статью. Я новичек и настроил астериск самым примитивным образом конечно, в одном флаконе с дистрибутива с Linux Sagnoma 7, так как предыдущая старая атс "рухнула", а вопрос с атс и звонками в офисе необходимо было решить в кратчайшие сроки. Через несколько дней работы, видимо какой-то из лог-файлов (пока не знаю, какой именно) переполнился и при входе через веб выдает ошибку: file_put_contents(): Only 0 of 96 bytes written, possibly out of free disk space
    И похоже, что эта проблема в самой платформе linux sagnome 7. Отсюда вопрос, как его можно почистить, если мне доступна консоль только freePBX ?
    Или всё же не остается никаких вариантов, кроме установки на Debian, который Вы описали в статье?

    • Zerox

      В статье у меня Centos. Про sagnoma вообще ни разу не слышал, даже не знаю, что это такое. Переставлять не обязательно, если все нормально настроено. Надо просто зайти на сервер и освободить занятое место. Через web интерфейс Freepbx скорее всего это сделать не получится. Нужна консоль сервера.

      • Аватар
        Аноним

        Добрый день.Спасибо за ответ. Но переустановить мне всё таки придётся. Что-то видимо я с разметкой диска при первоначальной установке я напортачил.

  49. Аватар

    Добрый день, подскажите пожалуйста
    При заходе на Asterisk CDR Viewer Mod выдает ошибку PDO::errorInfo(): could not find driver
    https://sun9-56.userapi.com/c855728/v855728551/14e736/hv8SmHRNEmE.jpg
    Centos 7
    php 7.1.33
    php-mysql установлен
    mysqlnd 5.0.12-dev

  50. Аватар
    Алексей

    Покупаете Raspberry PI 3 с гигом памяти в ДНС, ставите на него Астериск (желательно по этой статье с компилированием из исходников), настраиваете транк IAX2 с головным сервером, внутри подключаете по sip внутренние телефоны, настраиваете маршрутизацию (через головной офис или напрямик - это в диалплане).
    Если открываете порты наружу, то включайте fail2ban. Если не открываете - fail2ban будет только мешать.

  51. Аватар
    Алексей

    Имея большой опыт работы с sip протоколом за натом, могу посоветовать товарищам, соединяющим офисы микротиками через l2tp или pptp vpn, не связываться с открытием портов и пытаться через все это напрямик цеплять телефоны удаленных подразделений.
    Sip для телефонов, транки на sip непредсказуемо виснут. Для связи удаленных подразделений делайте транки на основе IAX2, там один порт и его проще контролировать. Когда виснет sip, хрен поймешь где что зависло и когда отвиснет.

    • Zerox

      Я обычно использую openvpn для объединения сетей. Проблем с sip при этом не наблюдаю. Все настраивается просто и очевидно.

      • Аватар
        Алексей

        Ну да, это пока сетей меньше десятка, они стабильно доступны и когда на головном сервере с астериском не отрубают питание.
        А когда все это начнет случаться (а по другому при GSM-доступе и не бывает), сессии начинают зависать в астериске и новые он принимать не хочет, микротик блочит разрешенные вроде бы порты, продажники жалуются директорам, а для меня жизнь обретает новые краски.
        Зачем нужен этот карнавал? Сделал транки через IAX2 и все перестало ломаться. Ну в общем каждый сам выбирает.

  52. Аватар

    Спасибо за статью. Хотелось бы видеть изменения в настройках конфигов астериска с учётом перехода на PJSIP.

  53. Аватар

    Спасибо за статью!

  54. Аватар

    Возникает такая ошибка, подскажите, пожалуйста, как ее решить.

    Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory
    asterisk.service: Supervising process 1147 which is not our child. We'll most likely not notice when it exits.

  55. Аватар

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

    • Аватар

      У меня не поднялось ODBC
      ODBC DSN Settings
      -----------------

      Name: asterisk
      DSN: MySQL-asterisk
      Last fail connection attempt: 2019-09-30 08:34:41
      Number of active connections: 0 (out of 1)

      Как его можно поднять вручную командой? или что нужно сделать? Почему при загрузке не поднялся автоматически?

      • Аватар

        Перезапустил через service asterisk restart, соединение появилось, но веб-форма все равно пустая.

  56. Аватар
    Алексей

    Добрый день.
    Владимир, а не подскажите какие настройки требуется добавить к группе, чтобы состоящие в ней номера могли звонить на 2-3 заранее известных внутренних номера?

    P.S.: Сервер установил, все завелось, все работает! Спасибо!

    • Zerox

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

      [local-zvonok]
      exten => 155,1,Dial(SIP/${EXTEN})
      exten => 156,1,Dial(SIP/${EXTEN})

      Пиры, которые будут входить только в контекст local-zvonok смогут звонить только на номера 155 и 156.

  57. Аватар

    Подскажите, есть связка Астериск и DVG6004s. Все работало прекрасно несколько лет, вдруг ни с того ни с сего перестало. а именно: мы звоним с софтфона через астериск в город, но нас не слышат (вообще ни звука), а мы слышим абонента на другом конце. При этом со внутреннего софтфона на внутренний софтфон все работает.
    На шлюз приходят 3 аналоговые линии из города, далее к WAN шлюза подключена сетевуха сервера с астериском. Вторая сетевуха на астериске подключена в локальную сеть в которой у нас софтфоны.
    Помогите пожалуйста разобраться.

    лог с астериска:

    [Sep 5 14:44:31] VERBOSE[3729] chan_sip.c: -- Registered SIP '107' at 192.168.0.233:5060
    [Sep 5 14:44:31] NOTICE[3729] chan_sip.c: Peer '107' is now Reachable. (17ms / 2000ms)
    [Sep 5 14:44:33] VERBOSE[3729] netsock2.c: == Using SIP RTP TOS bits 184
    [Sep 5 14:44:33] VERBOSE[3729] netsock2.c: == Using SIP RTP CoS mark 5
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:1] Macro("SIP/107-00000000", "user-callerid,SKIPTTL,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:1] Set("SIP/107-00000000", "AMPUSER=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:2] GotoIf("SIP/107-00000000", "0?report") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:3] ExecIf("SIP/107-00000000", "1?Set(REALCALLERIDNUM=107)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:4] Set("SIP/107-00000000", "AMPUSER=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:5] Set("SIP/107-00000000", "AMPUSERCIDNAME=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:6] GotoIf("SIP/107-00000000", "0?report") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:7] Set("SIP/107-00000000", "AMPUSERCID=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:8] Set("SIP/107-00000000", "CALLERID(all)="107" ") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:9] ExecIf("SIP/107-00000000", "1?Set(CHANNEL(language)=)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:10] GotoIf("SIP/107-00000000", "1?continue") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-user-callerid,s,19)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:19] Set("SIP/107-00000000", "CALLERID(number)=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:20] Set("SIP/107-00000000", "CALLERID(name)=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-user-callerid:21] NoOp("SIP/107-00000000", "Using CallerID "107" ") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:2] NoOp("SIP/107-00000000", "Calling Out Route: test") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:3] Set("SIP/107-00000000", "MOHCLASS=none") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:4] Set("SIP/107-00000000", "_NODEST=") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:5] Macro("SIP/107-00000000", "record-enable,107,OUT,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:1] GotoIf("SIP/107-00000000", "1?check") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-record-enable,s,4)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:4] ExecIf("SIP/107-00000000", "0?MacroExit()") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:5] GotoIf("SIP/107-00000000", "0?Group:OUT") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-record-enable,s,15)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:15] GotoIf("SIP/107-00000000", "0?IN") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:16] ExecIf("SIP/107-00000000", "0?MacroExit()") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:17] NoOp("SIP/107-00000000", "Recording enable for 107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:18] Set("SIP/107-00000000", "CALLFILENAME=OUT107-20190905-144433-1567669473.0") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:19] Goto("SIP/107-00000000", "record") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-record-enable,s,23)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:23] MixMonitor("SIP/107-00000000", "OUT107-20190905-144433-1567669473.0.wav,,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:24] Set("SIP/107-00000000", "CDR(userfield)=audio:OUT107-20190905-144433-1567669473.0.wav") in new stack
    [Sep 5 14:44:33] VERBOSE[3823] app_mixmonitor.c: == Begin MixMonitor Recording SIP/107-00000000
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-record-enable:25] MacroExit("SIP/107-00000000", "") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [89*********@from-internal:6] Macro("SIP/107-00000000", "dialout-trunk,4,89*********,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:1] Set("SIP/107-00000000", "DIAL_TRUNK=4") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:2] GosubIf("SIP/107-00000000", "0?sub-pincheck,s,1") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:3] GotoIf("SIP/107-00000000", "0?disabletrunk,1") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:4] Set("SIP/107-00000000", "DIAL_NUMBER=89*********") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:5] Set("SIP/107-00000000", "DIAL_TRUNK_OPTIONS=tr") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:6] Set("SIP/107-00000000", "OUTBOUND_GROUP=OUT_4") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:7] GotoIf("SIP/107-00000000", "0?nomax") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:8] GotoIf("SIP/107-00000000", "0?chanfull") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:9] GotoIf("SIP/107-00000000", "0?skipoutcid") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:10] Set("SIP/107-00000000", "DIAL_TRUNK_OPTIONS=") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:11] Macro("SIP/107-00000000", "outbound-callerid,4") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:1] ExecIf("SIP/107-00000000", "0?Set(CALLERPRES()=)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:2] ExecIf("SIP/107-00000000", "0?Set(REALCALLERIDNUM=107)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:3] GotoIf("SIP/107-00000000", "1?normcid") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-outbound-callerid,s,6)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:6] Set("SIP/107-00000000", "USEROUTCID=107") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:7] Set("SIP/107-00000000", "EMERGENCYCID=") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:8] Set("SIP/107-00000000", "TRUNKOUTCID=******") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:9] GotoIf("SIP/107-00000000", "1?trunkcid") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Goto (macro-outbound-callerid,s,12)
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:12] ExecIf("SIP/107-00000000", "1?Set(CALLERID(all)=******)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:13] ExecIf("SIP/107-00000000", "1?Set(CALLERID(all)=107)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:14] ExecIf("SIP/107-00000000", "0?Set(CALLERID(all)=)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-outbound-callerid:15] ExecIf("SIP/107-00000000", "0?Set(CALLERPRES()=prohib_passed_screen)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:12] GosubIf("SIP/107-00000000", "0?sub-flp-4,s,1") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:13] Set("SIP/107-00000000", "OUTNUM=89*********") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:14] Set("SIP/107-00000000", "custom=SIP/******") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:15] ExecIf("SIP/107-00000000", "1?Set(DIAL_TRUNK_OPTIONS=M(setmusic^none))") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:16] Macro("SIP/107-00000000", "dialout-trunk-predial-hook,") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk-predial-hook:1] MacroExit("SIP/107-00000000", "") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:17] GotoIf("SIP/107-00000000", "0?bypass,1") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:18] GotoIf("SIP/107-00000000", "0?customtrunk") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] pbx.c: -- Executing [s@macro-dialout-trunk:19] Dial("SIP/107-00000000", "SIP/******/89*********,300,M(setmusic^none)") in new stack
    [Sep 5 14:44:33] VERBOSE[3822] netsock2.c: == Using SIP RTP TOS bits 184
    [Sep 5 14:44:33] VERBOSE[3822] netsock2.c: == Using SIP RTP CoS mark 5
    [Sep 5 14:44:33] VERBOSE[3822] app_dial.c: -- Called SIP/******/89*********
    [Sep 5 14:44:37] VERBOSE[3822] app_dial.c: -- Call on SIP/******-00000001 placed on hold
    [Sep 5 14:44:37] VERBOSE[3822] channel.c: -- Music class default requested but no musiconhold loaded.
    [Sep 5 14:44:37] VERBOSE[3822] app_dial.c: -- SIP/******-00000001 is making progress passing it to SIP/107-00000000
    [Sep 5 14:45:01] VERBOSE[3563] asterisk.c: -- Remote UNIX connection
    [Sep 5 14:45:01] VERBOSE[3872] asterisk.c: -- Remote UNIX connection disconnected
    [Sep 5 14:45:06] VERBOSE[3822] app_macro.c: == Spawn extension (macro-dialout-trunk, s, 19) exited non-zero on 'SIP/107-00000000' in macro 'dialout-trunk'
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: == Spawn extension (from-internal, 89*********, 6) exited non-zero on 'SIP/107-00000000'
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [h@from-internal:1] Macro("SIP/107-00000000", "hangupcall") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:1] GotoIf("SIP/107-00000000", "0?endmixmoncheck") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:2] Set("SIP/107-00000000", "MIXMON_CALLFILENAME=/var/spool/asterisk/monitor/OUT107-20190905-144433-1567669473.0.wav") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:3] GotoIf("SIP/107-00000000", "1?defaultmixmondir") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,5)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:5] System("SIP/107-00000000", "test -e /var/spool/asterisk/monitor/OUT107-20190905-144433-1567669473.0.wav") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:6] NoOp("SIP/107-00000000", "SYSTEMSTATUS = SUCCESS") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:7] GotoIf("SIP/107-00000000", "1?endmixmoncheck") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,9)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:9] NoOp("SIP/107-00000000", "End of MIXMON check") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:10] GotoIf("SIP/107-00000000", "1?nomeetmemon") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,28)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:28] NoOp("SIP/107-00000000", "End of MEETME check") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:29] GotoIf("SIP/107-00000000", "1?noautomon") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,34)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:34] NoOp("SIP/107-00000000", "TOUCH_MONITOR_OUTPUT=") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:35] GotoIf("SIP/107-00000000", "1?noautomon2") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,41)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:41] NoOp("SIP/107-00000000", "MONITOR_FILENAME=") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:42] GotoIf("SIP/107-00000000", "1?skiprg") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,45)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:45] GotoIf("SIP/107-00000000", "1?skipblkvm") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,48)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:48] GotoIf("SIP/107-00000000", "1?theend") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Goto (macro-hangupcall,s,50)
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:50] AGI("SIP/107-00000000", "hangup.agi") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] res_agi.c: -- Launched AGI Script /var/lib/asterisk/agi-bin/hangup.agi
    [Sep 5 14:45:06] VERBOSE[3822] res_agi.c: -- AGI Script hangup.agi completed, returning 0
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: -- Executing [s@macro-hangupcall:51] Hangup("SIP/107-00000000", "") in new stack
    [Sep 5 14:45:06] VERBOSE[3822] app_macro.c: == Spawn extension (macro-hangupcall, s, 51) exited non-zero on 'SIP/107-00000000' in macro 'hangupcall'
    [Sep 5 14:45:06] VERBOSE[3822] pbx.c: == Spawn extension (from-internal, h, 1) exited non-zero on 'SIP/107-00000000'
    [Sep 5 14:45:06] VERBOSE[3823] app_mixmonitor.c: == MixMonitor close filestream
    [Sep 5 14:45:06] VERBOSE[3823] app_mixmonitor.c: == End MixMonitor Recording SIP/107-00000000
    [Sep 5 14:45:27] VERBOSE[3729] chan_sip.c: -- Unregistered SIP '107'
    • Zerox

      В логе я каких-то явных ошибок не заметил. Обычно, когда кого-то не слышно, это сетевые проблемы, особенно если asterisk за nat работает. Чудес не бывает, если много лет работало, а потом перестало, значит что-то изменилось. Если нет специалиста по настройке астериск, ищите, что изменилось за последнее время и возвращайте как было.

      • Аватар

        нат не при чем, потому что на шлюз идут аналоговые линии 3 штуки из города, заходят на шлюз, из шлюза патчкорд напрямую идет на сетевуху астериска. и со второй сетевухи астериска уже идет в сеть в которой софтфоны наши.
        по логам с железяки (шлюза) говорится что RTP S=2745 R=0 Lost=-1
        т.е. ресивд-а нет пакетов.

  58. Аватар
    Француз

    Камрад, а подскажите насколько сложно будет после того как вы настроено по Вашему мануалу перевести в базу? Ну т.е. чтобы конфиг были не в файлах а в базе, чтобы изменения применялись сразу и не приходилось грузить диалплан и т.д. Реально ли это исправить на текущей стадии или нужно изначально поднимать по другому?

    • Zerox

      Я не знаю, никогда не хранил конфиги в базе. Подозреваю, что это не должно быть проблемой. Логика настроек одна и та же. А перенос в разные форматы вопрос чисто технический. Это по идее :)

  59. Аватар

    Владимир, подскажите пожалуйста, это нормально, что при выполнении команды:
    contrib/scripts/install_prereq install

    вылазит сообщение, что
    Пакета с названием speexdsp-devel не найдено.
    Пакета с названием iksemel-devel не найдено.
    Пакета с названием libresample-devel не найдено.
    Пакета с названием hoard не найдено.
    Разрешение зависимостей

    и эти пакеты так и не устанавливаются в систему - даже при разрешении зависимостей?

    • Zerox

      Точно не знаю. Если потом астериск нормально собирается и устанавливается, то в целом, проблем может и не быть. У астериска обширный функционал, поэтому и пакетов с зависимостями много. Но часто большая часть из них не требуется, особенно если используется типовой функционал по организации звонков.

      • Аватар

        Астериск собрался и запустился успешно - без ошибок. Но вот эти указанные пакеты пока не дают покоя...
        Функционал пока используется самый простой, без излишеств - ВМ-ка с чистым CentOS.
        Спасибо Вам за понятный ответ!

  60. Аватар

    Вроде всё настроил по статье. iptables отключён и включать пока не буду. Группы создал свои по аналогии с примеров. Настраиваю телефоны, но они не регистрируются - "время вышло". Не понимаю, что не так.

    • Аватар

      Всё, разобрался. Оказывается фаервол мешал. Добавьте в статью заметку о том, что если сразу с вопросом фаервола не разобраться, то телефоны регистрироваться не будут.

      • Аватар

        А какой именно вопрос с файрволом? У меня та же ситуация. Все установлено и настроено по инструкции, но при попытке регистрации софтфона не происходит ничего, т.е. запросы на астер приходят, но сам сервак ничего не отвечает. Что нужно сделать?

        • Аватар

          Точно не помню, но по-моему я его то ли вырубил, то ли порты пробросил. Короче, работе Астера мешал именно фаервол. На этом сайте есть инструкция по нему.

          • Аватар

            Спасибо, Марат. А Астер у вас на реальном серваке стоит или на виртуалке? У меня на виртуалке и в принципе проблем как бы быть не должно. Selinux и iptables отключены, по ssh заходит, звонилка стоит на хосте. Интересно то, что видно, что запросы приходят от моего хоста на регистрацию, на нужный порт, но сам астер никаких ответов не дает. Перерыл уже весь интернет, задолбал своих коллег-специалистов по астеру, проблему так и не нашли. В общем мистика

            • Аватар

              На виртуалку, для теста. Была мысль заменить нашу телефонию на Астериск, так и осталось это в планх. Честно говоря, уже и не вспомню всех нюансов. Тоже пару дней бился над своей проблемой, пока не нашёл причину. Со своей стороны могу только посоветовать в данной ситуации поднять ещё одну виртуалку и по новой накатить Астериск.

              • Аватар

                В общем разобрался. Оказалось, что просто systemctl stop iptables не достаточно. Нужно также вырубить firewalld. Запустил tcpdump -u и регистрацию в софтфоне, наткнулся на эту строку icmp host asterisk is unreachable admin prohibited filter. Через 5 минут ответ нашелся https://unixspace.wordpress.com/2013/06/12/35/comment-page-1/

  61. Аватар
    Француз

    Zerox, Камрад, ну подтолкните еще в правильном направлении!!!!
    Изменил первую строчку в экстеншене записи и сделал вот так:
    exten => s,1,Set(fname=${STRFTIME(${EPOCH},,%Y/%m/%d)}/${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
    Это позволяет теперь писать в заданную по дефолту директорию по папкам /2019/07/17 к примеру. Все проверено. Папка создалась, записи кидаются в нее, НО не идет отображение на веб-форме.
    Я зашел в конфиг и выбрал 4-ый пункт в разделе формата хранения:
    ## Если 4, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/home/calls/2015/12/01".
    'storage_format' => 4,
    НО как я понял это работает только если записи кидаются в дефолтную папку "/home/calls/", но у меня она другая, поэтому прослушать записи на форме не возможно.
    Как можно подкорректировать конфиг форму чтобы он смотрел не в /home/calls/, а в другой указанной папке ?

    • Zerox

      Там в конфиге где-то настраивается папка. Посмотри повнимательнее. Я настраивал это последний раз несколько лет назад. Уже не помню подробностей, но там не сложно.

      • Аватар
        Француз

        Блин, невнимательно читаю описание. Путь я указал там, выбрал не тот пункт в storage.

  62. Аватар
    Француз

    Камрад, а подскажите касательно записи сразу в папки с указанием дня, а не просто в корень указанной.
    В мануале мы указывает просто папку, куда будут кидать сконвертированные в мр3 файлы. И даете приписку что в редми прописано как сделать чтобы записи раскидывались по папкам. Но там обычный скрипт, который в начале каждого дня раскидывает файлы предыдущего дня в папку в названии которого указан нужный день, но в базе то это не меняется. И получается: сегодня все записи кидаются в общую, на утро след. дня они скриптов перемещаются в созданную папку с номером дня, но на веб-форме ломаются ссылки. Если я захочу прослушать вчерашний день, то записей не будет. Он же будет искать в старой папке, а их там уже нет.
    Как можно подкорректировать скрипт или может сразу макрос, чтобы они писали записи сразу в папку с указание дня, а не просто в кучу, а то уже порядка 20 тыс файлов.

  63. Аватар
    Андрей

    Добрый день!

    лог текстовый пишется в astrerisk-cdr-viewer

    Но аудио файлы не прикрепляются

    по завершению разговора вижу ошибку:

    cdr_mysql.c:219 mysql_log: Cannot connect to database server localhost: (1044) Access denied for user 'asteriskcdruser'@'localhost' to database 'asteriskcdrdb'

    • Zerox

      Тут прямым текстом написано, в чем проблема:
      Cannot connect to database server localhost: (1044) Access denied for user ‘asteriskcdruser’@’localhost’ to database ‘asteriskcdrdb’

  64. Аватар
    Никита

    Доброго времени суток! Мануал отличны настроил все пашет, но почему то вместо DID получаю S

    Executing [s@ivr-main:2] NoOp("SIP/Tele2_XXXXXXXXXXX", "s") in new stack

    Кто может подсказать почему так

  65. Аватар
    Француз

    Я настроил запись, там есть кнопка удаление записи разговора. Но когда я нажимаю на нее выдается ошибка что нет правда на папку. Как понять под каким пользователем веб-формы пытается удалить файл из папки, чтобы потом дать права?

    • Аватар
      Француз

      Вопрос закрыт. Дал права на Apache и вроде удаляются записи.

      • Zerox

        Все правильно. Панель работает под web сервером. Для удаления файлов надо дать доступ пользователю, под которым запущен web сервер apache.

  66. Аватар

    Макросы как я понял будут убираться из астериска, нужно переписывать код на Gosub?

    [Jun 28 12:47:39] WARNING[24566][C-00000001]: app_macro.c:274 _macro_exec: Macro() is deprecated and will be removed from a future version of Asterisk.
    [Jun 28 12:47:39] WARNING[24566][C-00000001]: app_macro.c:275 _macro_exec: Dialplan should be updated to use Gosub instead.

  67. Аватар

    Осталось только указать настройки подключения к базе данных cdr viewer. Эти настройки находятся в файле inc/config.inc.php. Задаем там следующие параметры:

    Подскажите пожалуйста , о каком файле идет речь?

    sudo find / -name config.inc.php
    /etc/phpMyAdmin/config.inc.php
    /usr/share/phpMyAdmin/setup/frames/config.inc.php
    /usr/share/phpMyAdmin/test/test_data/config.inc.php

  68. Аватар

    Здравствуйте. Помогите пожалуйста советом. Имеется сервер Asterisk, большая часть абонентов сидит в локальной сети, абонентов много. Но требуется одного подключить снаружи, через интернет. Порты на шлюзе открыл, но коннекта всё равно нет. Как-то можно подключить одного абонента снаружи, не переделывая всю конфигурацию?

    • Zerox

      Надо смотреть настройки пиров. Возможно, для них разрешены подключения только из локальной сети. Если это так, то проброса портов не достаточно. Для конкретного пира нужно будет разрешить подключения с любого ip, плюс, скорее всего и другие настройки изменить. Зависит от того, как настроен астериск - напрямую смотрит в интернет или через NAT.

      • Аватар

        Смотрит через NAT, в роли которого выступает отдельная машина. Ок, а где именно это настраивать, и какой параметр за это отвечате?

  69. Аватар

    Столкнулись с проблемой /asterisk: error while loading shared libraries: libasteriskssl.so.1

    после этого /configure
    make
    make install

    и как то все заработало может кому поможет

  70. Аватар

    Подскажите, как запихнуть преобразование записей mp3 в конференцию. Я пытался сделать по аналогии в confbridge с тем что мы делали за для записи обычных телефонов, но не работает. А если по дефолту ставить значение на запись yes и указать путь то конфу пишет в wav.
    МОжет не стоит лезть в конфу и записывать через диалплан, т.е. как то добавить запись перед:
    exten => 999,1,Answer()
    exten => 999,n,ConfBridge(1,confer)

    Подскажите как правильно сделать?

  71. Аватар
    Сергей

    уже нашел cd -

  72. Аватар
    Сергей

    Нажал на F12 и сохранилось. Вначале я был в директории с исходниками. cd asterisk* . После установки Asterisk программа не вернулась в исходную директорию.
    make[1]: Вход в каталог `/home/maxcim/asterisk-16.3.0/menuselect'
    make[1]: `makeopts' не требует обновления.
    make[1]: Выход из каталога `/home/maxcim/asterisk-16.3.0/menuselect'
    /bin/sh: main/version.c.tmp: Отказано в доступе
    make: *** [main/version.c] Ошибка 1
    [maxcim@localhost asterisk-16.3.0]$
    Как вручную вернуться в исходную директорию? Так как требуется дальше: "Настроим запуск астериск от системного пользователя asterisk"

  73. Аватар
    Сергей

    Приветствую. Окно выборов компонентов сборки. Выбрал компоненты. А как сохранить? По книге "Завершив работу с окном выбора компонентов сборки, введите символ Х , чтобы сохранить изменения и закрыть окно." Непонятно как закрыть. Не проходит команда sudo make . Получаю в ответ : "make: *** Не заданы цели и не найден make-файл. Останов." Наверно вопросы простые кто нибудь ответьте.

  74. Аватар

    >Параметр callerid можно задать кириллицей, но могут возникнуть проблемы с некоторыми телефонами и точно возникнут проблемы, когда вы будете вести статистику звонков в mysql. Я не смог победить эту проблему с кодировками, поэтому использую только латиницу в этом параметре. Туда можно писать либо должность, либо ФИО человека.

    На сегодняшний день не нашли решение проблемы с кириллицей?

  75. Аватар
    Андрей

    Добрый день.
    Имеем Сип транк с 2 номерами. Городской и мобильный.
    Транк поднимается без проблем дозвоны идут на городской номер. А мобильный никак не работает. Пишет все абоненты заняты.
    Приписывал входящие маршруты с указанием разных номеров. Никаких результатов.
    Как правильно прописать 2 номера?

  76. Аватар
    Андрей

    Добрый день. Имеем Asterisk + Freepbx , SIP транк с 2 номерами . 1 городской, 2 мобильный. У них 1 учетка. И она привязана к городскому. В Астериске сип поднимается и происходят дозвоны только на городской номер. На мобильном постоянно : На данный момент операторы заняты. Пробывал прописывать в поле from= оба номера. Никаких изменений. Запрашивал у провайдера ответили тоже самое 1 учетка на 2 номера. Не могли бы подсказать как прописать в настройках второй номер.

  77. Аватар

    Выяснилось, пропало соединение с ODBC, поэтому ничего не пишется в базу. Я не силен в базах данных не подскажете как вернуть соединение или проверить почему оно не конектится. Базовые логи чистые. Настраивалось все по 11 пункту и до перезагрузки работало. Что могло отключиться после ребута сервера?

  78. Аватар

    Почему может не работать детализация?
    Настроил, открыл веб-морду сделал пробный звонок: есть детали и есть запись. Грузанул сервак. Снова позвонил. Детализации нету при поиске звонок не находит, но аудиозапись в папке есть. Но на веб морде нет самого звонка, как будто в базу запись не сделалась, что был звонок. Я мог что-то упустить в автозагрузке?

    • Аватар

      Апну вопросик с вашего позволения. За выходные так и не разобрался. Вроде повторно все проделал, но в детализации всего один звонок. Как можно проверить пишутся ли данные в базу?

    • Zerox

      Для начала проверьте, если ли ваш звонок в дефолтном логе звонков астериска - /var/log/asterisk/cdr-csv/Master.csv
      Дальше посмотрите, есть ли информация о звонке в mysql базе, зайдя в таблицу с записями.
      Если все везде есть, то обратите внимание на web панель. Я видел в ней такие глюки и не раз, когда звонки не отображались. Сразу под настройками фильтрации появляется надпись "Найдено 48, отфильтровано 2 записей", хотя никаких фильтров нет. И этих двух звонков реально нет в веб панели, хотя они есть в статистике.
      Скрин

      • Аватар

        В базе нету записей, только одна запись, которая была до перезагрузки. Новые туда не пишутся. Они должны переносится из дефолтного лога или вносятся при каждом звонке?
        Я перепроверил все файлы и все данные в пункте "11 Учет и просмотр статистики звонков (cdr viewer)" Все что вы расписали у меня записано и добавлено. Есть какой-то механизм для проверки почему не идет запись в базу? в 11 и 12 пункте вроде бы нет никаких автозагрузок при старте системы, которые я мог бы упустить.

  79. Аватар

    Можете подсказать с переводом звонка на внешку? Вопрос на тостере, чтобы не писать в комментарии кучу текста с логами. Буду признателен за направление куда копать - toster.ru/q/604395
    Вроде добавлял строку, которую там говорят сделать, но тогда звонок просто в никуда уходит.

  80. Аватар

    Камрад!
    MACRO выпилили из астериска и с ним уже не работает. Предлагают использовать Gosub, но я пробовал заменить Macro на Gosub и macro-recording на sub-recording. Выдается ошибка app_stack.c:592 gosub_exec: Attempt to reach a non-existent destination for Gosub: (Context:recording, Extensions:105, Priority:101)

    • Zerox

      Печальные новости. Не понятно, чем MACRO не угодил. Куча готовых конфигов с ним, теперь все переделывать. Я пока не делал новых установок со свежими версиями, поэтому не сталкивался.

      • Аватар

        Понял, спасибо.
        Еще такой вопрос: Почему на вебморде может не отображаться вариант проигрывания записи?
        Сделал все по мануалу на 13-ой версии - все окей. Когда захожу на вебморду в детализацию, показываются звонки, но в столбце "Запись", стоит перечеркнутый кругляшок при наведении на который показывается "Нет".
        Но при этом запись есть и в папке mnt/calls находятся, но на веб морде их нет. Куда копать?

        • Zerox

          Наверно что-то с путями к файлам. Панель не видит эти файлы. Может в базе пути с ошибкой добавляются. Думаю в эту сторону надо копать, если сами записи реально есть.

          • Аватар

            Да, спасибо! Была опечатка в пути, исправил все заработало.
            По MACRO я вас немного обманул в 16-ом пока просто выдается предупреждение что МАКРО устарело и вследующей версии будет удалено. Просят использовать GoSub.

  81. Аватар

    Привет! Статья отличная, но есть вопросы именно по установке из репозитория. Все вроде и хорошо и складно, но не все модули присутствуют (app_directory.so app_ices.so app_mp3.so app_page.so app_voicemail.so format_jpeg.so func_audiohookinherit.so) вот этих вот никак нету(((( Ставлю 16-ю версию. Почему из репы, а не собираю из сырцов? Потму что необходимо обновлять систему (ставлю на centos 7). При раворачивании из сырцов - все гуд, все модули на месте. При подкладывании файлов модулей отдельно - ругань на то что модули не иницилизированны. Спасибо за ответ.

  82. Аватар
    Я не робот

    Отличный материал, спасибо! Настройки астериска копипастом заработали и на OpenBSD, вот прям как есть, только IP изменил в соответствии со своим. Но это уже просто для проверки, я тут в виртуалке кручу OpenBSD для всяких экспериментов, проверяю на применимость в моих сценариях использования. А в продакшн пошёл Debian 8, с астериском, установленным по вашей статье.

    На вашем сайте блокировщик рекламы отключил, хоть как-то отблагодарить за труды.

  83. Аватар
    Алексей

    Очень нравится язык, которым написана статья.
    Большое спасибо за ваши труды.
    В тексте несущественная опечатка: "часовой пояс GTM"
    Похоже, имелось ввиду "GMT".

  84. Аватар

    Здравствуйте, прошу помочь с настройкой обработки # в меню ivr, есть freepbx с настроенным меню ivr, в нем говорится что при нажатии * повторно проговаривается сообщение, а при нажатии # перебрасывается в главное меню, но почему то при нажатии # на английском произносится слово transfer, потом длинный гудок секунд 15 и звонок сбрасывается

    • Аватар

      В asterisk клавиша # закреплена как команда blindtransfer (перевод звонка без согласования). Либо менять клавишу для перевода звонков в /etc/asterisk/features.conf секция [featuremap], либо в IVR использовать другую клавишу для перехода в меню. Например 0.
      Удачи=)

  85. Аватар
    Сергей

    Прошу помочь с ошибкой возникшей при подключении 3CXPhone.
    в окне дебаг 3CXPhone следующая ошибка подключения:
    not connected: authentication failed
    phone has been disconnected - error:401
    Phone is no longer connected
    в логах Asterisk:
    [2018-10-26 09:59:19] NOTICE[9155]: res_pjsip/pjsip_distributor.c:649 log_failed_request: Request 'REGISTER' from '"101" ' failed for '192.168.100.30:55392' (callid: ODhmNDU5YzlkNGY4MzhhYmY5ZmRkYjFkMWVkNGRiMDg.) - No matching endpoint found
    [2018-10-26 09:59:19] NOTICE[9155]: res_pjsip/pjsip_distributor.c:649 log_failed_request: Request 'REGISTER' from '"101" ' failed for '192.168.100.30:55392' (callid: ODhmNDU5YzlkNGY4MzhhYmY5ZmRkYjFkMWVkNGRiMDg.) - No matching endpoint found
    [2018-10-26 09:59:19] NOTICE[9155]: res_pjsip/pjsip_distributor.c:649 log_failed_request: Request 'REGISTER' from '"101" ' failed for '192.168.100.30:55392' (callid: ODhmNDU5YzlkNGY4MzhhYmY5ZmRkYjFkMWVkNGRiMDg.) - Failed to authenticate
    iptelephone*CLI>

  86. Аватар
    Андрей

    Приветствую!!! Большое тебе спасибо!!! Статья класс, с никс системами вообще не знаком но с твоей помощью получилось поднять мини-АТС.

  87. Аватар

    Камрад, а не планируется ли актуальный мануал по Astersik 16.0 + Centos 7 в ближайшее время ?

    • Zerox

      А там есть какие-то принципиальные отличия, кроме процесса установки? Обычно у астериск хорошая обратная совместимость. Старые диалпланы работают в новых версиях. А это самое главное, что есть в настройках.

      • Аватар

        Да есть малец. Я в линуксе еще слабо шарю и ошибки для меня это просто жесть.
        Вот к примеру ставил астериск на 10 maria а не на 5 в комплекте, который идет.
        Поставил pjsip по мануалу, потом jansson, потом астериск 16. При сборке ./configure он выдает предупреждение:
        https://cdn1.savepice.ru/uploads/2018/10/13/2507f4ffedccc9ccec3493850bd3ab23-full.png

        Ну тут вроде очевидно было и я просто добавил эту строку с jansson. Собрался нормально. Пошел выбирать меню и все выбрал что в мануале, начал делать make и он не может установить app_sql
        https://cdn1.savepice.ru/uploads/2018/10/13/8a582338d74b5b0b8803fa7c2a071b6f-full.png

        Вероятно он не понимает что это надо делать с 10.3 Maria, а он может пытается делать с 5, и вот пока дальше могу двинуть, хз как установить этот модуль .so

        • Zerox

          А зачем астериску maria 10? Я бы просто поставил на mysql 5 и не тратил время на решение этой проблемы. В данном случае разницы никакой не будет.

          • Аватар

            Ну хотелось как бы все последнее поставить и не заморачиваться. Смысл ставить 5-ую версию, когда уже 10.3 есть. Может она как нибудь лучше оптимизирована. Или астер под нее лучше заточен.

            • Zerox

              Так в том то и дело, что разницы не будет, а заморачиваться как раз надо. Mysql вам нужен, если собираетесь там статистику хранить, либо для еще какого-то дополнительного функционала. Самому астериску mysql для работы не нужен.

              • Аватар

                Ну в принципе да, тогда получается по сути можно не устанавливать все что связано с рнр и бд, т.е убрать из установки след.:
                mariadb-server mariadb php php-mysql php-mbstring tftp-server httpd php-pear phpmyadmin php-process php-xml

                Поставить pjproject, jansson и сам астериск. Запустить меню, собрать и прсот добавить диалпланы.
                Всякие CDR и прочее можно опустить ?

  88. Аватар

    Благодарю за помощь!

  89. Аватар

    Здравствуйте! Все выполнил по шагово по вашей статье однако сервис не запускается ystemctl status asterisk
    ● asterisk.service - LSB: Asterisk PBX
    Loaded: loaded (/etc/rc.d/init.d/asterisk; bad; vendor preset: disabled)
    Active: failed (Result: resources) since Ср 2018-07-25 10:07:07 +06; 5s ago
    Docs: man:systemd-sysv-generator(8)
    Process: 22496 ExecStart=/etc/rc.d/init.d/asterisk start (code=exited, status=0/SUCCESS)

    июл 25 10:07:07 localhost.localdomain systemd[1]: Starting LSB: Asterisk PBX...
    июл 25 10:07:07 localhost.localdomain asterisk[22496]: Starting asterisk:
    июл 25 10:07:07 localhost.localdomain systemd[1]: PID file /var/run/asterisk/ast....
    июл 25 10:07:07 localhost.localdomain systemd[1]: Failed to start LSB: Asterisk PBX.
    июл 25 10:07:07 localhost.localdomain systemd[1]: Unit asterisk.service entered ....
    июл 25 10:07:07 localhost.localdomain systemd[1]: asterisk.service failed.
    Hint: Some lines were ellipsized, use -l to show in full

    Будто такого сервиса и нет. Помогите в рещении проблемы.
    Астериск - asterisk-13.22.0
    CentOS - Linux localhost.localdomain 3.10.0-862.9.1.el7.x86_64 #1 SMP Mon Jul 16 16:29:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

    • Аватар
      Дмитрий

      Подтверждаю.
      service asterisk start
      Starting asterisk (via systemctl): Job for asterisk.service failed because a configured resource limit was exceeded. See "systemctl status asterisk.service" and "journalctl -xe" for details.
      [FAILED]

      [root@localhost asterisk-13.22.0]# systemctl status asterisk.service
      ● asterisk.service - LSB: Asterisk PBX
      Loaded: loaded (/etc/rc.d/init.d/asterisk; bad; vendor preset: disabled)
      Active: failed (Result: resources) since Tue 2018-07-31 09:00:54 MSK; 27s ago
      Docs: man:systemd-sysv-generator(8)
      Process: 21055 ExecStart=/etc/rc.d/init.d/asterisk start (code=exited, status=0/SUCCESS)

      Jul 31 09:00:54 localhost.localdomain systemd[1]: Starting LSB: Asterisk PBX...
      Jul 31 09:00:54 localhost.localdomain asterisk[21055]: ERROR: /usr/sbin/asterisk not found
      Jul 31 09:00:54 localhost.localdomain systemd[1]: PID file /var/run/asterisk/asterisk.pid not readable (yet?) after start.
      Jul 31 09:00:54 localhost.localdomain systemd[1]: Failed to start LSB: Asterisk PBX.
      Jul 31 09:00:54 localhost.localdomain systemd[1]: Unit asterisk.service entered failed state.
      Jul 31 09:00:54 localhost.localdomain systemd[1]: asterisk.service failed.

      • Аватар
        Руслан

        Такая же проблема

        • Zerox

          Сейчас проверю.

        • Zerox

          Проблему увидел. Только что попробовал собрать астериск и получил ошибку. Исправляется она добавлением ключа with-pjproject-bundled при конфигурации астериска. У меня в статье было:

          ./configure --libdir=/usr/lib64

          а теперь надо:

          ./configure --libdir=/usr/lib64 --with-pjproject-bundled

          После этого астериск собирается и запускается. Странно, что вы все пытались запустить астериск, хотя он просто не собрался и не установился. Ошибка была раньше.

          Подробнее об этой ошибке - https://community.asterisk.org/t/solved-compile-asterisk-13-22-0/75411/5

          • Аватар

            актуальнее:
            ./configure --with-pjproject-bundled --with-jansson-bundled
            - обе эти библиотеки рекомендуется устанавливать именно bundled с 13 Астера..

  90. Аватар

    Появилось парочка вопросов. Первый - как обновить? я говорю не про переход с 13 на 14 или 15, а про переход с 13.14 до 13.21 допустим (точно не помню какая щас там версия)
    И такой вопрос. Переодически стала выскакивать ошибка

    Call from peer '205' rejected due to usage limit of 1
    Failed to place call for device 205, too many calls

    При этом ни входящая ни исходящая связь не работает
    В гугле ничего внятного не нашёл по этому вопросу.

    Решается либо перенастройкой телефона, либо увелечением значения call-limit в настройках группы

    • Аватар

      Уточню что связь не работает именно на этом телефоне -_- По крайней мере звонки из наружи и наружу. Внутри как то не догадался проверить

    • Zerox

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

      Call from peer ‘205’ rejected due to usage limit of 1
      Из текста ошибки понятно, что стоит ограничение на одну линию на пир. Эта линия чем-то занята. Надо либо смотреть, чем занята, либо увеличивать этот лимит.

      • Аватар

        не подскажите чем и как смотреть?

        • Zerox

          Если линия занята, значит по телефону кто-то разговаривает. Или работает какая-то служба на телефоне, которая занимает линию. Можно логи астериска посмотреть, можно просто на телефон глянуть, что там с ним не так. Линия просто так не может быть занята.

  91. Аватар

    И еще вопрос... Если схема такая: VPS где поднят asterisk -> Internet -> роутер -> 2 пк с софтофоном 3cx. Будут ли нормально работать звонки с одного пк на другой?
    Просто на моменте "Если у вас так же, то все в порядке. Чтобы протестировать звонки, нам нужно подключить двух абонентов. Настраивайте еще один телефон или софтофон. Проверяйте в списке подключенных пиров чтобы было 2 подключения и попробуйте позвонить друг другу. Если вы все сделали правильно, то локальные звонки должны работать." сложилась такая картина - если позвонить с одного номера на другой, то звонок проходит. Но - при нажатии на кнопку "ответить" в софтофоне на входящий вызов - на исходящем начинает идти время звонка, а на принимающем продолжается "вызов"... Сброс звонка проходит нормально при этом...

    • Аватар

      Почитав форумы возможно понял в чем причина... Возможно из-за роутера (MikroTik) - но так и не смог решить проблему (пробовал разные пробросы \ открытие портов). Перепробовал что советовали - но результата нет. Даже подключив trunk - звонки идут в обе стороны, но без возможности нормально "ответить" при входящих, и нет звука при исходящих звонках (например через zadarma на номер 1111). Что я делаю не так и как это исправить? :(

      • Аватар

        В общем разобрался - сейчас звонки нормально проходят как внутри сети (типа "локальные"), так и входящие \ исходящие через trunk.
        Вылечилось в моем случае (VPS где поднят asterisk -> Internet -> роутер -> 2 пк с софтофоном 3cx) через установку в sip.conf в [general] nat=yes, и удаление в шаблонах пользователей nat=no...

  92. Аватар

    При установке столкнулся с проблемой - make посл make menuselect, когда выбрали необходимые модули, не проходил и вываливался с ошибкой. Долго промучался, перечитал кучу форумов - как оказалось (или я все таки что-то не так делал) asterisk не устанавливается нормально на mariadb-10.*... В итоге установил с нуля систему и все нормально дальше установилось.
    А интересно - в борьбе со всякими ботами \ сканерами поможет назначение нестандартных портов для asterisk'a? И какие могут быть последствия \ подводные камни \ проблемы?

  93. Аватар

    Подскажите пожалуйста, как побороть эхо!

  94. Аватар

    Ох, не кидайте тапками. Статья годная.
    Не хотите проапгрейдить или написать ещё одну с WebRTC и тонкими клиентами на браузерах?
    Было бы очень интересно более опытными глаза почитать про ICE STUN сервера, и как эту муть настраивать.
    В голове только куски необработанной инфы, о sipml5, jssip и прочем)

  95. Аватар
    aleks.tyumen

    Один вопрос конфигурационные файлы sip и extensions вам удобнее будет посмотреть прямо на самом форуме, либо добавить их ссылкой предварительно сохранив в txt?

  96. Аватар
    aleks.tyumen

    Извиняюсь, сейчас все исправлю

  97. Аватар
    aleks.tyumen

    что то я вам писал писал сейчас сообщение со всеми конфигами оно не ушло и пустое. секунду

    • Zerox

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

  98. Аватар
    Александр

    Локальные проходят а входящие нет. Абонент не доступен. Я вообще думаю что ошибка может в диал плане? С вами можно как то поговорить по этому поводу? Может icq или только через форум? Странно транк сам регистрируется нормально. Мне б разобраться сначала с настройками для исходящего. В файле sip.conf прописана регистрация у провайдера и два внутренних номера. В екстеншинс.конф прописан данный диалплан, между собой все работает а исходящие не работают. Уже неделю бьюсь.

    • Zerox

      Ошибка в диалплане. Я думаю, у вас транк, который зарегистрирован у провайдера назван одним именем, а обращаетесь вы к нему по другому имени. Поэтому он корректно регистрируется у провайдера, но звонки при этом не работают. Можете на форум выложить все свои конфиги (sip.conf и extensions.conf) Когда у меня будет время, я посмотрю их.

  99. Аватар
    Александр

    Всем доброго дня! Люди добрые, помогите , очень нуждаюсь в помощи, не понимаю уже в чем тут может быть дело. В общем пытаюсь с нуля установить и настроить самым примитивным вещам vicibox. версия ПО OpenSuSE Leap v.42.3 64-bit.Asterisk v.11.20.0-vici,ViciDial SVN Trunk v.2.14-628a build 170913-0908 revision 2815. В общем настраиваю sip телефонию Билайн. Вот на примере Самого элементарного у меня не получается. TRUNK поднял в конфигурации. файл extension создаю с нуля по вашей статье.
    [general]
    static=yes
    writeprotect=no
    [globals]
    [default]

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

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

    include => handup-sip

    ;Входящие звонки
    [call-in]
    exten => 9698033***,1,Dial(SIP/123)
    где 123, мой внутрений номер в этой системе, к которому я подключился через zoiper.

    при попытке куда либо позвонить выдает
    [May 8 17:19:46] -- Executing [89995496380@call-out:1] Dial("SIP/123-0000000e", "SIP/89995496380@9698033453") in new stack
    [May 8 17:19:46] WARNING[8505][C-00000016]: chan_sip.c:6066 create_addr: Purely numeric hostname (9698033453), and not a peer--rejecting!
    [May 8 17:19:46] WARNING[8505][C-00000016]: app_dial.c:2455 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Subscriber absent)
    [May 8 17:19:46] == Everyone is busy/congested at this time (1:0/0/1)
    [May 8 17:19:46] -- Auto fallthrough, channel 'SIP/123-0000000e' status is 'CHANUNAVAIL'

    буду рад любой помощи, бьюсь уже неделю

    • Zerox

      Судя по логу, какая-то проблема с транком. Что-то где-то напутано с названиями. Ошибка в поиске ищется легко, вариантов ошибки может быть много. разбирайтесь аккуратно в конфигурации. Локальные звонки проходят? Входящие?

  100. Аватар
    Владимир

    Заинтересовал пункт про переадресацию на мобильный телефон, у вас описан случай если нету телефона, а можно ли реализовать когда есть номер, есть телефон, но по каким-то причинам он не ответил в заданное по умолчанию время и тогда звонок уходил на сотовый (например человек в отпуске или командировке)?
    Попробовал с помощью FoolowMe, но видимо не то делаю и отрабатывает общее правило call-out

    • Zerox

      Конечно можно. Вот пример:

      exten => 120,1,Dial(SIP/120,10,t)
      exten => 120,2,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?:3)
      exten => 120,3,Dial(SIP/89161111111@mcn

      Звонок идет на внутренний номер 120, если 10 секунд никто не ответил, то идет переадресация на мобильный через транк mcn.
      Через DIALSTATUS можно на любой статус в линии выполнить какое-то действие. Я в своем примере при статусе нет ответа - NOANSWER, перехожу на 3-й шаг, где указано позвонить на мобильный. Можно, к примеру, на статус занято - BUSY, выполнить какое-то действие. Либо сказать что-то, либо перезвонить куда-то. В общем, тут можно очень сильно кастомизировать поведение астериска.

      • Аватар
        Владимир

        Я примерно что-то такое и делал, только не понял куда это вставлять чтобы для него срабатывало именно это правило а для других стандартное (вставлял перед общим правилом в call-out), в итоге у меня получалось что для всех и для него только стандартное и срабатывало или нужно вообще до call-out вставлять?

      • Аватар
        Владимир

        Попробовал и в call-out и до него и даже создал отдельную otpusk и все равно почему-то срабатывает общее правило call-out.
        Может я забыл упомянуть что должно не только при внешних но и при внутренних срабатывать это правило.

  101. Аватар

    Приветствую. Появился такой вопрос. Мейби поможешь - пользуемся астериском уже некоторое время. Зашёл разговор чтобы всю контору перевести на IP телефонию. Поднялся вопрос по покупке IP телефонов. Была кем то предложена идея использовать софтофон. Но у нас приимущественно используются терминальные машины. 3cx 6 вроде получилось запустить так(потестил на 2-х сеансах пока), но мейби есть другое какое то решение? )мейби встречал или использовал что то?

    • Zerox

      Мой совет такой - если есть возможность использовать стационарные аппараты, лучше ставить их. Для софтофонов нужна хорошая гарнитура, которая по стоимости сопоставима с бюджетным sip телефоном. Гарнитура и софтофон - очень нишевая вещь, актуальна для коллцентров. Обычным людям неудобно так работать.

      • Аватар

        Можно использовать комп. наушники бюджетные :) рассматрвиаем просто разные варианты. У нас есть операторы которым предпочтительна гарнитура.
        Ещё такой вопрос. Какнибудь реализовывали телефонную книгу? Забил абонента 1 раз, и на всех аппаратах он определялся.

        • Zerox

          Адресная книга задача не простая. Зависит от аппаратов. Я делал так. В одних аппаратах была возможность загружать адресную книгу через xml файл. В качестве пути можно было указать web сервер. В итоге я в локальной сети положил на веб сервер xml файл и на всех аппаратах прописал к нему путь. Для изменения адресной книги редактировал этот xml файл, изменения забирали телефоны сами. В окончательном варианте файл формировался выгрузкой из офисной crm.

          • Аватар

            Я видел костыль через мускуль и диалплан:
            В мускуле ведётся база с номерами и именами.
            В идалплане прописывается преобразование номера в международный формат (О_о) и сравнение его с мускулем. Но как то сомневаюсь на счёт таких костылей.
            По поводу удалённого файла тоже читал, но такой способ подходит только для аппаратов с такой плюшкой. Если будут всё таки софтофоны - не пойдёт.

            • Zerox

              Так а как это сделать централизованно? Адресная книга зависит от типа аппарата, который используется. Везде она разная.

              Историю с mysql я видел, в том числе реализацию такую. Но это не адресная книга. Это просто красивое отображение имени звонящего, которое будет на экране аппарата. Хранение в mysql позволяет легко редактировать это имя, не залезая в настройки юзеров в астериск.

              Лично я не вообще не понимаю смысл больших адресных книг на аппаратах. Пользоваться ими неудобно. Гораздо удобнее иметь перед собой напечатанный список всех абонентов компании. А в адресную книгу каждый заносит себе небольшое количество номеров, которые именно ему нужны для быстрого набора. Как только адресная книга становится большой, ей неудобно пользоваться, так как навигация на телефоне так себе.

  102. Аватар
    Станислав

    После установки надо еще selinux вырубить. В статье по установке с freepbx это есть, а тут нет.
    В /etc/sysconfig/selinux прописать SELINUX=disabled и перезагрузить или выполнить setenforce 0

  103. Аватар
    Аноним

    Огромное спасибо за статью!

  104. Аватар
    Андрей

    Всем, здрасти! Кто нибудь знает, что делаю не так:

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

    Какие варианты я тестировал:
    exten => _103,n,Goto(${EXTEN}-${DIALSTATUS},1)
    exten => _103-ANSWER,1,Hangup
    exten => _103-NOANSWER,1,Playback(user-not-answer)
    и
    exten => _103,n,NoOp(Dial Status: ${DIALSTATUS})
    exten => _103,n,GotoIf($["${DIALSTATUS},1"="BUSY"]?busy:unavail)
    exten => _103,n(unavail),Hangup()

    • Zerox

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

  105. Аватар

    Отличная статья, спасибо автору! Подскажите такой момент, есть ли смысл Астер устанавливать из официальных репов (дистрибутив дебиан 9), или собирать вручную, как описали в статье? Какие плюсы собранного ?

    • Zerox

      В принципе, никаких, просто самая свежая версия. Если версия, расположенная в репозитории устраивает, лучше использовать именно ее.

  106. Аватар

    Здравствуйте! Вы бы могли мне сказать, а на виртуальном сервере с прямым внешним IP без NAT - как настроить порты?
    И второй вопрос, на виртуальном сервере могу ли я подключить несколько внешних линий? Спасибо!

    • Zerox

      1. Порты не надо как-то особенно настраивать, если у вас внешний ip. Просто откройте их на фаерволе, или вообще его отключите, если не планируете настраивать ограничения доступа.
      2. Да, можете подключить сколько угодно внешних линий.

  107. Аватар

    Help! Застрял на соединении локальных абонентов, скопипастил листинги sip.conf и extensions.conf, клиенты подключаются нормально:

    debian-asterisk*CLI> sip show peers
    Name/username Host Dyn Forcerport Comedia ACL Port Status Description
    100/100 192.168.0.55 D No No 64812 OK (103 ms)
    101/101 192.168.0.31 D No No 55873 OK (111 ms)
    ...
    129 (Unspecified) D No No 0 UNKNOWN
    130 (Unspecified) D No No 0 UNKNOWN
    31 sip peers [Monitored: 2 online, 29 offline Unmonitored: 0 online, 0 offline]

    Yо при звонке один другому пишет:

    [Dec 15 13:45:02] NOTICE[897][C-0000001c]: chan_sip.c:26407 handle_request_invite: Call from '100' (192.168.0.55:64812) to extension '101' rejected because extension not found in context 'call-out'.

    Помогите разобраться.

    • Zerox

      В extensions.conf либо контекст называется не [call-out], либо он неправильно настроен. Этот же контекст настроен абоненту 100 в sip.conf.

      То есть ошибка означает, что не получается позвонить на номер 101, потому что в контексте call-out не описано правило, как позвонить.

    • Аватар

      Вы отредактировали скорее всего - extconfig.conf
      А нужно - extensions.conf
      Два дня бился сам)

  108. Аватар
    Александр

    Отбой. Разобрался (была опечатка).

  109. Аватар
    Александр

    Добрый день!
    Сначала хотел сказать спасибо за ваш труд! Ваши материалы очень помогают.
    Во время настройки, было ли у вас такое:
    Файл Wav во время записи имеет всего 1кб, соответственно и MP3 получается размером в 1кб. Файлы сохраняются по пути:
    /var/www/html/calls
    Так-то все остальное работает(web панель показывает звонки и если в конфигурационном файле указать минимальный размер 0кб для отображения, то появляется кнопка воспроизведения). На что можно обратить внимание.
    Заранее спасибо!

  110. Аватар
    Сергей

    Странная какаая то ситуация. На входящем звук пишется в файл, все нормально.
    В исходящем на внешку и на внутренних звонках файл записи создается, но он пустой. Пробовал убрать из скрипта [macro-recording] убрать все что относится к преоброзованию на mp3. Wav создается таким же пустым (какой то мусор в заголовке)

    Вот приложил лог звонка (внутрений), может что подскажите?

    -- Executing [100@call-out:1] Macro("SIP/101-00000017", "recording,101,100") in new stack
    -- Executing [s@macro-recording:1] Set("SIP/101-00000017", "fname=1511269586.34-2017-11-21-18_06-101-100") in new stack
    -- Executing [s@macro-recording:2] Set("SIP/101-00000017", "monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3" && rm -f "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" && chmod o+r "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3"") in new stack
    -- Executing [s@macro-recording:3] Set("SIP/101-00000017", "CDR(filename)=1511269586.34-2017-11-21-18_06-101-100.mp3") in new stack
    -- Executing [s@macro-recording:4] Set("SIP/101-00000017", "CDR(realdst)=100") in new stack
    -- Executing [s@macro-recording:5] MixMonitor("SIP/101-00000017", "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav,b,nice -n 19 /usr/local/bin/lame -b 32 --silent "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3" && rm -f "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" && chmod o+r "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3"") in new stack
    -- Executing [s@macro-recording:6] Verbose("SIP/101-00000017", "Exit record") in new stack
    Exit record
    -- Executing [100@call-out:2] Dial("SIP/101-00000017", "SIP/100,10") in new stack
    == Begin MixMonitor Recording SIP/101-00000017
    == Using SIP RTP CoS mark 5
    -- Called SIP/100
    -- SIP/100-00000018 is ringing
    -- SIP/100-00000018 answered SIP/101-00000017
    -- Channel SIP/100-00000018 joined 'simple_bridge' basic-bridge
    -- Channel SIP/101-00000017 joined 'simple_bridge' basic-bridge
    -- Channel SIP/100-00000018 left 'simple_bridge' basic-bridge
    -- Channel SIP/101-00000017 left 'simple_bridge' basic-bridge
    == Spawn extension (call-out, 100, 2) exited non-zero on 'SIP/101-00000017'
    == MixMonitor close filestream (mixed)
    == Executing [nice -n 19 /usr/local/bin/lame -b 32 --silent "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3" && rm -f "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.wav" && chmod o+r "/mnt/calls/1511269586.34-2017-11-21-18_06-101-100.mp3"]
    == End MixMonitor Recording SIP/101-00000017

    • Zerox

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

      • Аватар
        Сергей

        Абсолютно норимально,никаких проблем.... в чем и заковырка. Может как то можно дополнительно в диалплане на логирование ловушек наставить?

        • Аватар
          Сергей

          Вопрос снят. Проблема была банальная, не докрутил по настройкам iptales. Сам себе злобный Буратино...
          Извиняюсь за беспокойство.

          • Zerox

            Не понимаю связи с iptables. В чем конкретно была проблема? Разговоры же нормально шли.

  111. Аватар

    Как сделать, чтобы отображался статус присуствия, как в скайп?

  112. Аватар

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

  113. Аватар

    Настроил всё по инструкции, но почему то не идут исходящие звонки, на эхо тест звоню всё отлично а вот на любой городской или мобильный через 8 не идёт, если на мобильный то говорит что "направление не существует". Со входящими всё ОК!

    • Zerox

      Логи надо смотреть. Кто это говорит, сам астер или оператор связи. Если астер, то диалплан проверять, если оператор связи, то смотреть, какие у него правила набора. Возможно он ждет звонок через 7, а он идет через 8. Так часто бывает.

  114. Аватар

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

    • Zerox

      Если настройку астериска осилили, то уж поставить и подключить его к mysql дело несложное. К тому же на сайте все есть, да даже в этой статье.

  115. Аватар

    И кстати вопрос ещё. :) я использую ms sql server туда заливаю статистику звонков. У меня не получилось добавлять имя файла записи, это нельзя сделать или я не смог разобраться?

    • Zerox

      Думаю можно, просто не так, как у меня описано в статье. Я с mssql никогда не снюхивал ничего из линукс, так что не подскажу. Да я и смысла не вижу использовать какую-то внешнюю БД. Тут нагрузки никакой нет, но зато удобно, когда и сам сервер астера и бд находятся на одной виртуалке. Забэкапил и развернул всю систему, она сразу же готова к работе. А какой смысл во внешней базе mssql, кроме лишних проблем? Я бы установил локально mysql и не мучался.

  116. Аватар

    Через очереди.

  117. Аватар

    Если у меня 3 секретаря, хотелось бы знать кто из них трубку взял. В принципе в базе там можно вычислить кто взял. А вот в имени файла записи разговора стоит t, не удобно, думал как тотпросто можно поправить, что бы корректно имя файла было

    • Zerox

      А как на разных секретарей идет перенаправление? Через очередь? Или они просто перечислены один за другим в диалплане? Тут я не знаю, как подсказать, надо пробовать. Думаю, это можно как-то исправить, но надо разбираться.

    • Zerox

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

  118. Аватар

    Добрый день.

    Ситуация такая, если мне звонят снаружи, если не вводить добавочный номер, то входящий звонок переводится на секретаря, в логах вместо номера на кого переведен входящий вызов указан символ "t", как сделать что бы указывался конечный номер?

    В остальных случаях все корректно фиксируется.

    • Zerox

      Так а какой номер вы хотите увидеть? Они же номер не вводят, звонок уходит на секретаря, номер которого и так известен. Если нужно изменить вывод вместо "t" на номер секретаря, то тут простого решения я не вижу. В данном случае "t" это направление звонка, которое и фиксируется в статистике, ведь звонок на самом деле на "t" и уходит.

  119. Аватар
    Владимир

    Автору огромнейший респект, такой подробной и внятно написанной статьи я еще не встречал!!!
    Не нашел правда ответа на один вопросик, а как нибудь можно с консоли или еще как создать 3cxconfig для android 3CX? Все мне известные методы это прикручивать веб морду, чего я честно не очень хочу.

  120. Аватар
    Алексей

    Наткнулся на вашу инструкцию, и прочитав подумал, в старых инструкциях везде был пак такой - астер + libpri + dahdi, тут у вас иначе...объясните, что давал libpri и dahdi и почему сейчас он не используется для работы в новых версиях астера (например как в вашем случае 13) и зачем pjproject с jansson? (p.s. только начал изучать VOIP телефонию и поэтому от стольких мануалов, что я пересмотрел, голова кругом)

    • Аватар
      Алексей

      Кстати в предыдущей статье про астер и pbx libpri и dahdi использовался

    • Zerox

      libpri и dahdi используются для подключения к астериску плат расширения. Лично мне все это уже не нужно. Я стараюсь всю телефонию настраивать исключительно на sip. Подобные платы были популярны раньше, в переходный период, когда астериск стыковали с аналоговой и цифровой телефонией. Сейчас все в основном переходят на IP.

      • Аватар
        Алексей

        получается если я буду использовать аналоговые устройства мне данные пакеты пригодятся? в принципе понял зачем jansson - во время компиляции астера версии 13/14 он нужен был :))

        • Zerox

          Я не знаю подробностей насчет конкретно аналоговых устройств. Для них можно использовать голосовые шлюзы. Но если будут использоваться платы расширения, вставляемые напрямую в сервер, то будут нужны. Но я тут могу ошибаться. Сам я никогда никакие платы не использовал. Максимум - voip шлюзы, но это другая тема. Все это легко гуглится, если есть желание узнать подробности.

          • Аватар

            Поясню почему раньше был нужен dahdi, вся проблема была в том что для конференций раньше использовался физический генератор квантования, и эмулятор его был в этом пакете. Теперь используется бридж.

            • Zerox

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

  121. Аватар
    Михаил

    Здравствуйте, спасибо за статью, на многое открыли глаза.
    Единственное что: не показывает сохраненный звонок на web интерфейсе.
    в config.php изменил на свою папку и все равно без изменений.

    • Аватар
      Михаил

      Если ввести ip Сервера/records то файлы видны хоть и в wav.
      А вот через веб сервер их не видно

      • Аватар
        Михаил

        заработало. теперь проблема осталась только в том, что не конвертирует из wav в mp3

  122. Аватар

    сама разобралась. все ок.

  123. Аватар

    Добрый день. Вы можете подсказать, как должны выглядеть настройки sip.conf, если я не подключаюсь к провайдеру, а внешние номера прокидываю на sip-шлюз (плата TM.IP) в нашей АТС. Для одного номера (2055) работает, а вот как сделать чтобы и на другие номера можно было звонить? номера серии 7XXX - sip, 2055 - номер УПАТС. конфиг выглядит так:
    Extensions.conf

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

    [handup-sip]
    exten => _XX!,1,HangUp()

    [call-out]

    exten => _XXXX,1,Dial(SIP/${EXTEN})
    include => handup-sip
    exten => _XXXX.,1,Dial(SIP/${EXTEN}@2055)

    [call-in]
    exten => 2055,1,Dial(SIP/7000)

    sip.conf

    [general]
    externaddr=192.168.0.140: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]

    [managers-phones](!)
    type=friend
    context=call-out
    secret=123
    host=dynamic
    nat=no
    qualify=yes
    canreinvite=no
    callgroup=1
    pickupgroup=1
    call-limit=1
    dtmfmode=auto
    disallow=all
    allow=alaw
    allow=ulaw
    allow=g729
    allow=g723
    allow=g722

    [7000](managers-phones)
    callerid="Number 7000"
    [7001](managers-phones)
    callerid="Number 7001"
    [7002](managers-phones)
    callerid="Number 7002"

    [2055]
    host=192.168.0.140
    insecure=invite,port
    type=friend
    fromdomain=192.168.0.140
    disallow=all
    allow=alaw
    dtmfmode=auto
    secret=123
    defaultuser=2055
    trunkname=2055
    fromuser=2055
    callbackextensions=2055

  124. Аватар

    tar -xjvf pjproject-2.*
    у меня не отрабатывает, не подскажите что это?
    пишет
    [root@MiWiFi-R1CL-srv src]# wget http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
    --2017-09-15 18:25:41-- http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
    Resolving http://www.pjsip.org (www.pjsip.org)... 207.38.94.48
    Connecting to http://www.pjsip.org (www.pjsip.org)|207.38.94.48|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 4631778 (4.4M) [application/x-bzip2]
    Saving to: ‘pjproject-2.4.tar.bz2.4’

    100%[======================================>] 4,631,778 853KB/s in 5.9s

    2017-09-15 18:25:47 (763 KB/s) - ‘pjproject-2.4.tar.bz2.4’ saved [4631778/4631778]

    [root@MiWiFi-R1CL-srv src]# tar -xjvf pjproject-2.* tar (child): bzip2: Cannot exec: No such file or directory
    tar (child): Error is not recoverable: exiting now
    tar: Child returned status 2
    tar: Error is not recoverable: exiting now

    • Zerox

      Напишите полностью имя файла - pjproject-2.4.tar.bz2.4. Не понял только, почему на конце .4, скорее всего вы этот файл скачали уже 4 раза, поэтому команда tar -xjvf pjproject-2.* не понимает, какой из этих файлов нужно распаковать.

      • Аватар

        таже беда, переустановил cent
        php-pdo.x86_64 0:5.4.16-42.el7
        php-php-gettext.noarch 0:1.0.12-1.el7
        php-tcpdf.noarch 0:6.2.13-1.el7
        php-tcpdf-dejavu-sans-fonts.noarch 0:6.2.13-1.el7
        php-tidy.x86_64 0:5.4.16-7.el7
        pixman.x86_64 0:0.34.0-1.el7
        pixman-devel.x86_64 0:0.34.0-1.el7
        procmail.x86_64 0:3.22-36.el7
        pulseaudio-libs.x86_64 0:10.0-3.el7
        rsync.x86_64 0:3.0.9-18.el7
        slang-devel.x86_64 0:2.2.4-11.el7
        subversion-libs.x86_64 0:1.7.14-11.el7_4
        t1lib.x86_64 0:5.1.2-14.el7
        trousers.x86_64 0:0.3.14-2.el7
        unbound-libs.x86_64 0:1.4.20-34.el7
        uuid.x86_64 0:1.6.2-26.el7
        vim-common.x86_64 2:7.4.160-2.el7
        vim-filesystem.x86_64 2:7.4.160-2.el7
        wavpack.x86_64 0:4.60.1-9.el7
        xorg-x11-proto-devel.noarch 0:7.7-20.el7
        xz-devel.x86_64 0:5.2.2-1.el7
        zlib-devel.x86_64 0:1.2.7-17.el7

        Complete!
        [root@MiWiFi-R1CL-srv ~]# cd /usr/src
        [root@MiWiFi-R1CL-srv src]# wget http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
        --2017-09-15 12:56:00-- http://www.pjsip.org/release/2.4/pjproject-2.4.tar.bz2
        Resolving http://www.pjsip.org (www.pjsip.org)... 207.38.94.48
        Connecting to http://www.pjsip.org (www.pjsip.org)|207.38.94.48|:80... connected.
        HTTP request sent, awaiting response... 200 OK
        Length: 4631778 (4.4M) [application/x-bzip2]
        Saving to: ‘pjproject-2.4.tar.bz2’

        100%[======================================>] 4,631,778 1.27MB/s in 3.6s

        2017-09-15 12:56:04 (1.22 MB/s) - ‘pjproject-2.4.tar.bz2’ saved [4631778/4631778]

        [root@MiWiFi-R1CL-srv src]# tar -xjvf pjproject-2.*
        tar (child): bzip2: Cannot exec: No such file or directory
        tar (child): Error is not recoverable: exiting now
        tar: Child returned status 2
        tar: Error is not recoverable: exiting now
        [root@MiWiFi-R1CL-srv src]# tar xjvf pjproject-2.*
        tar (child): bzip2: Cannot exec: No such file or directory
        tar (child): Error is not recoverable: exiting now
        tar: Child returned status 2
        tar: Error is not recoverable: exiting now
        [root@MiWiFi-R1CL-srv src]#

        на 6.4 отрабатывали следующие
        wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
        wget http://downloads.asterisk.org/pub/telephony/libpri/old/libpri-1.4.15.tar.gz
        wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz
        d) Распаковываем скаченные архивы:
        tar zxvf dahdi-linux-complete*
        tar zxvf libpri*
        tar zxvf asterisk*

        • Zerox

          Я же написал, используйте полное имя файла в команде распаковки, а не маску со звездочкой на конце.

          • Аватар

            да, но перед этим советую проделать следующее, тогда точно будет работать
            yum install -y gcc gcc-c++ lynx bison mariadb-devel mariadb-server mariadb gmime-devel psmisc php php-mysql php-pear php-mbstring yum install tftp-server httpd make ncurses-devel libtermcap-devel sendmail sendmail-cf caching-nameserver sox newt-devel libxml2-devel libtiff-devel audiofile-devel gtk2-devel subversion kernel-devel yum install kernel-devel-$(uname -r) git subversion kernel-devel php-process crontabs cronie cronie-anacron wget vim php-xml uuid-devel libtool sqlite-devel libuuid-devel bzip2
            systemctl enable mariadb.service systemctl start mariadb.service

  125. Аватар

    Добрый день!
    очень помогают ваши статьи. Спасибо вам за этот труд.
    Все получалось до пункта "запись разговора", а именно на команде
    # tar zxvf lame-3.*
    текст ошибки:
    /usr/src# tar zxvf lame-3.*
    tar (child): lame-3.98.4: Функция read завершилась с ошибкой: Это каталог
    tar (child): Начало ленты, завершение работы
    tar (child): Error is not recoverable: exiting now

    gzip: stdin: unexpected end of file
    tar: Child returned status 2
    tar: Error is not recoverable: exiting now

    Я новичок и в основном делаю все по вашим командам, большинство не понимая. но все таки пытаюсь разобраться.
    Не могли бы вы мне помочь, что пошло не так?
    и если не трудно можете привести пример файла extensions.conf в варианте, если звонки будут просто писаться в какую-то папку, без конвертирования в mp3 и без заморочек с БД.

    • Zerox

      tar (child): lame-3.98.4: Функция read завершилась с ошибкой: Это каталог

      Эта ошибка говорит о том, что имя файла с маской "lame-3.*" возвращает имя каталога, а не файл архива. Вместо lame-3.* напишите полностью имя скачанного файла.