Salas para sessão de grupo
Este artigo descreve como implementar salas para sessão de grupo do Microsoft Teams com os Serviços de Comunicação do Azure. Esta capacidade habilita que os usuários dos Serviços de Comunicação do Azure em reuniões do Teams participem de salas para sessão de grupo. Os administradores do Teams controlam a disponibilidade das salas para sessão de grupo na reunião do Teams com a política de reunião do Teams. Você pode encontrar mais informações sobre as salas para sessão de grupo na Documentação do Teams.
Pré-requisitos
- Uma conta do Azure com uma assinatura ativa. Consulte Criar uma conta gratuitamente.
- Um recurso dos Serviços de Comunicação implantado. Veja Criar um recurso de Serviços de Comunicação.
- Um token de acesso de usuário para habilitar o cliente de chamada. Para saber mais, confira Criar e gerenciar token de acesso.
- O organizador da reunião do Teams precisa atribuir a política de reunião do Teams que permite salas para sessão de grupo. Veja Política de reunião do Teams.
- Opcional: conclua o guia de início rápido para Adicionar chamada de voz ao seu aplicativo.
Somente usuários do Microsoft 365 com funções de organizador, co-organizador ou gerente de sala podem gerenciar as salas para sessão de grupo.
Suporte
As tabelas a seguir definem o suporte às salas para reunião de grupo nos Serviços de Comunicação do Azure.
Identidades e tipos de chamadas
A tabela a seguir mostra o suporte em salas para sessão de grupo para tipo de chamada e identidade específicos.
Identidades | Reunião do Teams | Sala | Chamada 1:1 | Chamada em grupo | Chamada de interoperabilidade do Teams 1:1 | Chamada de interoperabilidade de Grupo do Teams |
---|---|---|---|---|---|---|
Usuário dos Serviços de Comunicação | ✔️ | |||||
Usuário do Microsoft 365 | ✔️ |
Operações
A tabela a seguir mostra o suporte para APIs individuais no SDK de chamadas relacionadas a tipos de identidade individuais.
Operações | Usuário dos Serviços de Comunicação | Usuário do Microsoft 365 |
---|---|---|
Obter sala para sessão de grupo atribuída | ✔️ | ✔️ |
Obter todas as salas para sessão de grupo | ✔️[1] | |
Ingressar na sala para sessão de grupo | ✔️ | ✔️ |
Gerenciar salas para sessão de grupo | ||
Participar do chat da sala para sessão de grupo | ✔️[2] | |
Obter configurações da sala para sessão de grupo | ✔️ | ✔️ |
[1] Apenas os usuários do Microsoft 365 com função de organizador, co-organizador ou gerente de sala.
[2] Os usuários do Microsoft 365 podem usar a API do Graph para participar do chat da sala para sessão de grupo. A ID da conversa de chat é fornecida no objeto da sala para sessão de grupo atribuída.
SDKs
As tabelas a seguir mostram o suporte para o recurso de salas para sessão de grupo nos SDKs individuais dos Serviços de Comunicação do Azure.
Status de suporte | Web | Interface do usuário da Web | iOS | Interface do usuário do iOS | Android | Interface do usuário do Android | Windows |
---|---|---|---|---|---|---|---|
Tem suporte | ✔️ |
Instalar o SDK
Use o comando npm install
para instalar o SDK Comum e de Chamada dos Serviços de Comunicação do Azure para JavaScript:
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
Inicializar objetos necessários
Uma instância CallClient
é necessária para a maioria das operações de chamada. Ao criar uma instância de CallClient
, você pode configurá-la com opções personalizadas, como uma instância de Logger
.
Com a instância de CallClient
, você pode criar uma instância de CallAgent
chamando o createCallAgent
. Esse método retorna de modo assíncrono um objeto de instância CallAgent
.
O método createCallAgent
usa CommunicationTokenCredential
como um argumento. Ele aceita um token de acesso do usuário.
Você pode usar o método getDeviceManager
na instância CallClient
para acessar o 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()
Como gerenciar melhor a conectividade do SDK com a infraestrutura da Microsoft
A instância Call Agent
ajuda você a gerenciar chamadas (para ingressar ou iniciar chamadas). Para trabalhar, o SDK de chamada precisa se conectar à infraestrutura da Microsoft para receber notificações de chamadas de entrada e coordenar outros detalhes da chamada. O seu Call Agent
tem dois estados possíveis:
Conectado: um valor connectionStatue Call Agent
de Connected
significa que o SDK do cliente está conectado e capaz de receber notificações da infraestrutura da Microsoft.
Desconectado: um valor connectionStatue Call Agent
de Disconnected
declara que há um problema que está impedindo o SDK de se conectar corretamente. Call Agent
deve ser recriado.
invalidToken
: se um token tiver expirado ou for inválido, a instânciaCall Agent
se desconecta com este erro.connectionIssue
: se houver um problema com o cliente se conectando à infraestrutura da Microsoft, depois de muitas tentativasCall Agent
expõe o erroconnectionIssue
.
Você pode verificar se o local Call Agent
está conectado à infraestrutura da Microsoft inspecionando o valor atual da propriedade connectionState
. Durante uma chamada ativa, você pode ouvir o evento connectionStateChanged
para determinar se Call Agent
muda do estado Conectado para Desconectado.
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);
Implementar salas para sessão de grupo
BreakoutRooms
é um feature
da classe Call
. Primeiro, você precisa importar o pacote Features
do SDK de Chamadas:
import { Features} from "@azure/communication-calling";
Criar o recurso breakoutRoom
Em seguida, obtenha o objeto da API de recurso da instância de chamada:
const breakoutRoomsFeature = mainMeetingCall.feature(Features.BreakoutRooms);
Assinar aos eventos breakoutRoom
A API BreakoutRooms
permite que você assine os eventos BreakoutRooms
. Um evento breakoutRoomsUpdated
vem de uma instância BreakoutRoomsCallFeature
e contém informações sobre as salas para sessão de grupo criadas, atualizadas e atribuídas.
Para receber informações sobre a sala para sessão de grupo, inscreva-se no evento breakoutRoomsUpdated
.
breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Manipular eventos breakoutRoom
O evento breakoutRoomsUpdated
fornece uma instância de uma das seguintes classes como um parâmetro de entrada. Você pode usar a propriedade type
para distinguir entre os diferentes tipos de eventos.
Classe
BreakoutRoomsEvent
: Este evento é acionado quando um usuário com a função de organizador, co-organizador ou gerente de sala para sessão de grupo cria ou atualiza as salas para sessão de grupo. Usuários do Microsoft 365 com a função de organizador, co-organizador ou gerente de sala para sessão de grupo podem receber este tipo de evento. Os desenvolvedores podem usar essas salas para sessão de grupo na propriedadedata
para renderizar detalhes sobre todas elas. Essa classe tem uma propriedadetype
igual a"breakoutRooms"
.export interface BreakoutRoomsEvent { /** * Breakout room event type */ type: "breakoutRooms", /** * list of Breakout rooms */ data: BreakoutRoom[] | undefined; }
Classe
BreakoutRoomsSettingsEvent
: Quando um usuário com a função de organizador, co-organizador ou gerente de sala para sessão de grupo atualiza as configurações da sala para sessão de grupo, isso aciona este evento. Os desenvolvedores podem usar estas informações para renderizar o tempo quando a sala para sessão de grupo termina ou decidir se devem renderizar um botão para ingressar na sala principal. Essa classe tem uma propriedadetype
igual a"breakoutRoomSettings"
.export interface BreakoutRoomSettingsEvent { /** * Breakout room event type */ type: "breakoutRoomSettings", /** * Breakout Room setting details */ data: BreakoutRoomSettings | undefined; }
Classe
AssignedBreakoutRoomsEvent
: esse evento é disparado quando os usuários são atribuídos a uma sala para sessão de grupo ou quando a sala para sessão de grupo atribuída é atualizada. Os usuários podem ingressar na sala para sessão de grupo quando a propriedadestate
estiver definida comoopen
, sair da sala para sessão de grupo quando a propriedadestate
estiver definida comoclosed
ou renderizar os detalhes da sala para sessão de grupo. Essa classe tem uma propriedadetype
igual a"assignedBreakoutRoom"
.export interface AssignedBreakoutRoomEvent { /** * Breakout room event type */ type: "assignedBreakoutRoom"; /** * Assigned breakout room details */ data: BreakoutRoom | undefined; }
Classe
JoinBreakoutRoomsEvent
: Este evento é acionado quando o participante está ingressando em uma chamada de sala para sessão de grupo. Este evento pode ocorrer quando um usuário é movido automaticamente para a sala para sessão de grupo (ou seja, seassignedBreakoutRoom
tiver a propriedadestate
definida comoopen
eautoMoveParticipantToBreakoutRoom
estiver definida comotrue
) ou quando um usuário ingressa explicitamente em uma sala para sessão de grupo (ou seja, chama o métodojoin
na instânciaassignedBreakoutRoom
quandoautoMoveParticipantToBreakoutRoom
estiver definida comofalse
). A propriedadedata
contém a instânciacall
da sala para sessão de grupo, que os desenvolvedores podem usar para controlar a chamada da sala. Essa classe tem uma propriedadetype
igual a"join"
.export interface JoinBreakoutRoomEvent { /** * Breakout room event type */ type: "join"; /** * Breakoutroom call object */ data: Call | TeamsCall; }
O código a seguir mostra informações valiosas recebidas nos eventos da sala para sessão de grupo:
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);
Listar salas para sessão de grupo disponíveis
Usuários do Microsoft 365 com função organizador, co-organizador ou gerente da sala para sessão de grupo podem acessar todas as salas para sessão de grupo.
const breakoutRooms = breakoutRoomsFeature.breakoutRooms;
breakoutRooms.forEach((room)=>{
console.log(`- ${room.displayName}`);
});
Listar convites
Usuários do Microsoft 365 com as funções de organizador, co-organizador ou gerente de sala podem acessar os participantes atribuídos a salas de reunião individuais.
breakoutRooms.forEach((room)=>{
console.log(`${room.displayName}`);
room.invitees.forEach((invitee) => {
console.log(`- ${invitee.id}`);
})
})
Ingressar na sala para sessão de grupo
Se assignedBreakoutRoom
tiver a propriedade autoMoveParticipantToBreakoutRoom
definida como true
, os usuários são movido automaticamente para a sala quando a propriedade state
estiver definida como open
. Se autoMoveParticipantToBreakoutRoom
estiver definida como false
, use o seguinte código para ingressar na sala para sessão de grupo.
Isso dispara o evento breakoutRoomsUpdated
com a classe JoinBreakoutRoomsEvent
, que tem a propriedade type
definida como join
. Você pode usar a instância de uma classe call
na propriedade data
para gerenciar a chamada da sala para sessão de grupo.
const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await breakoutRoom.join();
}
Quando o usuário estiver em uma sala para sessão de grupo e o organizador atribuir uma nova sala para sessão de grupo ao usuário, ele receberá o evento breakoutRoomsUpdated
com o tipo assignedBreakoutRooms
. Esse evento conterá os detalhes mais recentes da sala para sessão de grupo. O usuário precisará hangUp()
a chamada anterior da sala para sessão de grupo. Se autoMoveParticipantToBreakoutRoom
estiver definido como true
, o usuário será movido automaticamente, caso contrário, ele deverá chamar explicitamente o método join
na nova sala para sessão de grupo.
//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();
}
Os usuários do Microsoft 365 com função de organizador, co-organizador ou gerente de sala para sessão de grupo receberão a lista de salas para sessão de grupo criadas pelo gerente de sala para sessão de grupo ou pelo organizador da reunião principal. Nesse caso, o comportamento será ligeiramente diferente. Esse usuário deverá chamar explicitamente o método join()
para ingressar na sala para sessão de grupo. O usuário será mantido em espera na reunião principal inicialmente e, por fim, será removido da reunião principal. O usuário deverá inicializar o Recurso breakoutRooms para breakoutRoomCall
a fim de receber atualizações sobre a sala para sessão de grupo.
Se o usuário quiser ingressar em uma das salas para sessão de grupo, ele deverá chamar explicitamente o método join
.
const breakoutRoom = breakoutRoomsFeature.breakoutRooms[0];
if(breakoutRoom.state == 'open') {
const breakoutRoomCall = await breakoutRoom.join();
}
Para sair de uma sala para sessão de grupo, os usuários deverão executar a função hangUp()
na chamada da sala para sessão de grupo. O usuário deverá chamar ReturnToMainMeeting
para retomar a chamada da reunião principal.
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
Sair da sala para sessão de grupo
Quando o estado da sala para sessão de grupo for closed
, o usuário será informado sobre o fim da sala para sessão de grupo ao receber o evento breakoutRoomsUpdated
com a classe AssignedBreakoutRoomsEvent
e a propriedade type
igual a assignedBreakoutRooms
, que indicará que assignedBreakoutRoom
tem a propriedade state
definida como closed
. O usuário sairá da sala para sessão de grupo automaticamente e poderá retornar à reunião principal chamando returnToMainMeeting()
conforme mostrado acima.
Se o usuário quiser sair da sala para sessão de grupo mesmo antes de ela ser fechada e as configurações da sala para sessão de grupo breakoutRoomsFeature.breakoutRoomsSettings
tiverem a propriedade disableReturnToMainMeeting
definida como false
, o usuário poderá retornar à chamada da reunião principal com o seguinte código:
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
Obter participantes da sala para sessão de grupo
Ao ingressar na sala para sessão de grupo, você pode usar o seguinte código para obter a lista de participantes remotos da sala:
const breakoutRoomParticipants = [breakoutRoomCall.remoteParticipants.values()].map((p: SDK.RemoteParticipant) => { p.displayName || p.identifier });
console.log(`Participants of the breakoutRoom : <br/>" + breakoutRoomParticipants.join("<br/>")`);
Parar de receber eventos de salas para sessão de grupo
Usar o seguinte código para parar de receber eventos breakoutRooms.
breakoutRoomsFeature.off('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Propriedades da sala para sessão de grupo
As salas para sessão de grupo têm as seguintes propriedades:
Observação
O seguinte código de exemplo exibe eficientemente todas as propriedades da sala para sessão de grupo. Não se destina a ser reutilizado como mostrar. Na prática, você só usar as propriedades necessárias para o seu cenário da sala para sessão de grupo.
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;
Propriedades da sala para sessão de grupo | Descrição |
---|---|
displayName |
Nome da sala para sessão de grupo. Esta propriedade é somente para leitura. |
threadId |
Use a ID do chat conversa para ingressar no chat da sala para sessão de grupo. Esta propriedade é somente para leitura. |
state |
Estado da sala para sessão de grupo. Pode ser open ou closed . Os usuários poderão ingressar na sala somente quando o estado for open . Esta propriedade é somente para leitura. |
autoMoveParticipantToBreakoutRoom |
Valor booliano indicando se os usuários são movidos para salas para sessão de grupo automaticamente quando o state de assignedBreakoutRoom está definido para open . Esta propriedade é somente para leitura. Nas configurações da interface do usuário do Teams para salas para sessão de grupo, o organizador, co-organizador ou gerente da sala para sessão de grupo pode ajustar essa configuração específica. Ao definir esta opção para true , os participantes são transferidos automaticamente para a sala para sessão de grupo designada. Por outro lado, se você definir esta propriedade para false , então você deve chamar manualmente o método join para mover os participantes para a sala para sessão de grupo. |
call |
Objeto de chamada da sala para sessão de grupo. Este objeto é retornado quando o usuário ingressa na chamada da sala para sessão de grupo automaticamente ou ao chamar o método join no objeto assignedBreakoutRoom . Esta propriedade é somente para leitura. |
invitees |
A lista de convidados que estão atribuídos a sala para sessão de grupo. Esta propriedade é somente para leitura. |
Configurações da sala para sessão de grupo
As salas para sessão de grupo compartilham configurações que têm as seguintes propriedades:
const disableReturnToMainMeeting : boolean = breakoutRoomsSettings.disableReturnToMainMeeting;
const roomEndTime : TimestampInfo = breakoutRoomsSettings.roomEndTime;
Propriedades da sala para sessão de grupo | Descrição |
---|---|
disableReturnToMainMeeting |
Desabilitar participantes para devolução à reunião principal da chamada da sala para sessão de grupo. Esta propriedade é somente para leitura. Nas configurações de interface do usuário do Teams para salas de grupos, o organizador, coorganizador ou gerente da sala para sessão de grupo pode ajustar essa configuração específica para controlar quando os participantes das salas de grupos podem retornar à reunião principal. |
roomEndTime |
Hora de término da sala para sessão de grupo definida pelo usuário do Microsoft 365 com função organizador, co-organizador ou gerente da reunião principal. Esta propriedade é somente para leitura. |
Solução de problemas
Código do erro | Subcódigo | Categoria de resultado | Motivo | Resolução |
---|---|---|---|---|
400 | 46250 | ExpectedError | O recurso Salas para Sessão de Grupo só está disponível em reuniões do Teams. | Implemente seu próprio mecanismo de sala para sessão de grupo ou use as reuniões do Teams. |
405 | 46251 | ExpectedError | No momento, os Serviços de Comunicação do Azure desabilitaram esse recurso. | Experimente as APIs em alguns dias. |
500 | 46254 | UnexpectedServerError | Não foi possível ingressar na sala de reunião devido a um erro inesperado. | Verifique se o state de assignedBreakoutRoom é open e chame o método breakoutRoomsFeature.assignedBreakoutRoom.join() explicitamente. Se o problema persistir, colete os logs do console do navegador e entre em contato com o suporte dos Serviços de Comunicação do Azure. |
500 | 46255 | UnexpectedServerError | Não é possível realizar a reunião principal. | Verifique se o state de assignedBreakoutRoom é open e chame o método breakoutRoomsFeature.assignedBreakoutRoom.join() explicitamente. Se o problema persistir, colete os logs do console do navegador e entre em contato com o suporte dos Serviços de Comunicação do Azure. |
412 | 46256 | ExpectedError | Não foi possível ingressar na Sala para sessão de grupo, pois a sala está fechada. | Verifique se o state de assignedBreakoutRoom é open e chame o método breakoutRoomsFeature.assignedBreakoutRoom.join() explicitamente. |
412 | 46257 | UnexpectedServerError | Não foi possível retomar a reunião principal. | Siga as instruções definidas na seção Leave breakout room para sair manualmente da sala para sessão de grupo. Se o problema persistir, colete os logs do console do navegador e entre em contato com o suporte dos Serviços de Comunicação do Azure. |
412 | 46258 | UnexpectedClientError | Não é possível ler os detalhes da sala para sessão de grupo. | Colete os logs do console do navegador e entre em contato com o suporte dos Serviços de Comunicação do Azure. |
500 | 46259 | UnexpectedServerError | Não foi possível desligar a chamada da sala para sessão de grupo. | Siga as instruções definidas na seção Leave breakout room para sair manualmente da sala para sessão de grupo. |
412 | 46260 | UnexpectedClientError | Não é possível ingressar na Sala para sessão de grupo, pois ela ainda não foi atribuída. | Verifique se breakoutRoomsFeature.assignedBreakoutRoom está contém os detalhes da sala para sessão de grupo atribuída. Verifique se o state de assignedBreakoutRoom é open e chame o método breakoutRoomsFeature.assignedBreakoutRoom.join() explicitamente. |
412 | 46261 | UnexpectedClientError | Não será possível entrar na reunião principal. | Tente novamente chamando o método breakoutRoomsFeature.assignedBreakoutRoom.returnToMainMeeting() . Se o problema persistir, colete os logs do console do navegador e entre em contato com o suporte dos Serviços de Comunicação do Azure. |
412 | 46262 | ExpectedError | Já está na reunião principal. | Chame esse método somente quando o participante estiver na sala para sessão de grupo e removido da reunião principal. |
412 | 46263 | UnexpectedClientError | Falha ao encerrar a chamada da sala para sessão de grupo existente. | Tente chamar o método hangup() novamente para encerrar a chamada. Chame o método join() para entrar na sala para sessão de grupo novamente. |