27-11-2017 Статьи
В данной статье рассмотрим настройку Asterisk (Freepbx) и совершение звонков используя интерфейс AMI, при помощи библиотеки для python, asterisk-ami. В качестве АТС будем использовать Freepbx 13 версии. Для начала работы при помощи интерфейса AMI необходимо создать пользователя и предоставить ему права на выполнение различных действий.
Для того чтобы создать нового пользователя для взаимодействия с АТС при помощи AMI можно использовать графический интерфейс.
1. AMI в Freepbx
В верхнем меню навигации, выберите вкладку Settings и далее перейдите в раздел Asterisk Manager Users, как указано на скриншоте ниже:
В открывшемся окне добавляем пользователя (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 SimpleActionconnection = {
‘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 можно прочитать по ссылке