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.

Poznámka:

Automatizace volání v současné době nepodporuje hovory místností .

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 Telefon NumberIdentifier 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 jedná se o Call Připojení ion objekt získaný z odpovědi Answer nebo CreateCall odpovědi. 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í uživatele služby Communication Services, je nutné zadat CommunicationUserIdentifier objekt místo Telefon NumberIdentifier.

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ěď vám poskytne objekt Call Připojení ion, 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. Sequence diagram for placing an outbound call.

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ěď vám poskytne objekt Call Připojení ion, 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.

Sequence diagram for answering an incoming call.

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í Telefon NumberIdentifier.

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.

Sequence diagram for placing a 1:1 call and then transferring it.

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); 

Chcete-li přidat uživatele služby Communication Services, místo Telefon NumberIdentifier zadejte 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.

Sequence diagram for adding a participant to the call.

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á.
Sequence diagram for removing a participant from the call.

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();