AMI. Разносторонний Originate. Применение в CTI приложении

от автора

Originate можно перевести с английского как «давать начало». Возможности команды весьма широки и не все очевидны. Originate, среди разработчиков CTI приложений — это одна из наиболее популярных команд AMI. Чаще ее используют для инициации исходящих вызовов и организации обратных звонков. В рамках данной статьи мы рассмотрим расширенные возможности.

Пример настройки AMI и подключения по telnet

Настроим учетную запись в файле /etc/asterisk/manager.conf:

[general] enabled = yes port = 5038 bindaddr = 0.0.0.0  [1cami] ; secret=PASSWORD1cami deny=0.0.0.0/0.0.0.0 permit=0.0.0.0/0.0.0.0 ; Достаточно ограниченного набора прав.  read=call write=originate 

Далее необходимо в CLI консоли Asterisk выполнить команду:

module reload manager 

Для подключения будем использовать средства telnet:

~ # telnet 127.0.0.1 5038 Asterisk Call Manager/1.2 

Как только появится приглашение “Asterisk Call Manager”, можно вводить команды. Первой командой должна быть авторизация.

Action: Login Username: 1cami Secret: PASSWORD1cami 

Завершением ввода команды служит пустая строка. В случае успеха, получаем ответ:

Response: Success Message: Authentication accepted 

Базовый пример Originate

Описание параметров команды AMI

  • Channel — Имя канала. Формат type/identifier. Type — тип канала, в зависимости от используемого драйвера SIP / IAX2 / DAHDI
  • Context — Имя контекста для совершения вызова. Следует использовать совместно с параметрами Exten и Priority
  • Exten — номер телефона, определенный в контексте «Context»
  • Priority — Приоритет, позиция в Context, с которой начнеться обработка вызова
  • Timeout — Таймаут в милисекундах. Если инициатор исходящего звонка не ответил, вызов будет завершен
  • CallerID — значение callerid для исходящего звонка. Формат «ИмяСотрудника <НомерТелефона>»
  • Variable — установка переменных для порожденных Originate каналов
  • Account — Значение поля accauntcode для исходящих вызовов
  • Application — команда dialplan, которая будет выолнена, используется совместно с параметром «Data»
  • Async — признак асинхронного выполнения команды. Если установлен в значение «1», результат будет возвращен в пакете типа «Event» с именем «OriginateResponse»Data — Параметры команды dialplan
  • ActionID — идентификатор запроса, полезно использовать при несколькоих одновренменных асинхронных запросах. Позволяет сопоставить результат с исходных запросом

Коды ответа «Event» с именем «OriginateResponse»

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

Рассмотрим инициацию вызова с SIP канала 104 на номер 74952293042 в контексте from-internal:

Action: Originate Channel: SIP/104 Context: from-internal Exten: 74952293042 Priority: 1 Callerid: 104 Variable: SIPADDHEADER="Call-Info:\;answer-after=0" 

В результате этой команды, зазвонит внутренний телефон, связанный с каналом SIP/104. После поднятия трубки, вызов пойдет на номер 74952293042 в контекст from-internal, приоритет 1.

В некоторых случаях удобно совмещать исходящий вызов с intercom, для этого следует задействовать параметр Variable.
Для Cisco, Linksys, Yealink и некоторых программных телефонов, подойдет установка переменной “SIPADDHEADER” в значение: "Call-Info:\;answer-after=0"

Допустим, на рабочем месте используется телефон Linksys. В результате Originate, сработает автоматический ответ на вызов, на телефоне, связанном с каналом SIP/104.

Перехват вызова

Все слышали о функции перехвата вызова, поступившего на соседний телефонный аппарат.
Обычно функция реализуется “старкодом” *8.

Для реализации перехвата, в dialplan можно задействовать приложение PickUp или PickupChan, сети довольно много примеров использования.

Как организовать эту функцию средствами AMI?

Для захвата вызова можно воспользоваться командой Originate. У нее есть два интересных параметра:

  • Application — приложение, которое должно быть запущено
  • Data — данные приложения

Опишем пример перехвата вызова, поступившего на sip аккаунт 104:

Action: Originate Channel: SIP/104 Application: PickupChan Data: SIP/104-0000003c Priority: 1 Callerid: 104 Variable: SIPADDHEADER="Call-Info:\;answer-after=0" 

