Oddělené místnosti
Tento článek popisuje, jak implementovat skupinové místnosti Microsoft Teams pomocí Azure Communication Services. Tato funkce umožňuje uživatelům služby Azure Communication Services na schůzkách v Teams účastnit se skupinových místností. Správci Teams řídí dostupnost oddělených místností ve schůzce v Teams pomocí zásad schůzky Teams. Další informace o oddělených místnostech najdete v dokumentaci k Teams.
Požadavky
- Účet Azure s aktivním předplatným. Viz Bezplatné vytvoření účtu.
- Nasazený prostředek komunikační služby. Viz Vytvoření prostředku komunikační služby.
- Přístupový token uživatele pro povolení volajícího klienta. Další informace najdete v tématu Vytváření a správa přístupových tokenů.
- Organizátor schůzky Teams musí přiřadit zásady schůzky Teams, které umožňují oddělené místnosti. Podívejte se na zásady schůzek v Teams.
- Volitelné: Dokončete rychlý start a přidejte do aplikace hlasové volání.
Skupinové místnosti můžou spravovat jenom uživatelé Microsoftu 365 s organizátorem, spoluorganizátorem nebo rolemi Správce oddělených místností.
Technická podpora
Následující tabulky definují podporu oddělených místností ve službě Azure Communication Services.
Identity a typy volání
Následující tabulka uvádí podporu v oddělených místnostech pro konkrétní typ a identitu volání.
Identity | Schůzka v Teams | Místnost | 1:1 hovor | Skupinový hovor | 1:1 Zprostředkovatele spolupráce v Teams | Skupinový interopový hovor v Teams |
---|---|---|---|---|---|---|
Uživatel komunikačních služeb | ✔️ | |||||
Uživatel Microsoftu 365 | ✔️ |
Operace
Následující tabulka ukazuje podporu jednotlivých rozhraní API ve volající sadě SDK související s jednotlivými typy identit.
Operace | Uživatel komunikačních služeb | Uživatel Microsoftu 365 |
---|---|---|
Získání přiřazené oddělené místnosti | ✔️ | ✔️ |
Získání všech skupinových místností | ✔️ [1] | |
Připojit se k oddělené místnosti | ✔️ | ✔️ |
Správa skupinových místností | ||
Účast v skupinovém chatu v místnosti | ✔️ [2] | |
Získání nastavení oddělené místnosti | ✔️ | ✔️ |
[1] Jenom uživatel Microsoftu 365 s organizátorem rolí, spoluorganizátorem nebo správcem oddělené místnosti.
[2] Uživatelé Microsoftu 365 můžou pomocí rozhraní Graph API účastnit se skupinového chatu v místnosti. ID vlákna chatu je k dispozici v přiřazeného objektu oddělené místnosti.
Sady SDK
Následující tabulky ukazují podporu funkce oddělených místností v jednotlivých sadách SDK služby Azure Communication Services.
Stav podpory | Web | Webové uživatelské rozhraní | iOS | Uživatelské rozhraní iOS | Android | Uživatelské rozhraní Androidu | Windows |
---|---|---|---|---|---|---|---|
Je podporováno. | ✔️ |
Nainstalujte sadu SDK .
npm install
Pomocí příkazu nainstalujte sadu AZURE Communication Services Common and Calling SDK pro JavaScript:
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
Inicializace požadovaných objektů
Pro CallClient
většinu operací volání se vyžaduje instance. Když vytvoříte novou CallClient
instanci, můžete ji nakonfigurovat s vlastními možnostmi, jako je Logger
instance.
CallClient
S instancí můžete vytvořit CallAgent
instanci voláním createCallAgent
. Tato metoda asynchronně vrátí CallAgent
objekt instance.
Metoda createCallAgent
se používá CommunicationTokenCredential
jako argument. Přijímá přístupový token uživatele.
K přístupu deviceManager
můžete použít metodu getDeviceManager
v CallClient
instanci .
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()
Jak nejlépe spravovat připojení sady SDK k infrastruktuře Microsoftu
Tato Call Agent
instance vám pomůže spravovat hovory (pro připojení nebo zahájení hovorů). Aby bylo možné pracovat s vaší sadou SDK volání, musí se připojit k infrastruktuře Microsoftu, aby bylo možné dostávat oznámení o příchozích hovorech a koordinovat další podrobnosti volání. Máte Call Agent
dva možné stavy:
Připojeno – Call Agent
Hodnota connectionStatue znamená, Connected
že klientská sada SDK je připojená a dokáže přijímat oznámení z infrastruktury Microsoftu.
Odpojeno – Call Agent
Hodnota Disconnected
connectionStatue stavů existuje problém, který brání sadě SDK, aby se správně připojil.
Call Agent
by se mělo znovu vytvořit.
-
invalidToken
: Pokud vypršela platnost tokenu nebo je neplatnáCall Agent
instance, odpojí se s touto chybou. -
connectionIssue
: Pokud došlo k problému s klientem, který se připojuje k infrascture Microsoftu, po mnoha opakovaných pokusechCall Agent
connectionIssue
se zobrazí chyba.
Zkontrolujte, jestli je vaše místní Call Agent
infrastruktura připojená k infrastruktuře Microsoftu, a to kontrolou aktuální hodnoty connectionState
vlastnosti. Během aktivního volání můžete naslouchat connectionStateChanged
události a zjistit, jestli Call Agent
se změny ze stavu Připojeno k Odpojeno .
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);
Implementace oddělených místností
BreakoutRooms
je třída feature
Call
. Nejprve musíte importovat balíček Features
z volající sady SDK:
import { Features} from "@azure/communication-calling";
Vytvoření funkce BreakoutRoom
Pak získejte objekt rozhraní API funkce z instance volání:
const breakoutRoomsFeature = mainMeetingCall.feature(Features.BreakoutRooms);
Přihlášení k odběru událostí breakoutRoom
Rozhraní BreakoutRooms
API umožňuje přihlásit se k odběru BreakoutRooms
událostí. Událost breakoutRoomsUpdated
pochází z BreakoutRoomsCallFeature
instance a obsahuje informace o vytvořených, aktualizovaných a přiřazených oddělených místnostech.
Pokud chcete dostávat podrobnosti o oddělené místnosti, přihlaste se k odběru breakoutRoomsUpdated
události.
breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Zpracování událostí breakoutRoom
Událost breakoutRoomsUpdated
poskytuje instanci jedné z následujících tříd jako vstupní parametr. Vlastnost můžete použít type
k rozlišení mezi jednotlivými typy událostí.
Třída
BreakoutRoomsEvent
: Tato událost se aktivuje, když uživatel s organizátorem role, spoluorganizátorem nebo správcem oddělené místnosti vytvoří nebo aktualizuje oddělené místnosti. Uživatelé Microsoftu 365 s organizátorem rolí, spoluorganizátorem nebo manažerem skupinové místnosti můžou tento typ události přijmout. Vývojáři můžou pomocí oddělených místností ve vlastnostidata
vykreslit podrobnosti o všech oddělených místnostech. Tato třída má vlastnosttype
rovna"breakoutRooms"
.export interface BreakoutRoomsEvent { /** * Breakout room event type */ type: "breakoutRooms", /** * list of Breakout rooms */ data: BreakoutRoom[] | undefined; }
Třída
BreakoutRoomsSettingsEvent
: Když uživatel s organizátorem role, spoluorganizátorem nebo správcem oddělené místnosti aktualizuje nastavení oddělené místnosti, aktivuje tuto událost. Vývojáři můžou pomocí těchto informací vykreslit čas ukončení skupinové místnosti nebo rozhodnout, jestli se má vykreslit tlačítko pro připojení k hlavní místnosti. Tato třída má vlastnosttype
rovna"breakoutRoomSettings"
.export interface BreakoutRoomSettingsEvent { /** * Breakout room event type */ type: "breakoutRoomSettings", /** * Breakout Room setting details */ data: BreakoutRoomSettings | undefined; }
Třída
AssignedBreakoutRoomsEvent
: Tato událost se aktivuje, když se uživatel přiřadí k oddělené místnosti nebo se aktualizuje přiřazená oddělená místnost. Uživatelé se můžou připojit k oddělené místnosti, pokud je vlastnoststate
nastavena naopen
, opustit oddělenou místnost, pokud je vlastnoststate
nastavena naclosed
, nebo vykreslit podrobnosti o oddělené místnosti. Tato třída má vlastnosttype
rovna"assignedBreakoutRoom"
.export interface AssignedBreakoutRoomEvent { /** * Breakout room event type */ type: "assignedBreakoutRoom"; /** * Assigned breakout room details */ data: BreakoutRoom | undefined; }
Třída
JoinBreakoutRoomsEvent
: Tato událost se aktivuje, když se účastník připojuje k skupinovému hovoru v místnosti. K této události může dojít, když se uživatel automaticky přesune do oddělené místnosti (to znamená, pokud má vlastnoststate
nastavenouopen
na hodnotu aautoMoveParticipantToBreakoutRoom
je nastavenátrue
na) nebo když se uživatel explicitně připojí k oddělené místnosti (to znamená volání metodyjoin
v instanciassignedBreakoutRoom
, pokudautoMoveParticipantToBreakoutRoom
je nastavena nafalse
).assignedBreakoutRoom
Vlastnostdata
obsahuje instanci oddělené místnosticall
, kterou můžou vývojáři použít k řízení skupinového volání místnosti. Tato třída má vlastnosttype
rovna"join"
.export interface JoinBreakoutRoomEvent { /** * Breakout room event type */ type: "join"; /** * Breakoutroom call object */ data: Call | TeamsCall; }
Následující kód ukazuje cenné informace přijaté v událostech skupinové místnosti:
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);
Seznam dostupných oddělených místností
Uživatelé Microsoftu 365, kteří mají organizátora rolí, spoluorganizátora nebo správce skupinových místností, mají přístup ke všem odděleným místnostem.
const breakoutRooms = breakoutRoomsFeature.breakoutRooms;
breakoutRooms.forEach((room)=>{
console.log(`- ${room.displayName}`);
});
Seznam pozvaných uživatelů
Uživatel Microsoftu 365 s organizátorem rolí, spoluorganizátorem nebo správcem oddělené místnosti může přistupovat k účastníkům přiřazeným k jednotlivým odděleným místnostem.
breakoutRooms.forEach((room)=>{
console.log(`${room.displayName}`);
room.invitees.forEach((invitee) => {
console.log(`- ${invitee.id}`);
})
})
Připojit se k oddělené místnosti
Pokud je vlastnost autoMoveParticipantToBreakoutRoom
nastavena assignedBreakoutRoom
na true
, uživatel se automaticky přesune do oddělené místnosti, když je vlastnost state
nastavena na open
. Pokud autoMoveParticipantToBreakoutRoom
je nastavená hodnota false
, použijte následující kód pro připojení k oddělené místnosti.
Tato událost aktivuje breakoutRoomsUpdated
událost s třídou JoinBreakoutRoomsEvent
, která má vlastnost type
nastavena jako join
. Instanci třídy call
ve vlastnosti data
můžete použít ke správě skupinového volání místnosti.
const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await breakoutRoom.join();
}
Když je uživatel v oddělené místnosti a organizátor přiřadí uživateli novou oddělenou místnost, uživatel získá breakoutRoomsUpdated
událost s typem assignedBreakoutRooms
. Tato událost obsahuje nejnovější podrobnosti o oddělené místnosti. Uživatel musí provést hangUp()
předchozí hovor skupinové místnosti. Pokud autoMoveParticipantToBreakoutRoom
je nastavena na true
, uživatel se automaticky přesune, jinak uživatel musí volat metodu join
explicitně v nové oddělené místnosti.
//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();
}
Uživatel Microsoftu 365 s organizátorem rolí, spoluorganizátorem nebo správcem skupinových místností získá seznam oddělených místností vytvořených manažerem oddělené místnosti nebo organizátorem hlavní schůzky. V tomto případě se chování mírně liší. Tento uživatel musí explicitně volat join()
metodu připojení k oddělené místnosti. Uživatel je zpočátku přidržený v hlavní schůzce a nakonec se odebere z hlavní schůzky. Uživatel musí inicializovat funkci breakoutRooms pro breakoutRoomCall
pořadí, aby dostával aktualizace v oddělené místnosti.
Pokud se uživatel chce připojit k některé z oddělených místností , pak uživatel explicitně volá metodu join
.
const breakoutRoom = breakoutRoomsFeature.breakoutRooms[0];
if(breakoutRoom.state == 'open') {
const breakoutRoomCall = await breakoutRoom.join();
}
Aby uživatelé mohli opustit oddělenou místnost, měli by funkci spustit hangUp()
při volání skupinové místnosti. Uživatel bude volat ReturnToMainMeeting
, aby obnovil hlavní hovor schůzky.
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
Opuštění skupinové místnosti
Když je closed
stav oddělené místnosti , uživatel je informován o ukončení skupinové místnosti příjmem události breakoutRoomsUpdated
s třídou AssignedBreakoutRoomsEvent
a vlastnostítype
, která je rovnaassignedBreakoutRooms
, která označuje, že assignedBreakoutRoom
má vlastnost state
nastavenou .closed
Uživatel opustí skupinovou místnost automaticky a může se vrátit k hlavní schůzce zavoláním returnToMainMeeting()
, jak je znázorněno výše.
Pokud chce uživatel opustit oddělenou místnost i před zavřením místnosti a nastavení breakoutRoomsFeature.breakoutRoomsSettings
oddělené místnosti má nastavenou vlastnost disableReturnToMainMeeting
, false
může se uživatel vrátit do hlavního hovoru schůzky pomocí následujícího kódu:
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
Získání účastníků skupinové místnosti
Když se připojíte k oddělené místnosti, můžete pomocí následujícího kódu získat seznam vzdálených účastníků skupinové místnosti:
const breakoutRoomParticipants = [breakoutRoomCall.remoteParticipants.values()].map((p: SDK.RemoteParticipant) => { p.displayName || p.identifier });
console.log(`Participants of the breakoutRoom : <br/>" + breakoutRoomParticipants.join("<br/>")`);
Ukončení přijímání událostí skupinových místností
Pomocí následujícího kódu ukončete příjem událostí breakoutRooms.
breakoutRoomsFeature.off('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
Vlastnosti oddělené místnosti
Oddělené místnosti mají následující vlastnosti:
Poznámka:
Následující ukázkový kód efektivně zobrazí všechny vlastnosti oddělené místnosti. Není určeno k opakovanému použití, jak je znázorněno. V praxi použijete jenom vlastnosti potřebné pro váš scénář skupinové místnosti.
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;
Vlastnosti oddělené místnosti | Popis |
---|---|
displayName |
Název oddělené místnosti. Tato vlastnost je jen ke čtení. |
threadId |
Pomocí ID vlákna chatu se můžete připojit k chatu skupinové místnosti. Tato vlastnost je jen ke čtení. |
state |
Stav skupinové místnosti. Může to být buď open nebo closed . Uživatelé by se mohli připojit k oddělené místnosti pouze v případech, kdy je open stav . Tato vlastnost je jen ke čtení. |
autoMoveParticipantToBreakoutRoom |
Logická hodnota označující, zda jsou uživatelé přesunuti do oddělených místností automaticky, když state je nastavena assignedBreakoutRoom hodnota open . Tato vlastnost je jen ke čtení. V nastavení uživatelského rozhraní Teams pro oddělené místnosti může organizátor, spoluorganizátor nebo správce skupinových místností upravit toto konkrétní nastavení. Nastavením této možnosti se true účastníci automaticky převedou do určené oddělené místnosti. Naopak pokud tuto vlastnost nastavíte na false , musíte metodu join ručně zavolat, aby se účastníci přesunuli do oddělené místnosti. |
call |
Objekt skupinového volání místnosti Tento objekt se vrátí, když se uživatel připojí k skupinovému volání místnosti automaticky nebo zavolá metodu join objektu assignedBreakoutRoom . Tato vlastnost je jen ke čtení. |
invitees |
Seznam pozvaných, kteří jsou přiřazeni k oddělené místnosti. Tato vlastnost je jen ke čtení. |
Nastavení oddělené místnosti
Nastavení sdílení oddělených místností s následujícími vlastnostmi:
const disableReturnToMainMeeting : boolean = breakoutRoomsSettings.disableReturnToMainMeeting;
const roomEndTime : TimestampInfo = breakoutRoomsSettings.roomEndTime;
Vlastnosti oddělené místnosti | Popis |
---|---|
disableReturnToMainMeeting |
Zakažte účastníkům návrat na hlavní schůzku z skupinového hovoru v místnosti. Tato vlastnost je jen ke čtení. V nastavení uživatelského rozhraní Teams pro skupinové místnosti může organizátor, spoluorganizátor nebo správce skupinových místností upravit toto konkrétní nastavení tak, aby bylo možné řídit, kdy se účastníci skupinových místností mohou vrátit do hlavní schůzky. |
roomEndTime |
Čas ukončení skupinové místnosti nastavený uživatelem Microsoftu 365 s organizátorem role, spoluorganizátorem nebo správcem oddělené místnosti hlavní schůzky. Tato vlastnost je jen ke čtení. |
Řešení problému
Kód chyby | Podkód | Kategorie výsledků | Důvod | Rozlišení |
---|---|---|---|---|
400 | 46250 | ExpectedError | Funkce Oddělené místnosti je dostupná jenom na schůzkách v Teams. | Implementujte vlastní mechanismus skupinové místnosti nebo používejte schůzky Teams. |
405 | 46251 | ExpectedError | Služba Azure Communication Services tuto funkci aktuálně zakázala. | Zkuste rozhraní API za pár dní. |
500 | 46254 | UnexpectedServerError | Nejde se připojit k oddělené místnosti kvůli neočekávané chybě. | Ujistěte se, že state assignedBreakoutRoom je metoda a open metoda volání breakoutRoomsFeature.assignedBreakoutRoom.join() explicitně. Pokud problém přetrvává, shromážděte protokoly konzoly prohlížeče a obraťte se na podporu služeb Azure Communication Services. |
500 | 46255 | UnexpectedServerError | Nelze uspořádat hlavní schůzku. | Ujistěte se, že state assignedBreakoutRoom je metoda a open metoda volání breakoutRoomsFeature.assignedBreakoutRoom.join() explicitně. Pokud problém přetrvává, shromážděte protokoly konzoly prohlížeče a obraťte se na podporu služeb Azure Communication Services. |
412 | 46256 | ExpectedError | Nelze se připojit k oddělené místnosti, protože místnost je uzavřena. | Ujistěte se, že state assignedBreakoutRoom je metoda a open metoda volání breakoutRoomsFeature.assignedBreakoutRoom.join() explicitně. |
412 | 46257 | UnexpectedServerError | Nejde obnovit hlavní schůzku. | Postupujte podle pokynů definovaných v části Leave breakout room pro ruční opuštění oddělené místnosti. Pokud problém přetrvává, shromážděte protokoly konzoly prohlížeče a obraťte se na podporu služeb Azure Communication Services. |
412 | 46258 | UnexpectedClientError | Podrobnosti o oddělené místnosti nelze přečíst. | Shromážděte protokoly konzoly prohlížeče a obraťte se na podporu služeb Azure Communication Services. |
500 | 46259 | UnexpectedServerError | Hovor skupinové místnosti se nedá zavěsit. | Postupujte podle pokynů definovaných v části Leave breakout room pro ruční opuštění oddělené místnosti. |
412 | 46260 | UnexpectedClientError | Nelze se připojit k oddělené místnosti, protože ještě není přiřazena. | Ujistěte se, že breakoutRoomsFeature.assignedBreakoutRoom obsahuje podrobnosti o přiřazené oddělené místnosti. Ujistěte se, že state assignedBreakoutRoom je metoda a open metoda volání breakoutRoomsFeature.assignedBreakoutRoom.join() explicitně. |
412 | 46261 | UnexpectedClientError | Nejde se připojit k hlavní schůzce. | Zkuste to prosím znovu voláním breakoutRoomsFeature.assignedBreakoutRoom.returnToMainMeeting() metody. Pokud problém přetrvává, shromážděte protokoly konzoly prohlížeče a obraťte se na podporu služeb Azure Communication Services. |
412 | 46262 | ExpectedError | Už v hlavní schůzce. | Tuto metodu zavolejte jenom v případě, že je účastník v oddělené místnosti a odebere se z hlavní schůzky. |
412 | 46263 | UnexpectedClientError | Existující zablokování skupinové místnosti se nezdařilo. | Zkuste znovu zavolat metodu hangup() a zavěsit volání. Volání metody join() pro opětovné připojení k oddělené místnosti. |