Sdílet prostřednictvím


Jak řídit a řídit volání pomocí automatizace volání

Automatizace volání používá rozhraní REST API k příjmu požadavků na akce a poskytnutí odpovědí, které upozorňují, jestli byl požadavek úspěšně odeslán nebo ne. Vzhledem k asynchronní povaze volání má většina akcí odpovídající události, které se aktivují, když se akce úspěšně dokončí nebo selže. Tato příručka popisuje akce dostupné pro řízení hovorů, jako jsou CreateCall, Transfer, Redirect a správa účastníků. Akce jsou doprovázeny vzorovým kódem o tom, jak vyvolat zmíněné akce a sekvenční diagramy popisující události očekávané po vyvolání akce. Tyto diagramy vám pomůžou vizualizovat, jak programovat aplikaci služby pomocí automatizace volání.

Automatizace volání podporuje různé další akce pro správu médií hovorů a nahrávání, které mají samostatné vodítka.

Jako předpoklad doporučujeme, abyste si přečetli tyto články, které vám pomůžou maximálně využít tohoto průvodce:

  1. Průvodce koncepty automatizace volání, který popisuje programovací model akcí a zpětné volání událostí.
  2. Seznamte se s identifikátory uživatelů, jako jsou CommunicationUserIdentifier a PhoneNumberIdentifier používané v této příručce.

Pro všechny ukázky kódu je CallAutomationClient objekt, client který lze vytvořit, jak je znázorněno a callConnection je CallConnection objekt získaný z odpovědi Answer nebo CreateCall. Můžete ho také získat z událostí zpětného volání přijatých vaší aplikací.

var client = new CallAutomationClient("<resource_connection_string>"); 

Uskutečnění odchozího hovoru

Můžete umístit 1:1 nebo skupinový hovor na komunikačního uživatele nebo telefonní číslo (veřejné nebo komunikační služby vlastněné číslem). Při volání koncového bodu veřejné telefonní sítě musíte také zadat telefonní číslo, které se použije jako ID zdrojového volajícího a zobrazí se v oznámení o volání cílovému koncovému bodu veřejné telefonní sítě. Chcete-li umístit volání komunikační služby uživatele, musíte poskytnout CommunicationUserIdentifier objekt místo PhoneNumberIdentifier.

Uri callbackUri = new Uri("https://<myendpoint>/Events"); //the callback endpoint where you want to receive subsequent events 
var callerIdNumber = new PhoneNumberIdentifier("+16044561234"); // This is the Azure Communication Services provisioned phone number for the caller  
var callThisPerson = new CallInvite(new PhoneNumberIdentifier("+16041234567"), callerIdNumber); // person to call
CreateCallResult response = await client.CreateCallAsync(callThisPerson, callbackUri);

Při skupinovém hovoru, který obsahuje telefonní číslo, musíte zadat telefonní číslo, které se použije jako číslo ID volajícího do koncového bodu veřejné telefonní sítě.

Uri callbackUri = new Uri("https://<myendpoint>/Events"); //the callback endpoint where you want to receive subsequent events 
var pstnEndpoint = new PhoneNumberIdentifier("+16041234567");
var voipEndpoint = new CommunicationUserIdentifier("<user_id_of_target>"); //user id looks like 8:a1b1c1-...
var groupCallOptions = new CreateGroupCallOptions(new List<CommunicationIdentifier>{ pstnEndpoint, voipEndpoint }, callbackUri)
{
    SourceCallerIdNumber = new PhoneNumberIdentifier("+16044561234"), // This is the Azure Communication Services provisioned phone number for the caller
};
CreateCallResult response = await client.CreateGroupCallAsync(groupCallOptions);

Odpověď poskytuje objekt CallConnection, který můžete použít k provedení dalších akcí s tímto voláním po připojení. Po přijetí volání se do koncového bodu zpětného volání, který jste zadali dříve, publikují dvě události:

  1. CallConnected událost s oznámením, že hovor byl vytvořen s volaným.
  2. ParticipantsUpdated událost, která obsahuje nejnovější seznam účastníků hovoru. Sekvenční diagram pro umístění odchozího volání

V případě selhání volání se zobrazí CallDisconnected kódy chyb a CreateCallFailed události pro další řešení potíží (další informace o kódech chyb najdete na této stránce ).

Připojení k hovoru

Akce připojení umožňuje vaší službě navázat spojení s probíhajícím voláním a provádět s ním akce. To je užitečné při správě volání místností nebo při spuštění klientské aplikace 1:1 nebo skupinového volání, které automatizace volání není součástí. Připojení je vytvořeno pomocí CallLocator vlastnost a může být typu: ServerCallLocator, GroupCallLocator a RoomCallLocator. Tato ID se dají najít, když se volání původně vytvoří nebo se vytvoří místnost a publikuje se také jako součást události CallStarted .

Pokud se chcete připojit k libovolnému volání 1:1 nebo skupině, použijte ServerCallLocator. Pokud jste spustili volání pomocí GroupCallId, můžete také použít GroupCallLocator.

Uri callbackUri = new Uri("https://<myendpoint>/Events"); //the callback endpoint where you want to receive subsequent events
CallLocator serverCallLocator = new ServerCallLocator("<ServerCallId>");
ConnectCallResult response = await client.ConnectCallAsync(serverCallLocator, callbackUri);

Pokud se chcete připojit k volání Místnosti, použijte RoomCallLocator, který přebírá RoomId. Přečtěte si další informace o místnostech a o tom, jak lze rozhraní API pro automatizaci volání použít ke správě probíhajících volání místností.

Uri callbackUri = new Uri("https://<myendpoint>/Events"); //the callback endpoint where you want to receive subsequent events
CallLocator roomCallLocator = new RoomCallLocator("<RoomId>");
ConnectCallResult response = await client.ConnectCallAsync(roomCallLocator, callbackUri);

Úspěšná odpověď vám poskytne objekt CallConnection, který můžete použít k provedení dalších akcí s tímto voláním. Do koncového bodu zpětného volání, který jste zadali dříve, se publikují dvě události:

  1. CallConnected událost s oznámením, že jste se úspěšně připojili k volání.
  2. ParticipantsUpdated událost, která obsahuje nejnovější seznam účastníků hovoru.

Pokud se vaše služba od tohoto volání odpojí, budete kdykoli po úspěšném připojení upozorněni prostřednictvím události CallDisconected. Selhání připojení k volání na prvním místě způsobí událost ConnectFailed.

Sekvenční diagram pro připojení k volání

Přijetí příchozího hovoru

Jakmile se přihlásíte k odběru oznámení o příchozích hovorech k vašemu prostředku, přijmete příchozí hovor. Při odpovídání na hovor je nutné zadat adresu URL zpětného volání. Komunikační služby publikuje všechny následné události týkající se tohoto volání této adresy URL.

string incomingCallContext = "<IncomingCallContext_From_IncomingCall_Event>"; 
Uri callBackUri = new Uri("https://<myendpoint_where_I_want_to_receive_callback_events"); 

var answerCallOptions = new AnswerCallOptions(incomingCallContext, callBackUri);  
AnswerCallResult answerResponse = await client.AnswerCallAsync(answerCallOptions);
CallConnection callConnection = answerResponse.CallConnection; 

Odpověď poskytuje objekt CallConnection, který můžete použít k provedení dalších akcí s tímto voláním po připojení. Po přijetí volání se do koncového bodu zpětného volání, který jste zadali dříve, publikují dvě události:

  1. CallConnected událost s oznámením, že hovor byl vytvořen s volajícím.
  2. ParticipantsUpdated událost, která obsahuje nejnovější seznam účastníků hovoru.

Sekvenční diagram pro příjem příchozího hovoru

V případě selhání operace odpovědi se zobrazí AnswerFailed událost s kódy chyb pro další řešení potíží (další informace o kódech chyb najdete na této stránce ).

Odmítnutí hovoru

Příchozí hovor můžete odmítnout, jak je znázorněno níže. Můžete zadat důvod zamítnutí: žádný, zaneprázdněný nebo zakázaný. Pokud není nic zadané, není ve výchozím nastavení zvolena žádná.

string incomingCallContext = "<IncomingCallContext_From_IncomingCall_Event>"; 
var rejectOption = new RejectCallOptions(incomingCallContext); 
rejectOption.CallRejectReason = CallRejectReason.Forbidden; 
_ = await client.RejectCallAsync(rejectOption); 

Pro akci zamítnutí nejsou publikovány žádné události.

Přesměrování hovoru

Příchozí hovor můžete přesměrovat do jiného koncového bodu bez odpovědi. Přesměrování volání odebere schopnost aplikace řídit volání pomocí automatizace volání.

string incomingCallContext = "<IncomingCallContext_From_IncomingCall_Event>"; 
var target = new CallInvite(new CommunicationUserIdentifier("<user_id_of_target>")); //user id looks like 8:a1b1c1-... 
_ = await client.RedirectCallAsync(incomingCallContext, target); 

Pokud chcete hovor přesměrovat na telefonní číslo, vytvořte cílové ID a ID volajícího pomocí PhoneNumberIdentifier.

var callerIdNumber = new PhoneNumberIdentifier("+16044561234"); // This is the Azure Communication Services provisioned phone number for the caller
var target = new CallInvite(new PhoneNumberIdentifier("+16041234567"), callerIdNumber);

Pro přesměrování se nepublikují žádné události. Pokud je cílem uživatel komunikačních služeb nebo telefonní číslo vlastněné vaším prostředkem, vygeneruje novou událost IncomingCall s polem to nastaveným na cíl, který jste zadali.

Přepojení účastníka v hovoru

Když vaše aplikace přijme hovor nebo umístí odchozí volání do koncového bodu, je možné tento koncový bod přenést do jiného cílového koncového bodu. Přenos volání 1:1 odebere vaši aplikaci z hovoru a tím odebere její schopnost řídit volání pomocí automatizace volání. Pozvánka na volání do cíle zobrazí ID volajícího přenášeného koncového bodu. Poskytnutí vlastního ID volajícího se nepodporuje.

var transferDestination = new CommunicationUserIdentifier("<user_id>"); 
var transferOption = new TransferToParticipantOptions(transferDestination) {
    OperationContext = "<Your_context>",
    OperationCallbackUri = new Uri("<uri_endpoint>") // Sending event to a non-default endpoint.
};
// adding customCallingContext
transferOption.CustomCallingContext.AddVoip("customVoipHeader1", "customVoipHeaderValue1");
transferOption.CustomCallingContext.AddVoip("customVoipHeader2", "customVoipHeaderValue2");

TransferCallToParticipantResult result = await callConnection.TransferCallToParticipantAsync(transferOption);

Když vaše aplikace odpoví na skupinové volání nebo umístí odchozí volání skupiny do koncového bodu nebo přidá účastníka do volání 1:1, může se koncový bod přenést z volání do jiného cílového koncového bodu s výjimkou koncového bodu automatizace volání. Když přepojíte účastníka ve skupinovém hovoru, odebere se koncový bod, který se z hovoru přepojí. Pozvánka na volání do cíle zobrazí ID volajícího přenášeného koncového bodu. Poskytnutí vlastního ID volajícího se nepodporuje.

// Transfer User
var transferDestination = new CommunicationUserIdentifier("<user_id>");
var transferee = new CommunicationUserIdentifier("<transferee_user_id>"); 
var transferOption = new TransferToParticipantOptions(transferDestination);
transferOption.Transferee = transferee;

// adding customCallingContext
transferOption.CustomCallingContext.AddVoip("customVoipHeader1", "customVoipHeaderValue1");
transferOption.CustomCallingContext.AddVoip("customVoipHeader2", "customVoipHeaderValue2");

transferOption.OperationContext = "<Your_context>";
transferOption.OperationCallbackUri = new Uri("<uri_endpoint>");
TransferCallToParticipantResult result = await callConnection.TransferCallToParticipantAsync(transferOption);

// Transfer PSTN User
var transferDestination = new PhoneNumberIdentifier("<target_phoneNumber>");
var transferee = new PhoneNumberIdentifier("<transferee_phoneNumber>"); 
var transferOption = new TransferToParticipantOptions(transferDestination);
transferOption.Transferee = transferee;

// adding customCallingContext
transferOption.CustomCallingContext.AddSipUui("uuivalue");
transferOption.CustomCallingContext.AddSipX("header1", "headerValue");

transferOption.OperationContext = "<Your_context>";

// Sending event to a non-default endpoint.
transferOption.OperationCallbackUri = new Uri("<uri_endpoint>");

TransferCallToParticipantResult result = await callConnection.TransferCallToParticipantAsync(transferOption);

V sekvenčním diagramu je vidět očekávaný tok, když vaše aplikace umístí odchozí volání a pak ho přenese do jiného koncového bodu.

