Одним из рабочих инструментов офиса, несмотря на стремительные изменения последних десятилетий, по-прежнему является телефон. Мы займемся пошаговой настройкой с нуля АТС asterisk - современного инструмента для организации телефонии в офисе на основе протокола SIP. Я подробно с примерами и описанием проведу вас по основным параметрам, необходимым для базового функционала.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Данная статья является частью единого цикла статьей про сервер Centos.
Введение
Не буду останавливаться на описании сервера asterisk, в интернете много информации на эту тему. Да и сам я кратко рассказывал в своих предыдущих статьях про установку. Материал будет объемный, поэтому сразу перейдем к сути.
Статья планируется учебная, поэтому использовать будем голый asterisk без каких-либо web панелей для управления. Выполнять настройку asterisk будем с нуля, то есть с самой начальной установки самого сервера телефонии и всех зависимостей. Если вы разберетесь и освоите этот материал, то потом без проблем сможете настроить и поддерживать любую конфигурацию на основе астериска.
Я хочу подробно рассказать о настройке asterisk на конкретном примере, где будет собран в одном месте расширенный функционал, отвечающий практически на все запросы среднестатистического офиса.
Для примера опишем наш воображаемый офис:
- Работает 30 сотрудников. Номера будут трехзначные, от 100 до 130.
- У нас будут 3 отдела - менеджеры, техподдержка, руководство и все остальные.
- Номер секретаря 100, менеджеры 101-110, техподдержка 111-120, руководство 121-130.
- Мы будем использовать одного SIP провайдера для звонков.
Кратко получается такая картина. Я не пишу в самом начале о техническом задании, которое буду реализовывать. Каждый момент буду описывать и раскрывать в соответствующем разделе.
Для настройки я буду использовать учетную запись сервиса zadarma.com (отделились в РФ и работают под брендом Новофон). Неплохой оператор voip связи. Беру его для примера, потому что удобно использовать для тестирования конфигурации. Сразу после регистрации вам дают аккаунт, пример настроек для 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
Установка из исходников
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"
И еще некоторые зависимости, которые будут нужны.
# 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
Настройте 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
# 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
Все готово к установке непосредственно 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
Выбирайте необходимые модули и звуки, в зависимости от того, что вам нужно. Я в общем случае указываю:
- 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 запустился, но есть небольшие ошибки.
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 ситуации, которые требуют двух принципиально различных настроек:
- Сервер телефонии имеет свой внешний ip адрес и напрямую смотрит через него в интернет.
- Сервер стоит за шлюзом, не имеет своего внешнего адреса, доступ в интернет с помощью 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
Видим всех наших пользователей, их пароли и контекст. Список отсортирован не по порядку, не пугайтесь, если не заметите какой-то номер.
Дальше устанавливайте любую софтовую звонилку на компьютер или можете сразу использовать телефон, если он у вас под рукой. С телефонами удобнее, но не всегда они есть. В 3CXPhone задаем следующие настройки подключения к нашей ip атс:
Я сразу открываю дебаг окно для отладки. Корректное подключение к серверу будет выглядеть вот так: Проверим на сервере список подключенных пиров с помощью команды:
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.
В таком виде АТС уже вполне работоспособна, можно пользоваться, но есть ряд неудобств. Например, если позвонить на трехзначный номер, которого не существует, или на номер, который не зарегистрирован в данный момент на устройстве, вы просто получите сброс звонка и не поймете, в чем проблема. Для этих событий нужна отдельная обработка. Чтобы не загружать сразу файл конфигурации длинными и непонятными конструкциями, я рассмотрю этот момент ниже, когда буду рассказывать про голосовую почту. Это не критичная настройка, в таком виде все будет замечательно работать, но не так удобно, как могло бы.
Основной функционал 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-ти секунд, включать запись голосового сообщения.
Конкретно в контексте внутренних звонков этот параметр не принципиален, так как я не добавляю голосовую почту для звонков внутри организации, хотя можно это сделать. Не вижу в этом смысла. Я добавил сюда этот параметр, чтобы время ожидания ответа было одинаково во всех звонках. В следующих изменениях это уже будет играть принципиальное значение.
Пока мы просто добавили номер, куда можно позвонить для управления голосовой почтой. Теперь добавим непосредственно возможность записи голосовых сообщений по событиям. Остановимся на этом пункте поподробнее. Для начала уясним, в каких состояниях может пребывать номер:
- Номера вообще не существует на сервере. В нашем случае, к примеру, это любой номер не из диапазона 100-130.
- Номер существует, но он не зарегистрирован на АТС, то есть аппарат с этим номером не подключен.
- Номер существует, зарегистрирован, но при звонке на него никто не отвечает.
- Номер существует, зарегистрирован, но в данный момент занят.
Каждое из этих четырех состояний обрабатывается отдельно. Я считаю, что голосовую почту уместно будет включать по событию номер 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 секунд. Если вы считаете, что нужно больше, измените этот параметр.
Перечитывайте диалплан и тестируйте конфигурацию. При звонке абоненту и его неответе, звонящий услышит в трубке сообщение о том, что номер не отвечает и предложение оставить голосовую почту. Если звонивший оставит сообщение, то получатель получит это сообщение по 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
Совершаем звонок и проверяем таблицу 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, мелодии проигрываются отсюда. Я не буду менять настройки по-умолчанию. Добавим еще один класс музыки и укажем его в свойствах очереди, где будем ее проигрывать.
Копируем любым способом 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:
- Установка и настройка астериск с нуля
- Мониторинг asterisk в zabbix
- Соединение двух серверов астериск
- Анализ SIP трафика
- Замена +7 на 8 и наоборот
- Ограничение на звонки для группы номеров
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
У вас в инструкции в Mixmonitor стоит ключ b, но записи всё равно сохраняются, даже если трубку не сняли.
Ошибка загрузки конфигурации в телефон уже больше 2-х месяцев мучает нас....несколько телефонов asterisk не загружается по сети - unknown
Из N-го колличества (примерно 220 аппаратов) штук 15 пишут - unspecified , ip выдает dhcp.
Можете подсказать где искать проблему? или посоветовать специалиста, что поможет решить вопрос. Спасибо
Использовал наработки из этой статьи и предыдущих для установки Asterisk на Ubuntu. Но при установке выбрал дистрибутив самого последнего Asterisk, версии 20 и самую последнюю Ubuntu. Следуя инструкции автора настроил sip.conf потом extension.conf дошел до пункта проверка пользователей CLI> sip show users и тут приехали..... Система вообще не знает команд начинающихся на слово sip. Начал гуглить и почти на всех форумах пишут ( -- не стоит использовать chan_sip в 2020 году на новых установках. Пора приучать людей к pjsip, так как chan_sip устаревший и в ближайших выпусках от него откажутся окончательно --) Похоже пришло время обновлять инструкцию под новые версии Asterisk.
От chan_sip уже лет 10 отказываются, ещё когда я только начал изучать Asterisk от него уже отказывались. Думаю, ещё столько же будут отказываться. Объективно, с ним нет никаких проблем для типового применения, которое описано в статье.
Доброго
Не подскажете , используя chan_pjsip возможно настроить на один номер два аппарата, с одновременной возможностью и звонить на этот номер, и с этих аппаратов этим номером?
Не знаю, pjsip никогда не настраивал.
Возможно:
aor/max_contacts = 2
Огоромное спасибо автору за толковую статью с понятными обьяснениями.
Прошу помощи, проблема заключается в следующем:
На астере добавил несколько транков, создал группу внутренних номеров и очередь.
Звонки из внутренних номеров по исходящему маршруту идут в транки все ок.
Дальше поставил модуль коллцентр (issabel) и имею проблемку...
когда колцентр дозванивает абонентов и закидівает их в очередь я не могу совершать звонки наружу из внутренних номеров(хотя изредка пробивает раза с 30го) можно ли как-то віставить приоритет доступа к транкам для внутренних номеров перед автодиалером?
Я так сходу не могу продумать решение, тем более с таким модулем никогда не работал. Для абонентов можно устанавливать call-limit, который ограничивает количество возможных линий. Возможно в эту сторону нужно смотреть. Ну и учитывать, что dialplan читается по порядку, сверху вниз. Абонентов с наименьшим приоритетом надо выделять в отдельные маски и ставить в самый низ.
Не совсем понимаю, (так как не имею ни знаний ни опыта, поднял все методом научного тыка) на многих ресурсах писалось, что расположение элементов в файлах конфигурации не играет роли... и что такое маски? и вниз чего ставить абонентов???
У меня есть пару идей, может подскажете что нужно изменить чтобы при дозвоне после перебора транков астер не озвучивал мне что все линии заняты, а заново перебирал транки, что-бы получился вроди цикл до того пока не получится выскочить на линию?
Спасибо за внимание!
Решение этой задачи требует определённых навыков и понимания работы Asterisk. Я не помогу решить эту задачу в рамках ответов на комментарии. С учётом того, что решение я тоже не знаю, его надо придумать и отладить.
Подскажите, пожалуйста, деревянному, как привязать один внешний номер и 3 внутренних. И как настроить сценарий когда звонят на внешний, то звонок на Линии 1, после на 5 сек переадресация на Линию 2 и Линию 3?
Зарание благодарен!
Добрый день! Кто нибудь ставил на Debian11? Проблема odbc коннектором, asterisk не подключается к базе
Сложно. А на Бейсике можно перепрограммировать астерикс?
Здравствуйте, столкнулся с проблемой! У меня развернута телефония на базе FreePBX. Каждый день падает внешний телефон, то есть звонки из вне не могут пройти в организацию, идут короткие гудки. А внутренние звонки, просто тишина в трубке. После перезагрузки всё работает в штатном режиме. Подскажите в чём может быть проблема?
Логи надо смотреть. Как можно заочно сказать, в чём проблема? Возможно транки отваливаются, может ещё что-нибудь, какие-то сетевые проблемы и т.д.
Подскажите какой лог смотреть? В веб версии с самом FreePBX, ни каких ошибок не наблюдал!
Имеет смысл вот эти посмотреть:
/var/log/asterisk/full
/var/log/asterisk/freepbx.log
/var/log/messages
Сопоставить события там с временем, когда падает внешняя связь.
Здравствуйте.
Разворачиваю на Proxmox VE 7.2-3 с Версия ядра Linux 5.15.30-2-pve #1 SMP PVE 5.15.30-3 (Fri, 22 Apr 2022 18:08:27 +0200) контейнер LXC для установки: АТС asterisk. На Debian GNU/Linux 11 \n \l.
root@proxmox:/etc# dpkg --get-selections | grep ^pve-kernel
pve-kernel-5.15 install
pve-kernel-5.15.30-2-pve install
pve-kernel-helper install
Возникла проблема с установкой dahdi:
cd /usr/src/dahdi-linux-complete-2.10*/
root@asteriks:/usr/src/dahdi-linux-complete-2.10.2+2.10.2# make all && make install && make config
make -C linux all
make[1]: Entering directory '/usr/src/dahdi-linux-complete-2.10.2+2.10.2/linux'
make -C drivers/dahdi/firmware firmware-loaders
make[2]: Entering directory '/usr/src/dahdi-linux-complete-2.10.2+2.10.2/linux/drivers/dahdi/firmware'
make[2]: Leaving directory '/usr/src/dahdi-linux-complete-2.10.2+2.10.2/linux/drivers/dahdi/firmware'
You do not appear to have the sources for the 5.15.30-2-pve kernel installed.
make[1]: *** [Makefile:72: modules] Error 1
make[1]: Leaving directory '/usr/src/dahdi-linux-complete-2.10.2+2.10.2/linux'
make: *** [Makefile:9: all] Error 2
пробовал и так apt install linux-headers*
Failed to restart dahdi.service: Unit dahdi.service not found.
Смотрел версию ядра, точно такая как на proxmox.
Делал обновление на контейнере и на proxmox: sudo apt update && sudo apt dist-upgrade
результата нет.
Пробовал установить последнюю версию dahdi-linux-complete-3.2.0+3.2.0 тоже нет результата:
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-3.2.0+3.2.0.tar.gz
root@asteriks:/usr/src/dahdi-linux-complete-3.2.0+3.2.0# systemctl restart dahdi
Failed to restart dahdi.service: Unit dahdi.service not found.
root@asteriks:/usr/src/dahdi-linux-complete-3.2.0+3.2.0# make all && make install && make config
make -C linux all
make[1]: Entering directory '/usr/src/dahdi-linux-complete-3.2.0+3.2.0/linux'
make -C drivers/dahdi/firmware firmware-loaders
make[2]: Entering directory '/usr/src/dahdi-linux-complete-3.2.0+3.2.0/linux/drivers/dahdi/firmware'
make[2]: Leaving directory '/usr/src/dahdi-linux-complete-3.2.0+3.2.0/linux/drivers/dahdi/firmware'
You do not appear to have the sources for the 5.15.30-2-pve kernel installed.
make[1]: *** [Makefile:72: modules] Error 1
make[1]: Leaving directory '/usr/src/dahdi-linux-complete-3.2.0+3.2.0/linux'
make: *** [Makefile:9: all] Error 2
Подскажите пожалуйста в чем ошибка? Есть предположение, что проблема в proxmox. Но куда копать не знаю.
Зачем вам dahdi в lxc контейнере? Он нужен для работы с платами расширения.
Добрый день. Интересно, как решаете вопрос постепенного заполнения выделенного каталога под записи входящих/исходящих звонков. В сети много инструкций и примеров. Может какой-то свой способ или подход к этой теме порекомендуете?
Да ни как ))) походу пока база не откажет или перестанет что то запускаться
Zabbix
Да как угодно. Можно скриптом удалять записи старше какого-то времени. Банально через find и его ключ -delete.
А БД (там вроде бы 2 таблички: cel и cdr) имеет смысл трогать (чистить)?
Добрый день!
Пробовали ли интегрировать сервисы YANDEX.SPEECHKIT? Ari или Agi пробовали использовать?
Я - нет.
Добрый день, Владимир
Спасибо большое за подробно описанную статью по настройке.
Есть такая проблема при звонке, иногда возникает редко. не знаю куда дальше копать, везде перерыл все и не нашел ответа на свой вопрос
При исходящих звонках периодически выскакивает в дебаге астерикса следующая ошибка, автоответчик сообщает "На данный момент все линии заняты, перезвоните позже"
ЛОГ ошибки;
[2022-08-17 12:02:01] WARNING[3009][C-00001213] chan_sip.c: Received response: "Forbidden" from ';tag=as1514e78c'
Подскажите пожалуйста, где копать информация по истреблении данной проблемы?
Это скорее всего ограничение вашего провайдера. Он выдаёт ответ вашему серверу:
Received response: "Forbidden" from ';tag=as1514e78c'
Напишите им в поддержку, точно ответят их ли это проблема.
у вас в настройке cdr viewer ошибка, в экстеншене [recording]:
exten => s,n,Set(CDR(filename)=${fname}.mp3) нужно изменить на .wav, т.к. он в базу данных сохраняет неверный формат, из-за чего на веб-морде не подтягиваются аудиозаписи.
За статью спасибо.
Добрый день. Прочитал вашу инструкцию в возможности решения своей проблемы, но не нашел, хотя бы намека, где искать.
подскажите куда копать, проблема с отображением номера звонившего мне на АТС.
прописано два номера один пусть 74953000001, второй 88001001001
так вот при звонке на номер 8800, номер звонившего отображается как 9204404040
при звонке на 7495, отображается 79204404040, 7 перед номером.
но если позвонить на 7495 из-за заграницы, пусть будет Польша или Казахстан, то номер будет без 7 впереди, то есть 9204404040. и привяжет звонок к 8800.
номера арендованы у двух разных провайдеров.
Это особенность самого астериска или нужно где то искать в консоле, в ГУИ все пересмотрел, не нашел.
По умолчанию Астериск ничего не обрезает и не добавляет к номерам, если вы сами специально это не настроите. Я подозреваю, что разный формат отображения номера звонящего это особенности провайдеров. Напишите в тех. поддержку об этом и точно узнаете. Возможно они смогут под вас подправить это, если вам это критично. Если они ничего не сделают, то это можно исправить и на самом Астериск, но нужно немного разбираться в нём.
Понятно, спасибо. пробую провайдера посмотреть.
Добрый день.
Подскажите пожалуйста, выявилась одна любопытная проблема. При звонке от нас на внешний городской номер, когда трубку поднимает один человек, а потом хочет меня перевести на другого, то меня выкидывает в моё голосовое меню. Именно в моё, на мой астериск. Не подскажите куда копать?
Чего-то в диалплане напутали явно. Так трудно сказать, в чём проблема. Можно включить debug лог и посмотреть, что там в момент перенаправления в ivr. Должны быть какие-то записи по теме.
Здраствуйте Zerox можете подсказать у меня установлено астериск мод изабел у меня на данном моменте работает 4 сип транка с одного оператора но еще дополнительно хочу купить из другого провайдера 4 номера но как с исходяшем звонком быт ? Я данный момент исползую перхикс для каждого номера если в астериск такой функции при каждом исходном вызове астериск помещал номера для исходящего звонка ? Например 1 оператор 100 звонит на номеру +5985611641 и 2 оператор в тот же момент звонит с 200 на +55998514231 но при это 1ый оператор выходить из +592000000 а 2ой оператор выходить из +592001111
подскажите, что за ошибка, при записи в базу данных, и соответственно дата и время не записываются, показывает нули
WARNING[9317]: cdr_adaptive_odbc.c:731 odbc_log: Column type 9 (field 'asterisk:cdr:calldate') is unsupported at this time.
Хм, это на какой версии Asterisk? Я недавно по статье настраивал Aterisk 18, всё гладко прошло. Такой ошибки не получал.
Asterisk 18.11.0
Я на Debian 11 ставил, но за основу взял эту инструкцию. Настроил в том числе и учёт звонков через cdr_adaptive_odbc.
Добрый день! Вы решили проблему? Сейчас столкнулся с такойже проблемой. Пытаюсь гуглить, пока ничего вразумительного не нашел. Дайте пожалуйста ответ в случае если найдете решение или хотябы путь в сторону решения) Спасибо)
/etc/asterisk/cdr_odbc.conf
/etc/asterisk/res_odbc.conf
/etc/asterisk/cdr_mysql.conf:
с такими настройками удалось запустить, /etc/asterisk/cdr_adaptive_odbc.conf дефолтный
Спасибо за информацию.
Не проигрывает ivr. Я уже весь гугл перерыл, ничего не могу найти.
Executing [s@ivr-main:2] BackGround("SIP/rtk-00000005", "/etc/asterisk/ivr/music") in new stack
[Mar 1 13:39:52] WARNING[6176][C-00000004]: file.c:804 ast_openstream_full: File /etc/asterisk/ivr/music does not exist in any format
[Mar 1 13:39:52] WARNING[6176][C-00000004]: file.c:1277 ast_streamfile: Unable to open /etc/asterisk/ivr/music (format (alaw)): No such file or directory
[Mar 1 13:39:52] WARNING[6176][C-00000004]: pbx_builtins.c:1239 pbx_builtin_background: ast_streamfile failed on SIP/rtk-00000005 for /etc/asterisk/ivr/music
Как-будто ругается на формат, но и на любой другой звук в папке /var/lib/asterisk/sound/{en,ru} он выдаёт такую же ошибку.
Тут прямым текстом указана ошибка:
File /etc/asterisk/ivr/music does not exist in any format
Unable to open /etc/asterisk/ivr/music (format (alaw)): No such file or directory
Либо в пути ошибка, либо нету прав доступа к директории и файлам.
Владимир, да я уже и 777 права на звук давал и сделал владельцем и группой владельцев asterisk, и пути посмотрел в asterisk.conf всё равно ошибка...
Обычно когда так бывает, причиной ошибки является банальная невнимательность. Что-то другое по сути ошибки сказать трудно. Там явно всё написано.
Да нет же alaw файл сделай нормальный или тестовый hello закинь
Я перекодировал sox'ом wav в alaw, ulaw и gsm, но толку нет.
http://vfl.ru/fotos/311589d938328759.html
http://vfl.ru/fotos/93def25438328761.html
http://vfl.ru/fotos/4449f8eb38328764.html
На скринах extension.conf, права на файлы и ошибка.
Доброго времени суток. Для Debian 11 есть такие статьи ? или можно истользовать Вашу для Debian 10 и там все идентично ?
Есть некоторые отличия. Я недавно настраивал на Debian 11, пришлось повозиться только с настройкой odbc для хранения статистики в mysql. А так всё остальное в статье актуально и для 18-й версии Asterisk + Debian 11.
Я не советую использовать для Астериска Debian дистрибутывы, я сталкивался уже, были проблемы с отсутствием дополнительных модулей, особенно при использовании freePBX. Чем больше примочек добавляешь, тем больше проблем и костылей. Centos лучше всего подходит...
С базовым Asterisk никаких проблем в Debian нет. Вы советуете Centos Stream? Обычной Centos больше нет.
Ну да. Я в принципе разворачивал базовый Астериск на Дебиан, соглашусь в вами, вполне всё отлично. Но когда ставил вручную freePBX вдруг бросил, потому что всё требовало RHEL, и я просто скачал freePBX Distro и это видимо было правильно. Подкорректирую свой коммент - для базового Астериска Дебиан норм.
Всё правильно. FreePBX создан на базе Centos, поэтому именно там он и работает без проблем. Вручную ставить его нет большого смысла, тем более на Debian. Надо действительно брать готовый FreePBX Distro и разворачивать из него.
Продолжаем разбираться
Создаем директорию для записи разговор и назначаем ей права.
# mkdir /mnt/calls
# chown -R asterisk. /mnt/calls
что за пользователь "asterisk."?
не понятно откуда он взялся...
Статья крутая! Работа проделана большая. Большое спасибо!
Но к сожалению много "белых" пятен и частично информация устарела.
Особенно "запнулся" на моменте настройке сервера apache+php - проблема в том что следуя инструкции не запускается php
Далее настройка cdr так же не без танцев с бубном.
Интересно, кто-нибудь пытался установить и настроить данный сервер на CentOS Stream?
Мой CentOS 8 после 1.01.22 перестал иметь доступ к репозитариям, dnf или yum update пустота...
Здравствуйте.
asterisk сбрасывает входящий вызов после 30 секунд
как решить проблему?
Спасибо!!!
Лог звонка надо смотреть.
Здравствуйте Zerox! Спасибо за подробное руководство. Единственный вопрос, по голосовой почте. Как сделать так, чтобы по почте ничего не отправлять (нет желания настраивать сервер пересылки). Т.е запись разговора хранились только в Asterisk, без отправки куда-либо. Заранее спасибо, уважением= Олег-
По умолчанию и не отправляется ничего, если специально не настраивать.
Спасибо за статьи, это наверное самые подробные и полные описания установок и настроек, что мне попались.
По крайней мере установить, настроить CentOS и Asterisk получилось не обращаясь к другим ресурсам.
Только с Asterisk не совсем сладил :) , уперся вот в какой момент.
После установки и первичной настройки Астериска.
Установил софтфон скачанный по Вашей ссылке и установил на iPhone - SessionTalk SIP Softphone.
Соединение с Астериском есть
Name/username Host Dyn Forcerport Comedia ACL Port Status Description
100/100 192.168.41.240 D No No 53380 OK (124 ms)
101 (Unspecified) D No No 0 UNKNOWN
111/111 192.168.41.209 D No No 34872 OK (49 ms)
при наборе с софтфона звонок на iPhone проходит, но при ответе на телефоне соединения не происходит.
при обратном звонке телефон-софтфон соединение происходит, но речи по ним - нет, то есть алокаешь что в микрофон компьютера, что в смартфон , этого алло не слышно.
и в терминале такие сообщения
[Nov 30 16:56:47] NOTICE[1298]: chan_sip.c:25001 handle_response_peerpoke: Peer '111' is now Reachable. (48ms / 2000ms)
[Nov 30 18:00:11] NOTICE[1298]: chan_sip.c:30537 sip_poke_noanswer: Peer '111' is now UNREACHABLE! Last qualify: 371
Подскажите куда рыть?
Обычно, когда кого-то не слышно, это сетевые проблемы, особенно если asterisk за nat. Для голоса открывается отдельное соединение и возможно оно по какой-то причине не работает. А из лога видно, что пир сначала подключился, потом отключился.
Доброго дня
при переходе с sip на pjsip, при звонке на старую (неизвестную) модель телефона (всё что про него известно - это "АБВ-телефон") вылетает ошибка, при следующих звонках на него идет только звонок
[Oct 26 14:28:40] ERROR[45805]: pjproject: : sip_transport.c Error processing 361 bytes packet from UDP 192.168.2.16:5060 : PJSIP syntax error exception when parsing 'Event' header on line 7 col 11:
SIP/2.0 487 Request Terminated
Via: SIP/2.0/UDP 192.168.3.150:5060;rport;branch=z9hG4bKPj426c6d50-b90a-48ff-846e-690acaef151e
From: 1001 ;tag=0754a29f-4d3e-4b31-8766-e45a641a3fda
To: ;tag=323742653
Call-ID: 97d3c60d-cc4b-41e8-9886-5bcb0650d9de
CSeq: 20476 INVITE
Event: Mic=0,Speaker=0
Content-Length: 0
Возник вопрос по Asterisk CDR Viewer Mod: как правильно сделать запись в файле подсчёта расхода денежных средств (my_callrates.csv) по такому ТП: Столицы, первые 100 минут бесплатно, потом 1.98 руб с посекундной тарификацией? Пробовал написать так: 7495,0.00,Столицы,6000s+s,1.98
Ну или так: 7495,0.00,Столицы,100m+s,1.98
Не работает! Считает деньги (расход) сразу с первой секунды. В чём ошибка?, как написать правильно?
Думаю в будущем были бы полезны статьи с описанием перехода на pjsip и апгрейда астериска на 17/18/19
Владимир, огромное спасибо за статью. Очень помогла, с ее помощью запустил полноценную телефонию.
Спасибо и удачи!
У меня не появляются записи звонков в папке /mnt/calls
Записи в папке появились, но в вэб-морде иконка что запись не доступна((
по мне так уже нужно так - у меня не работает то то вот анидеск кто сможет подключитесь или контакты телеги ))))
разобрался, но каким трудом...
Добрый день!
Пробовали установку на rocky linux?
Это полный клон Centos. Там всё то же самое будет.
Подскажите, пожалуйста, как в веб-морде Asterisk CDR Viewer Mod v2.6.4, корректно отображался пункт "Кто звонил"
Т.к. сейчас там всегда отображается только мой собственный номер, и на какой номер он звонил, а не реальный номер звонящего
Статья по-прежнему улет!
Но есть небольшой у меня затык и непонятки.
Как правильно в блок ниже натыкать запись звонков строчкой
exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
Сам блок:
[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ownsounds/hello)
exten => s,3,WaitExten(15)
exten => 1,1,Goto(priem,s,1)
exten => 2,1,Dial(SIP/219)
exten => 3,1,Dial(SIP/224)
exten => 4,1,Dial(SIP/216)
exten => 0,1,Queue(reception,t)
exten => _XXX,1,Dial(SIP/${EXTEN})
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(ivr-main,s,1)
exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => t,n,Queue(reception,t)
Когда отправил, вариант натыкивания пришел в голову такой:
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ownsounds/hello)
exten => s,3,WaitExten(15)
exten => 1,1,Goto(priem,s,1)
exten => 2,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => 2,2,Dial(SIP/219)
exten => 3,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => 3,2,Dial(SIP/224)
exten => 4,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => 4,2,Dial(SIP/216)
exten => 0,1,Queue(reception,t)
exten => _XXX,1,Dial(SIP/${EXTEN})
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(ivr-main,s,1)
exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => t,n,Queue(reception,t)
Есть ли у него минусы?
Настроил таким образом, все работает.
Здравствуйте, интересует вопрос - можно ли настроить Voicemail для отправки с разной темой письма и тела?
Задача вообще такова: сотрудник звонит в службу поддержки, оставляя голос.сообщение -- голосовое сообщение пересылается на почту -- обработчик в Jira из письма создает задачу в проекте.
Делали с помощью модуля RecordEmail (в нем можно и тему и тело указать для разных типов задач) - все хорошо создается, но вложение НЕ прикрепляется, с помощью модуля VoiceMail - тоже задача создается и вложение прикрепляется! Что смогли выяснить - отличие писем в "" - если глянуть оригинал письма от VoiceMail - то имя файла заключено в "", а при RecordEmail (хоть " и прописаны в модуле) - в оригинале письма отсутствуют. То ли команда System (exten => submodule,n,System(echo "Content-Disposition: attachment\; filename=\"recording-6689bb50ebba833b431922090425679c.wav\"" >> /tmp/email-${UNIQUEID})) не так обрабатывает, то ли ...
Буду благодарен за любую помощь!
Заранее спасибо!
Используй postfix он подойдет для такого рода задачи
Здравствуйте! Спасибо вам за вашу статью!!!
После этого этапа пытаюсь записать приветствие с 3схphone6, например с номера 355, после происходит 5 сек и он сбрасывается, в чём может быть проблема?
лог: "," "100", "355", "call-out", "Number 100" "", "SIP/100-0000006", "Hangup", "","2021-05-29 05:05:52", "2021-05-29 05:05:29 05:05:58",5,3, "ANSWERED","DOCUMENTATION","1622264752.10",""
С консоли , пишет, что нет такой директории с консоли при вызове на номер 355
> 0x7f5c200352d0 -- Strict RTP learning after remote address set to: 192.168.56.1:40024 -- Executing [355@call-out:1] NoOp("SIP/100-00000006", "") in new stack
-- Executing [355@call-out:2] Wait("SIP/100-00000006", "2") in new stack
-- Executing [355@call-out:3] Playback("SIP/100-00000006", "beep") in new stack
> 0x7f5c200352d0 -- Strict RTP switching to RTP target address 192.168.56.1:40024 as source
-- Playing 'beep.alaw' (language 'ru')
-- Executing [355@call-out:4] Record("SIP/100-00000006", "/tmp/musicEXTEN:2:wav") in new stack
-- Playing 'beep.alaw' (language 'ru')
[May 29 22:23:09] WARNING[1651][C-00000004]: file.c:1504 ast_writefile: No such format '2:wav'[May 29 22:23:09] WARNING[1651][C-00000004]: app_record.c:396 record_exec: Could not create file /tmp/musicEXTEN
-- Executing [355@call-out:5] Wait("SIP/100-00000006", "1") in new stack
-- Executing [355@call-out:6] Playback("SIP/100-00000006", "/tmp/musicEXTEN:2") in new stack
[May 29 22:23:10] WARNING[1651][C-00000004]: file.c:789 ast_openstream_full: File /tmp/musicEXTEN:2 does not exist in any format[May 29 22:23:10] WARNING[1651][C-00000004]: file.c:1262 ast_streamfile: Unable to open /tmp/musicEXTEN:2 (format (alaw)): No such file or directory
[May 29 22:23:10] WARNING[1651][C-00000004]: app_playback.c:497 playback_exec: Playback failed on SIP/100-00000006 for /tmp/musicEXTEN:2
-- Executing [355@call-out:7] Wait("SIP/100-00000006", "2") in new stack
> 0x7f5c200352d0 -- Strict RTP learning complete - Locking on source address 192.168.56.1:40024
-- Executing [355@call-out:8] Hangup("SIP/100-00000006", "") in new stack
== Spawn extension (call-out, 355, 8) exited non-zero on 'SIP/100-00000006'
pc-call*CLI>
Вы явно в конфиге что-то напутали. У вас создается файл с таким именем - /tmp/musicEXTEN:2. Где-то какой-то символ потеряли и у вас EXTEN не переводится в реальный номер.
Настроил запись и статистику звонков, но появилась проблема, собеседники перестали слышать друг друга. Если прослушать запись звонка, то слышно как они "алекают" друг другу. Диалплан был самый простой, звонки внутри сети, исх. звонок на внешний номер, до добавления макроса на запись звонилось на ура.
Вообще странно. Запись звонков обычно никак не влияет на сами звонки, а идет параллельно, как организационно в диалплане, так и технически. Ни разу не сталкивался с проблемой связи при записи.
По идее, если в записи звонка слышно голоса, то он нормально проходит. Есть сомнения в софтовой звонилке 3CX. Завтра попробую телефон украсть у кого-нибудь.
Виновата оказалась софтовая звонилка, после ее удаления и выковыривания остатков из реестра все заработало.
И еще, чтобы удалить из CDR Viewer ненужные записи их нужно удалить из VariaDB?
Да, все верно. Они в базе хранятся.
Большое спасибо за статью, очень хорошая. Подскажите, пожалуйста, столкнулся с следующим затыком и гуглежка по другим сайтам не помогла.
Подключал транк без регистрации
[2000000]
type=friend
host=10.16.150.20
registersip=no
trunkname=2000000
fromuser=8122000000
callerid=812000000
callbackextension=2000000
disallow=all
allow=alaw
contex=call-in
insecure=invite
relaxdtmf=yes
dtmfmode=RFC2833 ; без relaxdtmf не помогает
canreinvite=no
port=5060
Прописал extentions.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}@2000000)
include => handup-sip
;Входящие звонки
[call-in]
exten => 2000000,1,Dial(SIP/100)
Наружу звонки идут, при попытке набрать номер, получаю ошибку на астере:
[May 6 23:29:16] NOTICE[1902][C-00000023]: chan_sip.c:26793 handle_request_invite: Call from '2000000' (10.16.150.20:5060) to extension '2000000' rejected because extension not found in context 'default'.
Не очень понимаю, как он ее не находит, ведь мы его прописывали нижней строчкой. Подскажите. на что он может ругатся?
АААА, опечатка в слове context... на contex.....
Вот пример, почему надо отдыхать, спасибо, Зерокс)
Добрый день! Подскажите пожалуйста, после ввода команды "sip show users" выдает "No such command 'sip show users' " В чем может быть проблема
Может забыли в консоль астериска перейти? rasterisk набирали?
Да asterisk =>reload =>sip show user.
Чтобы войти в консоль нужно из под рута набрать
asterisk -r
И уже в консоли:
aster*CLI>
Набрать команду
sip show user.
sip show users*
Проблема в том, что при установке, в menuselect, в пункте "Драйверы канала", не был отмечен модуль chan_sip. Почему то он не ставится по умолчанию...
Доброго времени суток! Вот пытаюсь разобраться в написанном поподробнее и возник вопрос:
callbackextension - я так понимаю, что эта настройка в sip.conf говорит о том, что данный peer может совершать исходящие звонки?
Поискал в сети описание данной настройки и конкретного ответа - прав я или нет, так и не нашел.
Зарание прошу прощения, если вопрос глупый.
Здравствуйте! Можно пример как сделать исходящий звонок с любого свободного транка если их 4 и больше?
Перечислите их по очереди в рамках одного контекста и маски. Он и так их будет перебирать по очереди, если с первого звонок не получится.
То есть вот так?
exten => _XXX.,1,Dial(SIP/${EXTEN}@11111)
exten => _XXX.,2,Dial(SIP/${EXTEN}@22222)
exten => _XXX.,3,Dial(SIP/${EXTEN}@33333)
exten => _XXX.,4,Dial(SIP/${EXTEN}@44444)
Думаю, да.
Нет, callbackextension с входящими звонками не связан. За это отвечает настройка dialplan и context, в который помещен peer.
В общем у меня активных коннекторов показывает 0 из 1. Делал всё по статье...
А почему коннектор MySQL, когда у нас ставится MariaDB...?!?
Друг как я тебя понимаю мы просто купаемся в этом океане обсурда и ничего поделать не можем !!!
мария это тоже sql
Это не просто sql. Так то postgresql тоже sql. MariaDB форк Mysql с полной обратной совместимостью. Как и другой известный форк - percona.
Подскажите а как обработать события после dial когда кто-то из сторон положил трубку, нужно отправить curl в софт, но все команды после соединения в диал не обрабатываются, только в случаи не удачи соединится?
Разобрался как обработать поднял трубку вызываемый опция U(), отклонил вызов вызываемый опция g, но не могу обработать сброс вызова звонящим может кто подскажет. Знаю про exten => h , но не совсем подходит может есть другой способ? не разобрался еще с опцией F() не пойму как работает
Добрый день.
Такая же ошибка, как и одного из комментаторов и никак дальше не продвинуться
[Mar 26 16:31:34] NOTICE[3024][C-00000005]: chan_sip.c:26805 handle_request_invite: Call from '101' (192.168.0.130:62506) to extension '100' rejected because extension not found in context 'call-out'.
Проверил и extensions.conf и sip.conf - все как в статье
Перезапускал сервис.
Все безрезультатно. Клиенты подключаются, в системе видятся, но позвонить друг другу не могут.
Что еще можно проверить?
В тексте ошибки точно указано, в чем проблема. Кроме как внимательно проверять конфиг, не знаю, что посоветовать. Обычно это все же ошибки в конфигурации. Я сам бывало так же ошибался и получал эту ошибку.
Все перепроверил, все конфиги.
Не работает. Та же ошибка.
Софтофоны конектятся:
Сократил оба конфига до минимума:
sip.conf:
extentions.conf:
Проще уже некуда,
и все равно ошибки при попытке звонка в обе стороны:
Asterisk 16.16.2, CentOS Linux release 8.3.2011
Странная история. Попробуйте на всякий случай название контекста outcalling везде написать с клавиатуры. Возможно при копировании какие-то проблемы возникает. Сталкивался с таким.
Далее попробуйте в контексте явно прописать номера, без масок:
exten => 100,1,Dial(SIP/100)
exten => 101,1,Dial(SIP/101)
Возможно где-то что-то еще меняли в конфигах и удалили что-то нужное. Я ни разу не сталкивался с описываемой проблемой.
Добрый день.
Спасибо, что уделили мне столько времени.
Это я болван!!! Создал файл с неправильным именем "extentions.conf".
Исправил, перезапустил - все работает.
Ошибку нашел, когда начал проверять права на файлы.
Два дня бился, даже разные клиенты X-Lite пробовал - оказалось все просто...
Еще раз спасибо!!!
И еще dialplan show покажите, когда все сделаете.
Я только начинаю разбираться в командах Linux и перепроверяю все, что написано в статье.
Такой вопрос. В команде chown вы намеренно поставили точку между пользователем и группой?
# chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk
В синтаксисе команды они должны разделяться двоиточием.
Как-то так
# chown -R asterisk:asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk
Я ввел именно свой вариант. Ошибок не было.
Спасибо.
Насколько я понимаю, разницы нет. Я обычно использую либо двоеточие asterisk:asterisk, либо для краткости точку - asterisk. Это то же самое, что предыдущая запись. Подходит, когда имя пользователя и группы совпадают. Не нужно писать группу.
Добрый день.
На CentOS 8 команда
# dnf config-manager --set-enabled PowerTools
Выдала ошибку
Error: No matching repo to modify: PowerTools.
Решение оказалось - убрать заглавные буквы. Правильное написание команды:
# dnf config-manager --set-enabled powertools
Все верно. Это недавно изменилось, не понятно только, зачем. Мне и в других статьях на это указали.
Простите!
Придерусь с первых строк. Номера от 100 до 130 это 31 сотрудник.
Ничего страшного конечно нет. Но глаз "режет" )
А в целом статья на пятерочку!
Просто я не программист :) Это они так сходу считают: 0, 1, 2 и т.д.
Владимир, а не могли бы Вы дополнить статью разделом по настройке с использованием PJSIP?
Тут надо не просто дополнить, а многое переделать. Есть такие планы, но когда появится время для этого - не знаю.
Принято. Спасибо за Ваш труд.
Здравствуйте.
1. Входящий звонок приходит на один внутренний номер.
2. Входящий звонок приходит на пару внутренних номеров
(queues.conf :
[secretary]
strategy = ringall / randov
member => SIP/100
member => SIP/130)
Если абонент не взял трубку в течении пары секунд/гудков - переадресовать входящий на сотовый.
Подскажите пожалуйста реализацию данных схемы.
Первый случай простой. Делается примерно так:
exten => 150,1,Dial(SIP/${EXTEN},2,Tt)
exten => 150,n,Dial(SIP/89151234567@397945)
Второй сходу не скажу, давно не настраивал подобное, надо думать и тестировать.
Добрый подскажите подключаю yeastar tg как VoIP-канал как правильно прописать конфиги то все примеры под Freepbx а я не пойму куда прописывать входящею и исходящею маршрутизацию (Out/Incoming Route)
Voip шлюз yeastar подключается как обычный пир и дальше через него настраивается маршрутизация в dialplan. В чем конкретно проблема? Я настраивал yeastar, не было никаких проблем и нюансов.
Здравствуйте! Как запретить межгород и звонки на мобильные для определенной группы
В формате комментария трудно ответить. Общий смысл такой. Формируете номера по группам, в одной те, кому можно звонить по межгороду, во второй те, кому нельзя. Разные группы привязываете к разным контекстам. В контексте, где разрешен межгород и мобильные, разрешаете все звонки по маске _X. А в группе, где не разрешены, делаете более узкие маски так, чтобы они не включали в себя номера на _810. и _89ХХ. То есть будет разрешено только _8495XXXXXXX и _8499XXXXXXX. Это городские московские номера. Они звонить смогут только по ним. Примерно так.
Спасибо. Буду пробовать
asterisk при определении номера срезает первую цифру 8. Как сделать чтобы правильно работал определитель номера?
Не понял, что значит срезает? Он по умолчанию ничего не срезает, если это не настроить в диалплане. При каких звонках это происходит? Может провайдер так передает входящий номер?
номер приходит в виде 93700000 не хватает или +7 или 8
Так это ваш астериск восьмерку отрезает или от провайдера такой номер приходит? От этого зависит исправление. Просто добавить 8 к номеру не проблема. Нужно callerid поправить. Вот тут пример, как это делать - https://serveradmin.ru/vyivod-tranka-vmeste-s-nomerom-zvonyashhego/ Только там я название транка добавляю, а вам надо цифру 8 добавить. Хотя я не очень понимаю, зачем это делать. И так понятно, какой номер звонил.
добавил во входящие "exten => _XXXXXXXXXX,1,Set(CALLERID(number)=8${CALLERID(number)}) exten => _XXXXXXXXXX,n,goto(ext-did,${EXTEN},1)". А нужно это чтобы из не принятых набрать абоненту который звонил
Здравствуйте. А что за ошибка после запуска asterisk.service: Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory
Она тоже у вас есть на скрине.
Да это не ошибка. Если я правильно понимаю смысл, то при запуске идет проверка наличия pid файла. Его там нет, так как он появляется после запуска службы asterisk. Зачем проверять его наличие при запуске и выводить предупреждение, не очень понятно. Возможно так реализована проверка активности службы. Но в такой ситуации, по идее, никакое предупреждение в логе не должно быть.
Доброго времени суток уважаемый Zerox! Прежде всего хочу выразить огромную благодарность за Ваш труд, так как с Asterisk имею дело первый раз, а Ваша статья очень помогает разобраться. Но есть вопрос, не могли бы Вы подсказать, как переадресовывать вызов на голосовую почту, если выключены телефоны секретарей, которые находятся в queue? Или же если это не возможно, то подскажите пожалуйста по этому ("Обращаю ваше внимание, что в контексте голосового меню я не сделал обработку статусов состояния телефона секретаря, хотя это может быть нужно, если у вас будет один секретарь принимать звонки."), желательно пример))) Заранее премного благодарен.
По таким нюансам уже не подскажу. Давно не погружался в voip тему. Подзабыл многое.
Доброго времени суток! Наверное начну с того, что данная инструкция одна из лучших среди тех, которые я смотрел и изучал.
С Linux я знаком мало, как-то не было нужды изучать, но тут обстоятельства так сложились, что я стал изучать Linux из-за необходимости поднять сервер Asterisk'a. Все шло по инструкции до момента сборки Asterisk'a, а именно возникла трудность с Jannson:
checking for JANSSON... no
checking for json_sprintf in -ljansson... no
configure: *** Asterisk requires libjansson >= 2.11 and no system copy was found.
configure: *** Please install the 'libjansson' development package or
configure: *** use './configure --with-jansson-bundled'
Покопавшись в сети я так и не нашел ответа как обновить Jannson до версии 2.11. Я подозреваю, что Jannson 2.11 необходим из-за того, что я взял Asterisk 18, а не как указано 16. Сервер CentOS 7.
Может быть вы подскажете как мне все таки обновить или установить Jannson 2.11? Заранее благодарен за ответ и весьма подробную, понятную инструкцию.
Я бегло погуглил и не нашел простого решения. Готового пакета с Jannson 2.11 для Centos 7, как я понял, не существует. Надо либо от других версий пробовать rpm пакеты ставить, но могут быть проблемы с зависимостями. Либо собирать самому из исходников, но тоже не факт, что получится. С учетом того, что в линуксе вы новичок, я бы вам не советовал тратить на это время. Это может оказаться непосильной задачей.
Советую остановиться пока на 16-й версии и сделать все по моей статье. У этой версии поддержка еще 3 года будет. Вам хватит, чтобы освоиться и войти в тему. Потом без проблем перенесете все на 18-ю или какую-то другую версию. Там еще и на pjsip переходить надо будет. Так что переезда не избежать. А моя статья все равно использует старый sip, так что 16-я версия тут лучше всего смотрится.
Ну я пробовал собрать из исходников Jannson 2.11 и 2.13.1 - в системе остается Jannson 2.10, смотрел через № rpm -qa. Я так понимаю, что на CentOS 7 они просто не встают. Хотя я может и ошибаюсь. Большое спасибо за ответ, пойду щупать Asterisk 16. ;)
Уважаемый Zerox, вот тут, как говориться "Либо я дурак, либо лыжи не едут..." Дело в том, что при попытке установить Asterisk 16.15.0 на моменте сборки Asteriska вылазит та же самая чертовщина с Jannson и вот тут я совсем запутался... У вас есть какие-то мысли по таком№у рзавитию событий? Ну как у более опытного пользователя.
Не зная всех подробностей, не могу что-то сказать конкретное. Когда последний раз проверял статью, все работало. Попробуйте все начать с нуля на чистом сервере.
Все конечно хорошо и красиво вот только pjsip тут установлен а настройка проходит через sip.conf. Как понимать сие чудо?
Здравствуйте, я в линухах поный ноль , но очень хочется самому ручками все настроить
подскажите пожалуйста, в чем может быть проблема, все сделал по вашей инструкции до момента усановки 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/ класть не надо
Но оно не работает в таком случае, либо же настройки лежат где то в другом месте, если да , то где ?
В общем подскажите куда копать
В данном случае в статье подразумевается, что используется дефолтная настройка 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
#
- заработало
авторизацию правда не настраивал еще, но уже радует))
Спасибо за статью, по данному описанию собрал рабочую сеть внутри сети.
Но дело дошло до 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 порт.
Как решить эту проблему?
Провайдер не может блокировать sip трафик? Я много раз с подобным сталкивался.
а это каким образом проверить можно?
Дело в том что порт открыт, я проверял.
Неужели они трафик режут?
Да, могут мешать именно нормальному хождению трафика. Порт при этом будет открыт. Я с таким сталкивался, приходилось по vpn подключаться sip телефонию. Провайдер просто продавал сам услуги voip, поэтому другим не давал пользоваться чем-то со стороны. Проверить легко - попробуйте подключиться к какому-то другому voip провайдеру. Например, через софтовый клиент на своем компьютере.
Спасибо за статью - реально помогла решить проблему: сервер телефонии - за 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 НЕ РАБОТАЛО! стоило переписать правила - голос пошел в обе стороны!
Круто, что это помогло. Я бы так сходу и не догадался поменять правила. Не очевидно, что ваше не будет работать.
Вот и мне было не очевидно целых две недели))). До правила по SIP, TCPDUMP показывал прохождение пакетов чисто между локальными интерфейсами: офис2_lan:5060 - офис1_lan: 5060. Rtp было асинхронным. Теперь все идёт так: офис2_lan - офис1_wan. (5060, и rtp). И все работает.
Здравствуйте! Изучаю по Вашей инструкции asterisk, за что огромное спасибо! У меня возник вопрос: я записываю(через Record()) сообщения, которое оставляет клиент (тот, кто позвонил нам) и хочу распознать через google cloud stt записанный файл формата wav, но столкнулся с проблемой плохого качества записи (8000 Hz, 1 channels, s16, 128 kb/s) и последующих проблем с распознаванием. Попытался записать в формате mp3, но астер мне сказал, что он умеет только "читать" mp3, но не записывать. Можно ли как то улучшить качество записываемого файла? Или записывать не через Record, а что-нибудь другое, которое записывает в лучшем качестве. Спасибо.
Я не решал никогда подобную задачу, поэтому не знаю, что посоветовать для гарантированного улучшения качества записи. Попробуйте записывать разговоры через 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)
Я не пойму, нужно или нет загружать в mysql /var/www/html/cdr/docs/mysql_cdr.sql?
Я дошел до "В папке docs подробная инструкция по настройке. Все дальнейшие действия делаются в соответствии с ней." и не пойму, что делать дальше?
Вроде по данной статье , мы создали таблицу cdr и колонки.
Здравствуйте,
При звонке с alcatel на asterisk (v16 + freepbx v15), на экране телефона alcatel отображается "SIP", а при поднятии трубку на asteriske, на телефоне alcatel отображется "вызываемый номер" и "SIP". Скажите пожалуйста, в чем может проблема.
Сам alcatel куда подключен? К этому же asterisk? Вообще, за информацию на дисплее аппаратов отвечает CALLERID. Надо копать в эту сторону.
Да, asterisk подключен к alcatel по sip транку
Zerox, здравствуйте,
Спасибо большое за подсказку, нашли решение.
Возник другой момент, при внутреннем звонке из астериска на alcatel, на аппарате алкателя звонок поступает на "isdn", вместо "внутренней линии". Нужно чтобы внутренние звонки поступали по внутренней линии. Скажите пожалуйста где в астериске можно настроить это? Есть ли какой-нибудь параметр в астериске, отвечающий за данный процесс?
Добрый день. Установил астериск 13 и при перезагрузке диалплана не вижу ошибок. всегда пишет pbx_config successfully loaded 33 contexts. Причем я намеренно сделал синтаксическую ошибку, чтобы увидеть в консоле как он про нее пишет. С астром 11 такого не было. Что нужно включить, чтобы он выводил в консоле ошибки в диалпланах?
Здравствуйте.
Вроде нашёл небольшой недочёт в инструкции.
Нужно добавить каталог "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 работает и так.
Здравствуйте 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
Я так понимаю решения нет?
Наверняка есть, но у меня нет возможности в этом разбираться и решать вопрос.
Да, есть, спасибо, нашла ответ в Вашей статье "Оповещение о занятости второй линии в asterisk". Увеличила кол-во линий на 2 и всё заработало). Вы в ней как раз про этот нюанс рассказываете.
Ещё раз Спасибо за Ваш труд!
Исправление: Добрый день, как я могу с уважением поменять язык на испанский или английский с ASTCDR?
Не очень понял, о каком языке идет речь? В web панели со статистикой звонков?
Да, веб-панель «Asterisk CDR Viewer Mod».
Я из Латинской Америки, все устанавливаю хорошо, но панель на русском.
Как я могу изменить его на испанский? Спасибо.
Эта панель русскоязычная. У нее нет перевода на другие языки. Так что только вручную переводить. Тут не так много текста, не трудно сделать самому.
Спасибо за ваш вклад, я надеюсь, вы настроите биллинг A2 со звездочкой 16 и freepbx. Ура!
Добрый день, как я могу изменить язык на испанский или английский, с уважением.
Здравствуйте Zerox.
Еще раз огромное спасибо за развёрнутую статью по настройке с нуля!
Осветите пожалуйста отличая и примеры настроек подключения "удаленных" пользователей к станции. Думаю во многих компаниях есть необходимость подключения не только внутри сети, но и мобильных пользователей (например топов).
Спасибо.
Для удаленных подключений каких-то особенных настроек делать не надо. Если в свойствах пиров не настроены ограничения по ip для подключения, то они будут разрешены всем. Дальше вам нужно будет пробросить порт 5060 на свой asterisk.
Спасибо!
Ещё вопрос, Лет семь назад пробовала ip телефонию на аппаратном уровне, станции поддерживала. Кол-во запросов от "халявщиков" забивали интернет.
Как обстоит дело с безопасностью у астериска сейчас? Перенос порта? Эхо запрос от порта имеет режимы вещания? Можно ли его включить так, что бы сканеры не определяли его как voip?
Спасибо!
В общем случае с безопасностью проблем нет. Я не делаю ничего особенного, кроме настройки fal2ban. Астериски смотрят напрямую в интернет. Единственное, на всякий случай не раздаю удаленный доступ к пирам без необходимости. Если удаленно никто не подключается, то регистрация пиров ограничивается списком локальных ip адресов.
Т.е. имеет смысл привязать все локальные телефоны по ip что бы сократить вероятность подбора?
Или достаточно указать nat=no? У меня астериск с одним ethernet портом.
Спасибо.
Не обязательно все телефоны по ip привязывать. Я обычно просто ограничение на уровне подсети делаю:
permit=192.168.3.0/255.255.255.0
deny=0.0.0.0/0.0.0.0
Спасибо!
Здравствуйте помогите пожалуйста.
Создал Веб-интерфейс через Asterisk-CDR-Viewer-Mod. Все работает кроме записи, не могу прослушать. Стоит типа нет доступа( что делать?
У Вас есть группа в телеграмме?
Кто и где говорит, что нет доступа? Записи реально создаются в папке?
Да создается запись. Не могу прослушать.
В столб се где запись стоит знак круглый внутри черточка, типа не возможно прослушать. Мне нужно прослушать запись и скачать. как могу это сделать?
Dastan, попробуйте скачать с сервера саму запись и прослушать. У меня в некоторых ситуациях создаются файлы которые не проигрываются физически, эти файлы не отображаются в вебе. (игралась с настройками. Если всё сделано по статье Zerox- работает всё как надо).
Скачать можно программой WinSCP.
Спасибо за подробный материал!
Музыка на ожидании (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
Большая работа. Спасибо.
Как сделать две очереди? у меня есть два городских номера, в 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], как можно из разделить?
а где же диалплан из которого ты вызываешь очередь покажи
Почему нету кнопки воспроизведения записи в web cdr в папке запись есть, а на сайте нету пути все прописал сделал тупо все как на вашем сайте у вас на скрине видно что можно воспроизвести запись у меня нет. Не могу понять в чем дело подскажите пожалуйста.
Такое возникает, если пути к файлам указаны не верно. То есть сохраняются они по одному правилу, а в cdr панели указана либо другая схема именования файлов, либо неверно указан каталог для размещения, а может просто прав на чтение не хватает. Смотрите в этом направлении. Панель просто не видит файлы, поэтому нет кнопки воспроизведения.
У меня та же проблема. Запись хранится в mnt/calls
но на WEB CDR не могу прослушать.
в настройках var/www/html/cdr/inc/config есть два файла php и php.sample там в (monitor_dir==> прописал mnt/calls) что я еще не правильно сделал ?
Может у вас браузер флеш блокирует? Не знаю как сейчас, но раньше там для прослушивания записей использовался flash, который сейчас все браузеры по-умолчанию блокируют.
Когда оператор начинает разговор выходит следующая ошибка Can't send 10 type frames with SIP write, это никак не мешает работе, но получается, что засераются логи, как можно избавиться от данного сообщения версия астера 16
Пишу asterisk -r потом core reload все прекрасно работает, потом куда-нибудь ухожу, приходу через 3 часа пробую позвонить на номер ничего не работает, опять пишу core reload звоню все норм, в чем может быть проблема?
Подскажите пожалуйста. Где копать? почему не записываются разговоры с транка на cdr . Я уже наверно перепробовал все варианты sip.conf и в диалплане. Просто может я не там вообще копаю. транк зарегистрирован как подключенного пользователя астериск видит, но запись не записывается...
В статье были проблемы с отображением конфигов и некоторые были не полные, в том числе по записи разговоров. Я сейчас все исправил. Попробуйте еще раз внимательно все проверить по статье и попробовать. Должно получиться. Я в том числе запись проверял совсем недавно, когда правил статьи, в феврале. Все работало и записывало.
Так запись идет, но только внутри сети, а по транку от ростелеком записи нету, а понять в чем проблема вообще не могу.
exten => _XXX.,n,Dial(SIP/${EXTEN}@397945) 397945 - это то что я пишу в sip.conf в fromdomain и host ?
Должно быть так:
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 один фиг транк работает, а запись нет.
Добрый день! Сделал все как у вас в статье, но почему-то в CDR не записываются разговоры с транка от ростелеком, получается звоню внутри сети к примеру с 101 на 102 все норм, но когда звоню с транка( извините может не правильно выражаюсь) запись не идет, хотя астериск видит подключенного пользователя. Получается что когда набираю sip show registry все норм, в пользователях тоже все норм
на сколько я понимаю в cdr идут все записи которые находятся в паке mnt/calls, но почему то звонки по транку туда не записываются, я вот не могу понять как заставить астериск записывать разговоры по транку
на сколько я понимаю все записывается в папку mnt/calls , но почему-то при звонке по транку ростелекома в эту папку запись не происходит, подскажите что можно сделать , настройки полностью брал с вашей статьи. то есть получается с 100 на 101 все записывается с транка нет
/var/log/asterisk/cdr-csv/Master.csv записи звонка с транка тоже нету почему-то, есть все кроме как с трнка...
не могу понять в чем проблема может быть
Добрый день. Помогите плизз. Года 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
в случае с файлом, происходит его воспроизведение(реально воспроизводится) но вышеуказанные команды не выполняются. Что может быть не так? Последующие команды идентичны в обоих случаях. Спасибо.
Так трудно мне что-то сказать. Надо разбираться. Сходу можно подумать, что при наличии файла работает какой-то этап диалплана, который заменяет голосовую почту, а когда его нет, перескакивает этот этап из-за ошибки и переходит на голосовую почту.
Я думаю как раз наоборот, что то происходит после воспроизведения вызывается исключение и блок:
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 какойто особенный? надо будит в понедельник попробовать.
здраствуйте
при проброске портов командой:
iptables -t nat -A PREROUTING -p udp --dst $WAN_IP --dport 5060 -j DNAT --to 192.168.1.25:5060
выбивает ошибку "bad argument 5060"
подскажите пожалуйста что тут надо сделать
Вот у меня подробная статья про iptables - https://serveradmin.ru/nastroyka-iptables-v-centos-7/
Там есть примеры правильных пробросов портов.
здравствуйте, если $WAN_IP на свой ip замените, будет все нормально. Я чето тоже удивился первый раз, на ошибку глядя. Потом догнал)))
А может путаете минус с тире
Добрый день!
Редкой подробности и структурированности статья. Благодарен вам.
Можно вопрос - можно ли установить астериск на удаленный сервер - типа на такой на котором хостинг предоставляют. Второй вопрос - для каких целей такая установка может потребоваться? или лучше ставить на собственный сервер?
1. Да, можно установить asterisk на арендуемый vps. Единственный нюанс, если вы живете в России, то и арендовать лучше тут же, чтобы были минимальные задержки. Не стоит заказывать в Европе или Америке.
2. Для целей надежности и стабильности. Это вопрос не в плоскости астериска, а в плоскости темы, где лучше хранить сервера, у себя в серверной или у облачного провайдера. Каждый решает по месту, как ему удобнее. Если у вас арендуется внешний сервер, то при его падении или проблемами с интернетом, внутренней связи тоже не будет.
Zerox приветствую:может уделим вниманеи на вашем сайте настройку pjsip:и tls и может быть отключим все ненужные службы у кстериска
Я рассматривал недавно вопрос с pjsip. Лично для себя не увидел каких-то явных преимуществ от перехода на него. На обычном sip все работает так, как надо. Так что пока не вижу смысла тратить на него свое время. Если совсем уберут sip из астериска, тогда буду думать. PJSIP просто сложнее настраивать. Должна быть явная выгода от увеличения времени на настройку. А если выгоды нет, зачем тратить время?
Здравствуйте,
Не могу найти отличия в параметрах externip и externip.
Когда какой применяется.
externaddr
Здрассте. У вас в sip.conf есть "[authentication]"
для чего она и как работает?
Интересно,кто то осилил видеозвонки и видеоконференцию на астере на 16...17 версиях,или это гиблое дело.зависящее от клиента и прочих плюшек астера?
Тоже интересно было бы на это посмотреть.
Большое спасибо за подробную статью!
Не подскажете ли, как настроить видеоконференцию?
Не подскажу. Вообще ни разу их не настраивал.
Подскажите на счет прав, что-то не могу найти комментарий, но помню что был. После перезагрузки сервера на веб-форме перестали отображаться записи, хотя в папке с аудио они продолжают записываться и сохранятся, помню что раньше давал права для веб юзера для эту папку, но что-то сейчас не срабатывает. Может где-то ошибаюсь?
Здравствуйте! Подскажите если внутренний номер совпадает с внешним, например 102 внутренний и 102 Полиция как зарезервировать 102 как городской номер чтобы при наборе 102 уходили через городской номер, 102 внутренний отключен пытаюсь сделать его как городской.
exten => _XXX,1,Dial(SIP/${EXTEN},15) шаблон же _ХХХ , как это победить?
Доброе утро! Подскажите пожалуйста, хотел настроить 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
Выдает ошибку. Помогите исправить. К слову я с линуксом впервые сталкиваюсь, не судите строго))
В статье все есть. Проверяйте внимательно настройки. Они рабочие. Скорее всего где-то ошиблись.
у меня тоже самое, не нашли решение?
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], у меня почему то некоторые пути отличались, вставил как у автора и заработало.
Знаете чего вам не хватает? Кнопочки: "Скачать инструкцию" в PDF :D
Знаете чего вам не хватает? Кнопочки: "Скачать инструкцию" в PDF :D
А кнопочка то есть!!!
Блин а как коменты удалять??? :D
Там, к сожалению, без картинок. После того, как перешел на формат картинок webp, плагин сломался.
Всем привет.
Когда не чем заняться, можно и 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.
Это обсуждения в стиле, зачем настраивать nginx и php-fpm, если можно поставить панель VestaCP. Если вам подходит и устраивает функционал Freepbx, пользуйтесь на здоровье. Мне лично этот продукт не нравится. Я его обслуживал и у него свои недостатки. Многие вещи на чистом asterisk реализовать быстрее и проще.
С Freepbx вы не сэкономите время настройки, если не знакомы с продуктом. Там тоже нужно потратить время на освоение и настройку. Лично я голый астериск настраиваю быстрее, чем Freepbx. Тут всего-то пару конфигов набросать из готового шаблона и все работает. Страшно может выглядеть, если делаешь первый раз. Но так и с freepbx будет. Когда освоишься, уже другое дело.
Ну если пару конфигов, и потом не нужно ни чего делать, тогда GUI не нужен.
У меня 4 АТС, и приходится постоянно их контролировать.
А FreePBX значительно проще чем VI.
И повторюсь, у меня всегда есть возможность обновить Asterisk до последней LTS
Во-первых, лично я vi не использую. Во-вторых, тут тоже нет проблем с обновлением до последней LTS.
Ох и намаялся я с этим Sangoma Technologies с одной стороны вроде действительно за 15 минут установил а дальше погружаешся в бездну настроек которые не всегда коректно работают... Сюрпризы практически на каждом повороте так как логика разработчиков не всегда понятно и надо убить кучу времени дабы понять как оно работает. Про то что они навыдумывали с защитой я просто умалчу, так как для понимания надо выкурить и выпить много :)
В результате я лично пришел к выводу что лучше потратить время на изучение чистого Asterisk и иметь действительно стабильныю в работе систему чем ловить вечные сюрпризы и изучать пробукт который сильно заграмажден. Конечно это все относится к тому что использовать свободную версию.
Все такие поделки которые называются свободные на самом деле мнимая свобода. Разработчики делают свободную версию не для того чтобы вы ей спокойно пользовались а для того чтобы вы ловили глюки им говарили а потом устав приобретали платную версию.
Еще раз спасибо Владимер за такую хорошую инструкцию.
Добавьте пожалуйста в статью информацию о требованиях к ресурсам, согласно заявленного кол-ва абонентов, для комфортной работы всех и стабильных конференций. И также информацию о ресурсах для минимального кол-ва абонентов, например 10.
Спасибо большое за статью!
У меня нет такой информации, так как она зависит от множества факторов. Но в общем и целом asterisk потребляет очень мало ресурсов в своей работе. Для среднего офиса на 30-50 человек будет достаточно виртуальной машины с 1-2 Cpu и 2-4 Ram.
Обновил и актуализировал полностью статью под Centos 8 и Asterisk 16. Заменил в dialplan Macro, который объявлен deprecated, на GoSub.
Спасибо за статью, остался один вопрос но ivr меню:
Закольцовка срабатывает только если набирают 3-х значный неверный добавочный номер, если количество цифр другое звонок просто сбрасывается. Как сделать чтобы на любое количество цифр была закольцовка?
Вместо шаблона _XXX поставить шаблон _XXX. (с точкой на конце) или просто _X. В общем, просто шаблон поменять. Описание шаблонов астериска тут - http://asterisk.ru/knowledgebase/Asterisk+Dialplan+Patterns
Здравствуйте!
Надо заметить, что устанавливая asterisk на клиента OpenVPN на debian 10, ваша рекомендация при переадресации не внешний номер добавить строку
exten => 115,n,Dial(SIP/89151234567@397945)
в контекст [call-out] перед общим правилом набора на внутренние номера - не верна.
В таком случае, при наборе внутреннего номера, в CLI астериска выпадает сообщение:
-- Auto fallthrough, channel 'SIP/122-00000000' status is 'UNKNOWN'
и вызов сбрасывается. А вот если строку с переадресацией вставить после общего правила набора на внутренние номера, то - работает. Но я это заметил только в случае установки внутри OpenVPN. Так и не понял - почему так?
Я вообще не понял, при чем тут openvpn. Dialplan вещь в себе и от openvpn точно не зависит.
Здравствуйте Zerox. Спасибо за статью по установке и настройке Asterisk. Установил Аsterisk в CentOS 8, зарегистрировался в сервисе Zadarma. Связь между абонентами внутри сети OK. Звонок с мобильного телефона на +74957776675+добавочный - OK! Но звонок с 100 или101 на мобильный, либо 4444 длится 7 сёк разговорного времени, дальше сброс (вызов до поднятия трубки не обрывается, только обрывается разговор). Подскажите в каком направлении осуществлять поиск? Грешу на интернет-соединение, использую 4g-модем с провайдером Мегафон, раздача через роутер. Sip- порты 5060 и 10000-2000 udp открыты. Какой модуль asteriskотвечает за качество голосовой передачи? Уважением= Олег
Это я даже не знаю, куда смотреть. Причин может быть море. Для начала смотреть полный debug лог астериска в момент разговора и обрыва. Потом анализировать sip трафик во время разговора и обрыва, например с помощью sngrep - https://serveradmin.ru/analiz-sip-trafika-v-asterisk-s-pomoshhyu-sngrep/
Дальше уже думать, в зависимости от полученных на предыдущих этапах информации.
Спасибо, займусь. самое интересное, что cent os и asterisk устанавливались на 2 разных физических PC и у обеих исходящий обрывается через 6-7 сек. Клиент с 100-м номером тоже разный - Win и Android - безрезультатно.
Добрый день,
Спасибо за статью, настроил по ней астериск 16 на Ubuntu 18, c поправками конечно.
Вопрос по статистике звонков.
По умолчанию входящие звонки попадают в голосовое меню, оттуда уходят на колл центр и по подразделениям.
Колл центр - это очередь где отвечает первый освободившийся оператор.
С точки зрения статистики, все входящие звонки попадающие в голосовое меню считаются отвеченными.
Как сделать так чтобы отвеченными считались только звонки с которыми общался оператор?
Насколько я понимаю, так просто это не сделать с этой панелью. Она подходит только для простых случаев. Для колл центров я везде видел либо сильно допиленные решения на базе астера со своими панелями и статистикой, либо готовые решения именно под колл центр.
https://github.com/revall/queue-stats/ Для статистики колл-центов - за глаза, берите только с гитхаба, ибо у автора только на старом php заведется.
Вопрос таков? Могут ли на сервере блокироваться/переадресовываться и тому подобные вещи происходить с клиентами? А то уж оооооооочень большая конверсия недозвонов, и есть подозрение на воровство клиентов. Заранее благодарен!
Здравствуйте, Владимир! Спасибо вам за ваши туториалы! Но, кажется, в части настройки записи разговоров (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 не правильный? Хотя он как у вас - один в один.
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. Но сделал как вы сказали и... Вуаля! Всё работает без "ахтунгов".
Спасибо за информацию. Нужно будет актуализировать статью под свежие lts версии asterisk.
Владимир, а можно вопрос насколько сильно отличаются настройка sip и pjsip или это ничего принципиального в астериске не меняет ?
Я не знаю. Всегда использую sip. Мне достаточно его возможностей.
ошибка команды 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 исчезают.
При компиляции ошибка подскажите
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
Эта ошибка в модуле mysql, который давно уже объявлен deprecated и использовать его большого смысла нет. Вместо него надо настраивать подключение к mysql через odbc.
Не сможет заработать статистика пока вы будите видеть эти ошибки
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
Вот мой ролик
CentOS 8 Asterisk 16.7.0 RealTime
https://www.youtube.com/watch?v=aU66SWQwgUE
Сделал все правильно, но один софт фон пишет что нет подключения к серверу другой тупо пишет регистрация и ничего не происходит, делал астериск на 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.
Решил проблему:
Отключил файрвол.
systemctl stop firewalld
Добрый день. Не проходят исходящие, подскажите пожалуйста.
строка регистрации
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
что может быть не нак
Нужно лог в первую очередь смотреть, чтобы понять, почему звонки не проходят.
При наборе выдаёт такую ошибку:
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.
Здравствуйте! уже подключена виртуальная АТС. Телефоны поддерживают работу в двух sip (1,2). Возможно ли по второму каналу подключить только внутреннею телефонию без выхода в интернет. т. е не настраивать iptables И так далее, а только прописать номера внутренних телефонов и все. Получится так что по одной линии телефон подключен к виртуальной атс, а по второй только внутрення аст (астерикс). надеюсь понятно объяснил)).
Объяснили понятно. Это без проблем можно сделать, но пользоваться будет не так удобно, потому что нужно будет линии каждый раз на аппарате выбирать, по которым звонить. Если это устраивает, то можно настраивать.
А по хорошему все внешние транки заводятся на астериск, а пользователи только к нему подключаются. Так и звонить удобнее, и управлять всем хозяйством. Ничего особо сложного в этом нет. У меня в статье как раз про это подробно и написано.
Добрый день. Спасибо за статью. Я новичек и настроил астериск самым примитивным образом конечно, в одном флаконе с дистрибутива с Linux Sagnoma 7, так как предыдущая старая атс "рухнула", а вопрос с атс и звонками в офисе необходимо было решить в кратчайшие сроки. Через несколько дней работы, видимо какой-то из лог-файлов (пока не знаю, какой именно) переполнился и при входе через веб выдает ошибку: file_put_contents(): Only 0 of 96 bytes written, possibly out of free disk space
И похоже, что эта проблема в самой платформе linux sagnome 7. Отсюда вопрос, как его можно почистить, если мне доступна консоль только freePBX ?
Или всё же не остается никаких вариантов, кроме установки на Debian, который Вы описали в статье?
В статье у меня Centos. Про sagnoma вообще ни разу не слышал, даже не знаю, что это такое. Переставлять не обязательно, если все нормально настроено. Надо просто зайти на сервер и освободить занятое место. Через web интерфейс Freepbx скорее всего это сделать не получится. Нужна консоль сервера.
Добрый день.Спасибо за ответ. Но переустановить мне всё таки придётся. Что-то видимо я с разметкой диска при первоначальной установке я напортачил.
Добрый день, подскажите пожалуйста
При заходе на 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
Покупаете Raspberry PI 3 с гигом памяти в ДНС, ставите на него Астериск (желательно по этой статье с компилированием из исходников), настраиваете транк IAX2 с головным сервером, внутри подключаете по sip внутренние телефоны, настраиваете маршрутизацию (через головной офис или напрямик - это в диалплане).
Если открываете порты наружу, то включайте fail2ban. Если не открываете - fail2ban будет только мешать.
Имея большой опыт работы с sip протоколом за натом, могу посоветовать товарищам, соединяющим офисы микротиками через l2tp или pptp vpn, не связываться с открытием портов и пытаться через все это напрямик цеплять телефоны удаленных подразделений.
Sip для телефонов, транки на sip непредсказуемо виснут. Для связи удаленных подразделений делайте транки на основе IAX2, там один порт и его проще контролировать. Когда виснет sip, хрен поймешь где что зависло и когда отвиснет.
Я обычно использую openvpn для объединения сетей. Проблем с sip при этом не наблюдаю. Все настраивается просто и очевидно.
Ну да, это пока сетей меньше десятка, они стабильно доступны и когда на головном сервере с астериском не отрубают питание.
А когда все это начнет случаться (а по другому при GSM-доступе и не бывает), сессии начинают зависать в астериске и новые он принимать не хочет, микротик блочит разрешенные вроде бы порты, продажники жалуются директорам, а для меня жизнь обретает новые краски.
Зачем нужен этот карнавал? Сделал транки через IAX2 и все перестало ломаться. Ну в общем каждый сам выбирает.
Спасибо за статью. Хотелось бы видеть изменения в настройках конфигов астериска с учётом перехода на PJSIP.
Спасибо за статью!
Возникает такая ошибка, подскажите, пожалуйста, как ее решить.
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.
Скажите почему могут не отображаться записи на веб-форме?
Фильтрации никакой нет. В папке аудио файлы есть, а веб-форма чистая. Может я куда то забыл дать права? Что проверить можно?
У меня не поднялось 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, соединение появилось, но веб-форма все равно пустая.
Добрый день.
Владимир, а не подскажите какие настройки требуется добавить к группе, чтобы состоящие в ней номера могли звонить на 2-3 заранее известных внутренних номера?
P.S.: Сервер установил, все завелось, все работает! Спасибо!
Это не настройки надо добавить, а составить диалплан под это требование. Номера с указанными ограничениями должны быть в отдельном контексте. Это настраивается в конфиге с пирами. А дальше в диалплане в этом контексте настраивается разрешение по звонкам, примерно так:
[local-zvonok]
exten => 155,1,Dial(SIP/${EXTEN})
exten => 156,1,Dial(SIP/${EXTEN})
Пиры, которые будут входить только в контекст local-zvonok смогут звонить только на номера 155 и 156.
Подскажите, есть связка Астериск и DVG6004s. Все работало прекрасно несколько лет, вдруг ни с того ни с сего перестало. а именно: мы звоним с софтфона через астериск в город, но нас не слышат (вообще ни звука), а мы слышим абонента на другом конце. При этом со внутреннего софтфона на внутренний софтфон все работает.
На шлюз приходят 3 аналоговые линии из города, далее к WAN шлюза подключена сетевуха сервера с астериском. Вторая сетевуха на астериске подключена в локальную сеть в которой у нас софтфоны.
Помогите пожалуйста разобраться.
лог с астериска:
В логе я каких-то явных ошибок не заметил. Обычно, когда кого-то не слышно, это сетевые проблемы, особенно если asterisk за nat работает. Чудес не бывает, если много лет работало, а потом перестало, значит что-то изменилось. Если нет специалиста по настройке астериск, ищите, что изменилось за последнее время и возвращайте как было.
нат не при чем, потому что на шлюз идут аналоговые линии 3 штуки из города, заходят на шлюз, из шлюза патчкорд напрямую идет на сетевуху астериска. и со второй сетевухи астериска уже идет в сеть в которой софтфоны наши.
по логам с железяки (шлюза) говорится что RTP S=2745 R=0 Lost=-1
т.е. ресивд-а нет пакетов.
Камрад, а подскажите насколько сложно будет после того как вы настроено по Вашему мануалу перевести в базу? Ну т.е. чтобы конфиг были не в файлах а в базе, чтобы изменения применялись сразу и не приходилось грузить диалплан и т.д. Реально ли это исправить на текущей стадии или нужно изначально поднимать по другому?
Я не знаю, никогда не хранил конфиги в базе. Подозреваю, что это не должно быть проблемой. Логика настроек одна и та же. А перенос в разные форматы вопрос чисто технический. Это по идее :)
Владимир, подскажите пожалуйста, это нормально, что при выполнении команды:
contrib/scripts/install_prereq install
вылазит сообщение, что
Пакета с названием speexdsp-devel не найдено.
Пакета с названием iksemel-devel не найдено.
Пакета с названием libresample-devel не найдено.
Пакета с названием hoard не найдено.
Разрешение зависимостей
и эти пакеты так и не устанавливаются в систему - даже при разрешении зависимостей?
Точно не знаю. Если потом астериск нормально собирается и устанавливается, то в целом, проблем может и не быть. У астериска обширный функционал, поэтому и пакетов с зависимостями много. Но часто большая часть из них не требуется, особенно если используется типовой функционал по организации звонков.
Астериск собрался и запустился успешно - без ошибок. Но вот эти указанные пакеты пока не дают покоя...
Функционал пока используется самый простой, без излишеств - ВМ-ка с чистым CentOS.
Спасибо Вам за понятный ответ!
Вроде всё настроил по статье. 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/
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/, а в другой указанной папке ?
Там в конфиге где-то настраивается папка. Посмотри повнимательнее. Я настраивал это последний раз несколько лет назад. Уже не помню подробностей, но там не сложно.
Блин, невнимательно читаю описание. Путь я указал там, выбрал не тот пункт в storage.
Камрад, а подскажите касательно записи сразу в папки с указанием дня, а не просто в корень указанной.
В мануале мы указывает просто папку, куда будут кидать сконвертированные в мр3 файлы. И даете приписку что в редми прописано как сделать чтобы записи раскидывались по папкам. Но там обычный скрипт, который в начале каждого дня раскидывает файлы предыдущего дня в папку в названии которого указан нужный день, но в базе то это не меняется. И получается: сегодня все записи кидаются в общую, на утро след. дня они скриптов перемещаются в созданную папку с номером дня, но на веб-форме ломаются ссылки. Если я захочу прослушать вчерашний день, то записей не будет. Он же будет искать в старой папке, а их там уже нет.
Как можно подкорректировать скрипт или может сразу макрос, чтобы они писали записи сразу в папку с указание дня, а не просто в кучу, а то уже порядка 20 тыс файлов.
Прочитайте комментарии в файле config.php от web панели, там написано, как хранить ссылки на файлы с учетом хранения записей в папках по дням или как-то еще. А вот тут пример, как это настроить в астериске сразу, без скриптов - https://serveradmin.ru/forum/astersik/vopros-o-makrose-zapisi-razgovorov/#post-1017
Если совместить эти два источника, получится сделать то, что вы хотите.
Спасибо.
Добрый день!
лог текстовый пишется в 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'
Тут прямым текстом написано, в чем проблема:
Cannot connect to database server localhost: (1044) Access denied for user ‘asteriskcdruser’@’localhost’ to database ‘asteriskcdrdb’
Доброго времени суток! Мануал отличны настроил все пашет, но почему то вместо DID получаю S
Executing [s@ivr-main:2] NoOp("SIP/Tele2_XXXXXXXXXXX", "s") in new stack
Кто может подсказать почему так
Я настроил запись, там есть кнопка удаление записи разговора. Но когда я нажимаю на нее выдается ошибка что нет правда на папку. Как понять под каким пользователем веб-формы пытается удалить файл из папки, чтобы потом дать права?
Вопрос закрыт. Дал права на Apache и вроде удаляются записи.
Все правильно. Панель работает под web сервером. Для удаления файлов надо дать доступ пользователю, под которым запущен web сервер apache.
Макросы как я понял будут убираться из астериска, нужно переписывать код на 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.
Осталось только указать настройки подключения к базе данных 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
Здесь нет этого файла https://github.com/prog-it/Asterisk-CDR-Viewer-Mod/tree/master/inc
https://github.com/prog-it/Asterisk-CDR-Viewer-Mod/blob/master/docs/Readme.md#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-cdr-viewer
Настройка CDR Viewer
Пример конфиг файла находится в inc/config/config.php.sample.
Перед началом использования этот файл нужно переименовать в config.php.
Все настройки находятся в файле inc/config/config.php с подробными комментариями, тут не должно возникнуть сложностей.
Здравствуйте. Помогите пожалуйста советом. Имеется сервер Asterisk, большая часть абонентов сидит в локальной сети, абонентов много. Но требуется одного подключить снаружи, через интернет. Порты на шлюзе открыл, но коннекта всё равно нет. Как-то можно подключить одного абонента снаружи, не переделывая всю конфигурацию?
Надо смотреть настройки пиров. Возможно, для них разрешены подключения только из локальной сети. Если это так, то проброса портов не достаточно. Для конкретного пира нужно будет разрешить подключения с любого ip, плюс, скорее всего и другие настройки изменить. Зависит от того, как настроен астериск - напрямую смотрит в интернет или через NAT.
Смотрит через NAT, в роли которого выступает отдельная машина. Ок, а где именно это настраивать, и какой параметр за это отвечате?
Столкнулись с проблемой /asterisk: error while loading shared libraries: libasteriskssl.so.1
после этого /configure
make
make install
и как то все заработало может кому поможет
Подскажите, как запихнуть преобразование записей mp3 в конференцию. Я пытался сделать по аналогии в confbridge с тем что мы делали за для записи обычных телефонов, но не работает. А если по дефолту ставить значение на запись yes и указать путь то конфу пишет в wav.
МОжет не стоит лезть в конфу и записывать через диалплан, т.е. как то добавить запись перед:
exten => 999,1,Answer()
exten => 999,n,ConfBridge(1,confer)
Подскажите как правильно сделать?
уже нашел cd -
Нажал на 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"
Приветствую. Окно выборов компонентов сборки. Выбрал компоненты. А как сохранить? По книге "Завершив работу с окном выбора компонентов сборки, введите символ Х , чтобы сохранить изменения и закрыть окно." Непонятно как закрыть. Не проходит команда sudo make . Получаю в ответ : "make: *** Не заданы цели и не найден make-файл. Останов." Наверно вопросы простые кто нибудь ответьте.
Нажать Save & Exit.
>Параметр callerid можно задать кириллицей, но могут возникнуть проблемы с некоторыми телефонами и точно возникнут проблемы, когда вы будете вести статистику звонков в mysql. Я не смог победить эту проблему с кодировками, поэтому использую только латиницу в этом параметре. Туда можно писать либо должность, либо ФИО человека.
На сегодняшний день не нашли решение проблемы с кириллицей?
Я и не искал. Может ее уже и нет. Рекомендую проверить.
Добрый день.
Имеем Сип транк с 2 номерами. Городской и мобильный.
Транк поднимается без проблем дозвоны идут на городской номер. А мобильный никак не работает. Пишет все абоненты заняты.
Приписывал входящие маршруты с указанием разных номеров. Никаких результатов.
Как правильно прописать 2 номера?
Добрый день. Имеем Asterisk + Freepbx , SIP транк с 2 номерами . 1 городской, 2 мобильный. У них 1 учетка. И она привязана к городскому. В Астериске сип поднимается и происходят дозвоны только на городской номер. На мобильном постоянно : На данный момент операторы заняты. Пробывал прописывать в поле from= оба номера. Никаких изменений. Запрашивал у провайдера ответили тоже самое 1 учетка на 2 номера. Не могли бы подсказать как прописать в настройках второй номер.
Выяснилось, пропало соединение с ODBC, поэтому ничего не пишется в базу. Я не силен в базах данных не подскажете как вернуть соединение или проверить почему оно не конектится. Базовые логи чистые. Настраивалось все по 11 пункту и до перезагрузки работало. Что могло отключиться после ребута сервера?
Почему может не работать детализация?
Настроил, открыл веб-морду сделал пробный звонок: есть детали и есть запись. Грузанул сервак. Снова позвонил. Детализации нету при поиске звонок не находит, но аудиозапись в папке есть. Но на веб морде нет самого звонка, как будто в базу запись не сделалась, что был звонок. Я мог что-то упустить в автозагрузке?
Апну вопросик с вашего позволения. За выходные так и не разобрался. Вроде повторно все проделал, но в детализации всего один звонок. Как можно проверить пишутся ли данные в базу?
Для начала проверьте, если ли ваш звонок в дефолтном логе звонков астериска - /var/log/asterisk/cdr-csv/Master.csv
Дальше посмотрите, есть ли информация о звонке в mysql базе, зайдя в таблицу с записями.
Если все везде есть, то обратите внимание на web панель. Я видел в ней такие глюки и не раз, когда звонки не отображались. Сразу под настройками фильтрации появляется надпись "Найдено 48, отфильтровано 2 записей", хотя никаких фильтров нет. И этих двух звонков реально нет в веб панели, хотя они есть в статистике.
В базе нету записей, только одна запись, которая была до перезагрузки. Новые туда не пишутся. Они должны переносится из дефолтного лога или вносятся при каждом звонке?
Я перепроверил все файлы и все данные в пункте "11 Учет и просмотр статистики звонков (cdr viewer)" Все что вы расписали у меня записано и добавлено. Есть какой-то механизм для проверки почему не идет запись в базу? в 11 и 12 пункте вроде бы нет никаких автозагрузок при старте системы, которые я мог бы упустить.
Можете подсказать с переводом звонка на внешку? Вопрос на тостере, чтобы не писать в комментарии кучу текста с логами. Буду признателен за направление куда копать - toster.ru/q/604395
Вроде добавлял строку, которую там говорят сделать, но тогда звонок просто в никуда уходит.
Камрад!
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)
Печальные новости. Не понятно, чем MACRO не угодил. Куча готовых конфигов с ним, теперь все переделывать. Я пока не делал новых установок со свежими версиями, поэтому не сталкивался.
Понял, спасибо.
Еще такой вопрос: Почему на вебморде может не отображаться вариант проигрывания записи?
Сделал все по мануалу на 13-ой версии - все окей. Когда захожу на вебморду в детализацию, показываются звонки, но в столбце "Запись", стоит перечеркнутый кругляшок при наведении на который показывается "Нет".
Но при этом запись есть и в папке mnt/calls находятся, но на веб морде их нет. Куда копать?
Наверно что-то с путями к файлам. Панель не видит эти файлы. Может в базе пути с ошибкой добавляются. Думаю в эту сторону надо копать, если сами записи реально есть.
Да, спасибо! Была опечатка в пути, исправил все заработало.
По MACRO я вас немного обманул в 16-ом пока просто выдается предупреждение что МАКРО устарело и вследующей версии будет удалено. Просят использовать GoSub.
Привет! Статья отличная, но есть вопросы именно по установке из репозитория. Все вроде и хорошо и складно, но не все модули присутствуют (app_directory.so app_ices.so app_mp3.so app_page.so app_voicemail.so format_jpeg.so func_audiohookinherit.so) вот этих вот никак нету(((( Ставлю 16-ю версию. Почему из репы, а не собираю из сырцов? Потму что необходимо обновлять систему (ставлю на centos 7). При раворачивании из сырцов - все гуд, все модули на месте. При подкладывании файлов модулей отдельно - ругань на то что модули не иницилизированны. Спасибо за ответ.
Отличный материал, спасибо! Настройки астериска копипастом заработали и на OpenBSD, вот прям как есть, только IP изменил в соответствии со своим. Но это уже просто для проверки, я тут в виртуалке кручу OpenBSD для всяких экспериментов, проверяю на применимость в моих сценариях использования. А в продакшн пошёл Debian 8, с астериском, установленным по вашей статье.
На вашем сайте блокировщик рекламы отключил, хоть как-то отблагодарить за труды.
Очень нравится язык, которым написана статья.
Большое спасибо за ваши труды.
В тексте несущественная опечатка: "часовой пояс GTM"
Похоже, имелось ввиду "GMT".
Здравствуйте, прошу помочь с настройкой обработки # в меню ivr, есть freepbx с настроенным меню ivr, в нем говорится что при нажатии * повторно проговаривается сообщение, а при нажатии # перебрасывается в главное меню, но почему то при нажатии # на английском произносится слово transfer, потом длинный гудок секунд 15 и звонок сбрасывается
В asterisk клавиша # закреплена как команда blindtransfer (перевод звонка без согласования). Либо менять клавишу для перевода звонков в /etc/asterisk/features.conf секция [featuremap], либо в IVR использовать другую клавишу для перехода в меню. Например 0.
Удачи=)
Прошу помочь с ошибкой возникшей при подключении 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>
А как решилась ошибка, появилась тоже при подключении 3CXPhone
Привет у меня так же, как решил? Все делал по статье!
Приветствую!!! Большое тебе спасибо!!! Статья класс, с никс системами вообще не знаком но с твоей помощью получилось поднять мини-АТС.
Камрад, а не планируется ли актуальный мануал по Astersik 16.0 + Centos 7 в ближайшее время ?
А там есть какие-то принципиальные отличия, кроме процесса установки? Обычно у астериск хорошая обратная совместимость. Старые диалпланы работают в новых версиях. А это самое главное, что есть в настройках.
Да есть малец. Я в линуксе еще слабо шарю и ошибки для меня это просто жесть.
Вот к примеру ставил астериск на 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
А зачем астериску maria 10? Я бы просто поставил на mysql 5 и не тратил время на решение этой проблемы. В данном случае разницы никакой не будет.
Ну хотелось как бы все последнее поставить и не заморачиваться. Смысл ставить 5-ую версию, когда уже 10.3 есть. Может она как нибудь лучше оптимизирована. Или астер под нее лучше заточен.
Так в том то и дело, что разницы не будет, а заморачиваться как раз надо. Mysql вам нужен, если собираетесь там статистику хранить, либо для еще какого-то дополнительного функционала. Самому астериску mysql для работы не нужен.
Ну в принципе да, тогда получается по сути можно не устанавливать все что связано с рнр и бд, т.е убрать из установки след.:
mariadb-server mariadb php php-mysql php-mbstring tftp-server httpd php-pear phpmyadmin php-process php-xml
Поставить pjproject, jansson и сам астериск. Запустить меню, собрать и прсот добавить диалпланы.
Всякие CDR и прочее можно опустить ?
Благодарю за помощь!
Здравствуйте! Все выполнил по шагово по вашей статье однако сервис не запускается 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.
Такая же проблема
Сейчас проверю.
Проблему увидел. Только что попробовал собрать астериск и получил ошибку. Исправляется она добавлением ключа 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 Астера..
Появилось парочка вопросов. Первый - как обновить? я говорю не про переход с 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 в настройках группы
Уточню что связь не работает именно на этом телефоне -_- По крайней мере звонки из наружи и наружу. Внутри как то не догадался проверить
Обновлять сбором и установкой из исходников новой версии. То есть делается все то же самое, что и здесь, только с новой версией и ставится поверх.
Call from peer ‘205’ rejected due to usage limit of 1
Из текста ошибки понятно, что стоит ограничение на одну линию на пир. Эта линия чем-то занята. Надо либо смотреть, чем занята, либо увеличивать этот лимит.
не подскажите чем и как смотреть?
Если линия занята, значит по телефону кто-то разговаривает. Или работает какая-то служба на телефоне, которая занимает линию. Можно логи астериска посмотреть, можно просто на телефон глянуть, что там с ним не так. Линия просто так не может быть занята.
И еще вопрос... Если схема такая: VPS где поднят asterisk -> Internet -> роутер -> 2 пк с софтофоном 3cx. Будут ли нормально работать звонки с одного пк на другой?
Просто на моменте "Если у вас так же, то все в порядке. Чтобы протестировать звонки, нам нужно подключить двух абонентов. Настраивайте еще один телефон или софтофон. Проверяйте в списке подключенных пиров чтобы было 2 подключения и попробуйте позвонить друг другу. Если вы все сделали правильно, то локальные звонки должны работать." сложилась такая картина - если позвонить с одного номера на другой, то звонок проходит. Но - при нажатии на кнопку "ответить" в софтофоне на входящий вызов - на исходящем начинает идти время звонка, а на принимающем продолжается "вызов"... Сброс звонка проходит нормально при этом...
Почитав форумы возможно понял в чем причина... Возможно из-за роутера (MikroTik) - но так и не смог решить проблему (пробовал разные пробросы \ открытие портов). Перепробовал что советовали - но результата нет. Даже подключив trunk - звонки идут в обе стороны, но без возможности нормально "ответить" при входящих, и нет звука при исходящих звонках (например через zadarma на номер 1111). Что я делаю не так и как это исправить? :(
В общем разобрался - сейчас звонки нормально проходят как внутри сети (типа "локальные"), так и входящие \ исходящие через trunk.
Вылечилось в моем случае (VPS где поднят asterisk -> Internet -> роутер -> 2 пк с софтофоном 3cx) через установку в sip.conf в [general] nat=yes, и удаление в шаблонах пользователей nat=no...
При установке столкнулся с проблемой - make посл make menuselect, когда выбрали необходимые модули, не проходил и вываливался с ошибкой. Долго промучался, перечитал кучу форумов - как оказалось (или я все таки что-то не так делал) asterisk не устанавливается нормально на mariadb-10.*... В итоге установил с нуля систему и все нормально дальше установилось.
А интересно - в борьбе со всякими ботами \ сканерами поможет назначение нестандартных портов для asterisk'a? И какие могут быть последствия \ подводные камни \ проблемы?
Подскажите пожалуйста, как побороть эхо!
Ох, не кидайте тапками. Статья годная.
Не хотите проапгрейдить или написать ещё одну с WebRTC и тонкими клиентами на браузерах?
Было бы очень интересно более опытными глаза почитать про ICE STUN сервера, и как эту муть настраивать.
В голове только куски необработанной инфы, о sipml5, jssip и прочем)
Один вопрос конфигурационные файлы sip и extensions вам удобнее будет посмотреть прямо на самом форуме, либо добавить их ссылкой предварительно сохранив в txt?
Извиняюсь, сейчас все исправлю
что то я вам писал писал сейчас сообщение со всеми конфигами оно не ушло и пустое. секунду
Я же попросил создать тему на форуме. Вы хотите, чтобы я вам помог, но при этом не хотите учитывать мою просьбу к вам создать ваше обращение, так, как удобно мне. Ваше сообщение отклонил антиспам модуль.
Локальные проходят а входящие нет. Абонент не доступен. Я вообще думаю что ошибка может в диал плане? С вами можно как то поговорить по этому поводу? Может icq или только через форум? Странно транк сам регистрируется нормально. Мне б разобраться сначала с настройками для исходящего. В файле sip.conf прописана регистрация у провайдера и два внутренних номера. В екстеншинс.конф прописан данный диалплан, между собой все работает а исходящие не работают. Уже неделю бьюсь.
Ошибка в диалплане. Я думаю, у вас транк, который зарегистрирован у провайдера назван одним именем, а обращаетесь вы к нему по другому имени. Поэтому он корректно регистрируется у провайдера, но звонки при этом не работают. Можете на форум выложить все свои конфиги (sip.conf и extensions.conf) Когда у меня будет время, я посмотрю их.
Всем доброго дня! Люди добрые, помогите , очень нуждаюсь в помощи, не понимаю уже в чем тут может быть дело. В общем пытаюсь с нуля установить и настроить самым примитивным вещам 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'
буду рад любой помощи, бьюсь уже неделю
Судя по логу, какая-то проблема с транком. Что-то где-то напутано с названиями. Ошибка в поиске ищется легко, вариантов ошибки может быть много. разбирайтесь аккуратно в конфигурации. Локальные звонки проходят? Входящие?
Заинтересовал пункт про переадресацию на мобильный телефон, у вас описан случай если нету телефона, а можно ли реализовать когда есть номер, есть телефон, но по каким-то причинам он не ответил в заданное по умолчанию время и тогда звонок уходил на сотовый (например человек в отпуске или командировке)?
Попробовал с помощью FoolowMe, но видимо не то делаю и отрабатывает общее правило call-out
Конечно можно. Вот пример:
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.
Может я забыл упомянуть что должно не только при внешних но и при внутренних срабатывать это правило.
Приветствую. Появился такой вопрос. Мейби поможешь - пользуемся астериском уже некоторое время. Зашёл разговор чтобы всю контору перевести на IP телефонию. Поднялся вопрос по покупке IP телефонов. Была кем то предложена идея использовать софтофон. Но у нас приимущественно используются терминальные машины. 3cx 6 вроде получилось запустить так(потестил на 2-х сеансах пока), но мейби есть другое какое то решение? )мейби встречал или использовал что то?
Мой совет такой - если есть возможность использовать стационарные аппараты, лучше ставить их. Для софтофонов нужна хорошая гарнитура, которая по стоимости сопоставима с бюджетным sip телефоном. Гарнитура и софтофон - очень нишевая вещь, актуальна для коллцентров. Обычным людям неудобно так работать.
Можно использовать комп. наушники бюджетные :) рассматрвиаем просто разные варианты. У нас есть операторы которым предпочтительна гарнитура.
Ещё такой вопрос. Какнибудь реализовывали телефонную книгу? Забил абонента 1 раз, и на всех аппаратах он определялся.
Адресная книга задача не простая. Зависит от аппаратов. Я делал так. В одних аппаратах была возможность загружать адресную книгу через xml файл. В качестве пути можно было указать web сервер. В итоге я в локальной сети положил на веб сервер xml файл и на всех аппаратах прописал к нему путь. Для изменения адресной книги редактировал этот xml файл, изменения забирали телефоны сами. В окончательном варианте файл формировался выгрузкой из офисной crm.
Я видел костыль через мускуль и диалплан:
В мускуле ведётся база с номерами и именами.
В идалплане прописывается преобразование номера в международный формат (О_о) и сравнение его с мускулем. Но как то сомневаюсь на счёт таких костылей.
По поводу удалённого файла тоже читал, но такой способ подходит только для аппаратов с такой плюшкой. Если будут всё таки софтофоны - не пойдёт.
Так а как это сделать централизованно? Адресная книга зависит от типа аппарата, который используется. Везде она разная.
Историю с mysql я видел, в том числе реализацию такую. Но это не адресная книга. Это просто красивое отображение имени звонящего, которое будет на экране аппарата. Хранение в mysql позволяет легко редактировать это имя, не залезая в настройки юзеров в астериск.
Лично я не вообще не понимаю смысл больших адресных книг на аппаратах. Пользоваться ими неудобно. Гораздо удобнее иметь перед собой напечатанный список всех абонентов компании. А в адресную книгу каждый заносит себе небольшое количество номеров, которые именно ему нужны для быстрого набора. Как только адресная книга становится большой, ей неудобно пользоваться, так как навигация на телефоне так себе.
После установки надо еще selinux вырубить. В статье по установке с freepbx это есть, а тут нет.
В /etc/sysconfig/selinux прописать SELINUX=disabled и перезагрузить или выполнить setenforce 0
Огромное спасибо за статью!
Всем, здрасти! Кто нибудь знает, что делаю не так:
Пытаюсь на многоканальном телефоне отловить, что занят первый канал и чтоб для звонящего абонента включалась либо другая мелодия, либо оповещение что человек разговаривает подождите.
Какие варианты я тестировал:
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()
Мне тоже интересно решение этой задачи. Актуальная тема. Но готового решения у меня нет. Когда все получится, поделитесь рабочим вариантом.
Отличная статья, спасибо автору! Подскажите такой момент, есть ли смысл Астер устанавливать из официальных репов (дистрибутив дебиан 9), или собирать вручную, как описали в статье? Какие плюсы собранного ?
В принципе, никаких, просто самая свежая версия. Если версия, расположенная в репозитории устраивает, лучше использовать именно ее.
Здравствуйте! Вы бы могли мне сказать, а на виртуальном сервере с прямым внешним IP без NAT - как настроить порты?
И второй вопрос, на виртуальном сервере могу ли я подключить несколько внешних линий? Спасибо!
1. Порты не надо как-то особенно настраивать, если у вас внешний ip. Просто откройте их на фаерволе, или вообще его отключите, если не планируете настраивать ограничения доступа.
2. Да, можете подключить сколько угодно внешних линий.
Вы бы взялись за некоторую плату настроить на виртуальной машине IP АТС?
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'.
Помогите разобраться.
В extensions.conf либо контекст называется не [call-out], либо он неправильно настроен. Этот же контекст настроен абоненту 100 в sip.conf.
То есть ошибка означает, что не получается позвонить на номер 101, потому что в контексте call-out не описано правило, как позвонить.
Вы отредактировали скорее всего - extconfig.conf
А нужно - extensions.conf
Два дня бился сам)
Добрый день.
Такая же ошибка и никак дальше не продвинуться
[Mar 26 16:31:34] NOTICE[3024][C-00000005]: chan_sip.c:26805 handle_request_invite: Call from '101' (192.168.0.130:62506) to extension '100' rejected because extension not found in context 'call-out'.
Проверил и extensions.conf и sip.conf - все как в статье
Перезапускал сервис.
Все безрезультатно. Клиенты подключаются, в системе видятся, но позвонить друг другу не могут.
Help!
Отбой. Разобрался (была опечатка).
Добрый день!
Сначала хотел сказать спасибо за ваш труд! Ваши материалы очень помогают.
Во время настройки, было ли у вас такое:
Файл Wav во время записи имеет всего 1кб, соответственно и MP3 получается размером в 1кб. Файлы сохраняются по пути:
/var/www/html/calls
Так-то все остальное работает(web панель показывает звонки и если в конфигурационном файле указать минимальный размер 0кб для отображения, то появляется кнопка воспроизведения). На что можно обратить внимание.
Заранее спасибо!
Странная какаая то ситуация. На входящем звук пишется в файл, все нормально.
В исходящем на внешку и на внутренних звонках файл записи создается, но он пустой. Пробовал убрать из скрипта [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
А сами звонки нормально проходят? В логе никакого криминала не вижу.
Абсолютно норимально,никаких проблем.... в чем и заковырка. Может как то можно дополнительно в диалплане на логирование ловушек наставить?
Вопрос снят. Проблема была банальная, не докрутил по настройкам iptales. Сам себе злобный Буратино...
Извиняюсь за беспокойство.
Не понимаю связи с iptables. В чем конкретно была проблема? Разговоры же нормально шли.
Как сделать, чтобы отображался статус присуствия, как в скайп?
Не понял, где отображался такой статус?
> Не понял, где отображался такой статус?
На клиентском ПО, чтобы было видно - человек, которому звонишь в он-лайн, офф-лайн или как-нибудь:
https://andrewjprokop.wordpress.com/2014/05/20/implementing-presence-with-sip/
http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/asterisk-DeviceStates-SECT-1.html
Subscribe и hint вам туда
Я знаю, что туда. Но хотелось бы конкретный пример с подробными разъяснениями. Очень долго не могу понять суть.
Вот для начало:
https://geektimes.ru/company/digitalangel/blog/267582/
а дальше гугл в помощь
Да действительно выход был через 7, но удобнее помоему пользоваться через 8.
Я рассказал, как решить эту проблему отдельно - https://serveradmin.ru/zvonok-v-asterisk-cherez-8-7-ili-7-zamena-7-na-8/
Удобно не удобно:) Есть стандарт, это раз, ну и два Zerox прав:) Проще сделать преобразование любой формы набора к требованиям провайдера, и удобно и красиво
Настроил всё по инструкции, но почему то не идут исходящие звонки, на эхо тест звоню всё отлично а вот на любой городской или мобильный через 8 не идёт, если на мобильный то говорит что "направление не существует". Со входящими всё ОК!
Логи надо смотреть. Кто это говорит, сам астер или оператор связи. Если астер, то диалплан проверять, если оператор связи, то смотреть, какие у него правила набора. Возможно он ждет звонок через 7, а он идет через 8. Так часто бывает.
Имелся установленный mssql, решил задействовать. Для меня пока линукс новое...? надо попробовать mysql
Если настройку астериска осилили, то уж поставить и подключить его к mysql дело несложное. К тому же на сайте все есть, да даже в этой статье.
И кстати вопрос ещё. :) я использую ms sql server туда заливаю статистику звонков. У меня не получилось добавлять имя файла записи, это нельзя сделать или я не смог разобраться?
Думаю можно, просто не так, как у меня описано в статье. Я с mssql никогда не снюхивал ничего из линукс, так что не подскажу. Да я и смысла не вижу использовать какую-то внешнюю БД. Тут нагрузки никакой нет, но зато удобно, когда и сам сервер астера и бд находятся на одной виртуалке. Забэкапил и развернул всю систему, она сразу же готова к работе. А какой смысл во внешней базе mssql, кроме лишних проблем? Я бы установил локально mysql и не мучался.
membermacro и setinterfacevar вам в руки
Упс, на пост выше, пардон.
Через очереди.
Если у меня 3 секретаря, хотелось бы знать кто из них трубку взял. В принципе в базе там можно вычислить кто взял. А вот в имени файла записи разговора стоит t, не удобно, думал как тотпросто можно поправить, что бы корректно имя файла было
А как на разных секретарей идет перенаправление? Через очередь? Или они просто перечислены один за другим в диалплане? Тут я не знаю, как подсказать, надо пробовать. Думаю, это можно как-то исправить, но надо разбираться.
Кстати, если вопрос только в имени файла, то для него можно указывать маску. Надо посмотреть все параметры, которые можно задавать и выбрать подходящие.
Добрый день.
Ситуация такая, если мне звонят снаружи, если не вводить добавочный номер, то входящий звонок переводится на секретаря, в логах вместо номера на кого переведен входящий вызов указан символ "t", как сделать что бы указывался конечный номер?
В остальных случаях все корректно фиксируется.
Так а какой номер вы хотите увидеть? Они же номер не вводят, звонок уходит на секретаря, номер которого и так известен. Если нужно изменить вывод вместо "t" на номер секретаря, то тут простого решения я не вижу. В данном случае "t" это направление звонка, которое и фиксируется в статистике, ведь звонок на самом деле на "t" и уходит.
Автору огромнейший респект, такой подробной и внятно написанной статьи я еще не встречал!!!
Не нашел правда ответа на один вопросик, а как нибудь можно с консоли или еще как создать 3cxconfig для android 3CX? Все мне известные методы это прикручивать веб морду, чего я честно не очень хочу.
Наткнулся на вашу инструкцию, и прочитав подумал, в старых инструкциях везде был пак такой - астер + libpri + dahdi, тут у вас иначе...объясните, что давал libpri и dahdi и почему сейчас он не используется для работы в новых версиях астера (например как в вашем случае 13) и зачем pjproject с jansson? (p.s. только начал изучать VOIP телефонию и поэтому от стольких мануалов, что я пересмотрел, голова кругом)
Кстати в предыдущей статье про астер и pbx libpri и dahdi использовался
libpri и dahdi используются для подключения к астериску плат расширения. Лично мне все это уже не нужно. Я стараюсь всю телефонию настраивать исключительно на sip. Подобные платы были популярны раньше, в переходный период, когда астериск стыковали с аналоговой и цифровой телефонией. Сейчас все в основном переходят на IP.
получается если я буду использовать аналоговые устройства мне данные пакеты пригодятся? в принципе понял зачем jansson - во время компиляции астера версии 13/14 он нужен был :))
Я не знаю подробностей насчет конкретно аналоговых устройств. Для них можно использовать голосовые шлюзы. Но если будут использоваться платы расширения, вставляемые напрямую в сервер, то будут нужны. Но я тут могу ошибаться. Сам я никогда никакие платы не использовал. Максимум - voip шлюзы, но это другая тема. Все это легко гуглится, если есть желание узнать подробности.
Поясню почему раньше был нужен dahdi, вся проблема была в том что для конференций раньше использовался физический генератор квантования, и эмулятор его был в этом пакете. Теперь используется бридж.
Спасибо за информацию, не знал. Я стал настраивать астеры уже когда появился бридж для конференций.
Здравствуйте, спасибо за статью, на многое открыли глаза.
Единственное что: не показывает сохраненный звонок на web интерфейсе.
в config.php изменил на свою папку и все равно без изменений.
Если ввести ip Сервера/records то файлы видны хоть и в wav.
А вот через веб сервер их не видно
заработало. теперь проблема осталась только в том, что не конвертирует из wav в mp3
сама разобралась. все ок.
Добрый день. Вы можете подсказать, как должны выглядеть настройки 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
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
Напишите полностью имя файла - 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*
Я же написал, используйте полное имя файла в команде распаковки, а не маску со звездочкой на конце.
да, но перед этим советую проделать следующее, тогда точно будет работать
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
Добрый день!
очень помогают ваши статьи. Спасибо вам за этот труд.
Все получалось до пункта "запись разговора", а именно на команде
# 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 и без заморочек с БД.
tar (child): lame-3.98.4: Функция read завершилась с ошибкой: Это каталог
Эта ошибка говорит о том, что имя файла с маской "lame-3.*" возвращает имя каталога, а не файл архива. Вместо lame-3.* напишите полностью имя скачанного файла.
Спасибо помогло.
но теперь ошибка на команде #make
Makefile:306: ошибка выполнения рецепта для цели «xmm_quantize_sub.lo»
make[3]: *** [xmm_quantize_sub.lo] Ошибка 1
make[3]: выход из каталога «/usr/src/lame-3.98.4/libmp3lame/vector»
Makefile:489: ошибка выполнения рецепта для цели «all-recursive»
make[2]: *** [all-recursive] Ошибка 1
make[2]: выход из каталога «/usr/src/lame-3.98.4/libmp3lame»
Makefile:312: ошибка выполнения рецепта для цели «all-recursive»
make[1]: *** [all-recursive] Ошибка 1
make[1]: выход из каталога «/usr/src/lame-3.98.4»
Makefile:240: ошибка выполнения рецепта для цели «all»
make: *** [all] Ошибка 2
Возможно файл скачался не полностью. В принципе, можно не ставить lame и либо вообще отключить запись разговоров, либо оставить их несжатыми в wav. Потом уже, после настройки основного, вернуться к этому вопросу.
В любом случае спасибо. в остальном проблем не возникло.
Для таких новичков как я, не хватает пояснений по каждой команде. Но тогда статья удвоится в объеме...
Успехов Вам.
На виртуальной машине поднял сервер Астерикса за натом. При звонке с одного софтофона на другой случилась проблема. Не было слышно 1 абонента. Звонил шел через внешний ип по внутреннему номеру. 100 слышно, 101 нет. пробовал directmedia, пробросы портов на роутере, отрубал iptables, а помогло указание внутренней под сети сервера в sip.conf - localnet=192.168.1.0/255.255.255.0 над externaddr
дополнение для sip.conf для поддержки видео звонков.
[general]
videosupport=yes
[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
allow=h261
allow=h263
allow=h263p
Здравствуйте! Столкнулся с такой проблемой: при попытке состыковать астериск и MySql через ODBC, по написанному в Вашей статье образцу, получаю ошибку: res_odbc.c:962 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=-201315904 [iODBC][Driver Manager]MySQL: cannot open shared object file: No such file or directory. При этом isql -v MYSQL-asterisk asterisk_user 12345678 спокойно соединяется с БД.
Статья супер! Пройдя поэтапно получилось разобраться в астере, и начал понимать конфиги. Перед этим пробовал freepbx, так и не смог совладать, с конфигами както проще, знаешь где что. Поставили задачу по переезду коллцентра на свое железо, благо всего 6 опеаторов работает.
Один вопрос. Не играет приветствие, ни Background, ни Playback. В трубке тишина, гудков тоже нет.
wav конвертил, брал готовые, нет звука. В чем проблема может быть? Ставил все по статье, ничего лишнего, из коробки.
;голосовое приветствие
[ivr-main]
exten => s,1,Set(CALLERID(name)=ZADARMA)
exten => s,2,Answer()
exten => s,n,Playback(queue-callswaiting) ;/etc/asterisk/ivr/welcome
exten => s,n,Queue(queue-5zvezd,Tt)
Надо включить full лог и посмотреть на сообщения в момент, когда должно проигрываться приветствие. Скорее всего что-то с музыкальными файлами - либо формат не тот, либо путь к файлу не правильно указан.
Подставлял родные мелодии из самого астера. Также тишина. В логах написано что типа играет.
== Using SIP RTP CoS mark 5
-- Executing [zadarma@zadarma-in:1] BackGround("SIP/zadarma-00000015", "/etc/asterisk/ivr/welcome_sold") in new stack
-- Playing '/etc/asterisk/ivr/welcome_sold.slin' (language 'ru')
-- Executing [zadarma@zadarma-in:2] Dial("SIP/zadarma-00000015", "SIP/100") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/100
-- SIP/100-00000016 is ringing
== Spawn extension (zadarma-in, zadarma, 2) exited non-zero on 'SIP/zadarma-00000015'
в папке лежит wav файл, в логах slin. Вот это пока не понятно, вроде как на лету декодит астер.
Большое спасибо за подробную статью! Очень познавательно и полезно.
Скажите пожалуйста, правильно ли я понимаю, что использование внешнего SIP-провайдера (zadarma в примере) опционально? Т.е., как я понял, необходимо для связи нашего Астерикса с ТФОП?
Например, можно ли поднять Астерикс на машине с белым IP, абоненты А и Б через интернет подключены к этому Астериксу. Возможно ли абоненту А звонить через городскую линию абонента Б?
и спасибо за суперский мануал!
+ exten => _X!,1,HangUp() это же наверное можно вписать в блок [default] и не испоьовать include верно?
Поверьте использовать контекст дефаулт плохая идея.
День добрый в инете не нешел подробностей по этой строчки exten => _X!,1,HangUp()
почему именно так вешаете трубку?
конкретно два вопроса
1) что даёт восклецательный знак?
2) почему приоретет 1 а не n ?
заранее спасибо
Здравствуйте.
А не могли бы вы написать такую же подробную статью по отправке и приему факсов ..и при]м факса на емейл? спасибо
Я с факсами вообще не связываюсь. Мороки много - толку мало. Факс отжившая технология, вообще не вижу смысла ими пользоваться. Самый простой вариант - купить voip шлюз с аналоговой линией и подключить факс к нему. Хотя еще проще - воспользоваться онлайн сервисом каким-нибудь по приему факса. Я делал так, когда факс просили. Но обычно я отговариваю от факса. Зачем он нужен?
Аналоговая линия вообще не вариант. Факс все еще востребован в глубинке. А вот любой SIP провайдер с нормальной поддержкой T38 поможет, + допиливаение астериска
Здравствуйте. Подскажите пожалуйста, у нас настроена атс Астериск. настроено 6 удаленных офисов. через впн. Телефоны грандстрим. Так вот сегодня на одной точке, возникла проблема. Если во время входящего разговора, приходит ещё один внешний звонок, то оператор перестаёт слышать абонента с которым уже разговаривает.
Куда смотреть? интересно то. что если звонить внутри сети. т.е. разговаривает оператор точки 1 с оператором точки 2 и звонит на точку1 оператор точки3, то никаких проблем со звуком нет. Только при внешних звонках.
Даже нет идей. Если раньше все работало, то надо смотреть, что изменилось за последнее время.
Ничего не менялось. в CDR репортсе, в это время нет записей о том. что я по внутренниму номеру разговаривал с проблемной точкой. А мы говорили и не раз и не по 10 секунд.
А сегодня история повторилась. Я попытался с внешнего телефона дозвониться до точки, сработал автоответчик и когда подняли трубку, я кроме оператора. слышал длинные гудки. как будто мне ещё не ответили.
Здравствуйте!
Хотелось бы в первую очередь поблагодарить автора за действительно замечательную статью - СПАСИБО!
Как полный новичок в IP-телефонии хотел бы спросить у гуру "куда и где копать" чтобы у локального пользователя заработал телефон в следующей ситуации:
После выхода с больничного у локального абонента перестала работать связь (ни туды и ни сюды). Забрался через браузер в FreePBX и в логах по нему нашел такую запись:
"... LocalAddress="IPV4/TCP/0.0.0.0/5038",RemoteAddress="IPV4/TCP/127.0.0.1 ..."
Я, конечно, извиняюсь, может быть вы мне подскажете, пол интернета перерыл.
Мне нужно, чтобы ivr произносил числа (в т.ч. и отрицательные и дробные) из таблицы mysql на том же сервере (ну или на другом, значения не имеет).
Сижу, всю голову поломал.
Как можно написать это правило в extension.conf?
Я бы туда ещё и рубли с копейками запихнул, которые в say.conf пытаюсь приделать.
В интернете есть много примеров с произнесением времени и даты, но вот с деньгами проблема. Может, хоть немного поможете? Больше не к кому обратиться, за что зацепиться.
Спасибо!
Даже не знаю, с какой стороны подходить к решению данной задачи. Ни разу не сталкивался.
Я думаю вам путь в AGI. На хабре есть описание автоматизации текстов 1С + Астериск
А ещё, может кому-то потребуется, у меня никак asterisk не соединялся по odbc с mysql. Выдавал ошибку:
res_odbc.c:958 odbc_obj_connect: res_odbc: Error SQLConnect=-1 errno=1045 [unixODBC][MySQL][ODBC 5.2(w) Driver]Access denied for user 'asterisk_user'@'localhost' (using pass
Проблема оказалась в том, что пароль пользователя asterisk_user содержал точку с запятой.
Я так, понял, спецсимволов быть не должно.
Они могут быть, но их надо экранировать. Если нет большой необходимости, лучше некоторые спецсимволы не использовать. Например, с # обычно проблем не бывает, а вот с запятыми, кавычками очень часто.
Разобрался.
Почему-то после изменении необходимых параметров логина/пароля в файлике /var/www/html/inc/config.inc.php всё устранилось.
А я правил /etc/phpMyAdmin/config.inc.php :(
Допишите пожалуйста в статье полный путь этого файла..
И ещё... Огромное вам спасибо за ваш труд.
Добрый день!
Что только не делал, выскакивает ошибка в веб-интерфейсе детализации звонков:
PDO::errorInfo(): SQLSTATE[28000] [1045] Access denied for user 'asterisk'@'localhost' (using password: YES)
причём user у меня asterisk_user, всё делал по вашим конфигам.
Где рыть, что копать? В логах ничего нет. Может, где-то можно включить режим логирования debug, и это что-то даст?...
Вопрос дилетанта: "Вот поставили мы PJSIP и выбрали его в menuselect." Это означает что он по умолчанию на нем будет работать? Я просто почему спрашиваю, вот к примеру регистрирую ростелеком, не угадал с пароле и ошибка выдалась: " WARNING[2397]:chan_sip.c:24286 handle_response_register: Forbidden - wrong password on authentication for REGISTER for '213162' to '10.10.10.100'"
И в ошибке четко видно "chan_sip.c", разве там не должен быть pjsip? Как проверить что все работает на PJSIP ?
Выбор зависит от конфига, как и где юзер заведен, но поверьте вам PJSIP не нужен:)
Камрад! Замечательная статья, настроил нужное по ней, но остались ошибки. Часть ошибок я нагуглил, но часть осталась, не могу сообразить, как исправить. Не сталкивались с такими ошибками:
[Feb 8 13:52:59] WARNING[9416]: res_odbc.c:526 load_odbc_config: The 'pooling', 'shared_connections', 'limit', and 'idlecheck' options were replaced by 'max_connections'. See res_odbc.conf.sample.
[Feb 8 13:52:59] WARNING[9416]: res_odbc.c:526 load_odbc_config: The 'pooling', 'shared_connections', 'limit', and 'idlecheck' options were replaced by 'max_connections'. See res_odbc.conf.sample.
[Feb 8 13:52:59] NOTICE[9416]: res_odbc.c:617 load_odbc_config: Registered ODBC class 'asterisk' dsn->[MySQL-asterisk]
[Feb 8 13:52:59] NOTICE[9417]: sorcery.c:1409 sorcery_object_load: Type 'system' is not reloadable, maintaining previous values
[Feb 8 13:52:59] WARNING[9416]: res_phoneprov.c:1231 get_defaults: Unable to find a valid server address or name.
[Feb 8 13:52:59] ERROR[9416]: ari/config.c:314 process_config: No configured users for ARI
[Feb 8 13:52:59] NOTICE[9416]: pbx_lua.c:1640 load_or_reload_lua_stuff: Lua PBX Switch loaded.
[Feb 8 13:52:59] WARNING[9416]: res_config_pgsql.c:1355 parse_config: PostgreSQL RealTime: Not connected
[Feb 8 13:52:59] NOTICE[9416]: chan_skinny.c:8424 config_load: Configuring skinny from skinny.conf
[Feb 8 13:52:59] NOTICE[9416]: cel_custom.c:97 load_config: No mappings found in cel_custom.conf. Not logging CEL to custom CSVs.
[Feb 8 13:52:59] NOTICE[9416]: app_queue.c:8839 reload_queue_rules: queuerules.conf has not changed since it was last loaded. Not taking any action.
Так это же не ошибки, а оповещения и предупреждения. В принципе, по тексту и так понятно, о чем идет речь. Это модули, которые не настроены. По хорошему их надо отключать и не загружать. Но у меня никак руки не доходят в них разобраться. И так работает :)
Понял, спасибо! Да все работает, но смущали эти предупреждения. А понял что это модули, тока часть отключить не получалось, но как это обычно бывает, как только я опубликовал вопрос, так тут же что-то нашлось в инете. Вот тут - http://wikiadmin.net/asterisk/ парень описал какие модули отключал у себя. Попробую сравнить имена в его списке и отключить у себя такие.
Смушают оставшиеся 3 строки:
WARNING[9416]: res_odbc.c:526 load_odbc_config: The 'pooling', 'shared_connections', 'limit', and 'idlecheck' options were replaced by 'max_connections'. See res_odbc.conf.sample.
NOTICE[9416]: res_odbc.c:617 load_odbc_config: Registered ODBC class 'asterisk' dsn->[MySQL-asterisk]
ERROR[9416]: ari/config.c:314 process_config: No configured users for ARI
по 1-му и 2-ому, мы же в мануале настраивали odbc конекты, если я отключу их, по идее работать не будет же то что настраивали с их помощью.
по 3-ему Это ошибка непонятная, похожего модуля не нашел.
Добавить стоить в sip.conf alwaysauthreject=yes, это при попытках брутфорса будет показывать всегда 401 Не авторизован. В связке с fail2ban который все же имеет ряд дырочек будет плюсом.
Тут добавлю iptables hekbn:) NEW:)
hekbn -> рулит
А так вы молодец! Мне бы такую статью года 2 назад в руки! В общем всяческие похвалы!
Только не пойму зашем вам pj если у вас только SIP, и зачем у вас в конфиге g729 коммерческий кодек которого, если мне склероз не изменяет, его в обычной поставке астериска нет :)
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
И влетаем на самые распространенные грабли с астериском за Nat, а потом курим почему голос ходит в одну сторону, не? :)
А в чем тут проблема? Сейчас нет времени вникать в суть, но у меня с натом не было каких-то особых проблем с iptables.
Данный проброс дает возможность подключиться SIP клиенту из вне. Далее он подключился со своего IP(SIP_IP) к Вашему WAN_IP. Тут проблем нет.
При звонке будет попытка установить соединение SIP_IP к WAN_IP это пройдет на ура. А в обратную сторону не пойдет потому что астериск будет отправлять "голос" на SIP_IP в ответ.
А так проблема не в Nat. А с самим RTP.
ну кроме случаев если у вас SIP_IP это внешний белый IP. В таком случае проблем не будет
Вечером приведу примеры работающих серверов с реальными примерами iptables, сравним.
Да, я посмотрел потом на конфиг астера что Вы приводите и там стоит canreinvite=no, он как раз решает проблему. Правда он устарел еще в 11м астериске. Теперь используется Directmedia
Это не решение проблемы, так как трафик (s)rtp пойдет в обход астера, а это болт на запись. externip в руки.
Zerox, благодарю за статью! Довольно доходчиво и понятно описаны основы. После прочтения за пару часов поднял тестовый астер, и что самое главное, я понял , что я сделал, и как это работает. (Я новичок, который никогда не занимался телефонией в принципе).
Спасибо Вам огромное!
Спасибо за отзыв. Я рад, что у меня получилось задуманное. Целью было написать наиболее понятным для новичка языком, как настроить функциональную и законченную систему телефонии на базе asterisk.
Не очень получилось. Непонятно самое главное - взаимодействие со сторонними программами - Задарма и ЗСХ. Как чего и зачем. Лично я подошел к этому пункту и пошел искать в другом месте . (какая то глупая приписка про перс данные, кто вам ее посоветовал? )
Еще по записи звуков хотел бы поправить:
1. Не понятно, зачем нужна первая строка? NoOp() в данном случае ничего не делает, вместо этой команды логичнее поставить Answer()
2. Перед командой Record() нет смысла в Playback(beep). Команда Record, сгенерирует beep на канале, перед началом записи
Спасибо за содержательные замечания. Я проверю информацию и исправлю статью, как будет возможность.
NoOp() - Эта команда выводит содержимое переменной без ее выполнения, то есть, Вы можете написать так:
NoOp(${CALLERID(num)}) - и при просмотре в консоли лога Астериска будет выведено содержимое этой переменной
NoOp(${EXTEN}) - тоже самое, вы в консоли увидите вызываемый экстеншен. Для отладки в основном используется
Вопрос снимается) переименовал каталог и авторизация ушла:) чтото в апачах и /var/www/html допилить забыл.
Доброго дня. А можете подсказать откуда же запрашивается авторизация у свеже-установленного модуля статистики ? все перекопал. авторизацию сам не настраивал...
Отличная статья. Спасибо.
в контексте [ivr-main]:
;Если введен не существующий номер, то говорим об этом и отправляем в начало приветствия
exten => _XXX,2,Playback(privacy-incorrect)
exten => _XXX,3,Goto(ivr-main,s,1)
Есть специальный экстеншн "i" - Вызывается, при попытке вызова неизвестного екстеншена.
Спасибо за дополнение. Я знаю про него, иногда использую. Для остальных, речь идет вот о чем. Просто после:
exten => t,1,Dial(SIP/100)
можно добавить например вот так:
exten => i,1,Dial(SIP/100).
И звонок уйдет на номер 100, если ввели неправильно внутренний номер.
Так даже более правильно будет, чем то, что у меня сейчас, но я почему-то в статье сделал таким образом. Не помню почему.
И почти правильно делали, exten => i,1,Dial(SIP/100). это не отработает и будет сброс звонка. Эта проблема ранее не однократно обсуждалась. В данном случае нужно выпольнить по ошибке переход в определенный контекст, и из него уже выполнить набор абонента.
в конструкции
exten => t,1,Macro(recording,${CALLERID(num)},${EXTEN})
exten => t,n,Queue(secretary,t)
есть один недостаток.
Если в очереди 2 телефона секретаря, то в базу данных будет писаться два разговора.
Для примера из статьи 100 и 130. Если трубку возьмет 100, то 130 будет отображаться в cdr viewer не отвеченным. Если два телефона - в принципе не проблема... если в очереди 10-20-30 тел, то при одном звонке - 9 лишних записей - немножко накладно по использованию ресурсов. Как обойти данную проблему еще не нашел решения. Если у кого-то есть наработки - намекните.
Да, любопытно. Я не сталкивался с этим. Я стараюсь запись не включать, там, где она явна не нужна. Не стоит забывать про УК РФ, Статья 138. Без ведома людей, записывать их нельзя. Нужно предупреждать об этом и сотрудников компании, и их абонентов.
Максрос использовать непосредственно в очереди как вариант. т.е. в queue.conf непосредственно
Спасибо за информацию, долго не мог понять почему у меня не звонит через моего оператора связи, выяснилось что у него требуется обязательная регистрация, спасибо еще раз, все доходчиво написано.
точно так же все настроил но почему то выход в город только через +7 или 7, как 7ку заменить на 8ку?
Это от оператора связи зависит. Заменить 7 на 8 можно в диалплане. В интернете без проблем можно найти пример, у меня нет под рукой.
запретить с них вызовы
exten => _8XX/_001xxxxx,1,Hangup()
такой конструкцией отбей. первое номер на который звонят (в данном случае шаблон), второе номер с которого звонят (тоже шаблон) - отбить, или любое действие какое ты хочешь.
В данном примере при звонке на номера с 800 по 899 с номеров 001(00000-99999) будет положена трубка. Если я не так тебя понял, то шаблоны можно поменять местами.
Причем тут iptables вообще непонятно - он нужен только для разруливания кто может к твоему астериску получить доступ.
Спосибо тебе Yura
Здравствуйте я новичек
В Asteriske хочу блокировать все номера с префиксом 001xxxxx, как мне это сделать или это нужно с делать с помощью iptables?
заранее спасибо
Что значит блокировать номера? Запретить на них звонить, или запретить с них вызовы?
и советую почитать Asterisk: The Future of Telephony.Хотя бы 5 главу - Основы диаплана. Книга конечно старенькая - последняя редакция 2009 года, если не ошибаюсь, но десяток страниц даст вам много пищи для размышлений и понимания того, что описано в статье. Написано конечно хорошо, но тупо копипастить не годится - вы должны понимать, что делаете. Тогда и ошибок не будет. И не забывайте, что это деньги. Были случаи, когда неправильные настройки и защита астериска приводили к многотысячным счетам за телефонию.
Судя по вашему вопросу по iptables - почитайте обязательно по защите сервера.
Разобрался и с отсутствием файлов... в config.inc.php устанавливается размер файла, с которого файл не считается отсутствующим. Поэтому мои коротенькие тестовые звонки и не отображались в панели.
Спасибо огромное за статью. Весьма подробно, а ко всему еще и позволило не только тупо накопипастить, но еще и изучить некоторые вопросы самостоятельно, поняв смысл написанного выше.
Все хорошо, кроме одного момента - вылезла ошибка с кодеками.
[Nov 14 17:38:43] WARNING[28879][C-00000000]: translate.c:481 ast_translator_build_path: No translator path: (starting codec is not valid)
[Nov 14 17:38:43] WARNING[28879][C-00000000]: translate.c:481 ast_translator_build_path: No translator path: (starting codec is not valid)
[Nov 14 17:38:43] WARNING[28879][C-00000000]: translate.c:481 ast_translator_build_path: No translator path: (starting codec is not valid)
[Nov 14 17:38:43] WARNING[28879][C-00000000]: translate.c:481 ast_translator_build_path: No translator path: (starting codec is not valid)
Как исправить еще не доковырял.
Плюс ко всему необходимо в modules.conf добавить
MACRO & MIXMONITOR если их нет в арр
можно попросить ваш modules.conf, чтобы понять, что у меня не подгружено.
Это был тестовый стенд, его уже нет. Но файл modules.conf я не трогал вообще. Какой он был после установки, такой и оставался.
Разобрался.
Таки нехватка кодека. Астериск ставил без установки примеров и т.д., файл modules.conf был пустой. Решилось загрузкой module load codec_alaw.so
Теперь осталось разобраться с тем, что в панели отображает звонки, но вместо файла записи - знак отсутствия файла.
Огромное спасибо за статью! Признаться я полный ноль не только в Asterisk но и VoIP, но хотел бы задать интересующий меня вопрос (надеюсь кто то ответит). Этот экстеншен: exten => _XXX.,1,Dial(SIP/${EXTEN}@397945) предназначен для звонков на внешние номера. Автор говорит что благодаря этому можно звонит на городские номера. Работает ли это для звонков на другие сервера Asterisk? Т.е. абонент набирает 6-и значный внутренний номер в сервисе zadarma и попадает на другой Asterisk сервер, правильно ли я понял?
Да, все верно. Думаю, что звонок на другой астериск через сервис задарма возможен.
Большое спасибо!
Настройка в menuselect:
# make menuselect
пункт: Core Sound Packages: Выбираем русские звуки RU-WAV,
- Оные отсутствуют. Имются только EN-WAV.
Почему? Всё делалось по последовательно по пунктам статьи. Русская озвучка потом будет работать?
Тема добавлена в форум.
Можно будет вручную скачать и установить. Возможно состав пакета установки изменился. Когда я последний раз настраивал астериск русский язык был по-умолчанию.
ОК
Статья правда хорошая, только вот столкнулся с проблемой:
Сделал точно всё по приводимым в статье инструкциям, но входящие звонки с внешнего транка - не идут (Ошибка 486 : Busy Here, то бишь занято). Использовал сервис Zadarma. Внутренние звонки работают, исходящие наружу то же, а вот обратно нет. Пробовал отключать iptables - не помогло. В чём может быть проблема?
Может быть сам zadarma глючит? Либо с фаерволом проблемы. Если он отключен, то проброс портов надо проверять, если он есть. Отсутствие входящих с нормальными исходящими очень похоже на не проброшенный порт 5060.
Имеется ввиду проброс порта на роутере?
Да. У меня такое было. Если неправильно проброшен порт, то исходящие звонки совершать можно, их инициирует сам астериск, если у него есть доступ в интернет, то он нормально позвонит. А вот входящие не проходят, соединение инициирует провайдер. Возможно он не может достучаться до сервера и выдает статус Занято.
Да вроде пробросил. Куда-нибудь скрин бросить можно?, посмотрите?
Давай продолжим на форуме:
//serveradmin.ru/forum/astersik/problemyi-s-ishodyashhimi-zvonkami/
Здравствуйте. Я хочу установить чистый астериск 16 на centos 7. В статье мне надо пропустить пункт "Быстрая установка из репозитория
Centos 7" да?
Отличная статья, Большое Спасибо!!!
Были некоторые моменты неясные, дошло ))