В паре сообщений о Voice-Conn мы рассмотрели его дизайн, особенности и реализацию. Этот пост предназначен только для того, чтобы дать вам представление о том, как реализовать различные элементы управления телефонными вызовами.
Обсуждаются следующие функции управления вызовом:
1. Ответ
2. Удержание
3. Снять с удержания
4. Прервать
5. Новый вызов
6. Консультация Вызов
7. Перевод вызова
8. Конференц-связь
Реализация функций управления вызовами разделена на 3 части -
1. ВВОД
2. ПРЕДВАРИТЕЛЬНОЕ
3. ВЫПОЛНЕНИЕ
Если необходимо, я собрал вместе несколько фрагментов кода.
Ответить на звонок:
Ввод: CallId вызова, на который нужно ответить.
Предварительное условие: одно из «TerminalConnection» должно находиться в состоянии ЗВОНОК.
Выполнение. Как только мы находим TerminalConnection, которое находится в состоянии RINGING, нам нужно вызвать метод answer () для объекта TerminalConnection.
Для начала я бы предоставил некоторый фрагмент кода, поскольку он не будет иметь большого значения, поскольку конструкции могут отличаться в зависимости от вашей реализации.
// Get the call Object , using p for provider Call call = p.getCall(callId); // Get the connections in the call Connection[] conns = call.getConnections(); for (Connection c: conns) { if (!c.getAddress().getName().equals(p.getAgentDeviceID())) continue; for (TerminalConnection tConn : c.getTerminalConnections()) { if (tConn.getTerminal().getName().equals(p.getAgentDeviceID())&& tConn.getState() == TerminalConnection.RINGING){ return tConn; // Return the Terminal Connection which is RINGING } } }
Отказаться от звонка:
Вход: CallId вызова, который необходимо сбросить.
Предварительное условие: Одно из «Соединений» должно находиться в одном из следующих состояний: ПОДКЛЮЧЕНО, ВХОДИТ, ПРЕДУПРЕЖДЕНИЕ, СБОЙ.
Выполнение: Как только мы обнаруживаем, что Соединение (из Вызова с использованием callId) находится в одном из этих состояний - СОЕДИНЕНО, ВХОДИТ, ПРЕДУПРЕЖДЕНИЕ, ОТКАЗАНО , нам нужно вызвать разъединение ( ) для объекта Соединение.
Удержание вызова:
Ввод: CallId вызова, который нужно удерживать.
Предварительное условие: одно из «TerminalConnection» должно находиться в состоянии РАЗГОВОР.
Выполнение. Как только мы находим TerminalConnection, которое находится в состоянии TALKING, нам нужно вызвать метод hold () для объекта CallControlTerminalConnection.
Возобновить звонок:
Ввод: CallId вызова, который необходимо возобновить.
Предварительное условие: одно из «TerminalConnection» имеет состояние HELD.
Выполнение. Как только мы обнаружим, что TerminalConnection находится в состоянии HELD, нам нужно вызвать метод unhold () для объекта CallControlTerminalConnection.
Варианты набора номера:
Новый вызов:
Ввод: номер для набора (0 будет префиксом в случае номера внешней сети / мобильного телефона).
Предварительное условие: достаточно каналов для нового звонка.
Выполнение:
- Используя провайдер JTAPI, получите адрес телефонии и объект терминала телефонии.
- Затем создайте объект телефонного вызова с помощью поставщика JTAPI.
- После этого вызовите метод connect () для объекта Call.
/** We need to get the appropriate objects associated with the originating terminal of the telephone call. We arbitrarily choose one of the Terminal from the Address.**/ // p is used to denote provider try { // Step - 1 A Address origaddr = p.getJtapiInstance().getAddress(p.getAgent().getTerminalAddress()); // Step - 1 B Terminal origterm = origaddr.getTerminals()[0]; // Step - 2 Call mycall = provider.getJtapiInstance().createCall(); // Step - 3 mycall.connect(origterm, origaddr, number); } catch (Exception e) {
Консультации по телефону:
Это особые типы телефонных вызовов, которые часто создаются для конференц-связи или передачи с помощью Call. Таким образом, консультационные вызовы всегда связаны с другим существующим вызовом.
Ввод: номер для набора и callId существующего вызова, который находится в состоянии РАЗГОВОР.
Предварительное условие: один существующий вызов в состоянии РАЗГОВОР и достаточно каналов свободны для набора нового вызова.
Выполнение: найдите существующий объект Call, который находится в состоянии TALKING. Затем создайте объект Call телефонии с помощью поставщика JTAPI. После создания вызовите метод consult () на CallControlCall объект.
Если консультационный вызов успешен, существующий вызов переводится в режим УДЕРЖАНИЯ, а новый вызов становится АКТИВНЫМ. Мы используем его в качестве первого шага любого ТРАНСФЕРА или КОНФЕРЕНЦИИ.
try { // P for provider long tCallId = // TALKING CallId; Call tCall = p.getCall(tCallId); Call myCall = p.getJtapiInstance().createCall(); ((CallControlCall) myCall).consult(getController(p, tCall), number); } catch (Exception e) { } /** How to get the Controller **/ public TerminalConnection getTransferController(Provider p, Call tCall) { for (Connection c: tCall.getConnections()) { if (c.getTerminalConnections() == null) { continue; } for (TerminalConnection t : c.getTerminalConnections()) { if (t instanceof CallControlTerminalConnection && t.getTerminal().getName().equals(p.getAgent().getTerminalAddress()) ) { return t; } } } return null; }
Перевод вызова:
Это способ, с помощью которого мы можем переместить один вызов в другой.
Ввод: CallId вызовов, участвующих в переводе. Хотя вам не нужно предоставлять их, ваша инфра-система поддерживает только два канала или ровно два АКТИВНЫХ вызова.
Предварительное условие: два активных вызова: один с состоянием TerminalConnection как HELD, а другой с состоянием TerminalConnection как RINGING / TALKING.
Оформление перевода:
- Для выполнения передачи должен быть участник / терминал, который действует как контроллер передачи.
Контроллер передачи - это соединение с терминалом, вокруг которого выполняется передача. - Нам нужно найти объект Call, у которого TerminalConnection находится в состоянии HELD. Это представляет собой вызов, который будет переведен.
- Найдите объект вызова, который имеет состояние TerminalConnection как RINGING / TALKING.
- Как только мы найдем оба объекта вызова, нам нужно вызвать метод transfer () класса CallControlCall.
- После завершения передачи контроллер передачи больше не связан ни с одним из вызовов.
((CallControlCall) talkingCall).transfer(heldCall);
Конференция:
Это способ «слияния» двух телефонных звонков. То есть два Вызова объединяются в один Вызов с объединением всех участников двух Вызовов.
Вход: CallId вызовов, участвующих в конференции. Хотя вам не нужно предоставлять их, ваша инфра-система поддерживает только два канала или ровно два АКТИВНЫХ вызова.
Предварительное условие: два активных вызова: один с состоянием TerminalConnection как HELD, а другой с состоянием TerminalConnection как TALKING.
Проведение конференции:
- Для выполнения передачи должен быть участник / терминал, который действует как контроллер конференции.
Контроллер конференции - это соединение с терминалом, вокруг которого выполняется передача. - Нам нужно найти объект Call, у которого TerminalConnection находится в состоянии HELD. Это представляет собой вызов, который будет переведен.
- Найдите объект вызова, у которого есть TerminalConnection в стате TALKING.
- Как только мы найдем оба объекта вызова, нам нужно вызвать метод конференции () класса CallControlCall.
- После завершения конференции оба вызова объединяются в один вызов.
((CallControlCall) talkingCall).conference(heldCall);
Все необходимые функции можно найти в банке телефонии и в пакете поставщика. Для нас было кошмаром просматривать документацию в поисках подробностей о различных функциях и пакетах. Поэтому я полагал, что это краткое изложение сэкономит время и даст вам фору, когда вы погрузитесь в неизведанное.