Комнаты для разбиения
В этой статье описывается, как реализовать комнаты прорыва Microsoft Teams с Службы коммуникации Azure. Эта возможность позволяет Службы коммуникации Azure пользователям в собраниях Teams участвовать в комнатах разбиения. Администраторы Teams управляют доступностью комнат разбиения в собраниях Teams с политикой собраний Teams. Дополнительные сведения о комнатах для разбиения можно найти в документации Teams.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Дополнительные сведения см. в статье "Создание учетной записи".
- Развернутый ресурс Служб коммуникации. См. статью "Создание ресурса служб коммуникации".
- Маркер доступа пользователя для включения клиента для вызовов. Дополнительные сведения см. в статье о создании маркеров доступа и управлении ими.
- Организатор собраний Teams должен назначить политику собраний Teams, которая включает комнаты для разбиения. См . политику собраний Teams.
- (Необязательно.) Выполните инструкции из краткого руководства Добавление функции голосового вызова в приложение.
Только пользователи Microsoft 365 с ролями организатора, соорганизатора или диспетчера комнат останова могут управлять комнатами прорыва.
Поддержка
В следующих таблицах определяется поддержка комнат разбиения в Службы коммуникации Azure.
Удостоверения и типы вызовов
В следующей таблице показана поддержка в комнатах останова для конкретного типа вызова и удостоверения.
Удостоверения | Собрание Teams | Комната | Вызов 1:1 | Групповой вызов | Вызов взаимодействия Teams 1:1 | Вызов взаимодействия с Группами Teams |
---|---|---|---|---|---|---|
Пользователь служб коммуникации | ✔️ | |||||
Пользователь Microsoft 365 | ✔️ |
Операции
В следующей таблице показана поддержка отдельных API в вызывающем пакете SDK, связанном с отдельными типами удостоверений.
Операции | Пользователь служб коммуникации | Пользователь Microsoft 365 |
---|---|---|
Получение назначенной комнаты останова | ✔️ | ✔️ |
Получение всех помещений для разбиения | ✔️ [1] | |
Присоединение к помещению для выхода | ✔️ | ✔️ |
Управление комнатами разбиения | ||
Участие в чате комнаты для разбиения | ✔️ [2] | |
Получение параметров комнаты для останова | ✔️ | ✔️ |
[1] Только пользователь Microsoft 365 с организатором ролей, соорганизатором или диспетчером помещений для разбиения.
[2] Пользователи Microsoft 365 могут использовать API Graph для участия в чате в комнате останова. Идентификатор потока чата предоставляется в назначенном объекте комнаты разбиения.
Пакеты SDK
В следующих таблицах показана поддержка возможностей комнат разбиения в отдельных пакетах SDK Службы коммуникации Azure.
Состояние поддержки | Интернет | Веб-интерфейс | iOS | Пользовательский интерфейс iOS | Android | Пользовательский интерфейс Android | Windows |
---|---|---|---|---|---|---|---|
Поддерживается | ✔️ |
Установка пакета 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);
Реализация помещений для разбиения
BreakoutRooms
feature
— это классCall
. Сначала необходимо импортировать пакет Features
из пакета SDK для вызовов:
import { Features} from "@azure/communication-calling";
Создание компонента breakoutRoom
Затем получите объект API признаков из экземпляра вызова:
const breakoutRoomsFeature = mainMeetingCall.feature(Features.BreakoutRooms);
Подписка на события breakoutRoom
BreakoutRooms
API позволяет подписаться на BreakoutRooms
события. breakoutRoomsUpdated
Событие происходит из экземпляра BreakoutRoomsCallFeature
и содержит сведения о созданных, обновленных и назначенных комнатах останова.
Чтобы получить сведения о помещении для разбиения, подпишитесь на breakoutRoomsUpdated
событие.
breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Обработка событий разрывов
Событие breakoutRoomsUpdated
предоставляет экземпляр одного из следующих классов в качестве входного параметра. Свойство можно использовать type
для различения отдельных типов событий.
Класс
BreakoutRoomsEvent
: это событие активируется, когда пользователь с организатором ролей, соорганизатором или диспетчером комнат для разбиения создает или обновляет комнаты выхода. Пользователи Microsoft 365 с организатором ролей, соорганизатором или диспетчером комнат для разбиения могут получать это событие. Разработчики могут использовать комнаты разбиения в собственностиdata
для просмотра сведений обо всех комнатах разбиения. Этот класс имеет свойствоtype
равно"breakoutRooms"
.export interface BreakoutRoomsEvent { /** * Breakout room event type */ type: "breakoutRooms", /** * list of Breakout rooms */ data: BreakoutRoom[] | undefined; }
Класс
BreakoutRoomsSettingsEvent
: когда пользователь с организатором ролей, соорганизатором или диспетчером комнат разбиения обновляет параметры комнаты прорыва, он активирует это событие. Разработчики могут использовать эти сведения для отрисовки времени окончания комнаты прорыва или принятия решения о том, следует ли отображать кнопку для присоединения к главной комнате. Этот класс имеет свойствоtype
равно"breakoutRoomSettings"
.export interface BreakoutRoomSettingsEvent { /** * Breakout room event type */ type: "breakoutRoomSettings", /** * Breakout Room setting details */ data: BreakoutRoomSettings | undefined; }
Класс
AssignedBreakoutRoomsEvent
: это событие активируется при назначении пользователем комнаты прорыва или обновлении назначенной комнаты останова. Пользователи могут присоединиться к номеру останова, если для свойстваstate
заданоopen
значение, оставить комнату прорыва, если для свойстваstate
заданоclosed
значение , или отобразить сведения о помещении прорыва. Этот класс имеет свойствоtype
равно"assignedBreakoutRoom"
.export interface AssignedBreakoutRoomEvent { /** * Breakout room event type */ type: "assignedBreakoutRoom"; /** * Assigned breakout room details */ data: BreakoutRoom | undefined; }
Класс
JoinBreakoutRoomsEvent
: это событие активируется при присоединении участника к вызову комнаты прорыва. Это событие может произойти при автоматическом перемещении пользователя в комнату разбиения (тassignedBreakoutRoom
. е. если заданоstate
open
свойство иtrue
autoMoveParticipantToBreakoutRoom
имеет значение ) или когда пользователь явно присоединяется к комнате разбиения (то есть вызывает методjoin
в экземпляреassignedBreakoutRoom
, еслиautoMoveParticipantToBreakoutRoom
заданоfalse
значение ). Свойствоdata
содержит экземпляр комнатыcall
разбиения, который разработчики могут использовать для управления вызовом комнаты разбиения. Этот класс имеет свойствоtype
равно"join"
.export interface JoinBreakoutRoomEvent { /** * Breakout room event type */ type: "join"; /** * Breakoutroom call object */ data: Call | TeamsCall; }
В следующем коде показаны ценные сведения, полученные в событиях комнаты останова:
const breakoutRoomsUpdatedListener = (event) => {
switch(event.type) {
case "breakoutRooms":
const breakoutRooms = event.data;
console.log(`Breakout rooms are created or updated. There are ${breakoutRooms.length} breakout rooms in total.`);
breakoutRooms.forEach((room)=>{
console.log(`- ${room.displayName}`);
});
break;
case "assignedBreakoutRooms":
const assignedRoom = event.data;
console.log(`You are assigned to breakout room named: ${assignedRoom.displayName}`);
console.log(`Assigned breakout room thread Id: ${assignedRoom.threadId}`);
console.log(`Automatically move participants to breakout room: ${assignedRoom.autoMoveParticipantToBreakoutRoom}`);
console.log(`Assigned breakout room state : ${assignedRoom.state }`);
break;
case "breakoutRoomsSettings":
const breakoutRoomSettings = event.data;
console.log(`Breakout room ends at: ${breakoutRoomSettings.roomEndTime}`);
console.log(`Disable the user to return to main meeting from breakout room call : ${breakoutRoomSettings.disableReturnToMainMeeting}`);
break;
case "join":
const breakoutRoomCall = event.data;
console.log(`You have joined breakout room with call ID: ${breakoutRoomCall.id}`);
break;
}
}
breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Вывод списка доступных комнат для разбиения
Пользователи Microsoft 365 с организатором ролей, соорганизатором или диспетчером комнат для разбиения могут получить доступ ко всем комнатам выхода.
const breakoutRooms = breakoutRoomsFeature.breakoutRooms;
breakoutRooms.forEach((room)=>{
console.log(`- ${room.displayName}`);
});
Перечисление приглашений
Пользователь Microsoft 365 с организатором ролей, соорганизатором или диспетчером комнат для останова может получить доступ к участникам, назначенным отдельным комнатам для разбиения.
breakoutRooms.forEach((room)=>{
console.log(`${room.displayName}`);
room.invitees.forEach((invitee) => {
console.log(`- ${invitee.id}`);
})
})
Присоединение к помещению для выхода
assignedBreakoutRoom
Если для свойства autoMoveParticipantToBreakoutRoom
задано true
значение , пользователь автоматически перемещается в комнату останова при установке open
свойстваstate
. Если autoMoveParticipantToBreakoutRoom
задано значение false
, используйте следующий код для присоединения к помещению разбиения.
Это активирует событие с классом breakoutRoomsUpdated
JoinBreakoutRoomsEvent
, который имеет свойство type
, заданное как join
. Экземпляр класса call
в свойстве data
можно использовать для управления вызовом комнаты разбиения.
const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await breakoutRoom.join();
}
Когда пользователь находится в помещении для разбиения, организатор назначает пользователю новую комнату разбиения, пользователь получает breakoutRoomsUpdated
событие с типом assignedBreakoutRooms
. Это событие содержит последние сведения о помещении для прорыва. Пользователь должен выполнить hangUp()
предыдущий вызов комнаты для разбиения. Если autoMoveParticipantToBreakoutRoom
задано значение true
, пользователь автоматически перемещается, в противном случае пользователю необходимо явно вызвать join
метод в новой комнате разбиения.
//Breakout room which is assigned initially.
const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await breakoutRoom.join();
}
// `breakoutRoomsUpdated` event which contains the details of the new breakout room
let assignedRoom = undefined;
const breakoutRoomsUpdatedListener = (event) => {
switch(event.type) {
case "assignedBreakoutRooms":
const assignedRoom = event.data;
break;
}
}
if(assignedRoom.threadId != breakoutRoom.threadId && breakoutRooms != null)
{
await breakoutRoom.hangUp();
}
if(assignedRoom.state == 'open' && !assignedRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await assignedRoom.join();
}
Пользователь Microsoft 365 с организатором ролей, соорганизатором или диспетчером комнат для разбиения можно получить список комнат для разбиения, созданных менеджером комнат для разбиения или организатором основного собрания. В этом случае поведение немного отличается. Этот пользователь должен явно вызвать join()
метод для присоединения к комнате разрыва. Пользователь хранится на удержании основного собрания первоначально и в конечном итоге удален из основного собрания. Пользователь должен инициализировать компонент breakoutRooms для breakoutRoomCall
получения обновлений в комнате останова.
Если пользователь хочет присоединиться к любому из комнат разбиения, пользователь явно вызывает join
метод.
const breakoutRoom = breakoutRoomsFeature.breakoutRooms[0];
if(breakoutRoom.state == 'open') {
const breakoutRoomCall = await breakoutRoom.join();
}
Чтобы выйти из комнаты разбиения, пользователи должны выполнить hangUp()
функцию в вызове комнаты разбиения. Пользователь будет вызывать ReturnToMainMeeting
возобновление основного звонка на собрание.
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
Оставьте комнату для разбиения
Если состояние closed
комнаты прорыва равно, пользователь получает событие breakoutRoomsUpdated
с классом AssignedBreakoutRoomsEvent
и свойствомtype
, равным assignedBreakoutRooms
ейclosed
, что указывает, assignedBreakoutRoom
что имеет значение свойстваstate
. Пользователь покидает комнату останова автоматически и может вернуться к главному собранию, вызвав returnToMainMeeting()
, как показано выше.
Если пользователь хочет оставить комнату разбиения даже до закрытия комнаты, а параметры breakoutRoomsFeature.breakoutRoomsSettings
комнаты выхода имеют свойство disableReturnToMainMeeting
, заданное для того, чтобы false
пользователь смог вернуться к основному вызову собрания со следующим кодом:
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
Получение участников комнаты прорыва
При присоединении к комнате вы можете использовать следующий код, чтобы получить список удаленных участников комнаты прорыва:
const breakoutRoomParticipants = [breakoutRoomCall.remoteParticipants.values()].map((p: SDK.RemoteParticipant) => { p.displayName || p.identifier });
console.log(`Participants of the breakoutRoom : <br/>" + breakoutRoomParticipants.join("<br/>")`);
Остановка приема событий комнат разбиения
Используйте следующий код, чтобы остановить получение событий разбиения.
breakoutRoomsFeature.off('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Свойства комнаты останова
Комнаты для разбиения имеют следующие свойства:
Примечание.
В следующем примере кода эффективно отображаются все свойства комнаты разбиения. Он не предназначен для повторного использования, как показано ниже. На практике вы используете только свойства, необходимые для сценария помещения для разбиения.
const displayName : string = breakoutRoom.displayName;
const threadId : string = breakoutRoom.threadId;
const state : BreakoutRoomState = breakoutRoom.state;
const autoMoveParticipantToBreakoutRoom : boolean = breakoutRoom.autoMoveParticipantToBreakoutRoom;
const call : Call | TeamsCall = breakoutRoom.call;
const invitees : Invitee[] = breakoutRoom.invitees;
Свойства комнаты останова | Description |
---|---|
displayName |
Имя комнаты прорыва. Это свойство доступно только для чтения. |
threadId |
Используйте идентификатор потока чата для присоединения чата к комнате останова. Это свойство доступно только для чтения. |
state |
Состояние комнаты прорыва. Это может быть либо open либо closed . Пользователи смогут присоединиться к комнате прорыва только в том случае, если состояние равно open . Это свойство доступно только для чтения. |
autoMoveParticipantToBreakoutRoom |
Логическое значение, указывающее, перемещаются ли пользователи в комнаты разбиения автоматически, когда state assignedBreakoutRoom задано значение open . Это свойство доступно только для чтения. В параметрах пользовательского интерфейса Teams для комнат разбиения организатор, соорганизатор или диспетчер помещений для разбиения можно настроить этот конкретный параметр. Задав этот параметр, true участники автоматически передаются в назначенное место для разбиения. И наоборот, если для этого свойства false задано значение, необходимо вручную вызвать join метод для перемещения участников в комнату прорыва. |
call |
Объект вызова комнаты прорыва. Этот объект возвращается, когда пользователь присоединяется к вызову join комнаты разбиения автоматически или путем вызова метода в assignedBreakoutRoom объекте. Это свойство доступно только для чтения. |
invitees |
Список приглашений, назначенных комнате прорыва. Это свойство доступно только для чтения. |
Параметры комнаты для останова
Параметр общего доступа к комнатам для разбиения с следующими свойствами:
const disableReturnToMainMeeting : boolean = breakoutRoomsSettings.disableReturnToMainMeeting;
const roomEndTime : TimestampInfo = breakoutRoomsSettings.roomEndTime;
Свойства комнаты останова | Description |
---|---|
disableReturnToMainMeeting |
Отключите участников, чтобы вернуться к главному собранию из вызова комнаты останова. Это свойство доступно только для чтения. В параметрах пользовательского интерфейса Teams для комнат разбиения организатор, соорганизатор или диспетчер комнат для разбиения можно настроить этот конкретный параметр, чтобы управлять тем, когда участник номеров прорыва может вернуться к главному собранию. |
roomEndTime |
Время окончания комнаты для перерыва, заданное пользователем Microsoft 365 с организатором ролей, соорганизатором или диспетчером помещений для разбиения основного собрания. Это свойство доступно только для чтения. |
Устранение неполадок
Код ошибки | Дополнительный код | Категория результатов | Причина | Разрешение |
---|---|---|---|---|
400 | 46250 | ExpectedError | Функция комнат останова доступна только в собраниях Teams. | Реализуйте собственный механизм разбиения или используйте собрания Teams. |
405 | 46251 | ExpectedError | Службы коммуникации Azure в настоящее время отключена эта функция. | Попробуйте api в течение нескольких дней. |
500 | 46254 | UnexpectedServerError | Не удается присоединиться к помещению для разбиения из-за непредвиденной ошибки. | Убедитесь, что state assignedBreakoutRoom метод is open и вызывается breakoutRoomsFeature.assignedBreakoutRoom.join() явным образом. Если проблема сохранится, соберите журналы консоли браузера и обратитесь в службу поддержки Службы коммуникации Azure. |
500 | 46255 | UnexpectedServerError | Не удается провести главное собрание. | Убедитесь, что state assignedBreakoutRoom метод is open и вызывается breakoutRoomsFeature.assignedBreakoutRoom.join() явным образом. Если проблема сохранится, соберите журналы консоли браузера и обратитесь в службу поддержки Службы коммуникации Azure. |
412 | 46256 | ExpectedError | Не удается присоединиться к комнате прорыва, так как комната закрыта. | Убедитесь, что state assignedBreakoutRoom метод is open и вызывается breakoutRoomsFeature.assignedBreakoutRoom.join() явным образом. |
412 | 46257 | UnexpectedServerError | Не удалось возобновить основное собрание. | Следуйте инструкциям, определенным в разделе Leave breakout room , чтобы вручную выйти из помещения для разбиения. Если проблема сохранится, соберите журналы консоли браузера и обратитесь в службу поддержки Службы коммуникации Azure. |
412 | 46258 | UnexpectedClientError | Не удается прочитать сведения о помещении для разбиения. | Соберите журналы консоли браузера и обратитесь в службу поддержки Службы коммуникации Azure. |
500 | 46259 | UnexpectedServerError | Не удалось повесить звонок в комнате прорыва. | Следуйте инструкциям, определенным в разделе Leave breakout room , чтобы вручную выйти из помещения для разбиения. |
412 | 46260 | UnexpectedClientError | Не удается присоединиться к комнате останова, так как она еще не назначена. | Убедитесь, что breakoutRoomsFeature.assignedBreakoutRoom у вас есть сведения о назначенной комнате разбиения. Убедитесь, что state assignedBreakoutRoom метод is open и вызывается breakoutRoomsFeature.assignedBreakoutRoom.join() явным образом. |
412 | 46261 | UnexpectedClientError | Не удается присоединиться к главному собранию. | Повторите попытку breakoutRoomsFeature.assignedBreakoutRoom.returnToMainMeeting() , вызвав метод. Если проблема сохранится, соберите журналы консоли браузера и обратитесь в службу поддержки Службы коммуникации Azure. |
412 | 46262 | ExpectedError | Уже в главном собрании. | Вызовите этот метод только в том случае, если участник находится в комнате останова и удален из основного собрания. |
412 | 46263 | UnexpectedClientError | Сбой существующего вызова комнаты для разбиения. | Повторите попытку вызова метода hangup(), чтобы зависнуть вызов. Вызов метода join() для повторного присоединения к комнате останова. |