Глава 17

Интерфейс управления Asterisk (AMI)

Джон Малкович: Я видел мир, который

НЕ должен видеть человек!

Крейг Шварц: Правда? Потому что для большинства людей

это довольно приятный опыт.

— Будучи Джоном Малковичем

Asterisk Manager Interface (AMI) — это интерфейс системного мониторинга и управления системой, предоставляемый Asterisk. Он позволяет осуществлять живой мониторинг событий, происходящих в системе, а также разрешать запросам к Asterisk выполнять некоторые действия. Доступные действия широко распространены и включают такие вещи, как возврат информации о статусе и появлении новых вызовов. Многие интересные приложения были разработаны поверх Asterisk и используют AMI в качестве основного интерфейса для Asterisk.

Эта глава также включает документацию по использованию файлов вызовов. Файлы вызовов Asterisk — это простой способ инициировать несколько вызовов. Как только объем вызовов увеличивается или ваши потребности становятся более серьезными, вы можете перейти к использованию AMI. Подробности можно найти в разделе “Файлы вызовов”.

Быстрый старт

Этот раздел предназначен для того, чтобы испачкать руки с помощью AMI как можно быстрее. Сначала поместите следующую конфигурацию в /etc/asterisk/manager.conf:

;

; Включите AMI и попросите его принимать соединения только с localhost.

;

[general]

enabled = yes

webenabled = yes

bindaddr = 127.0.0.1

;

; Создайте учетную запись «hello» с паролем «world»

;

[hello]

secret = world

read = all ; Получать все типы событий

write = all ; Разрешить этому пользователю выполнять все действия.

Эта типовая конфигурация настроена так, чтобы разрешать только локальные подключения к AMI. Если вы намерены сделать этот интерфейс доступным по сети, настоятельно рекомендуется использовать его только с помощью TLS. Использование TLS обсуждается более подробно далее в этой главе.

После тогоконфигурирования AMI готова, включите встроенный сервер HTTP, поместив следующее содержимое в /etc/asterisk/http.conf:

;

; Включить встроенный HTTP-сервер и слушать только соединения на localhost.

;

[general]

enabled = yes

bindaddr = 127.0.0.1

AMI через TCP

Существует несколько способов подключения к AMI, но наиболее распространенным является TCP-сокет. Мы будем использовать telnet для демонстрации подключения AMI. В этом примере показаны следующие шаги:

  • Подключитесь к AMI через сокет TCP на порт 5038.
  • Войдите в систему, используя действие Login.
  • Выполните действие Ping.
  • Выйдите из системы, используя действие Logoff.

Вот как AMI отвечает на эти действия:

$ telnet localhost 5038

Trying 127.0.0.1…

Connected to localhost.

Escape character is ‘^]’.

Asterisk Call Manager/1.1

Action: Login

Username: hello

Secret: world

Response: Success

Message: Authentication accepted

Action: Ping

Response: Success

Ping: Pong

Timestamp: 1282739190.454046

Action: Logoff

Response: Goodbye

Message: Thanks for all the fish.

Connection closed by foreign host.

После того, как вы это сделаете, вы убедитесь, что AMI принимает соединения через TCP-соединение.

AMI через HTTP

Также возможно использовать AMI по HTTP. В этом разделе мы будем выполнять те же действия, что и раньше, но через HTTP вместо собственного TCP интерфейса к AMI. AMI по HTTP раскрыт более подробно в “AMI через HTTP”.

Учетные записи, используемые для подключения к AMI через HTTP — это те же учетные записи, которые настроены в файле /etc/asterisk/manager.conf.

В этом примере показано как получить доступ к AMI через HTTP, войти в систему, выполнить действие Ping и выйти из системы:

$ wget «http://localhost:8088/rawman?action=login&username=hello&secret=world» \

> —save-cookies cookies.txt -O —

—2010-08-31 12:34:23—

Resolving localhost… 127.0.0.1

Connecting to localhost|127.0.0.1|:8088… connected.

HTTP request sent, awaiting response… 200 OK

Length: 55

Saving to: `STDOUT’

Response: Success

Message: Authentication accepted

2010-08-31 12:34:23 (662 KB/s) — written to stdout [55/55]

$ wget «http://localhost:8088/rawman?action=ping» —load-cookies cookies.txt -O —

—2010-08-31 12:34:23—

Resolving localhost… 127.0.0.1

Connecting to localhost|127.0.0.1|:8088… connected.

HTTP request sent, awaiting response… 200 OK

Length: 63

Saving to: `STDOUT’

Response: Success

Ping: Pong

Timestamp: 1283258063.040293

2010-08-31 12:34:23 (775 KB/s) — written to stdout [63/63]

$ wget «http://localhost:8088/rawman?action=logoff» —load-cookies cookies.txt -O —

—2010-08-31 12:34:23—

Resolving localhost… 127.0.0.1

Connecting to localhost|127.0.0.1|:8088… connected.

HTTP request sent, awaiting response… 200 OK

Length: 56

