CentOS & Asterisk. Часть 2. Мониторинг, план набора и звонки на внешку.


20.11.2018

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

Эта команда нам покажет количество звонков в данный момент:

watch -n 5 "asterisk -rx 'core show calls' | grep active"

Эта команда нам покажет количество звонков в данный момент а также кто кому звонит:

watch "asterisk -vvvvvrx 'core show channels verbose'"

Выход из обоих команд «CTRL+C»

Теперь касаемо CLI - набираем команду:

sudo asterisk –r

Запустилась управляшка (CLI) астериска и в ней мы пишем:

sip show peers

В данном скрине мы видим, что астериск у нас версии 15.6.2, что запущен от пользователя «asteriskpbx», а также что из четырёх абонентов только два в онлайн, и видим какие адреса они получили. Неплохо! Едем дальше.


sip show users

Покажет нам всех пользователей вместе с паролями!

core show sysinfo

Покажет нам информацию о системе:


А это чудесный мониторинг сетевого трафика:

Установка:
yum -y install epel-release iptraf

Общая cтатистика по интерфейсу eth0:
iptraf-ng -i eth0

Статистика входящих и исходящих пакетов по интерфейсу eth0:
iptraf-ng -d eth0

Активность по TCP и UDP по интерфейсу eth0:
iptraf-ng -s eth0

Выход:
Жмём «x» для выхода


А теперь давайте поподробнее разберём наш план набора из предыдущей статьи:


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

# Что такое [localcalls] –

Это обозначение нашего контекста, само название выдумал я сам, и вы можете тут написать что угодно – главное чтобы оно совпадало с тем что мы написали у абонентов в «sip.conf». Проще говоря таким образом астериск ориентируется по какому плану набора имеет право действовать тот или иной номер. Напоминаю что абоненты прописываются в «sip.conf» а план набора в «extensions.conf».


# Что такое _XXX –

Это шаблон. А вернее говоря, знак подчёркивания впереди говорит что это шаблон, а количество иксов это на какие номера, а вернее на сколькизначные номера он действует. Но не путайте – имеется ввиду номера НА КОТОРЫЕ мы звоним! Если нам надо использовать универсальный шаблон то просто пишем "_X." - так мы звоним на любые номера


# Что означает 1 после запятой сразу после шаблона –

Это очередность – то есть мы можем сделать точно такой exten на такой же шаблон для трёхзначных номеров ниже, только изменить что-нибудь и сделать очерёдность 2. В таком случае если не сработает шаблон с очерёдностью 1 то план набора перескочит на очередность 2. В примере ниже описан план набора, при котором – если звонить с номера 100 на номер 101, то мы и попадаем на номер 101. Но, если мы выключили телефон с номером 101, то есть первая очередь не отработает то мы перескакиваем на строку с очередью 2 – то есть звонок переходит на номер 103:

exten => 101,1,Dial(SIP/101)
exten => 101,2,Dial(SIP/103)

# Что такое Dial –

Это команда – «Dial» значит берём и звоним на то что в скобках, казалось бы, зачем писать отдельно команду звонить если мы на телефонном сервере – а чё ещё, то делать двум абонентам друг с другом. А вот всё не так просто – вместо «Dial» можно поставить «Goto» и перенаправить правило набора на другое правило набора или другой контекст! Рассмотрим вот такой план набора - где вместо "Dial" мы используем "Answer":

exten => _XXX,1,Answer()
same => n,SayDigits(${EXTEN})

При таком плане набора - когда мы звоним на 3х значный номер - трубка поднимается сразу без гудков и нам произносят цифры, которые мы набрали!.
# Что такое SIP/${EXTEN} –

Это значит – звони по протоколу SIP на любой номер (exten), какой хочешь, то есть не прописан конкретный номер, а прописан массив из всех exten. Или иначе говоря, "${EXTEN}" это контейнер. И мы с этим контейнером можем почудить - например берём исходный номер 94169671111 - и нам надо получить из этого номера его отдельные части:

• ${EXTEN:1:3} - мы получим 416, так как ":1" - это значит первую цифру откидываем, а ":3" - значит берём три следующих за первой цифры;

• ${EXTEN:4:7} - мы получим 9671111, так как ":4" - это значит откидываем первые 4 цифры, а ":7" - значит берём 7 следующих за четвёртой цифры;

• ${EXTEN:-4:4} мы получим 1111, так как ":-4" - это значит отсчитать 4 цифры с конца, а ":4" - значит вернуть 4 цифры после курсора - что собственно и будут те же цифры что отсчитали с конца;

• ${EXTEN:2:-4} - мы получим 16967, так как ":2" - это значит откидываем 2 цифры сначала, а ":-4" - значит убрать 4 последних цифры с конца;

• ${EXTEN:-6:-4} - мы получим 67, так как ":-6" - отсчитать 6 цифры с конца, а ":-4" - исключить 4 цифры с конца от полученного результата;

• ${EXTEN:1} - даст нам 4169671111 просто исключив первую цифру;

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


# Что означает запятая после SIP/${EXTEN} –

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


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

# Что означает буква «m» после секунд дозвона –
Это означает что звонящий будет слышать музычку вместо гудков. Вот так вот :).

