Udostępnij za pośrednictwem


Jak kontrolować i kierować wywołaniami za pomocą usługi Call Automation

Usługa Call Automation używa interfejsu API REST do odbierania żądań dotyczących akcji i dostarczania odpowiedzi w celu powiadomienia o tym, czy żądanie zostało pomyślnie przesłane, czy nie. Ze względu na asynchroniczny charakter wywoływania większość akcji ma odpowiednie zdarzenia, które są wyzwalane po pomyślnym zakończeniu akcji lub niepomyślnie. W tym przewodniku opisano akcje dostępne dla wywołań kierowniczych, takich jak CreateCall, Transfer, Redirect i zarządzanie uczestnikami. Akcje są dołączone do przykładowego kodu na temat wywoływania tej akcji i diagramów sekwencji opisujących zdarzenia oczekiwane po wywołaniu akcji. Te diagramy ułatwiają wizualizowanie sposobu programowania aplikacji usługi za pomocą usługi Call Automation.

Usługa Call Automation obsługuje różne inne akcje do zarządzania nośnikami połączeń i nagrywania, które mają oddzielne przewodniki.

Uwaga

Usługa Call Automation obecnie nie obsługuje połączeń Rooms .

W ramach wymagań wstępnych zalecamy przeczytanie tych artykułów, aby jak najlepiej wykorzystać ten przewodnik:

  1. Przewodnik pojęć związanych z usługą Call Automation opisujący model programowania zdarzeń akcji i wywołania zwrotne zdarzeń.
  2. Dowiedz się więcej o identyfikatorach użytkowników, takich jak CommunicationUserIdentifier i Telefon NumberIdentifier używanych w tym przewodniku.

Dla wszystkich przykładów kodu jest obiekt CallAutomationClient, client który można utworzyć, jak pokazano i callConnection jest obiektem Call Połączenie ion uzyskanym z odpowiedzi Answer lub CreateCall. Można go również uzyskać z zdarzeń wywołania zwrotnego odebranych przez aplikację.

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

Nawiązywanie połączenia wychodzącego

Możesz umieścić połączenie 1:1 lub grupę do użytkownika komunikacji lub numeru telefonu (publiczny lub komunikacyjny numer własności). Podczas wywoływania punktu końcowego PSTN należy również podać numer telefonu, który jest używany jako identyfikator obiektu wywołującego źródła i wyświetlany w powiadomieniu o wywołaniu do docelowego punktu końcowego PSTN. Aby umieścić wywołanie użytkownika usług Communication Services, należy podać obiekt CommunicationUserIdentifier zamiast 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);

Podczas nawiązywania połączenia grupowego zawierającego numer telefonu należy podać numer telefonu używany jako numer identyfikacyjny rozmówcy do punktu końcowego PSTN.

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

Odpowiedź zawiera obiekt Call Połączenie ion, którego można użyć do podjęcia dalszych akcji dla tego wywołania po nawiązaniu połączenia. Po udzieleniu odpowiedzi na połączenie dwa zdarzenia są publikowane w podanym wcześniej punkcie końcowym wywołania zwrotnego:

  1. CallConnected zdarzenie z powiadomieniem, że wywołanie zostało nawiązane z wywołaniem wywoływanym.
  2. ParticipantsUpdated zdarzenie zawierające najnowszą listę uczestników połączenia. Sequence diagram for placing an outbound call.

Odpowiedz na połączenie przychodzące

Po zasubskrybowaniu odbierania powiadomień połączeń przychodzących do zasobu otrzymasz połączenie przychodzące. Podczas odpowiadania na połączenie należy podać adres URL wywołania zwrotnego. Usługi komunikacyjne publikują wszystkie kolejne zdarzenia dotyczące tego wywołania do tego adresu 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; 

Odpowiedź zawiera obiekt Call Połączenie ion, którego można użyć do podjęcia dalszych akcji dla tego wywołania po nawiązaniu połączenia. Po udzieleniu odpowiedzi na połączenie dwa zdarzenia są publikowane w podanym wcześniej punkcie końcowym wywołania zwrotnego:

  1. CallConnected zdarzenie z powiadomieniem, że połączenie zostało nawiązane z obiektem wywołującym.
  2. ParticipantsUpdated zdarzenie zawierające najnowszą listę uczestników połączenia.

Sequence diagram for answering an incoming call.

Odrzucanie połączenia