Saving to: `STDOUT’

Response: Goodbye

Message: Thanks for all the fish.

2010-08-31 12:34:23 (696 KB/s) — written to stdout [56/56]

Интерфейс HTTP для AMI позволяет интегрировать управление вызовами Asterisk в веб-службу.

Конфигурация

Раздел «Быстрый старт» показал очень простой набор конфигурационных файлов, чтобы вы начали. Однако для AMI доступно еще много вариантов.

manager.conf

Основным конфигурационным файлом для AMI является /etc/asterisk/manager.conf. Раздел [general] содержит параметры (перечисленные в Таблице 20-1), которые контролируют общую работу AMI. Любые другие разделы в файле manager.conf будут определять учетные записи для входа в систему и использования AMI.

Таблица 20-1. Опции в разделе manager.conf [general]

Параметр Значение/Пример Описание
enabled yes Включает AMI. По умолчанию — no.
webenabled yes Позволяет получать доступ к AMI через встроенный HTTP-сервер. По умолчанию — no.a
порт 5038 Задает номер прослушиваемого порта для подключения AMI. Значение по умолчанию — 5038.
bindaddr 127.0.0.1 Устанавливает прослушиваемый адрес для соединений AMI. По умолчанию используется прослушивание по всем адресам (0.0.0.0). Однако настоятельно рекомендуется установить значение 127.0.0.1.
tlsenable yes Позволяет прослушивать AMI-соединения с использованием TLS. По умолчанию — no. За пределами локальной машины настоятельно рекомендуется открывать подключение только через TLS.b
tlsbindport 5039 Устанавливает прослушиваемый порт для TLS-соединений с AMI. Значение по умолчанию — 5039.
tlsbindaddr 0.0.0.0 Задает прослушиваемый адрес для AMI на основе TLS. По умолчанию прослушиваются все адреса (0.0.0.0)
tlscertfile /var/lib/asterisk/keys/asterisk.pem Устанавливает путь к сертификату сервера для TLS. Это необходимо, если для параметра tlsenable установлено значение yes.
tlsprivatekey /var/lib/asterisk/keys/private.pem Устанавливает путь к закрытому ключу TLS. Если не указано, будет проверен tlscertfile чтобы узнать, содержит ли он также закрытый ключ.
tlscipher <cipher string> Задает список шифров для использования OpenSSL. Установка этого параметра необязательна. Чтобы просмотреть список доступных шифров запустите openssl ciphers -v в командной строке.
allowmultiplelogin no Позволяет одной учетной записи одновременно создавать более одного соединения. По умолчанию yes.
displayconnects yes Сообщает о подключении к AMI в виде подробных сообщений в консоли Asterisk. Это обычно полезно, но может мешать в системе с использованием сценариев, которые совершают много соединений с AMI. По умолчанию yes.
timestampevents no Добавляет временную метку на основе эпохи Unix для каждого события, сообщенного AMI. По умолчанию — no.
brokeneventsaction no Восстанавливает ранее нарушенное поведение для действия Events AMI, где ответ не будет отправлен при некоторых обстоятельствах. Эта опция существует ради обратной совместимости для приложений, которые работали над ошибкой; она не должна использоваться без крайней необходимости. По умолчанию no.
channelvars VAR1, VAR2, VAR3 [, VAR4 […]] Задает список переменных канала для включения во все события AMI, ориентированные на канал. По умолчанию переменные канала не включаются.
debug no Включает дополнительную отладку в коде AMI. Это в первую очередь касается разработчиков кода C для Asterisk. По умолчанию no.
httptimeout 60 Задает таймаут HTTP в секундах. Эта задержка влияет на пользователей AMI через HTTP: устанавливает Max — Age на HTTP куки, задает как долго кэшируются события, чтобы позволить извлекать их через HTTP с помощью действий WaitEvents и отрезок времени когда HTTP-сервер сохраняет сессии в живых после завершения действия AMI. Значение по умолчанию-60 секунд.

a Чтобы получить доступ к AMI через HTTP, встроенный HTTP-сервер также должен быть настроен в /etc/asterisk/http.conf.

b Пакет разработки OpenSSL должен быть установлен для того, чтобы Asterisk использовал шифрование. На Ubuntu, пакет libssl-dev. На RHEL пакет называется openssl-devel.

Файл конфигурации manager.conf также содержит конфигурацию учетных записей пользователей AMI. Учетная запись создается путем добавления раздела с именем пользователя в квадратных скобках. В каждом разделе [username] есть опции, которые можно установить и они будут применяться только к этой учетной записи. В Таблице 20-2 перечислены параметры, доступные в разделе [username].

Таблица 20-2. Параметры для разделов [username]

Параметр Значение/Пример Описание
secret password Устанавливает пароль, используемый для аутентификации. Он должен быть установлен.
deny 0.0.0.0/0.0.0.0 Задает список управления доступом IP-адресов (ACL), которым должно быть отказано в аутентификации от этого пользователя. По умолчанию этот параметр не установлен.
permit 192.168.1.0/255.255.255.0 Задает ACL для IP-адресов, которым разрешена аутентификация пользователя. Как и deny, по умолчанию не установлен. Без этих параметров любой IP-адрес, который может подключиться к AMI, сможет аутентифицироваться как этот пользователь.
writetimeout 100 Устанавливает тайм-аут, используемый Asterisk при записи данных в AMI-соединение для этого пользователя. Эта опция указывается в миллисекундах. Значение по умолчанию равно 100.
displayconnects yes Также доступен в разделе [general] (см. Таблицу 20-1), но может определяться отдельно для каждого пользователя.
read system, call[, …] Определяет какие события AMI этот пользователь будет получать. По умолчанию пользователь не получает никаких событий. Таблица 20-3 охватывает доступные типы разрешений для параметров read и write.
write system, call[, …] Определяет какие события AMI этот пользователь сможет выполнять. По умолчанию пользователь не может выполнять никаких событий. Таблица 20-3 охватывает доступные типы разрешений для параметров read и write.
eventfilter !Channel: DAHDI* Используется для фильтрации событий AMI в белом или черном списке перед их доставкой в клиентское приложение AMI. Фильтры задаются с помощью регулярного выражения. Указанный фильтр является фильтром белого списка, если ему не предшествует восклицательный знак.a

a Если фильтры не заданы — будут доставлены все события, разрешенные на основе параметра read. Если указаны только фильтры белого списка — будут доставлены только события, соответствующие одному из фильтров. Если есть только фильтры в стиле черного списка, будут доставлены все события, которые не соответствуют ни одному из фильтров. Наконец, если существует сочетание фильтров в стиле белого и черного списка, сначала будут обработаны фильтры белого списка, а затем фильтры черного списка.

Как обсуждалось в Таблице 20-2, параметры read и write задают какие действия и события AMI доступны определенному пользователю. Таблица 20-3 показывает доступные значения разрешений, которые могут быть указаны для этих параметров.

Обратите особое внимание на разрешения system, command и originate. Эти разрешения предоставляют значительные возможности внешнему приложению. Предоставьте эти разрешения только тем приложениям, над которыми у вас есть полный контроль.

Таблица 20-3. Доступные значения для параметров read/write учетной записи пользователя AMI

Идентификатор разрешения read write
all Сокращенный способ указания, что этот пользователь должен иметь доступ ко всем доступным параметрам привилегий. Предоставляет пользователю все параметры привилегий.
system Позволяет пользователю получать общие сведения о системе, такие как перезагрузка конфигурации. Позволяет пользователю выполнять команды управления системой Asterisk, такие как Restart, Reload или Shutdown. Это разрешение дает пользователям возможность выполнять команды системы вне Asterisk. Предоставление этого разрешения эквивалентно предоставлению доступа к оболочке в качестве пользователя или группы, от имени которых выполняется процесс Asterisk. Это еще одна веская причина, почему Asterisk не должен запускаться от пользователя root.
call Позволяет пользователю получать события о каналах в системе. Позволяет пользователю устанавливать информацию о каналах.
log Предоставляет пользователю доступ к информации журнала.a Только read
verbose Предоставляет пользователю доступ к подробному журналу информации.b Только read
agent Предоставляет пользователю доступ к событиям о состоянии агентов из модулей app_queue и chan_agent. Позволяет пользователю выполнять действия по управлению и получению состояния очередей и агентов.
user Предоставляет доступ к определяемым пользователем событиям, а также событиям о пользователях Jabber/XMPP. Позволяет пользователю выполнить действие UserEvent, которое позволяет запросить Asterisk создать пользовательское событие.c
config Только write Позволяет пользователю извлекать, обновлять и перезагружать файлы конфигурации.
command Только write Позволяет пользователю выполнять команды CLI Asterisk через AMI.
dtmf Позволяет пользователю получать события, генерируемые при прохождении DTMF через ядро Asterisk.d Только read
reporting Предоставляет пользователю доступ к событиям качества вызова, таким как статистика jitterbuffer или отчеты протокола управления RTP (RTCP). Позволяет пользователю выполнить ряд действий для получения статистики и информации о состоянии всей системы.
cdr Предоставляет пользователю доступ к записям CDR, сообщаемым модулем cdr_manager. Только read
dialplan Позволяет пользователю получать события, созданные при установке переменных или создании новых расширений. Только read
originate Только write Позволяет пользователю выполнить действие Originate, которое позволяет клиенту AMI запросить создание нового вызова Asterisk.
agi Позволяет пользователю получать события, генерируемые при обработке команд AGI. Позволяет пользователю выполнять действия для управления каналами, на которых выполняется AGI в асинхронном режиме. Более подробно AGI рассматривается в Главе 21.
cc Позволяет пользователю получать события, связанные с дополнительными службами завершения вызова (CCSS). Только read
aoc Позволяет пользователю просматривать события Advice of Charge , создаваемым при получении событий AOC. Позволяет пользователю выполнять действие диспетчера AOCMessage для отправки сообщений AOC.

a Этот уровень определен, но в настоящее время не используется нигде в Asterisk.

b Этот уровень определен, но в настоящее время не используется нигде в Asterisk.

c Действие UserEvent является полезным механизмом для доставки сообщений другим клиентам AMI.

d События DTMF не будут генерироваться в мостовом вызове между двумя каналами, если не используется универсальное мостовое соединение в ядре Asterisk. Например, если DTMF передается с потоком мультимедиа, а поток мультимедиа течет непосредственно между двумя конечными точками, Asterisk не сможет сообщить о событиях DTMF.

http.conf

Как мы видели, AMI можно получить через HTTP, а также TCP. Для выполнения этой работы в Asterisk встроен очень простой HTTP-сервер. Все параметры, относящиеся к AMI, находятся в разделе [general] файла /etc/asterisk/http.conf.

Для включения доступа к AMI через HTTP требуются оба параметра /etc/asterisk/manager.conf и /etc/asterisk/http.conf. AMI должен быть включен в manager.conf опцией enabled установленной в yes, и manager.conf опция webenabled должна иметь значение yes, чтобы разрешить доступ через HTTP. Наконец, опция enabled в http.conf должна быть установлена в yes для включения самого сервера HTTP.

Доступные параметры перечислены в Таблице 20-4.

Таблица 20-4. Параметры в разделе http.conf [general]

Идентификатор разрешения read write
enabled yes Включает встроенный HTTP-сервер. По умолчанию no.
bindport 8088 Устанавливает прослушиваемый порт для HTTP-соединений. Значение по умолчанию — 8088.
bindaddr 127.0.0.1 Устанавливает адрес для прослушивания HTTP-соединений. По умолчанию используется прослушивание по всем адресам (0.0.0.0). Однако настоятельно рекомендуется установить это значение 127.0.0.1.
tlsenable yes Позволяет прослушивать HTTPS-соединения. По умолчанию — no. Настоятельно рекомендуется использовать HTTPS только в том случае, если вы хотите открыть HTTP-соединение вне локальной машины.a
tlsbindport 8089 Устанавливает порт для прослушивания соединений HTTPS. Значение по умолчанию — 8089
tlsbindaddr 0.0.0.0 Устанавливает адрес для прослушивания подключений AMI с поддержкой TLS. По умолчанию используется прослушивание по всем адресам (0.0.0.0).
tlscertfile /var/lib/asterisk/keys/asterisk.pem Устанавливает путь к сертификату сервера HTTPS. Это необходимо, если для параметра tlsenable установлено значение yes.
tlsprivatekey /var/lib/asterisk/keys/private.pem Устанавливает путь к приватному ключу HTTPS. Если не указано — будет проверен tlscertfile чтобы узнать, содержит ли он также приватный ключ.
tlscipher <cipher string> Определяет список шифров OpenSSL для использования. Это необязательно. Чтобы просмотреть список доступных шифров, запустите openssl ciphers -v в командной строке.

a Чтобы Asterisk мог использовать шифрование — необходимо установить пакет разработки OpenSSL. Для Ubuntu пакет libssl-dev. На RHEL пакет называется openssl-devel.

Обзор протокола

В AMI есть два основных типа сообщений: диспетчер событий и диспетчер действий.

Диспетчер событий — это односторонние сообщения, отправляемые от Asterisk к клиентам AMI для отчета о происходящем в системе. См. Рисунок 20-1 для графического представления передачи управляющих событий.

Рисунок 20-1. Диспетчер событий

Диспетчер действий — это запросы от клиента, у которого есть связанные ответы, приходящие обратно от Asterisk. То есть, действие диспетчера может быть запросом к Asterisk на выполнение какого-либо действия и возврат результата. Например, есть действие AMI для инициирования нового вызова. См. Рисунок 20-2. для графического представления клиента, отправляющего действия диспетчеру и получающего ответы.

Рисунок 20-2. Диспетчер действий

Другие действия диспетчера — это запросы данных, о которых знает Asterisk. Например, существует действие диспетчера для получения списка всех активных каналов в системе: сведения о каждом канале доставляются как событие диспетчера. Когда список результатов будет завершен, будет отправлено сообщение о том, что конец достигнут. См. Рисунок 20-3 для графического представления клиента, отправляющего этот тип действия диспетчера и получающего список ответов.

Рисунок 20-3. Действия диспетчера, возвращающие список данных.

Кодировка сообщений.

Все сообщения AMI, включая события диспетчера, действия и ответы на действия кодируются одинаково. Сообщения основаны на тексте, а строки заканчиваются возвратом каретки и символом перевода строки. Сообщение заканчивается пустой строкой:

Header1: Это первый заголовок<CR><LF>

Header2: Это второй заголовок<CR><LF>

Header3: это последний заголовок этого сообщения<CR><LF>

<CR><LF>

События

События диспетчера всегда имеют заголовок Event и заголовок Privilege. Заголовок Event дает имя события, в то время как заголовок Privilege перечисляет уровни разрешений, связанные с событием. Любые другие заголовки, включенные в событие, зависят от типа события. Вот пример:

Event: Hangup

Privilege: call,all

Channel: SIP/0004F2060EB4-00000000

Uniqueid: 1283174108.0

CallerIDNum: 2565551212

CallerIDName: Russell Bryant

Cause: 16

Cause-txt: Normal Clearing

Asterisk 11 представила команды CLI manager show events и manager show event <event>. Выполните эти команды в CLI Asterisk, чтобы получить список событий или узнать подробности конкретного события.

Обратите внимание, что документация диспетчера событий доступна только из CLI Asterisk, если Asterisk был собран с помощью команды make full, а не просто make.

Действия

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

Чтобы получить список заголовков, связанных с определенным действием диспетчера, введите в командной строке Asterisk команду manager show command <Action>. Чтобы получить полный список действий диспетчера, поддерживаемых используемой версией Asterisk — введите команду manager show commands в CLI Asterisk.

Окончательным ответом на действие диспетчера обычно является сообщение, содержащее заголовок Response. Значение заголовка Response будет иметь значение Success, если действие диспетчера было выполнено успешно. Если действие диспетчера не было выполнено успешно, значением заголовка ответа будет Error. Например:

Action: Login

Username: russell

Secret: russell

Response: Success

Message: Authentication accepted

AMI через HTTP

В дополнение к собственному интерфейсу TCP можно также получить доступ к AMI по протоколу HTTP. Программисты, имеющие опыт написания приложений с использованием веб-API, вероятно, предпочтут родное подключение TCP. Хотя интерфейс TCP предлагает только один тип структуры сообщений, AMI через HTTP предлагает несколько вариантов кодирования. Вы можете получать ответы в том же формате, что и интерфейс TCP — в формате XML или в виде базовой HTML-страницы. Тип кодировки выбирается на основе поля в URL-адресе запроса. Параметры кодирования обсуждаются более подробно далее в этом разделе.

Аутентификация и обработка сеанса

Существует два метода выполнения аутентификации для AMI через HTTP. Во-первых, необходимо использовать действие Login, аналогичное аутентификации с собственным интерфейсом TCP. Этот метод, который использовался в примере быстрого старта, как замечено в «AMI через HTTP«.

После успешной аутентификации Asterisk предоставит файл cookie, который идентифицирует аутентифицированный сеанс. Вот пример ответа на действие Login, который включает cookie сеанса от Asterisk:

$ curl -v «http://localhost:8088/rawman?action=login&username=hello&secret=world»

* About to connect() to localhost port 8088 (#0)

* Trying 127.0.0.1… connected

* Connected to localhost (127.0.0.1) port 8088 (#0)

> GET /rawman?action=login&username=hello&secret=worlda HTTP/1.1

> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7

OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15

> Host: localhost:8088

> Accept: */*

>

< HTTP/1.1 200 OK

< Server: Asterisk/SVN-branch-11-r378376

< Date: Tue, 07 Sep 2010 11:51:28 GMT

< Connection: close

< Cache-Control: no-cache, no-store

< Content-Length: 55

< Content-type: text/plain

< Cache-Control: no-cache;

< Set-Cookie: mansession_id=»0e929e60″; Version=1; Max-Age=60

< Pragma: SuppressEvents

<

Response: Success

Message: Authentication accepted

* Closing connection #0

Второй вариант аутентификации — это дайджест аутентификации HTTP. В этом примере запрошенным типом кодировки на основе URL-адреса запроса является rawman. Чтобы указать, что следует использовать дайджест-проверку подлинности HTTP, префикс типа кодировки в URL-адресе запроса с a:

$ curl -v —digest -u hello:world http://127.0.0.1:8088/arawman?action=ping

* About to connect() to 127.0.0.1 port 8088 (#0)

* Trying 127.0.0.1…

* connected

* Connected to 127.0.0.1 (127.0.0.1) port 8088 (#0)

* Server auth using Digest with user ‘hello’

> GET /arawman?action=ping HTTP/1.1

> User-Agent: curl/7.27.0

> Host: 127.0.0.1:8088

> Accept: */*

>

< HTTP/1.1 401 Unauthorized

< Server: Asterisk/SVN-branch-11-r378376

< Date: Thu, 17 Jan 2013 13:19:05 GMT

< Connection: close

< Cache-Control: no-cache, no-store

< Content-Length: 210

< WWW-authenticate: Digest algorithm=MD5, realm=»asterisk», nonce=»55b30b6d»,

< qop=»auth», opaque=»55b30b6d»

< Content-type: text/html

<

* Closing connection #0

* Issue another request to this URL: ‘http://127.0.0.1:8088/arawman?action=ping’

* About to connect() to 127.0.0.1 port 8088 (#0)

* Trying 127.0.0.1…

* connected

* Connected to 127.0.0.1 (127.0.0.1) port 8088 (#0)

* Server auth using Digest with user ‘hello’

> GET /arawman?action=ping HTTP/1.1

> Authorization: Digest username=»hello», realm=»asterisk», nonce=»55b30b6d»,

> uri=»/arawman?action=ping», cnonce=»MTQ0MTQ5″, nc=00000001,

> qop=auth, response=»df8edf75f3571ad425cacb975d09280b»,

> opaque=»55b30b6d», algorithm=»MD5″

> User-Agent: curl/7.27.0

> Host: 127.0.0.1:8088

> Accept: */*

>

< HTTP/1.1 200 OK

< Server: Asterisk/SVN-branch-11-r378376

< Date: Thu, 17 Jan 2013 13:19:05 GMT

< Connection: close

< Cache-Control: no-cache, no-store

< Content-Length: 63

< Content-type: text/plain

<

Response: Success

Ping: Pong

Timestamp: 1358428745.481800

* Closing connection #0

Кодирование /rawman

Тип кодировки rawman — это то, что до сих пор использовалось во всех примерах AMI через HTTP в этой главе. Ответы, полученные от запросов с использованием rawman, форматируются точно так же, как если бы запросы отправлялись через прямое TCP-подключение к AMI.

Кодирование /manager

Тип кодировки manager предоставляет ответ в простой HTML-форме. Этот интерфейс в первую очередь полезен для экспериментов с AMI. Вот пример Login с использованием этого типа кодировки:

$ curl -v «http://localhost:8088/manager?

> «action=login&username=hello&secret=world»

* About to connect() to localhost port 8088 (#0)

* Trying 127.0.0.1… connected

* Connected to localhost (127.0.0.1) port 8088 (#0)

> GET /manager?action=login&username=hello&secret=world HTTP/1.1

> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7

OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15

> Host: localhost:8088

> Accept: */*

>

< HTTP/1.1 200 OK

< Server: Asterisk/SVN-branch-11-r378376

< Date: Tue, 07 Sep 2010 12:19:05 GMT

< Connection: close

< Cache-Control: no-cache, no-store

< Content-Length: 881

< Content-type: text/html

< Cache-Control: no-cache;

< Set-Cookie: mansession_id=»139deda7″; Version=1; Max-Age=60

< Pragma: SuppressEvents

<

<title>Asterisk&trade; Manager Interface</title><body bgcolor=»#ffffff»>

<table align=center bgcolor=»#f1f1f1″ width=»500″>

<tr><td colspan=»2″ bgcolor=»#f1f1ff»><h1>Manager Tester</h1></td></tr>

<tr><td colspan=»2″ bgcolor=»#f1f1ff»><form action=»manager» method=»post»>

Action: <select name=»action»>

<option value=»»>——&gt;</option>

<option value=»login»>login</option>

<option value=»command»>Command</option>

<option value=»waitevent»>waitevent</option>

<option value=»listcommands»>listcommands</option>

</select>

or <input name=»action»><br/>

CLI Command <input name=»command»><br>

user <input name=»username»> pass <input type=»password» name=»secret»><br>

<input type=»submit»>

</form>

</td></tr>

<tr><td>Response</td><td>Success</td></tr>

<tr><td>Message</td><td>Authentication accepted</td></tr>

<tr><td colspan=»2″><hr></td></tr>

* Closing connection #0

</table></body>

Кодирование /mxml

Тип кодирования mxml предоставляет ответы на действия диспетчера, закодированные в XML. Вот пример Login с помощью типа кодирования mxml:

$ curl -v «http://localhost:8088/mxml?action=login&username=hello&secret=world»

* About to connect() to localhost port 8088 (#0)

* Trying 127.0.0.1… connected

* Connected to localhost (127.0.0.1) port 8088 (#0)

> GET /mxml?action=login&username=hello&secret=world HTTP/1.1

> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7

OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15

> Host: localhost:8088

> Accept: */*

>

< HTTP/1.1 200 OK

< Server: Asterisk/SVN-branch-11-r378376

< Date: Tue, 07 Sep 2010 12:26:58 GMT

< Connection: close

< Cache-Control: no-cache, no-store

< Content-Length: 146

< Content-type: text/xml

< Cache-Control: no-cache;

< Set-Cookie: mansession_id=»536d17a4″; Version=1; Max-Age=60

< Pragma: SuppressEvents

<

<ajax-response>

<response type=’object’ id=’unknown’>

<generic response=’Success’ message=’Authentication accepted’ />

</response>

* Closing connection #0

</ajax-response>

События диспетчера

При подключении к собственному интерфейсу TCP для AMI события диспетчера доставляются асинхронно. При использовании AMI через HTTP события должны быть получены путем опроса. События загружаются через HTTP, выполнив WaitEvent диспетчера действий. В следующем примере показано как события могут быть получены с помощью WaitEvent диспетчера действий. Шаги:

  1. Запустите сеанс AMI HTTP с помощью действия Login.
  2. Зарегистрируйте SIP-телефон на Asterisk для создания события диспетчера.
  3. Извлеките событие диспетчера с помощью действия WaitEvent.

Взаимодействие выглядит так:

$ wget —save-cookies cookies.txt \

> «http://localhost:8088/mxml?action=login&username=hello&secret=world» -O —

<ajax-response>

<response type=’object’ id=’unknown’>

<generic response=’Success’ message=’Authentication accepted’ />

</response>

</ajax-response>

$ wget —load-cookies cookies.txt \

< «http://localhost:8088/mxml?action=waitevent» -O —

<ajax-response>

<response type=’object’ id=’unknown’>

<generic response=’Success’ message=’Waiting for Event completed.’ />

</response>

<response type=’object’ id=’unknown’>

<generic event=’PeerStatus’ privilege=’system,all’

channeltype=’SIP’ peer=’SIP/0000FFFF0004′

peerstatus=’Registered’ address=’172.16.0.160:5060′ />

</response>

<response type=’object’ id=’unknown’>

<generic event=’WaitEventComplete’ />

</response>

</ajax-response>

Файлы вызовов

Перед приведением примеров использования AMI, стоит поговорить о файлах вызовов. Часто AMI рассматривают для исходящих вызовов, однако, во многих ситуациях проще использовать файлы вызовов. Файл вызова — это простой текстовый файл, описывающий вызов, который вы хотите совершить с Asterisk. После создания файла вызова вы перемещаете его в каталог /var/spool/asterisk/outgoing. Asterisk обнаружит, что файл был помещен туда и будет обрабатывать вызов.

Чтобы использовать файлы вызовов в Asterisk должен быть загружен модуль pbx_spool. Выполните следующую команду в CLI Asterisk, чтобы убедиться, что он загружен. Если это не так, проверьте конфигурационный файл модулей /etc/asterisk/modules.conf:

*CLI> module show like spool

Module Description Use Count

pbx_spool.so Outgoing Spool Support 0

1 modules loaded

Asterisk поставляется с образцом файла вызова. Его можно найти как sample.call в корневом каталоге исходников Asterisk.

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

# Это комментарий

Option: Value

Таблица 20-5 описывает параметры, которые могут быть указаны в файле вызова.

Таблица 20-5. Параметры файла вызова

Параметр Пример значения Описание
Channel SIP/myphone Этот параметр является критическим и должен быть в каждом файле вызовов. Он описывает исходящий вызов, который будет инициирован. Это значение имеет тот же синтаксис, который будет использоваться для аргумента канала приложения Dial() в диалплане.
Context default Этот параметр используется для указания местоположения в диалплане, где будет стартовать выполняться исходящий вызов. Параметры Context, Extension и Priority должны использоваться вместе. При использовании этих параметров не следует использовать параметры Application и Data.
Extension s См. документацию для параметра Context.
Priority 1 См. документацию для параметра Context. Если параметры Context и Extension заданы, а Priority — нет, по умолчанию используется значение 1.
Application ConfBridge Параметры Application и Data можно использовать вместо параметров Context, Extension и Priority. В этом случае исходящий вызов напрямую подключается к одному приложению после ответа на вызов.
Data 500 См. документацию для параметра Application.
MaxRetries 2 Если исходящий вызов не отвечает, параметр MaxRetries указывает, сколько раз Asterisk повторит вызов перед отказом. Если не указано, значение по умолчанию равно 0.
RetryTime 60 Если ответ на исходящий вызов не получен, этот параметр указывает время ожидания в секундах перед повторной попыткой. Значение по умолчанию — 300 секунд (5 минут).
WaitTime 30 Этот параметр указывает время ожидания ответа в секундах перед отказом от исходящего вызова. Значение по умолчанию — 45 секунд.
CallerID Jonathan Rose <(555) 555-1212> Этот параметр можно использовать для указания CallerID, используемого для исходящего вызова.
Account someaccount Этот параметр устанавливает код аккаунта CDR для исходящего вызова.
Set VARIABLE=VALUE or FUNCTION(arguments)=VALUE Параметр Set можно использовать для установки переменных канала или функций канала на исходящем канале. Его можно указать несколько раз в файле вызовов.
Codecs ulaw,alaw Эта опция может использоваться для ограничения разрешенных кодеков при исходящем вызове. Если этот параметр не указан — набор кодеков, настроенных в файле конфигурации драйвера канала, будет сохранен
AlwaysDelete yes По умолчанию файлы вызовов всегда удаляются после их обработки. Если этот параметр имеет значение no — Asterisk проверит время изменения файла. Если это время в будущем, файл не будет удален.
Archive no Если этот параметр имеет значение yes, то вместо удаления файла вызова он будет перемещен в каталог /var/spool/asterisk/outgoing_done. Asterisk также добавит строку Status в файл вызова, которая будет отражать результат обработки файла вызова. Возможные значения Status — Completed (завершен), Expired (истек (максимальное количество попыток превышено)) или Failed (завершен с ошибкой (произошла ошибка)).

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

$ cat > demo-congrats.call << EOF

> Channel: SIP/[email protected]

> Application: Playback

> Data: demo-congrats

> CallerID: Asterisk <(555) 555-1212>

>

> EOF

$ mv demo-congrats.call /var/spool/asterisk/outgoing/

Использование mv вместо cp здесь важно. Asterisk следит за тем, чтобы содержимое отображалось в каталоге спула. Если вы используете копирование, Asterisk может попытаться прочитать новый файл до того, как содержимое будет полностью скопировано в него. Создание файла, а затем его перемещение позволяет избежать этой проблемы.

Использованием файлов вызовов для совершения исходящих вызовов легко и невероятно полезно. Оно отлично подходит для малого объема вызовов. Если вы хотели бы надежно инициировать много вызовов сразу, AMI является более подходящим. “Инициирование вызова с помощью Python и StarPy” дает пример инициирования вызова с помощью AMI.

Пример использования

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

Инициирование вызова

AMI имеет действие диспетчера Originate, которое может использоваться для инициирования вызова. Многие из принятых заголовков совпадают с параметрами, размещенными в файлах вызовов. Таблица 20-6 перечисляет заголовки, принятые действием Originate.

Таблица 20-6. Заголовки для действия Originate

Параметр Пример значения Описание
ActionID a3a58876-f7c9-4c28-aa97-50d8166f658d Этот заголовок принимается большинством действий AMI. Он используется для предоставления уникального идентификатора, который также будет включен во все ответы на действие. Это позволяет определить, с каким запросом связан ответ. Он важен, так как все действия, их ответы и события передаются по одному соединению (если только не используется AMI через HTTP).
Channel SIP/myphone Этот заголовок является критическим и должен быть указан. Он описывает исходящий вызов, который будет инициирован. Это значение имеет тот же синтаксис, который будет использоваться для аргумента канала приложения Dial() в диалплане.
Context default Этот параметр используется для указания местоположения в диалплане, где будет стартовать выполняться ответ на исходящий вызов. Заголовки Context, Extension и Priority должны использоваться вместе. При использовании этих параметров не следует использовать параметры Application и Data.
Exten s См. документацию для заголовка Context.
Priority 1 См. документацию для заголовка Context.
Application ConfBridge Вместо заголовков Context, Exten и Priority можно использовать заголовки Application и Data. В этом случае исходящий вызов напрямую подключается к одному приложению после ответа на вызов.
Data 500 См. документацию для заголовка Application.
Timeout 30000 Этот заголовок указывает время ожидания ответа в миллисекундах перед отказом от исходящего вызова. Значение по умолчанию — 30000 миллисекунд (30 секунд).
CallerID Matthew Jordan <(555) 867-5309> Этот заголовок может использоваться для указания CallerID, используемого для исходящего вызова.
Account someaccount Этот заголовок задает код аккаунта CDR для исходящего вызова.
Variable VARIABLE=VALUE or FUNCTION(arguments)=VALUE Заголовок Variable может использоваться для установки переменных канала или функций канала на исходящем канале. Его можно указать несколько раз.
Codecs ulaw,alaw Эта опция может использоваться для ограничения разрешенных кодеков при исходящем вызове. Если этот параметр не указан, набор кодеков, настроенных в файле конфигурации драйвера канала, по-прежнему будет учитываться.
EarlyMedia true Если этот заголовок указан и имеет значение true, исходящий вызов будет подключен к указанному добавочному номеру или приложению, как только появится какое-либо предответное состояние (Early Media).
Async true Если этот заголовок указан и имеет значение true, то вызов будет инициироваться асинхронно. Это позволит продолжить выполнение других действий с AMI-соединением во время обработки вызова.

Простейший пример использования действия Originate осуществляется через telnet:

$ telnet localhost 5038

Trying 127.0.0.1…

Connected to localhost.

Escape character is ‘^]’.

Asterisk Call Manager/1.3

Action: Login

Username: hello

Secret: world

Response: Success

Message: Authentication accepted

Action: Originate

Channel: Local/loop@test

Application: Playback

Data: demo-congrats

Response: Success

Message: Originate successfully queued

^]

telnet> quit

Connection closed

Перенаправление вызова

Перенаправление (или перевод) вызова из AMI — еще одна функция, заслуживающая упоминания. Действие AMI Redirect может использоваться для отправки одного или двух каналов на любой другой внутренний номер в диалплане Asterisk. Если вам нужно перенаправить два канала, которые соединены вместе, сделайте это для них обоих одновременно. В противном случае, как только один канал был перенаправлен, другой будет завершен.

Перенаправление одного канала:

Action: Redirect

Channel: SIP/myphone-0011223344

Exten: 1234

Context: default

Priority: 1

Для перенаправления двух каналов:

Action: Redirect

Channel: SIP/myphone-0011223344

Context: default

Exten: 1234

Priority: 1

ExtraChannel: SIP/otherphone-0011223344

ExtraContext: default

ExtraExten: 5678

ExtraPriority: 1

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

[confbridge]

exten => _X.,1,ConfBridge(${EXTEN})

Информацию о настройке поведения приложения ConfBridge см. в разделе «Расширенные возможности конференц-связи» в Главе 11.

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

Action: Redirect

Channel: SIP/myphone-0011223344

Context: confbridge

Exten: 1234

Priority: 1

ExtraChannel: SIP/otherphone-0011223344

ExtraContext: confbridge

ExtraExten: 1234

ExtraPriority: 1

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

Инициирование вызова с использованием Python и StarPy

Чтобы еще больше продемонстрировать использование действия Originate, мы предоставили скрипт, который его использует. Полный сценарий приведен в Примере 20-1. Его можно загрузить с https://github.com/russellb/amiutils. Чтобы получить представление об использовании примера приложения, вот вывод справки:

$ ./amioriginate.py —help

Usage: amioriginate.py [options] <channel>

Эта программа используется для инициирования вызова на сервере Asterisk с помощью интерфейса управления Asterisk (AMI). Аргумент канала для этого приложения сообщает Asterisk, какой исходящий вызов следует выполнить. Существуют различные параметры, с помощью которых можно указать, к чему будет подключен исходящий вызов после ответа.

Options:

-h, —help Показать это сообщение справки и выйти

-d, —debug Включить вывод отладочной информации

-u USERNAME, —username=USERNAME

Имя пользователя AMI

-p PASSWORD, —password=PASSWORD

пароль AMI

-H HOST, —host=HOST Hostname или IP-адрес сервера Asterisk

-t PORT, —port=PORT Номер порта для AMI

-a APPLICATION, —application=APPLICATION

Приложение для подключения вызова. При использовании

этого параметра можно также указать аргументы приложения

с параметром-D/—data. Не используйте этот параметр и

параметры context, extension, и priority одновременно.

-D DATA, —data=DATA Аргументы для передачи приложению диалплана, указанному

с помощью-a/—application.

-c CONTEXT, —context=CONTEXT

Контекст в dialplan для отправки вызова, как только

получен ответ. При использовании этого параметра

необходимо также указать extension и priority. Не

указывайте параметры Application или Data при

использовании этого параметра.

-e EXTEN, —extension=EXTEN

Добавочный номер для подключения вызова. Cледует

использовать вместе с параметрами context и proirity.

-P PRIORITY, —priority=PRIORITY

Приоритет добавочного номера для подключения вызова.

Должен использоваться вместе с параметрами context и

extension.

Если вы запустите утилиту в режиме отладки, то увидите сообщение об обмене сырыми AMI-сообщениями. Во-первых, вот пример использования скрипта для инициирования вызова и подключения его к приложению. MSG OUT и Line In в выводе определяют обмен AMI. Строки MSG OUT указывают приложению действие AMI во внутреннем формате вместо исходного формата AMI, но заголовки и их значения по-прежнему видны. Строки Line In показывают только ответ TCP от Asterisk. Вывод показывает:

  1. Приложение запрашивает вход в AMI.
  2. Asterisk отвечает, принимая запрос аутентификации.
  3. Приложение отправляет запрос на инициирование вызова.
  4. Asterisk отвечает, указывая, что запрос инициирования успешно обработан. Вызов будет выполняться асинхронно, так как запрос originate включает Async: True. В противном случае мы не получили бы ответа, пока исходящий вызов или не будет отвечен или не отклонен по какой-либо причине.

$ ./amioriginate.py -d -u hello -p world \

> -a playback -D demo-congrats SIP/myphone

DEBUG:AMI:MSG OUT: {‘action’: ‘login’, ‘username’: ‘hello’, ‘secret’: ‘world’,

‘actionid’: ‘rhel6.3-server-28064728-1’}

DEBUG:AMI:Line In: ‘Asterisk Call Manager/1.3’

DEBUG:AMI:Line In: ‘Response: Success’

DEBUG:AMI:Line In: ‘ActionID: rhel6.3-server-28064728-1’

DEBUG:AMI:Line In: ‘Message: Authentication accepted’

DEBUG:AMI:Line In: »

DEBUG:AMI:MSG OUT: {‘application’: ‘playback’,

‘actionid’: ‘rhel6.3-server-28064728-2’,

‘variable’: », ‘async’: ‘True’, ‘data’: ‘demo-congrats’,

‘action’: ‘originate’, ‘channel’: ‘SIP/myphone’}

DEBUG:AMI:Line In: ‘Response: Success’

DEBUG:AMI:Line In: ‘ActionID: rhel6.3-server-28064728-2’

DEBUG:AMI:Line In: ‘Message: Originate successfully queued’

DEBUG:AMI:Line In: »

Этот скрипт использует два сторонних модуля Python: twisted и starpy. Модуль twisted широко используется и должен быть доступен в виде дистрибутива. Модуль starpy используется не так часто и его нужно установить вручную. См. “Разработка фреймворков”.

Пример 20-1. amioriginate.py

#!/usr/bin/env python

#

# Copyright (C) 2012, Russell Bryant

#

# Licensed under the Apache License, Version 2.0 (the «License»); you may

# not use this file except in compliance with the License. You may obtain

# a copy of the License at

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an «AS IS» BASIS, WITHOUT

# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

# License for the specific language governing permissions and limitations

# under the License.

# Если иное не требуется применимым законодательством или не согласовано в

# письменной форме, программное обеспечение, распространяемое по лицензии,

# распространяется на условиях «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ,

# явных или подразумеваемых. См. Лицензию для конкретного языка, регулирующего

# разрешения и ограничения в рамках Лицензии.

#

»’Originate вызов на сервере Asterisk

Разработан в качестве примера для «Asterisk: The Definitive Guide»

»’

import getpass

import logging

import optparse

import sys

import starpy.manager

from twisted.internet import reactor

LOG = logging.getLogger(__name__)

class OriginateCall(object):

def __init__(self, options, channel):

self.options = options

self.channel = channel

self.ami = starpy.manager.AMIFactory(self.options.username,

self.options.password)

def _on_login(self, ami):

kwargs = dict(channel=self.channel, async=True)

if self.options.application:

kwargs[‘application’] = self.options.application

kwargs[‘data’] = self.options.data

else:

kwargs[‘context’] = self.options.context

kwargs[‘exten’] = self.options.exten

kwargs[‘priority’] = self.options.priority

def _on_success(ami):

reactor.stop()

def _on_error(reason):

LOG.error(‘Originate failed: %s’ % reason.getErrorMessage())

reactor.stop()

ami.originate(**kwargs).addCallbacks(_on_success, _on_error)

def connect_and_call(self):

def _on_login_error(reason):

LOG.error(‘Failed to log in: %s’ % reason.getErrorMessage())

reactor.stop()

df = self.ami.login(self.options.host, self.options.port)

df.addCallbacks(self._on_login, _on_login_error)

def main(argv=None):

if argv is None:

argv = sys.argv

logging.basicConfig(level=logging.INFO)

description = (‘Эта программа используется для инициирования вызова на ‘

‘сервере Asterisk с помощью AMI. Аргумент канала для этого’

‘приложения сообщает Asterisk, какой исходящий вызов следует

‘выполнить. Существуют различные параметры, с помощью которых

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

‘ответа.’)

usage = ‘%prog [options] <channel>’

parser = optparse.OptionParser(description=description, usage=usage)

parser.add_option(‘-d’, ‘—debug’, action=’store_true’,

dest=’debug’, help=’Enable debug output’)

parser.add_option(‘-u’, ‘—username’, action=’store’, type=’string’,

dest=’username’, default=None, help=’AMI username’)

parser.add_option(‘-p’, ‘—password’, action=’store’, type=’string’,

dest=’password’, default=None, help=’AMI password’)

parser.add_option(‘-H’, ‘—host’, action=’store’, type=’string’,

dest=’host’, default=’localhost’,

help=’Hostname or IP address of the Asterisk server’)

parser.add_option(‘-t’, ‘—port’, action=’store’, type=’int’,

dest=’port’, default=5038,

help=’Port number for the AMI’)

parser.add_option(‘-a’, ‘—application’, action=’store’, type=’string’,

dest=’application’, default=»,

help=’Приложение для подключения вызова. При’

‘использовании’ этого параметра можно также указать’

‘аргументы приложения с параметром-D/—data. Не’

‘используйте этот параметр и параметры context,’

‘extension и priority одновременно.’)

parser.add_option(‘-D’, ‘—data’, action=’store’, type=’string’,

dest=’data’, default=»,

help=’Аргументы для передачи приложению диалплана,’

‘указанному с помощью-a/—application.’)

parser.add_option(‘-c’, ‘—context’, action=’store’, type=’string’,

dest=’context’, default=»,

help=’Context in the dialplan to send the call to ‘

‘once it answers. If using this option, you ‘

‘must also specify an extension and priority. ‘

‘Do not specify the application or data options ‘

‘if using this option.’)

parser.add_option(‘-e’, ‘—extension’, action=’store’, type=’string’,

dest=’exten’, default=»,

help=’Extension to connect the call to. This should ‘

‘be used along with the context and priority ‘

‘options.’)

parser.add_option(‘-P’, ‘—priority’, action=’store’, type=’string’,

dest=’priority’, default=»,

help=’Priority of the extension to connect the call ‘

‘to. This should used along with the context ‘

‘and extension options.’)

(options, args) = parser.parse_args(argv)

if options.debug:

LOG.setLevel(logging.DEBUG)

starpy.manager.log.setLevel(logging.DEBUG)

if len(args) != 2 or not len(args[1]):

LOG.error(‘Please specify a single outbound channel.’)

parser.print_usage()

return 1

channel = args[1]

valid_application = len(options.application)

valid_extension = (len(options.context) and len(options.exten) and

len(options.priority))

if not valid_application and not valid_extension:

LOG.error(‘Укажите допустимую точку для подключения вызова после ответа’

‘Укажите приложение или контекст, расширение и приоритет.’)

parser.print_usage()

return 1

if valid_application and valid_extension:

LOG.error(‘Пожалуйста, укажите только одно расширение или приложение.’)

parser.print_usage()

return 1

if not options.username:

user = raw_input(‘Username [%s]: ‘ % getpass.getuser())

if not user:

user = getpass.getuser()

options.username = user

if not options.password:

options.password = getpass.getpass()

o = OriginateCall(options, channel)

reactor.callWhenRunning(o.connect_and_call)

reactor.run()

return 0

if __name__ == ‘__main__’:

sys.exit(main())

Разработка фреймворков

Многие разработчики приложений пишут код, который напрямую взаимодействует с AMI. Тем не менее, существует ряд библиотек, целью которых является упрощение написания приложений AMI. Таблица 20-7 содержит некоторые списки из которых часть успешно используются. Если вы ищете библиотеки для Asterisk на любом популярном языке программирования по вашему выбору, вы, скорее всего, найдете их.

Таблица 20-7. Фреймворки разработки AMI

Фреймворк Язык URL
Adhearsion Ruby http://adhearsion.com/
StarPy Python https://github.com/asterisk-org/starpy https://github.com/gawel/panoramisk https://github.com/ettoreleandrotognoli/python-ami
Asterisk-Java Java http://asterisk-java.org/

CSTA

Телекоммуникационные приложения с компьютерной поддержкой (CSTA) — это стандарт интеграции компьютерной телефонии (CTI), используемый несколькими производителями. Некоторые из тех, что предоставлены CSTA, могут быть сопоставлены с операциями, доступными в AMI. Было нескольких усилий, чтобы обеспечить интерфейс CSTA для Asterisk, в том числе проект Open CSTA. Хотя ни один из авторов не имеет опыта работы с этим интерфейсом CSTA для Asterisk, его, безусловно, стоит рассмотреть, если у вас есть опыт CSTA или существующее приложение CSTA вы хотели бы интегрировать с Asterisk.

Интересные приложения

Было разработано много полезных приложений, которые используют преимущества AMI. Вот один из примеров.

Flash-панель оператора

Flash Operator Panel — это приложение, которое запускается в веб-браузере с помощью Flash. Оно используется в основном в качестве интерфейса, чтобы видеть какие внутренние номера в настоящее время звонят или используются. Оно также включает в себя возможность мониторинга состояния конференц-зала и очередей вызовов. Также могут быть выполнены некоторые действия вызова, такие как врывание (barging) и передача (transfer) вызовов. На Рисунке 20-4 показан интерфейс Flash-панели оператора.

Загрузить и получить более подробную информацию о Flash-панели оператора можно по адресу http://www.asternic.org и http://www.fop2.com.

Рисунок 20-4. Flash-панель оператора.

Заключение

Интерфейс управления Asterisk (AMI) предоставляет API для мониторинга событий из системы Asterisk, а также запрашивает у Asterisk выполнение широкого спектра действий. Был представлен интерфейс HTTP и разработан ряд платформ, которые облегчают разработку приложений. Вся эта информация, а также примеры, которые мы рассмотрели в конце этой главы, должны заставить вас задуматься о том, какие новые приложения вы могли бы создать с помощью AMI.

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

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

Надежен в эксплуатации.

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

Гибкий в настройке.

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

Имеет огромный функционал.

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

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

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