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.

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 PhoneNumberIdentifier używanych w tym przewodniku.

W przypadku wszystkich przykładów kodu obiekt CallAutomationClient, client który można utworzyć, jak pokazano, i callConnection jest obiektem CallConnection 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 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);

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 CallConnection, 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. Diagram sekwencji do umieszczenia wywołania wychodzącego.

W przypadku niepowodzenia wywołania zostanie wyświetlone CallDisconnected zdarzenie i CreateCallFailed z kodami błędów w celu dalszego rozwiązywania problemów (zobacz tę stronę , aby uzyskać więcej informacji na temat kodów błędów).

Nawiązywanie połączenia z połączeniem

Akcja połącz umożliwia usłudze nawiązanie połączenia z trwającym wywołaniem i podjęcie na nim akcji. Jest to przydatne w przypadku zarządzania wywołaniem usługi Rooms lub uruchamianiem wywołania przez aplikacje klienckie 1:1 lub grupy, które nie są częścią automatyzacji wywołań. Połączenie jest ustanawiane przy użyciu właściwości CallLocator i może być typami: ServerCallLocator, GroupCallLocator i RoomCallLocator. Te identyfikatory można znaleźć po utworzeniu wywołania lub utworzeniu pokoju, a także opublikowanym w ramach zdarzenia CallStarted .

Aby nawiązać połączenie z dowolnym wywołaniem 1:1 lub grupą, użyj obiektu ServerCallLocator. Jeśli uruchomiono połączenie przy użyciu elementu GroupCallId, możesz również użyć klasy 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);

Aby nawiązać połączenie z usługą Rooms, użyj funkcji RoomCallLocator, która przyjmuje parametr RoomId. Dowiedz się więcej o pokojach i sposobie używania interfejsu API usługi Call Automation do zarządzania trwającymi połączeniami w pokojach.

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

Pomyślna odpowiedź zawiera obiekt CallConnection, którego można użyć do wykonania dalszych akcji dla tego wywołania. Dwa zdarzenia są publikowane w podanym wcześniej punkcie końcowym wywołania zwrotnego:

  1. CallConnected zdarzenie z powiadomieniem o pomyślnym nawiązaniu połączenia.
  2. ParticipantsUpdated zdarzenie zawierające najnowszą listę uczestników połączenia.

W dowolnym momencie po pomyślnym nawiązaniu połączenia, jeśli usługa zostanie odłączona od tego wywołania, otrzymasz powiadomienie za pośrednictwem zdarzenia CallDisconected. Nie można nawiązać połączenia z wywołaniem w pierwszej kolejności powoduje wystąpienie zdarzenia ConnectFailed.

Diagram sekwencji umożliwiający nawiązywanie połączenia z wywołaniem.

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 CallConnection, 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.

Diagram sekwencji na potrzeby odpowiadania na połączenie przychodzące.

W przypadku niepowodzenia operacji odpowiedzi otrzymasz AnswerFailed zdarzenie z kodami błędów w celu dalszego rozwiązywania problemów (zobacz tę stronę , aby uzyskać więcej informacji na temat kodów błędów).

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

Ż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.

Diagram sekwencji do umieszczenia wywołania 1:1, a następnie przeniesienia go.

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 Communication Services, podaj parametr CommunicationUserIdentifier zamiast PhoneNumberIdentifier. 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.

Diagram sekwencji dodawania uczestnika do wywołania.

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.
Diagram sekwencji usuwania uczestnika z wywołania.

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