Особенность этого Originate — нет необходимости описывать параметр «context».

Но появляется потребоность отслеживать каналы, которые мы можем перехватить. В данном примере канал описан как «SIP/104-0000003b».

Отслеживать появление новых каналов возможно в event "Newstate", где "ChannelState" установлено в значение «5» (Ringing). Ниже пример event:

Event: Newstate Privilege: call,all Channel: SIP/104-0000003c ChannelState: 5 ChannelStateDesc: Ringing CallerIDNum: 104 CallerIDName: Default Extension ConnectedLineNum: 104 ConnectedLineName:  Uniqueid: askozia-1438348824.146 

Как только поступит event "Newstate", где "ChannelState" установлено в значение «6» (Up) — на вызов уже ответили:

Event: Newstate Privilege: call,all Channel: SIP/104-0000003c ChannelState: 6 ChannelStateDesc: Up CallerIDNum: 104 CallerIDName: Default Extension ConnectedLineNum: 104 ConnectedLineName:  Uniqueid: askozia-1438348824.146 

Внимательный читатель заметит в примере некоторую несуразицу:

Action: Originate Channel: SIP/104 Application: PickupChan Data: SIP/104-0000003b 

Ошибки нет. Вызов выполняем с Channel SIP/104, PickupChan выполняем для канала SIP/104-0000003b. То есть для своего же канала.

Прокомментирую на примере

Эту функцию мы запустили в повседневное использование. На моем рабочем месте установлен IP телефон. К телефону подключена гарнитура.

  1. Мне поступает входящий вызов;
  2. Жму кнопку «Ответить на вызов» в нашем CTI приложении;
  3. Выполняется описанный выше пример originate;
  4. Благодаря установленному «SIPADDHEADER» происходит автоответ;
  5. Телефон выполняет исходящий звонок и «пикапит» вызов.

Физически, я не поднимаю трубку телефона. Общаюсь с клиентом по гарнитуре. Руки свободны — профит на лицо.

Прослушать запись разговора

В некоторых случаях удобно прослушать запись разговора с телефонного аппарата в виде обратного звонка. На наш номер 104 поступит вызов. При ответе мы услышим запись разговора.

Пример AMI:

Action: Originate Channel: SIP/104 Application: Playback Data: /storage/usbdisk1/test_file Priority: 1 Callerid: Playback Variable: SIPADDHEADER="Call-Info:\;answer-after=0" 

Используется приложение "Playback", в качестве данных передаем полное имя файла без расширения "/storage/usbdisk1/test_file".

Подслушать разговор

Для обучения новых сотрудников мы начали использовать необычный подход. Каждый стажер может подслушивать / прослушивать разговоры своего куратора. Благодаря этому, сотрудник быстрее начинает понимать, как построить разговор с клиентом.
В этом случае мы используем приложение "ChanSpy":

Action: Originate Channel: SIP/104 Application: ChanSpy Data: SIP/105,qx Priority: 1 Callerid: Spy-105 <105> Variable: SIPADDHEADER="Call-Info:\;answer-after=0" 

  • q — “тихий режим”, присоединение к разговору не анонсируется в разговор.

Присоединиться к разговору

В некоторых случаях куратору необходимо присоединиться к разговору и “вырулить” ситуацию. В этом случае используем следующий пример:

Action: Originate Channel: SIP/104 Application: ChanSpy Data: SIP/105,qBx Priority: 1 Callerid: Spy-105 <105> Variable: SIPADDHEADER="Call-Info:\;answer-after=0"  

  • B — оба канала могут слышать присоединившегося абонента

Режим суфлера

Куратор может присоединиться к разговору и подсказывать стажеру:

Action: Originate Channel: SIP/104 Application: ChanSpy Data: SIP/105,wx Priority: 1 Callerid: Spy-105 <105> Variable: SIPADDHEADER="Call-Info:\;answer-after=0"  

  • w — режим шепота, присоединившегося абонента будет слышать только канал, за которым «шпионим»

Заключение

Описанные команды отлично вписываются в CTI приложения и значительно могут улучшить удобство работы и эффективность сотрудников.

При разработке я рекомендую обратить внимание на проекты PAMI, NAMI и Shift8.

Надеюсь эта статья поможет в понимании работы команды originate, что позволит сделать ваши CTI приложения более функциональными.

ссылка на оригинал статьи http://habrahabr.ru/post/265647/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *