Salas para sesión de subgrupo
En este artículo se describe cómo implementar salas de interrupción de Microsoft Teams con Azure Communication Services. Esta funcionalidad permite a los usuarios de Azure Communication Services en reuniones de Teams participar en salas de interrupción. Los administradores de Teams controlan la disponibilidad de las salas de interrupción en la reunión de Teams con la directiva de reuniones de Teams. Puede encontrar información adicional sobre las salas para sesión de subgrupo en la documentación de Teams.
Requisitos previos
- Una cuenta de Azure con una suscripción activa. Consulte Crear una cuenta de forma gratuita.
- Un recurso de Communication Services implementado. Consulte Creación de un recurso de Communication Services.
- Un token de acceso de usuario para habilitar el cliente de llamada. Para más información, consulte Inicio rápido: Creación y administración de tokens de acceso.
- El organizador de reuniones de Teams debe asignar la directiva de reunión de Teams que permita salas de interrupción. Consulte directiva de reunión de Teams.
- Opcional: Complete la guía de inicio rápido para agregar llamadas de voz a la aplicación.
Solo los usuarios de Microsoft 365 con el rol organizador, coorganizador o administrador de salas de reuniones pueden administrar las salas para sesión de subgrupo.
Soporte técnico
En las siguientes tablas se define la compatibilidad de las salas para sesión de subgrupo en Azure Communication Services.
Identidades y tipos de llamadas
En la tabla siguiente se muestra compatibilidad en salas de interrupción para un tipo de llamada y una identidad específicos.
Identidades | Reuniones en Teams | Sala | Llamada 1:1 | Llamada grupal | Llamada de interoperabilidad de Teams individual | Llamada de interoperabilidad de Teams de grupo |
---|---|---|---|---|---|---|
Usuario de Communication Services | ✔️ | |||||
Usuario de Microsoft 365 | ✔️ |
Operations
En la tabla siguiente se muestra compatibilidad con API individuales en el SDK de llamada relacionado con tipos de identidad individuales.
Operations | Usuario de Communication Services | Usuario de Microsoft 365 |
---|---|---|
Obtención de la sala para sesión de subgrupo asignada | ✔️ | ✔️ |
Obtención de todas las salas para sesión de subgrupo | ✔️[1] | |
Unirse a la sala para sesión de subgrupo | ✔️ | ✔️ |
Administrar salas de trabajos en grupo | ||
Participar en el chat de la sala para sesión de subgrupo | ✔️[2] | |
Obtención de la configuración de la sala para sesión de subgrupo | ✔️ | ✔️ |
[1] Solo usuario de Microsoft 365 con función de organizador, coorganizador o administrador de sala para sesión de subgrupo.
[2] Los usuarios de Microsoft 365 pueden usar Graph API para participar en el chat de la sala para sesión de subgrupo. El identificador de subproceso del chat se proporciona en el objeto de sala para sesión de subgrupo asignado.
SDK
En las tablas siguientes se muestra compatibilidad con la característica de salas de interrupción en los SDK individuales de Azure Communication Services.
Estado de compatibilidad | Web | IU Web | iOS | Interfaz de usuario de iOS | Android | UI de Android | Windows |
---|---|---|---|---|---|---|---|
Se admite | ✔️ |
Instalación del SDK
Use el comando npm install
para instalar los SDK comunes y de llamada de Azure Communication Services para JavaScript:
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
Inicialización de los objetos necesarios
Se requiere una instancia de CallClient
para la mayoría de las operaciones de llamada. Al crear una nueva instancia de CallClient
, puede configurarla con opciones personalizadas, como una instancia de Logger
.
Con la instancia de CallClient
, puede crear una instancia de CallAgent
llamando al createCallAgent
. Este método devuelve un objeto de instancia CallAgent
de manera asincrónica.
El método createCallAgent
utiliza CommunicationTokenCredential
como argumento. Acepta un token de acceso de usuario.
Puede usar el método getDeviceManager
en la instancia de CallClient
para acceder a 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()
Cuál es la mejor forma de administrar la conectividad del SDK en la infraestructura de Microsoft
La instancia de Call Agent
le ayuda a administrar llamadas (para unirse o iniciar llamadas). Para trabajar con el SDK de llamadas, debe conectarse a la infraestructura de Microsoft para obtener notificaciones de llamadas entrantes y coordinar otros detalles de la llamada. Call Agent
tiene dos posibles estados:
Conectado: un valor connectionStatue Call Agent
con estado Connected
significa que el SDK de cliente está conectado y es capaz de recibir notificaciones de la infraestructura de Microsoft.
Desconectado: un valor connectionStatue Call Agent
con estado Disconnected
indica que hay un problema que impide que el SDK se conecte correctamente. Call Agent
se debe volver a crear.
invalidToken
: si un token ha expirado o no es válido, la instancia deCall Agent
se desconecta con este error.connectionIssue
: si hay un problema cuando el cliente se conecta a la infraestructura de Microsoft, después de muchos reintentos,Call Agent
expone el errorconnectionIssue
.
Para comprobar si el Call Agent
local está conectado a la infraestructura de Microsoft, inspeccione el valor actual de la propiedad connectionState
. Durante una llamada activa, puede escuchar el evento connectionStateChanged
para determinar si Call Agent
cambia de Conectado a 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);
Implementación de salas de interrupción
BreakoutRooms
es un feature
de la clase Call
. En primer lugar, debe importar el paquete Features
desde el SDK de llamadas:
import { Features} from "@azure/communication-calling";
Creación de una característica breakoutRoom
A continuación, obtenga el objeto de API de características de la instancia de llamada:
const breakoutRoomsFeature = mainMeetingCall.feature(Features.BreakoutRooms);
Suscribirse a eventos breakoutRoom
La API BreakoutRooms
permite suscribirse a los eventos BreakoutRooms
. Un evento breakoutRoomsUpdated
procede de una instancia de BreakoutRoomsCallFeature
y contiene información sobre las salas de interrupción creadas, actualizadas y asignadas.
Para recibir detalles de la sala para sesión de subgrupo, suscríbase al evento breakoutRoomsUpdated
.
breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Control de eventos breakoutRoom
El evento breakoutRoomsUpdated
proporciona una instancia de una de las siguientes clases como parámetro de entrada. Puede usar la propiedad type
para distinguir entre tipos de eventos individuales.
Clase
BreakoutRoomsEvent
: Este evento se desencadena cuando un usuario con el organizador de roles, coorganizador o administrador de salas de interrupción crea o actualiza las salas de interrupción. Los usuarios de Microsoft 365 con organizador de roles, coorganizador o administrador de salas de interrupción pueden recibir este tipo de evento. Los desarrolladores pueden usar las salas para sesión de subgrupo en la propiedaddata
para representar detalles sobre todas las salas para sesión de subgrupo. Esta clase tiene la propiedadtype
igual a"breakoutRooms"
.export interface BreakoutRoomsEvent { /** * Breakout room event type */ type: "breakoutRooms", /** * list of Breakout rooms */ data: BreakoutRoom[] | undefined; }
Clase
BreakoutRoomsSettingsEvent
: Cuando un usuario con un organizador de roles, coorganizador o administrador de salas de interrupción actualiza la configuración de la sala de interrupción, desencadena este evento. Los desarrolladores pueden usar esta información para representar la hora en que finaliza la sala de interrupción o decidir si se va a representar un botón para unirse a la sala principal. Esta clase tiene la propiedadtype
igual a"breakoutRoomSettings"
.export interface BreakoutRoomSettingsEvent { /** * Breakout room event type */ type: "breakoutRoomSettings", /** * Breakout Room setting details */ data: BreakoutRoomSettings | undefined; }
Clase
AssignedBreakoutRoomsEvent
: este evento se desencadena cuando el usuario se asigna a una sala para sesión de subgrupo o se actualiza la sala para sesión de subgrupo asignada. Los usuarios pueden unirse a la sala de interrupción cuando la propiedadstate
está establecida enopen
, deje la sala de interrupción cuando la propiedadstate
esté establecida enclosed
, o represente los detalles de la sala de interrupción. Esta clase tiene la propiedadtype
igual a"assignedBreakoutRoom"
.export interface AssignedBreakoutRoomEvent { /** * Breakout room event type */ type: "assignedBreakoutRoom"; /** * Assigned breakout room details */ data: BreakoutRoom | undefined; }
Clase
JoinBreakoutRoomsEvent
: Este evento se desencadena cuando el participante se une a una llamada de sala de interrupción. Este evento puede ocurrir cuando un usuario se mueve automáticamente a la sala de interrupción (es decir, siassignedBreakoutRoom
tiene la propiedadstate
establecida enopen
yautoMoveParticipantToBreakoutRoom
se establece entrue
) o cuando un usuario se une explícitamente a una sala de interrupción (es decir, llama al métodojoin
en la instanciaassignedBreakoutRoom
cuandoautoMoveParticipantToBreakoutRoom
se establece enfalse
). La propiedaddata
contiene la instancia decall
de la sala para sesión de subgrupo, que los desarrolladores pueden usar para controlar la llamada a la sala para sesión de subgrupo. Esta clase tiene la propiedadtype
igual a"join"
.export interface JoinBreakoutRoomEvent { /** * Breakout room event type */ type: "join"; /** * Breakoutroom call object */ data: Call | TeamsCall; }
El siguiente código muestra información valiosa recibida en los eventos de la sala para sesión de subgrupo:
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);
Lista de las salas para sesión de subgrupo disponibles
Los usuarios de Microsoft 365 con organizador de roles, coorganizador o administrador de salas de interrupción pueden acceder a todas las salas de interrupción.
const breakoutRooms = breakoutRoomsFeature.breakoutRooms;
breakoutRooms.forEach((room)=>{
console.log(`- ${room.displayName}`);
});
Lista de invitados
El usuario de Microsoft 365 con el rol de organizador, coorganizador o administrador de salas para sesión de subgrupo puede acceder a los participantes asignados a salas para sesión de subgrupo individuales.
breakoutRooms.forEach((room)=>{
console.log(`${room.displayName}`);
room.invitees.forEach((invitee) => {
console.log(`- ${invitee.id}`);
})
})
Unirse a la sala para sesión de subgrupo
Si el assignedBreakoutRoom
tiene la propiedad autoMoveParticipantToBreakoutRoom
establecida en true
, el usuario se mueve automáticamente a la sala para sesión de subgrupo cuando la propiedad state
está establecida en open
. Si autoMoveParticipantToBreakoutRoom
se establece en false
, use el siguiente código para unir la sala para sesión de subgrupo.
Esto desencadena el evento breakoutRoomsUpdated
con clase JoinBreakoutRoomsEvent
que tiene la propiedad type
establecida como join
. Puede usar la instancia de una clase call
en la propiedad data
para administrar la llamada a la sala para sesión de subgrupo.
const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await breakoutRoom.join();
}
Cuando el usuario está en una sala para sesión de subgrupo y el organizador le asigna una nueva, el usuario obtiene el evento breakoutRoomsUpdated
con el tipo assignedBreakoutRooms
. Este evento contiene los detalles más recientes de la sala. El usuario tiene que hangUp()
la llamada de sala anterior. Si autoMoveParticipantToBreakoutRoom
se establece en true
, el usuario se mueve automáticamente; de lo contrario, el usuario tiene que llamar al método join
explícitamente en la nueva sala.
//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();
}
El usuario de Microsoft 365 con el organizador de roles, coorganizador o administrador de salas obtiene la lista de salas creada por el administrador de salas o el organizador de la reunión principal. En este caso, el comportamiento es ligeramente diferente. Este usuario tiene que llamar explícitamente al método join()
para unirse a la sala. El usuario se mantiene en espera en la reunión principal inicialmente y finalmente se quita de la reunión principal. El usuario tiene que inicializar la característica breakoutRooms para breakoutRoomCall
a fin de recibir actualizaciones sobre la sala.
Si el usuario quiere unirse a cualquiera de las salas, llama explícitamente al método join
.
const breakoutRoom = breakoutRoomsFeature.breakoutRooms[0];
if(breakoutRoom.state == 'open') {
const breakoutRoomCall = await breakoutRoom.join();
}
Para salir de una sala, los usuarios deben ejecutar la función hangUp()
en la llamada a la sala. El usuario llamaría a ReturnToMainMeeting
para reanudar la llamada a la reunión principal.
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
Abandonar la sala para sesión de subgrupo
Cuando el estado de la sala es closed
, se informa al usuario sobre el final de la sala al recibir el evento breakoutRoomsUpdated
con la clase AssignedBreakoutRoomsEvent
y la propiedad type
igual a assignedBreakoutRooms
que indica que assignedBreakoutRoom
tiene la propiedad state
establecida en closed
. El usuario deja la sala automáticamente y puede volver a la reunión principal si llama a returnToMainMeeting()
como se ha mostrado antes.
Si el usuario quiere abandonar la sala incluso antes de que se cierre y la configuración de la sala breakoutRoomsFeature.breakoutRoomsSettings
tiene la propiedad disableReturnToMainMeeting
establecida en false
, el usuario puede volver a la llamada de la reunión principal con el siguiente código:
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
Obtención de los participantes de la sala para sesión de subgrupo
Al unirse a la sala para sesión de subgrupo, puede usar el siguiente código para obtener la lista de participantes remotos de la sala para sesión de subgrupo:
const breakoutRoomParticipants = [breakoutRoomCall.remoteParticipants.values()].map((p: SDK.RemoteParticipant) => { p.displayName || p.identifier });
console.log(`Participants of the breakoutRoom : <br/>" + breakoutRoomParticipants.join("<br/>")`);
Deje de recibir eventos de salas para sesión de subgrupo
Use el código siguiente para dejar de recibir eventos breakoutRooms.
breakoutRoomsFeature.off('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Propiedades de la sala para sesión de subgrupo
Las salas para sesión de subgrupo tienen las siguientes propiedades:
Nota:
El código de ejemplo siguiente muestra eficazmente todas las propiedades de la sala de interrupción. No está pensado para reutilizarse como se muestra. En la práctica, solo se usan las propiedades necesarias para el escenario de sala de interrupción.
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;
Propiedades de la sala para sesión de subgrupo | Descripción |
---|---|
displayName |
Nombre de la sala de interrupción. Esta propiedad es de solo lectura. |
threadId |
Use el identificador del subproceso de chat para unirse al chat del salón de interrupción. Esta propiedad es de solo lectura. |
state |
Estado de la sala de interrupción. Puede ser open o closed . Los usuarios podrían unirse a la sala para sesión de subgrupo solo cuando el estado es open . Esta propiedad es de solo lectura. |
autoMoveParticipantToBreakoutRoom |
Valor booleano que indica si los usuarios se mueven a salas de interrupción automáticamente cuando el state de assignedBreakoutRoom está establecido en open . Esta propiedad es de solo lectura. En la configuración de la interfaz de usuario de Teams para las salas para sesión de subgrupo, el organizador, el coorganizador o el administrador de la sala para sesión de subgrupo pueden ajustar esta configuración específica. Al establecer esta opción en true , los participantes se transfieren automáticamente a su sala de interrupción designada. Por el contrario, si establece esta propiedad en false , debe llamar manualmente al método join para mover los participantes a la sala de interrupción. |
call |
Objeto de llamada de sala de interrupción. Este objeto se devuelve cuando el usuario se une automáticamente a la llamada a la sala de interrupción o llamando al método join en assignedBreakoutRoom objeto. Esta propiedad es de solo lectura. |
invitees |
Lista de invitaciones asignadas al salón de interrupción. Esta propiedad es de solo lectura. |
Configuración de la sala para sesión de subgrupo
Las salas para sesión de subgrupo comparten la configuración que tiene las siguientes propiedades:
const disableReturnToMainMeeting : boolean = breakoutRoomsSettings.disableReturnToMainMeeting;
const roomEndTime : TimestampInfo = breakoutRoomsSettings.roomEndTime;
Propiedades de la sala para sesión de subgrupo | Descripción |
---|---|
disableReturnToMainMeeting |
Deshabilite a los participantes para volver a la reunión principal desde la llamada a la sala de interrupción. Esta propiedad es de solo lectura. En la configuración de la interfaz de usuario de Teams para las salas para sesión de subgrupo, el organizador, el coorganizador o el administrador de la sala para sesión de subgrupo pueden ajustar esta configuración específica para controlar cuándo los participantes de las salas para sesión de subgrupo pueden volver a la reunión principal. |
roomEndTime |
Hora de finalización de la sala de interrupción establecida por el usuario de Microsoft 365 con organizador de roles, coorganizador o administrador de salas de interrupción de la reunión principal. Esta propiedad es de solo lectura. |
Solución de problemas
Código de error | SubCode | Categoría de resultado | Motivo | Solución |
---|---|---|---|---|
400 | 46250 | ExpectedError | La característica Salas para sesión de subgrupo solo está disponible en las reuniones de Teams. | Implemente su propio mecanismo de sala para sesión de subgrupo o use reuniones de Teams. |
405 | 46251 | ExpectedError | Actualmente, Azure Communication Services ha deshabilitado esta característica. | Pruebe las API en un par de días. |
500 | 46254 | UnexpectedServerError | No se puede unir a la sala para sesión de subgrupo debido a un error inesperado. | Asegúrese de que el state de assignedBreakoutRoom sea open y llame explícitamente al método breakoutRoomsFeature.assignedBreakoutRoom.join() . Si el problema persiste, recopile los registros de la consola del explorador y póngase en contacto con el soporte técnico de Azure Communication Services. |
500 | 46255 | UnexpectedServerError | No se puede celebrar la reunión principal. | Asegúrese de que el state de assignedBreakoutRoom sea open y llame explícitamente al método breakoutRoomsFeature.assignedBreakoutRoom.join() . Si el problema persiste, recopile los registros de la consola del explorador y póngase en contacto con el soporte técnico de Azure Communication Services. |
412 | 46256 | ExpectedError | No se puede unir a la sala para sesión de subgrupo ya que la sala está cerrada. | Asegúrese de que el state de assignedBreakoutRoom sea open y llame explícitamente al método breakoutRoomsFeature.assignedBreakoutRoom.join() . |
412 | 46257 | UnexpectedServerError | No se puede reanudar la reunión principal. | Siga las instrucciones definidas en la sección Leave breakout room para la salida manual de la sala para sesión de subgrupo. Si el problema persiste, recopile los registros de la consola del explorador y póngase en contacto con el soporte técnico de Azure Communication Services. |
412 | 46258 | UnexpectedClientError | No se pueden leer los detalles de la sala para sesión de subgrupo. | Recopile los registros de la consola del explorador y póngase en contacto con el soporte técnico de Azure Communication Services. |
500 | 46259 | UnexpectedServerError | No se pudo colgar la llamada a la sala para sesión de subgrupo. | Siga las instrucciones definidas en la sección Leave breakout room para la salida manual de la sala para sesión de subgrupo. |
412 | 46260 | UnexpectedClientError | No se puede unir a la sala para sesión de subgrupo ya que aún no está asignado. | Asegúrese de que el breakoutRoomsFeature.assignedBreakoutRoom tenga los detalles de la sala para sesión de subgrupo asignada. Asegúrese de que el state de assignedBreakoutRoom sea open y llame explícitamente al método breakoutRoomsFeature.assignedBreakoutRoom.join() . |
412 | 46261 | UnexpectedClientError | No se puede unir a la reunión principal. | Inténtelo de nuevo llamando al método breakoutRoomsFeature.assignedBreakoutRoom.returnToMainMeeting() . Si el problema persiste, recopile los registros de la consola del explorador y póngase en contacto con el soporte técnico de Azure Communication Services. |
412 | 46262 | ExpectedError | Ya está en la reunión principal. | Llame a este método solo cuando el participante esté en la sala y se quite de la reunión principal. |
412 | 46263 | UnexpectedClientError | Error de bloqueo de la llamada a la sala existente. | Intente llamar al método hangup() de nuevo para colgar la llamada. Llame al método join() para volver a unirse a la sala. |