В паре сообщений о 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 будет префиксом в случае номера внешней сети / мобильного телефона).

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

Выполнение:

  1. Используя провайдер JTAPI, получите адрес телефонии и объект терминала телефонии.
  2. Затем создайте объект телефонного вызова с помощью поставщика JTAPI.
  3. После этого вызовите метод 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.

Оформление перевода:

  1. Для выполнения передачи должен быть участник / терминал, который действует как контроллер передачи.
    Контроллер передачи - это соединение с терминалом, вокруг которого выполняется передача.
  2. Нам нужно найти объект Call, у которого TerminalConnection находится в состоянии HELD. Это представляет собой вызов, который будет переведен.
  3. Найдите объект вызова, который имеет состояние TerminalConnection как RINGING / TALKING.
  4. Как только мы найдем оба объекта вызова, нам нужно вызвать метод transfer () класса CallControlCall.
  5. После завершения передачи контроллер передачи больше не связан ни с одним из вызовов.
((CallControlCall) talkingCall).transfer(heldCall);

Конференция:

Это способ «слияния» двух телефонных звонков. То есть два Вызова объединяются в один Вызов с объединением всех участников двух Вызовов.

Вход: CallId вызовов, участвующих в конференции. Хотя вам не нужно предоставлять их, ваша инфра-система поддерживает только два канала или ровно два АКТИВНЫХ вызова.

Предварительное условие: два активных вызова: один с состоянием TerminalConnection как HELD, а другой с состоянием TerminalConnection как TALKING.

Проведение конференции:

  1. Для выполнения передачи должен быть участник / терминал, который действует как контроллер конференции.
    Контроллер конференции - это соединение с терминалом, вокруг которого выполняется передача.
  2. Нам нужно найти объект Call, у которого TerminalConnection находится в состоянии HELD. Это представляет собой вызов, который будет переведен.
  3. Найдите объект вызова, у которого есть TerminalConnection в стате TALKING.
  4. Как только мы найдем оба объекта вызова, нам нужно вызвать метод конференции () класса CallControlCall.
  5. После завершения конференции оба вызова объединяются в один вызов.
((CallControlCall) talkingCall).conference(heldCall);

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