Sekvenční diagram pro umístění volání 1:1 a jeho následné přenesení

Přidání účastníka do hovoru

Účastníka (uživatel komunikační služby nebo telefonní číslo) můžete přidat do existujícího hovoru. Při přidávání telefonního čísla je povinné zadat ID volajícího. Toto ID volajícího se zobrazí při oznámení o hovoru přidanému účastníkovi.

// Add user
var addThisPerson = new CallInvite(new CommunicationUserIdentifier("<user_id>"));
// add custom calling context
addThisPerson.CustomCallingContext.AddVoip("myHeader", "myValue");
AddParticipantsResult result = await callConnection.AddParticipantAsync(addThisPerson);

// Add PSTN user
var callerIdNumber = new PhoneNumberIdentifier("+16044561234"); // This is the Azure Communication Services provisioned phone number for the caller
var addThisPerson = new CallInvite(new PhoneNumberIdentifier("+16041234567"), callerIdNumber);
// add custom calling context
addThisPerson.CustomCallingContext.AddSipUui("value");
addThisPerson.CustomCallingContext.AddSipX("header1", "customSipHeaderValue1");

// Use option bag to set optional parameters
var addParticipantOptions = new AddParticipantOptions(new CallInvite(addThisPerson))
{
    InvitationTimeoutInSeconds = 60,
    OperationContext = "operationContext",
    OperationCallbackUri = new Uri("uri_endpoint"); // Sending event to a non-default endpoint.
};

AddParticipantsResult result = await callConnection.AddParticipantAsync(addParticipantOptions); 

Pokud chcete přidat uživatele Komunikační služby, zadejte místo PhoneNumberIdentifier CommunicationUserIdentifier. ID volajícího není v tomto případě povinné.

AddParticipant publikuje AddParticipantSucceeded událost spolu AddParticipantFailed s ParticipantUpdated nejnovějším seznamem účastníků hovoru.

Sekvenční diagram pro přidání účastníka do hovoru

Zrušení žádosti o přidání účastníka

// add a participant
var addThisPerson = new CallInvite(new CommunicationUserIdentifier("<user_id>"));
var addParticipantResponse = await callConnection.AddParticipantAsync(addThisPerson);

// cancel the request with optional parameters
var cancelAddParticipantOperationOptions = new CancelAddParticipantOperationOptions(addParticipantResponse.Value.InvitationId)
{
    OperationContext = "operationContext",
    OperationCallbackUri = new Uri("uri_endpoint"); // Sending event to a non-default endpoint.
}
await callConnection.CancelAddParticipantOperationAsync(cancelAddParticipantOperationOptions);

Odebrání účastníka z hovoru

var removeThisUser = new CommunicationUserIdentifier("<user_id>"); 

// remove a participant from the call with optional parameters
var removeParticipantOptions = new RemoveParticipantOptions(removeThisUser)
{
    OperationContext = "operationContext",
    OperationCallbackUri = new Uri("uri_endpoint"); // Sending event to a non-default endpoint.
}

RemoveParticipantsResult result = await callConnection.RemoveParticipantAsync(removeParticipantOptions);

RemoveParticipant publikuje RemoveParticipantSucceeded událost spolu RemoveParticipantFailed s ParticipantUpdated událostí s nejnovějším seznamem účastníků hovoru. Odebraný účastník se ze seznamu vynechá.
Sekvenční diagram pro odebrání účastníka z hovoru

Zavěsit hovor

Akci Zavěsit můžete použít k odebrání aplikace z volání nebo ukončení skupinového volání nastavením parametru forEveryone na hodnotu true. U hovoru ve 1:1 zavěsíte hovor ve výchozím nastavení s druhým účastníkem.

_ = await callConnection.HangUpAsync(forEveryone: true); 

Jakmile se akce hangUp úspěšně dokončí, publikuje se událost CallDisconnected.

Získání informací o účastníkovi hovoru

CallParticipant participantInfo = await callConnection.GetParticipantAsync(new CommunicationUserIdentifier("<user_id>"));

Získání informací o všech účastnících hovoru

List<CallParticipant> participantList = (await callConnection.GetParticipantsAsync()).Value.ToList(); 

Získání nejnovějších informací o hovoru

CallConnectionProperties callConnectionProperties = await callConnection.GetCallConnectionPropertiesAsync();