Кстати пара слов о том, как подключить провайдера – только через провайдера астериск сможет звонить на внешние номера! Для примера я использовал регистрацию на ресурсе my.zadarma.com Собственно, после регистрации от провайдера нам нужно только 3 вещи, а именно:

Сервер: sip.zadarma.com
Логин: 527389
Пароль: ju8cN3

И эти параметры нам нужно просто прописать в наши файлы конфигурации:
В «sip.conf»:
Перед нашими абонентами пишем:

;;;;;;;;;;;;;;;;;;;
[zadarma]
type=friend
username=527389
secret=ju8cN3
fromuser=527389
fromdomain=sip.zadarma.com
host=sip.zadarma.com
nat=force_rport
insecure=invite
context=vneshka
canreinvite=no
;;;;;;;;;;;;;;;;;;;

Обратите внимание у нас теперь есть контекст «vneshka» - то есть нам его надо обозначить в диал плане в «extensions.conf».

Далее в том же «sip.conf» мы ищем раздел [general] и пишем под ним строку «register»

[general]
register => 527389:ju8cN3@sip.zadarma.com/527389

А ёще чуть ниже находим «context=public» - это параметр описывающий контекст по умолчанию для входящих извне звонков и так как у нас теперь есть провайдер мы меняем его «context=vneshka».

Сохранили и закрыли «sip.conf» теперь редактируем «extensions.conf»:
Спускаемся в самый низ к нашему контексту [localcalls] и добавляем ему новую строку, и далее ниже добавим новый контекст «vneshka» всё вместе выглядит вот так:

;;;;;;;;;;;;;;;;;;;
[localcalls]
exten => _XXX,1,Dial(SIP/${EXTEN},,m)
exten => _XXXXXXXXXXX,1,Dial(SIP/zadarma/${EXTEN})
[vneshka]
exten => _X.,1,Dial(SIP/100&SIP/101&SIP/102&SIP/103,60,m,tT)
;;;;;;;;;;;;;;;;;;;

Смотрим наши нововведения – во-первых к нашему контексту [localcalls] добавилось правило набора на 11ти значный шаблон, уходящий на абонента «zadarma». Обратите внимание на то что – для того чтобы просто звонить с местных телефонов на внешние номера достаточно было прописать строку «register» во вкладке [general] в «sip.conf» и добавить шаблон в [localcalls]. А вот для того чтобы нам могли дозвониться извне мы дописывали контекст [vneshka]. Причем в данном примере будут звонить параллельно все 4 номера. Кстати звонки через провайдера называются звонки через «транк». После мы можем проверить регистрацию у провайдера внутренней командой астериска «sip show registry»:

asterisk -r

sip show registry

exit

Нужно сказать, что вместо конструкции «SIP/100» можно использовать переменную. А зачем? А вот предположим, что наш Диал-План, после настройки всех нюансов, превратился в большой текст кода. И вот как раз на после этого к нам приходит директор и говорит, что мы переходим с трёхзначных номеров на четырёхзначные – и мы в панике по всему конфигу меняем «SIP/100» на «SIP/1000» и т.д. А лучше сразу объявить глобальные переменные – то есть вместо того чтобы по всему коду менять «SIP/100» на «SIP/1000» мы сделаем это только в одном месте. Для этого мы находим раздел [globals] конфига «extensions.conf» и объявляем там наши глобальные переменные:


[globals]
director=SIP/100
glavbuh=SIP/101
secretar=SIP/102
ohrana=SIP/103

Таким образом в конце конфига где мы прописали наши контексты – наш план набора будет выглядеть так:

;;;;;;;;;;;;;;;;;;;
[localcalls]
exten => _XXX,1,Dial(SIP/${EXTEN},,m)
exten => _XXXXXXXXXXX,1,Dial(SIP/zadarma/${EXTEN})
[vneshka]
exten => _X.,1,Dial(director&glavbuh&secretar&ohrana,60,m,tT)
;;;;;;;;;;;;;;;;;;;

Вот пример плана набора, при котором звонящие на директора будут попадать на приёмную в случае если телефон директора выключен:

;;;;;;;;;;;;;;;;;;;
exten => director,1,Dial(director)
exten => director,2,Dial(secretar)
;;;;;;;;;;;;;;;;;;;


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

Пакет русских сервисных сообщений (asterisk-core-sounds-ru-alaw-current) asterisk-core-sounds-ru-alaw-current drive.google.com
Asterisk CDR Viewer https://github.com/g613/asterisk-cdr-viewer drive.google.com
Ease Audio Converter http://audiotool.net/EaseAudioConverter/index.htm
Adobe Audition https://www.adobe.com/ru/products/audition.html
WinSCP https://winscp.net/eng/download.php
CentOS-7-x86_64-Minimal-1804.iso https://www.centos.org/download drive.google.com
Исходник asterisk-15.6.2 https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-15.6.2.tar.gz drive.google.com
Исходник dahdi-linux: https://downloads.asterisk.org/pub/telephony/dahdi-linux/dahdi-linux-current.tar.gz drive.google.com
Исходник libpri-current: https://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz drive.google.com
X-lite: https://www.counterpath.com/x-lite-download/ drive.google.com
Официальная wiki https://wiki.asterisk.org/wiki/display/AST/Home


Навигация: