Захват DTMF-сигналов во время разговора

Материал из Oktell
Перейти к: навигация, поиск

Наверх

Введение

Задача: Определять во время разговора введенные DTMF-символы на внешней и внутренней линии. В зависимости от линии и введенного на ней символа запускать различные процессы на сервере и клиентском приложении сотрудника. Например, при нажатии сотрудником на 1 — открыть в браузере сайт oktell.ru, при нажатии на 2 — привязать звонок к задаче Call-центра.

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

Однако, проблема решается с помощью самостоятельного перехвата DTMF-сигналов во время разговора. В системе есть возможность с помощью сценариев получить введенные символы как с внешней, так и с внутренней линии. В процессе настройки сценариев вы сами определяете какие действия должна выполнить система при нажатии того или иного символа (или их комбинации). Таким образом, в Oktell можно реализовать неограниченное количество "служебных комбинаций".

Функционал полезен в случаях, когда операторы часто проделывают одни и те же действия: добавляют текущий контакт в CRM-систему, открывают карточку клиента в браузере. С помощью определенных символов сотрудник может пометить клиента, чтобы система, к примеру, отправила ему SMS после разговора. Введенные символы на внешней стороне применяются для ввода скрытых данных, например, пароля во время разговора. Это может быть использовано для подтверждения операций в банковской сфере, не сообщая оператору личной информации.


Основная идея

Чтобы перехватывать DTMF-сигналы с любой линии, необходимо в IVR-сценарии после успешного переключения зациклить компонент Ввод значения. В таком случае на линии параллельно с разговором будет работать IVR сценарий, фиксирующий все введенные символы.


Перехват DTMF-001.png

Дополнительно все введенные DTMF сохраняются в таблице [oktell]..[a_stat_dtmf]. Для этого необходимо включить соответствующие настройки в разделе Администрирование/Общие настройки/Управление базами данных — Сохранять в БД все получаемые по внешним/внутренним линиям DTMF-символы. Для считывания DTMF потребуется отдельный служебный сценарий, который будет циклично мониторить таблицу на предмет ввода новых символов.


Перехват DTMF-002.png


Главный IVR сценарий

Поскольку в главный IVR сценарий попадает внешняя линия, установленный "Ввод значения" будет принимать DTMF только на этой внешней линии. В рамках задачи необходимо принимать DTMF и с внутренней линии, следовательно нужно дозвониться до нее и также запустить на ней IVR сценарий. Такая операция реализуется через дозвон и конференцию с моделью поведению "Преобразовать в коммутацию".


Перехват DTMF-003.png


Компонент "Начальные параметры". Определяет параметры клиента и сохраняет в переменные:

  • сессионной переменной phone (строковая) присваивается внутренний номер, на который происходит переключение. В примере, строка "900".
  • сессионной переменной key (строковая) присваивается значение выражения RANDOM(999999). Переменная используется в качестве ключа конференции.
  • сессионной переменной CallerId (строковая) присваивается значение функции Номер абонента (CallerId). Переменная хранит номер абонента.


Перехват DTMF-005.png


Компонент "В конференцию". Отправляет клиента в конференцию с моделью поведения "Преобразовать в коммутацию". Как только в эту коммутацию присоединится второй участник она преобразуется в обычный разговор. Ключ конференции предварительно генерируется случайным образом.

  • Ключ конференции — переменная key
  • Создать, если отсутствует - да
  • Расширенная настройка — да
  • Модель поведения - Преобразовать в коммутацию


Компонент "На дозвон". Запускает сценарий дозвона до внутреннего номера с последующим добавлением в конференцию. Все сессионные переменные будут переданы в этот сценарий автоматически.

  • Тип запуска — асинхронный служебный
  • Сценарий - Перехват DTMF (служебный сценарий дозвона)


Компонент "Перехват DTMF". Запускает сценарий для считывания DTMF-сигналов с данной внешней линии. Параметр запуска 0 означает, что сценарий запускается для внешней линии (рассматривается ниже).

  • Тип запуска - вложенный
  • Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
  • Параметр запуска - строка "0"


Перехват DTMF-004.png


Служебный сценарий дозвона

Сценарий дозванивается до внутреннего пользователя и запускает на его линии IVR сценарий добавления в конференцию. В сценарии не предусмотрен случай, когда внутренний абонент не берет трубку.


Перехват DTMF-006.png


Компонент "Дозвон". Все используемые сессионные переменные должны строго иметь такие же наименования, как и в главном сценарии.

  • Номер/команда - сессионная переменная phone (строковая)
  • Среда - внутренний номерной план
  • Обслуживание - IVR
  • Сценарий IVR - Перехват DTMF (IVR сценарий входа в конференцию)
  • Параметр запуска - сессионная переменная key (строковая)
  • CallerId - сессионная переменная CallerId (строковая)


IVR сценарий входа в конференцию

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


Перехват DTMF-007.png


Компонент "Старт". На вход сценария передается номер конференции, в которую следует добавить внутреннего сотрудника. Параметр запуска сохраняется в переменную key.

  • Параметр запуска - переменная key (строковая)


Компонент "В конференцию". Добавляет сотрудника в конференцию с указанным ключом.

  • Ключ конференции — переменная key
  • Создать, если отсутствует - да
  • Расширенная настройка — да
  • Модель поведения - Преобразовать в коммутацию

Компонент "Перехват DTMF". Запускает сценарий для считывания DTMF-сигналов с текущей внутренней линии. Параметр запуска 1 означает, что сценарий запускается для внутренней линии (рассматривается ниже).

  • Тип запуска - вложенный
  • Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
  • Параметр запуска - строка "1"


Перехват DTMF-008.png


IVR сценарий перехвата DTMF

Основной сценарий для захвата DTMF и выполнения служебных действий. Главная идея — зациклить компонент "Ввод значения", анализируя введенные значения. Напомним, что этот сценарий — единый для внешних и внутренних линий, поэтому на старт передавался флаг, поясняющий тип линии: 0 - внешняя линия, 1 - внутренняя. Такое разделение помогает реализовать различный функционал для сотрудников и клиентов.


Перехват DTMF-009.png


Компонент "Старт". На вход сценария передается тип линии. Компонент сохраняет параметр запуска в переменную startParam.

  • Параметр запуска - переменная startParam (строковая)


Компонент "Внутренняя линия?". Определяет тип линии и направляет сценарий на соответствующую ветку.

  • Аргумент 1 — переменная startParam
  • Аргумент 2 — строка 1
  • Тип сравнения — "="
  • Переход, если правда — на компонент "Ввод с внутренней линии"
  • Переход, если ложь — на компонент "Ввод с внешней линии"


Компонент "Ввод с внутренней линии". Ожидает ввода одного символа с внутренней линии, затем сохраняет введенный символ в переменную DTMF. Переход к анализу происходит только если символ введен.

  • Буфер для DTMF - переменная DTMF (строковая)
  • Очистить буфер - Да
  • Макс время, с - 20
  • Количество символов - 1
  • Переход - на компонент "Ув2"
  • Переход, таймаут - на компонент "->"


Перехват DTMF-010.png


Компонент "Ув2". Отладочное уведомление для вывода захваченного символа

  • Текст — выражение ScriptFunc( 'Имя пользователя' )+' набрал символ '+[DTMF]
  • Способ оповещения — Всплывающее уведомление
  • Ключ получателя — введите внутренний номер вашего пользователя


Компонент "Определение символа". Анализирует введенный символ — по нажатию на 1 у сотрудника должна открыться веб-страница в браузере, а по нажатию на 2 звонок должен прикрепиться к задаче.

  • Аргумент - переменная DTMF
  • Значения -
1 - на компонент "Ув3"
2 - на компонент "Ув4"
  • Переход, прочее — на компонент "->"


Перехват DTMF-011.png


Компоненты "Ув3 и Ув4". Отладочные уведомления о выбранных действиях.


Компонент "Действие 1". Запускает сценарий для открытия страницы Oktell.ru в браузере. На вход сценария передается идентификатор оператора, для которого нужно это выполнить.

  • Тип запуска - Асинхронный служебный
  • Сценарий - Перехват DTMF (Служебный сценарий для открытия сайта)
  • Параметр запуска - функция "Guid-идентификатор пользователя".


Компонент "Действие 2". Запускает сценарий для привязки звонка к задаче. На вход сценария передается идентификатор оператора, для которого нужно это выполнить.

  • Тип запуска - Асинхронный служебный
  • Сценарий - Перехват DTMF (Служебный сценарий для привязки звонка к задаче)
  • Параметр запуска - функция "Guid-идентификатор пользователя".


Перехват DTMF-012.png


Компонент "->". Не имеет функционального предназначения, используется для связки компонентов.

  • Время задержки, мс - 0


Компонент "Ввод с внешней линии". Аналогичные действия выполняются для внешней линии. Компонент считывает DTMF, введенные на внешней линии.

  • Буфер для DTMF - переменная DTMF (строковая)
  • Очистить буфер - Да
  • Макс время, с - 20
  • Количество символов - 1
  • Переход - на компонент "Ув1"
  • Переход, таймаут - на компонент "->"


Компонент "Ув1". Отладочное уведомление для вывода захваченного символа. После компонента вы можете аналогично реализовать функционал для внешних линий.

  • Текст — выражение 'Линия '+ScriptFunc( 'Номер линии' )+' набрал символ '+[DTMF]
  • Способ оповещения — Всплывающее уведомление
  • Ключ получателя — введите внутренний номер вашего пользователя


Перехват DTMF-013.png


Служебный сценарий для открытия сайта

Сценарий выполняется после нажатия на внутренней линии символа "1". Открывает страницу https://oktell.ru в браузере на компьютере сотрудника. Ключ сотрудника передается на вход сценария.


Перехват DTMF-014.png


Компонент "Старт". На вход сценария передается идентификатор пользователя. Компонент сохраняет параметр запуска в переменную GUID пользователя.

  • Параметр запуска - переменная GUID пользователя (строковая)


Компонент "Открыть веб-страницу". Открывает указанную веб-страницу в браузере по умолчанию на компьютере пользователя.

  • Ключ пользователя - переменная GUID пользователя
  • Файл - строка "https://oktell.ru"
  • Путь - Абсолютный
  • Режим запуска - С помощью оболочки


Перехват DTMF-016.png


Служебный сценарий для привязки звонка к задаче

Сценарий выполняется после нажатия символа "2" на внутренней линии. Прикрепляет текущий звонок к задаче. Напомним, что прикрепление звонка к задаче работает только во время действующего разговора, при наличии данного оператора в режиме Call-центр и активной задаче. Если одно из этих условий не выполнено, то сценарий не сработает. Ключ сотрудника, для которого нужно прикрепить звонок, передается на вход сценария.


Перехват DTMF-015.png


Компонент "Старт". На вход сценария передается идентификатор пользователя. Компонент сохраняет параметр запуска в переменную GUID пользователя.

  • Параметр запуска - переменная GUID пользователя (строковая)


Компонент "Привязать звонок к задаче". Прикрепляет текущий звонок пользователя к указанной задаче.

  • Действие - Установить
  • Тип объекта - Задача
  • Задача - выберите задачу Call-центра
  • Свойство/действие - Привязать к звонку оператора
  • Значение - переменная GUID пользователя


Перехват DTMF-017.png


IVR сценарий исходящей маршрутизации

Ранее мы подробно рассмотрели перехват DTMF во время входящего звонка. В данном параграфе рассматривается перехват DTMF во время исходящего звонка. Для реализации функционала потребуется модифицировать сценарий исходящей маршрутизации.

Поскольку этот сценарий запускается на внутренней линии, изначально мы сможем перехватывать только сигналы с внутренних линий. Как говорилось ранее, нам для перехвата DTMF нужно запустить IVR сценарий на требуемой линии. Вы можете воспользоваться указанным выше алгоритмом через создание конференции, однако мы рассмотрим альтернативный способ считывания сигналов непосредственно из БД. Для работы данного сценария необходимо установить флажок "Сохранять в БД все получаемые по внешним/внутренним линиям DTMF-символы" в модуле Администрирование/Общие настройки/Управление базами данных.

В сценарии исходящей маршрутизации после успешного соединения нужно установить запуск служебного сценария для получения DTMF из БД и IVR сценарий для захвата сигналов с данной линии. Также чтобы получать DTMF с нужной внешней линии, необходимо сохранить ее идентификатор в компоненте "ВНЕШНИЕ".


Перехват DTMF-018.png


Компонент "ВНЕШНИЕ". В компоненте необходимо сохранить идентификатор выбранной линии в сессионную переменную "Line" (строковая)

  • Идентификатор выбранной линии - сессионная переменная "Line" (строковая)


Компонент "Получение DTMF из БД". Запускает сценарий для мониторинга таблицы a_stat_dtmf

  • Тип запуска - Асинхронный служебный
  • Сценарий - Перехват DTMF (Служебный сценарий для получения DTMF из БД)


Компонент "Перехват DTMF". Запускает сценарий для считывания DTMF-сигналов с текущей внутренней линии. Параметр запуска 1 означает, что сценарий запускается для внутренней линии. Сценарий рассмотрен выше.

  • Тип запуска - вложенный
  • Сценарий - Перехват DTMF (IVR сценарий перехвата DTMF)
  • Параметр запуска - строка "1"


Перехват DTMF-019.png


Служебный сценарий для получения DTMF из БД

Основная идея сценария - циклично осуществлять запросы в таблицу [oktell]..[a_stat_dtmf] и последовательно считывать все введенные символы с внешней линии. На каждой итерации символы анализируются и производятся заранее настроенные действия. Через сессионную переменную Line сценарий получает идентификатор линии, по которой нужно захватывать DTMF.


Перехват DTMF-020.png


Компонент "Текущее время". Сохраняет текущее время в переменную dt. Используется в качестве начального параметра для поиска DTMF в таблице.

  • переменной dt (дата/время) присваивается значение функции "Текущие дата и время"


Компонент "idchain". Определяет текущий идентификатор цепочки коммутаций на внешней линии. Требуется для поиска DTMF в таблице, а также для проверки существования коммутации.

  • Действие - Определить
  • Тип объекта - Линия
  • Ключ линии - сессионная переменная Line (строковая)
  • Значение в переменную - переменная idchain (строковая)


Компонент "Ув1". Отладочное уведомление для вывода значения переменной idchain.

  • Отладочный режим - Да
  • Текст - переменная idchain
  • Ключ получателя - введите ваш внутренний номер


Перехват DTMF-021.png


Компонент "Не в коммутации?". Проверяет существование сессии (цепочки коммутаций) на линии. Если текущая цепочка коммутаций равна строке "00000000-0000-0000-0000-000000000000" заканчивает служебный сценарий.

  • Аргумент 1 - переменная idchain
  • Аргумент 2 - строка 00000000-0000-0000-0000-000000000000
  • Тип сравнения - "="
  • Переход, если правда - на компонент "Ув2".
  • Переход, если ложь - на компонент "получить DTMF"


Компонент "Ув2". Уведомляет администратора о завершении сценарии.

  • Текст - строка Сценарий получения DTMF завершен
  • Ключ получателя - введите ваш внутренний номер


Компонент "Получить DTMF". Выполняет SQL-запрос в таблицу [oktell]..[a_stat_dtmf] для получения последнего DTMF по текущей цепочки коммутаций на данной линии. Запрос построен таким образом, что последовательно считывает введенные символы, сохраняя каждый раз временную метку. Таким образом, вне зависимости от скорости ввода символов запрос гарантирует их последовательный перебор.

select top 1 @dt=dt, @symbol = symbol from a_stat_dtmf 
where idchain = @idchain
and dt > @dt
order by dt asc

где

  • @dt - переменная dt
  • @idchain - переменная idchain
  • @symbol - переменная symbol (строковая)


Перехват DTMF-022.png


Компонент "пусто". Проверяет был ли введен символ.

  • Аргумент 1 - переменная symbol
  • Аргумент 2 - пустая строка
  • Тип сравнения - "="
  • Переход, если правда - на компонент "1000ms".
  • Переход, если ложь - на компонент "Ув3"


Компонент "Ув3". Выводит на экран принятый DTMF-символ. После компонента вы можете реализовать функционал для внешних линий, аналогично вышеописанному сценарию перехвата символов.

  • Отладочный режим - Нет
  • Текст - выражение 'Линия '+[NumLine]+' набрала символ '+[symbol]
  • Ключ получателя - введите ваш внутренний номер.


Компонент "1000ms". Пауза перед следующей итерацией. Во избежание загрузки базы данных не рекомендуется ставить интервал менее 500 мс.

  • Время задержки, мс - 1000


Перехват DTMF-023.png


Компонент "->". Не имеет функционального предназначения, используется для связки компонентов.

  • Время задержки, мс - 0


Компонент "Обнуляем". Очищает переменную symbol перед новой итерацией.

  • переменной symbol присваивается пустая строка.


Перехват DTMF-024.png


Установка готовых сценариев в систему

  • Скачайте и импортируйте сценарии из архива: Перехват DTMF.zip (собраны на версии 2.12.0.150423)
  • Установите сценарий Перехват DTMF (Главный IVR сценарий) в качестве главного IVR сценария. Присвойте переменной phone - внутренний номер для переключения.
  • Установите Перехват DTMF (IVR сценарий исходящей маршрутизации) в качестве IVR сценария исходящей маршрутизации.
  • Реализуйте нужный функционал с помощью служебных сценариев и назначьте их в сценарии Перехват DTMF (IVR сценарий перехвата DTMF)