Переключение и переадресация звонков
Во время активного звонка может потребоваться передать звонок другому лицу, номеру или голосовой почте. Давайте узнаем, как.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
- Развернутый ресурс Служб коммуникации. Создайте ресурс Служб коммуникации.
- Маркер доступа пользователя для включения клиента для вызовов. Дополнительные сведения см. в статье о создании маркеров доступа и управлении ими.
- Необязательно. Выполните краткое руководство по добавлению голосовых вызовов в приложение
Установка пакета SDK
npm install
Используйте команду для установки пакета SDK Службы коммуникации Azure Common and Calling SDK для JavaScript:
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
Инициализация обязательных объектов
Экземпляр CallClient
требуется для большинства операций вызова. При создании нового CallClient
экземпляра его можно настроить с помощью пользовательских параметров, таких как Logger
экземпляр.
С помощью экземпляра CallClient
можно создать CallAgent
экземпляр, вызвав его createCallAgent
. Этот метод асинхронно возвращает объект экземпляра CallAgent
.
Метод createCallAgent
использует CommunicationTokenCredential
в качестве аргумента. Он принимает маркер доступа пользователя.
Можно применить метод getDeviceManager
для экземпляра CallClient
, чтобы получить доступ к deviceManager
.
const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");
// Set the logger's log level
setLogLevel('verbose');
// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
console.log(...args); // Redirect log output to console
};
const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()
Управление подключением пакета SDK к инфраструктуре Майкрософт
Экземпляр Call Agent
помогает управлять вызовами (для присоединения или запуска вызовов). Для работы пакета SDK для вызова необходимо подключиться к инфраструктуре Майкрософт для получения уведомлений о входящих звонках и координации других сведений о вызове. У вас Call Agent
есть два возможных состояния:
Подключено — Call Agent
значение Connected
connectionStatue означает, что клиентский пакет SDK подключен и способен получать уведомления из инфраструктуры Майкрософт.
Отключено — Call Agent
значение connectionStatue состояний Disconnected
возникает проблема, которая препятствует правильному подключению пакета SDK. Call Agent
необходимо повторно создать.
invalidToken
: если срок действия маркера истек или является недопустимымCall Agent
экземпляром, отключается с этой ошибкой.connectionIssue
: если возникла проблема с клиентом, подключающимся к инфраструктуре Майкрософт, после многих повторных попытокCall Agent
возникаетconnectionIssue
ошибка.
Вы можете проверить, подключен ли локальный сервер Call Agent
к инфраструктуре Майкрософт, проверив текущее значение connectionState
свойства. Во время активного вызова можно прослушивать connectionStateChanged
событие, чтобы определить, изменяются ли Call Agent
изменения из подключенного к отключенном состоянию.
const connectionState = callAgentInstance.connectionState;
console.log(connectionState); // it may return either of 'Connected' | 'Disconnected'
const connectionStateCallback = (args) => {
console.log(args); // it will return an object with oldState and newState, each of having a value of either of 'Connected' | 'Disconnected'
// it will also return reason, either of 'invalidToken' | 'connectionIssue'
}
callAgentInstance.on('connectionStateChanged', connectionStateCallback);
Перенаправление вызовов является расширенной функцией основного API Call
. Сначала необходимо импортировать функции вызова из пакета SDK для вызовов:
import { Features} from "@azure/communication-calling";
Затем можно получить объект API функций передачи из экземпляра вызова:
const callTransferApi = call.feature(Features.Transfer);
Перенаправление вызовов осуществляется при участии трех сторон.
- Передающая сторона — участник вызова, который инициирует запрос на передачу.
- Передаваемая сторона — участник вызова, который перенаправляется.
- Целевая сторона — участник, к которому выполняется перенаправление.
Передача участнику:
- существует уже установленный вызов между передающей стороной и передаваемой стороной; передающая сторона принимает решение о перенаправлении вызова от передаваемой стороны целевой стороне;
- передающая сторона вызывает API
transfer
; - целевая сторона получает входящий вызов, если передаваемая сторона подтверждает запрос на передачу.
Для передачи текущего вызова можно использовать API transfer
. transfer
принимает необязательный аргумент transferCallOptions
, который позволяет задать флаг disableForwardingAndUnanswered
:
disableForwardingAndUnanswered = false
— если целевая сторона не ответит на входящий вызов, осуществляемый при передаче, применяются параметры переадресации и отсутствия ответа, настроенные для целевой стороны;disableForwardingAndUnanswered = true
— если целевая сторона не ответит на входящий вызов, осуществляемый при передаче, попытка передачи вызова прерывается.
// transfer target can be an Azure Communication Services user
const id = { communicationUserId: <ACS_USER_ID> };
// call transfer API
const transfer = callTransferApi.transfer({targetParticipant: id});
Передача на звонок:
- существует уже установленный вызов между передающей стороной и передаваемой стороной;
- Существует уже подключенный вызов между переносчиком и целевым объектом передачи.
- Переадресатор решает передать звонок с получателем передачи вызову с целевым объектом передачи.
- передающая сторона вызывает API
transfer
; - целевая сторона получает входящий вызов, если передаваемая сторона подтверждает запрос на передачу.
Для передачи текущего вызова можно использовать API transfer
.
// transfer to the target call specifying the call id
const id = { targetCallId: <CALL_ID> };
// call transfer API
const transfer = callTransferApi.transfer({ targetCallId: <CALL_ID> });
transfer
API позволяет подписаться на stateChanged
. Он также поставляется с передачей state
и error
свойствами
// transfer state
const transferState = transfer.state; // None | Transferring | Transferred | Failed
// to check the transfer failure reason
const transferError = transfer.error; // transfer error code that describes the failure if a transfer request failed
Получатель может прослушивать transferAccepted
событие. Прослушиватель этого события содержит TransferEventArgs
объект вызова нового вызова между получателем передачи и целевым объектом передачи.
// Transferee can subscribe to the transferAccepted event
callTransferApi.on('transferAccepted', args => {
const newTransferCall = args.targetCall;
});
Средство передачи может подписаться на события для изменения состояния передачи. Если звонок к получателю передачи был успешно подключен к целевому объекту передачи, метод передачи может зависнуть от исходного вызова с получателем передачи.
transfer.on('stateChanged', () => {
if (transfer.state === 'Transferred') {
call.hangUp();
}
});
Передача в голосовую почту:
- Существует подключенный вызов между переносчиком и получателем передачи.
- Известны идентификатор пользователя Teams целевого участника голосовой почты .
- Средство передачи решает передать звонок с получателем передачи в голосовую почту целевого участника с помощью идентификатора пользователя Teams целевого участника.
- передающая сторона вызывает API
transfer
; - Получатель передачи получает запрос на передачу.
Для передачи текущего вызова можно использовать API transfer
.
// transfer to the target participant voicemail specified by their Teams User Identifier
const id: MicrosoftTeamsUserIdentifier = { microsoftTeamsUserId: userId}
// call transfer API
const transfer = callTransferApi.transfer({ targetParticipantVoicemail: id });
transfer
API позволяет подписаться на stateChanged
. Он также поставляется с передачей state
и error
свойствами
// transfer state
const transferState = transfer.state; // None | Transferring | Transferred | Failed
// to check the transfer failure reason
const transferError = transfer.error; // transfer error code that describes the failure if a transfer request failed
Получатель может прослушивать transferAccepted
событие. Прослушиватель этого события содержит TransferEventArgs
объект вызова нового вызова между получателем передачи и голосовой почтой целевого участника.
// Transferee can subscribe to the transferAccepted event
callTransferApi.on('transferAccepted', args => {
const newTransferCall = args.targetCall;
});
Средство передачи может подписаться на события для изменения состояния передачи. Если звонок к получателю передачи был успешно подключен с голосовой почтой целевого участника, передача может зависнуть от исходного звонка с получателем передачи.
transfer.on('stateChanged', () => {
if (transfer.state === 'Transferred') {
call.hangUp();
}
});