Настройка Asterisk (FreePbx)

Поделитесь материалом

27-11-2017  Статьи

В данной статье рассмотрим настройку Asterisk (Freepbx) и совершение звонков используя интерфейс AMI, при помощи библиотеки для python, asterisk-ami. В качестве АТС будем использовать Freepbx 13 версии. Для начала работы при помощи интерфейса AMI необходимо создать пользователя и предоставить ему права на выполнение различных действий.

Для того чтобы создать нового пользователя для взаимодействия с АТС при помощи AMI можно использовать графический интерфейс.

 

 

1. AMI в Freepbx

В верхнем меню навигации, выберите вкладку Settings и далее перейдите в раздел Asterisk Manager Users, как указано на скриншоте ниже:

settings

 

В открывшемся окне добавляем пользователя (Add manager) и настраиваем поля, перечисленные ниже.

На вкладке General

  • Manager Name — Имя пользователя AMI. Не должно содержать в себе пробелы.
  • Manager Secret — Пароль.
  •  Deny — В данном поле вы можете указать IP – адрес и маску подсети, с которых необходимо запретить подключение к AMI по указанным данным. Если хотите указать несколько подсетей, то используйте символ &. Например, 192.168.0.0/255.255.255.0&192.168.1.0/255.255.255.0
  • Permit — Укажите IP – адрес и маску подсети, с которых разрешено подключение к AMI через этого пользователя. Синтаксис аналогичен как и в поле Deny.
  • Write Timeout — Укажите таймаут, который будет использовать Asterisk при записи данных через данную AMI учетную запись. По умолчанию, период равен 100 миллисекунд.

На вкладке Permissions выбираем требуемые права.
Чтобы узнать какие нужны права на различные «Action» можно посмотреть если ввести «asteriskCLI» >> «show manager commands»

 

Вывод команды:

Команда Привилегии Описание
AbsoluteTimeout call,all Установка абсолютного Timeout
AgentCallbackLogin agent,all Попросит агента войти в систему с обратным вызовом.
AgentLogoff agent,all Установка статуса агента, как не зарегистрированного в asterisk.
Agents agent,all Список объектов и их статус
ChangeMonitor call,all Изменить имя файла мониторинга канала
Command command,all Выполняет Asterisk CLI команду
DBGet system,all Выводит запись из БД
DBPut system,all Добавляет запись в БД
Events <none> Контролирует поток событий
ExtensionState call,all Проверяет статус extension-а
GetConfig config,all Выводит текущую конфигурацию
Getvar call,all Получает переменную канала
Hangup call,all Повесить трубку
IAXnetstats <none> Показывает сетевую статистику для IAX2 драйвера канала
IAXpeers <none> Отображает все IAX2 пиры
ListCommands <none> Показывает список доступных команд
Logoff <none> Отключиться
MailboxCount call,all Проверить количество Mailbox сообщений
MailboxStatus call,all Проверка Mailbox
Monitor call,all Отслеживание событий на канале
Originate call,all Совершить звонок
Park call,all Припарковать вызов
ParkedCalls <none> Вывести список припаркованных звонков
PauseMonitor call,all Приостановить отслеживание канала
Ping <none> Keepalive команда
PlayDTMF call,all Проиграть DTMFсигнал на определенном канале
QueueAdd agent,all Добавить в очередь
QueuePause agent,all Делает члена очереди временно недоступным
QueueRemove agent,all Убирает интерфейс из очереди
Queues <none> Очередь
QueueStatus <none> Статус Очереди
Redirect call,all Переадресация вызова
SetCDRUserField call,all Установка CDR пользовательского поля
Setvar call,all Установка переменной на канале
SIPpeers system,all Перечисляет SIP пиры
Status system,all Список статусов каналов
StopMonitor call,all Останавливает отслеживание канала
UnpauseMonitor call,all Прекращает паузу в отслеживании канала
UpdateConfig config,all Обновить конфигурацию
UserEvent user,all Отправить произвольную команду события
WaitEvent <none> Подождать, пока произойдет событие.

Звонок выполняется при помощи Action — Originateкоторому требуются права Call, поэтому их и требуется указать.

 

2. Совершение звонка из python.

Чтобы удобно взаимодействовать с AMI будем использовать библиотеку.

Установить её довольно просто :
pip install git+https://github.com/ettoreleandrotognoli/python-ami 

Напишем программу для совершения звонка между двумя телефонами в сети с номерами 554 и 555:

from asterisk.ami import AMIClient
from asterisk.ami import SimpleAction

connection = {
‘address’: ’127.0.0.1′,#ip адрес вашей АТС
‘port’: 5038  # Порт Ami  по умолчанию 5038
}

login = {
‘username’: ‘UserName’,
‘secret’: ‘Password’
}

client = AMIClient(**connection)
future = client.login(**login)# после подключения сформируем звонок Number=554

action = SimpleAction(
‘Originate’,
Channel=’Sip/’+number,# Название канала, с которого совершается исходящий вызов ( в данном случае Sip с номером 554)
Exten=’555′, # Номер на который совершается вызов  (используется только совместно с параметрами Context и Priority)
Priority=1, # Приоритет выполнения
Context=’from-internal’, # Название контекста для совершения исходящего вызова
CallerID=’python’, # Значение CallerID, используемое для совершения исходящего вызова.
)client.send_action(action)

В данном примере мы рассмотрели синхронный метод, если же требуется совершить несколько звонков без ожидания ответа на предыдущие действия можно в параметры Originate добавить Async=true, ActionID=111.

Использование параметра Async приводит к генерации manager API события (Event) - OriginateResponse, которое содержит код ошибки в поле reason, если оно есть.
Код ошибки может принимать следующие значения:

0 = Номер или extention не найден.
1 = Нет ответа (no answer)
4 = Успешное выполнение (answered)
8 = Перегрузка или абонент не доступен (congested or not available)

 

 

Подробнее о Action — Originate можно прочитать по ссылке