Możesz odrzucić połączenie przychodzące, jak pokazano poniżej. Możesz podać przyczynę odrzucenia: brak, zajęty lub zabroniony. Jeśli nic nie zostanie podane, żadna z nich nie zostanie wybrana domyślnie.

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

Żadne zdarzenia nie są publikowane dla akcji odrzucania.

Przekierowywanie połączenia

Możesz przekierować połączenie przychodzące do innego punktu końcowego bez odpowiadania na nie. Przekierowanie wywołania eliminuje możliwość kontrolowania wywołania za pomocą usługi Call Automation.

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

Aby przekierować połączenie do numeru telefonu, skonstruuj identyfikator obiektu docelowego i rozmówcę przy użyciu 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);

Żadne zdarzenia nie są publikowane dla przekierowania. Jeśli elementem docelowym jest użytkownik usługi Communication Services lub numer telefonu należący do zasobu, generuje nowe zdarzenie IncomingCall z polem "to" ustawionym na określony element docelowy.

Przeniesienie uczestnika w rozmowie

Gdy aplikacja odpowiada na wywołanie lub umieszcza wywołanie wychodzące do punktu końcowego, ten punkt końcowy może zostać przeniesiony do innego docelowego punktu końcowego. Przeniesienie wywołania 1:1 spowoduje usunięcie aplikacji z wywołania, a tym samym usunięcie jej możliwości kontrolowania wywołania przy użyciu usługi Call Automation. Zaproszenie wywołania do obiektu docelowego spowoduje wyświetlenie identyfikatora obiektu wywołującego przesyłanego punktu końcowego. Podanie niestandardowego identyfikatora wywołującego nie jest obsługiwane.

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

Gdy aplikacja odpowiada na wywołanie grupy lub umieszcza wywołanie grupy wychodzącej do punktu końcowego lub dodała uczestnika do wywołania 1:1, punkt końcowy może zostać przeniesiony z wywołania do innego punktu końcowego docelowego, z wyjątkiem punktu końcowego automatyzacji wywołania. Przeniesienie uczestnika w wywołaniu grupy spowoduje usunięcie punktu końcowego przesyłanego z wywołania. Zaproszenie wywołania do obiektu docelowego spowoduje wyświetlenie identyfikatora obiektu wywołującego przesyłanego punktu końcowego. Podanie niestandardowego identyfikatora wywołującego nie jest obsługiwane.

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

Diagram sekwencji przedstawia oczekiwany przepływ, gdy aplikacja umieszcza wywołanie wychodzące, a następnie przesyła je do innego punktu końcowego.

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

Dodawanie uczestnika do połączenia

Możesz dodać uczestnika (użytkownika lub numer telefonu usług komunikacyjnych) do istniejącego połączenia. Podczas dodawania numeru telefonu należy podać identyfikator rozmówców. Ten identyfikator osoby wywołującej jest wyświetlany w powiadomieniu o wywołaniu do dodawanego uczestnika.

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

Aby dodać użytkownika usług Komunikacyjnych, podaj parametr CommunicationUserIdentifier zamiast Telefon NumberIdentifier. W tym przypadku identyfikator obiektu wywołującego nie jest obowiązkowy.

Aplikacja AddParticipant publikuje AddParticipantSucceeded zdarzenie lub AddParticipantFailed wraz z udostępnieniem ParticipantUpdated najnowszej listy uczestników połączenia.

Sequence diagram for adding a participant to the call.

Anulowanie żądania dodawania uczestnika

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

Usuwanie uczestnika z połączenia

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

Element RemoveParticipant opublikuje RemoveParticipantSucceeded wydarzenie lub RemoveParticipantFailed wraz ze zdarzeniem ParticipantUpdated zawierającym najnowszą listę uczestników połączenia. Usunięty uczestnik zostanie pominięty z listy.
Sequence diagram for removing a participant from the call.

Zawieszanie się na wywołaniu

Akcja zawieszania się może służyć do usunięcia aplikacji z wywołania lub zakończenia wywołania grupy przez ustawienie parametruEveryone na true. W przypadku wywołania 1:1 zawiesza się przerwanie połączenia z innym uczestnikiem domyślnie.

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

Zdarzenie CallDisconnected jest publikowane po pomyślnym zakończeniu akcji hangUp.

Uzyskiwanie informacji o uczestniku połączenia

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

Uzyskiwanie informacji o wszystkich uczestników połączeń

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

Uzyskiwanie najnowszych informacji o połączeniu

CallConnectionProperties callConnectionProperties = await callConnection.GetCallConnectionPropertiesAsync();