Bagikan melalui


Cara mengontrol dan mengarahkan panggilan dengan Automasi Panggilan

Automasi Panggilan menggunakan antarmuka REST API untuk menerima permintaan tindakan dan memberikan respons untuk memberi tahu apakah permintaan berhasil dikirimkan atau tidak. Karena sifat panggilan asinkron, sebagian besar tindakan memiliki peristiwa yang sesuai yang dipicu ketika tindakan berhasil diselesaikan atau gagal. Panduan ini mencakup tindakan yang tersedia untuk panggilan kemudi, seperti CreateCall, Transfer, Pengalihan, dan pengelolaan peserta. Tindakan disertai dengan kode sampel tentang cara memanggil tindakan yang dikatakan dan diagram urutan yang menjelaskan peristiwa yang diharapkan setelah memanggil tindakan. Diagram ini membantu Anda memvisualisasikan cara memprogram aplikasi layanan Anda dengan Automasi Panggilan.

Automation Panggilan mendukung berbagai tindakan lain untuk mengelola media panggilan dan perekaman yang memiliki panduan terpisah.

Sebagai prasyarat, kami sarankan Anda membaca artikel ini untuk memanfaatkan panduan ini:

  1. Panduan konsep Call Automation yang menjelaskan model pemrograman peristiwa tindakan dan panggilan balik peristiwa.
  2. Pelajari tentang pengidentifikasi pengguna seperti CommunicationUserIdentifier dan PhoneNumberIdentifier yang digunakan dalam panduan ini.

Untuk semua sampel kode, client adalah objek CallAutomationClient yang dapat dibuat seperti yang ditunjukkan dan callConnection merupakan objek CallConnection yang diperoleh dari respons Answer atau CreateCall. Anda juga dapat memperolehnya dari peristiwa panggilan balik yang diterima oleh aplikasi Anda.

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

Melakukan panggilan keluar

Anda dapat melakukan panggilan 1:1 atau grup ke pengguna komunikasi atau nomor telepon (nomor publik atau milik Communication Services). Saat memanggil titik akhir PSTN, Anda juga perlu memberikan nomor telepon yang digunakan sebagai ID pemanggil sumber dan ditampilkan dalam pemberitahuan panggilan ke titik akhir PSTN target. Untuk melakukan panggilan ke pengguna Communication Services, Anda perlu menyediakan objek CommunicationUserIdentifier alih-alih 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);

Saat melakukan panggilan grup yang menyertakan nomor telepon, Anda harus memberikan nomor telepon yang digunakan sebagai nomor ID penelepon ke titik akhir 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);

Respons memberi Anda objek CallConnection yang dapat Anda gunakan untuk mengambil tindakan lebih lanjut pada panggilan ini setelah tersambung. Setelah panggilan dijawab, dua peristiwa dipublikasikan ke titik akhir panggilan balik yang Anda berikan sebelumnya:

  1. CallConnected peristiwa yang memberi tahu bahwa panggilan telah dibuat dengan penerima panggilan.
  2. ParticipantsUpdated acara yang berisi daftar peserta terbaru dalam panggilan. Diagram urutan untuk melakukan panggilan keluar.

Jika panggilan gagal, Anda akan menerima CallDisconnected peristiwa dan CreateCallFailed dengan kode kesalahan untuk pemecahan masalah lebih lanjut (lihat halaman ini untuk informasi selengkapnya tentang kode kesalahan Automation Panggilan).

Menyambungkan ke panggilan (dalam pratinjau)

Tindakan sambungkan memungkinkan layanan Anda membuat koneksi dengan panggilan yang sedang berlangsung dan mengambil tindakan di atasnya. Ini berguna untuk mengelola panggilan Rooms atau ketika aplikasi klien memulai panggilan 1:1 atau grup yang memanggil otomatisasi bukan bagian darinya. Koneksi dibuat menggunakan properti CallLocator dan dapat berupa jenis: ServerCallLocator, GroupCallLocator, dan RoomCallLocator. ID ini dapat ditemukan ketika panggilan awalnya dibuat atau Ruangan dibuat, dan juga diterbitkan sebagai bagian dari peristiwa CallStarted .

Untuk menyambungkan ke panggilan 1:1 atau grup apa pun, gunakan ServerCallLocator. Jika Anda memulai panggilan menggunakan GroupCallId, Anda juga dapat menggunakan 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);

Untuk menyambungkan ke panggilan Rooms, gunakan RoomCallLocator yang mengambil RoomId. Pelajari selengkapnya tentang Ruang dan bagaimana API Automasi Panggilan dapat digunakan untuk mengelola panggilan Kamar yang sedang berlangsung.

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

Respons yang berhasil memberi Anda objek CallConnection yang dapat Anda gunakan untuk mengambil tindakan lebih lanjut pada panggilan ini. Dua peristiwa diterbitkan ke titik akhir panggilan balik yang Anda berikan sebelumnya:

  1. CallConnected peristiwa yang memberi tahu bahwa Anda berhasil tersambung ke panggilan.
  2. ParticipantsUpdated acara yang berisi daftar peserta terbaru dalam panggilan.

Kapan saja setelah koneksi berhasil, jika layanan Anda terputus dari panggilan ini, Anda akan diberi tahu melalui peristiwa CallDisconected. Kegagalan untuk menyambungkan ke panggilan di tempat pertama menghasilkan peristiwa ConnectFailed.

Diagram urutan untuk menyambungkan ke panggilan.

Menjawab panggilan masuk

Setelah berlangganan untuk menerima pemberitahuan panggilan masuk ke sumber daya, Anda akan menjawab panggilan masuk. Saat menjawab panggilan, Anda perlu memberikan url panggilan balik. Communication Services memposting semua peristiwa berikutnya tentang panggilan ini ke url tersebut.

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; 

Respons memberi Anda objek CallConnection yang dapat Anda gunakan untuk mengambil tindakan lebih lanjut pada panggilan ini setelah tersambung. Setelah panggilan dijawab, dua peristiwa dipublikasikan ke titik akhir panggilan balik yang Anda berikan sebelumnya:

  1. CallConnected peristiwa yang memberi tahu bahwa panggilan telah dibuat dengan pemanggil.
  2. ParticipantsUpdated acara yang berisi daftar peserta terbaru dalam panggilan.

Diagram urutan untuk menjawab panggilan masuk.

Menolak panggilan

Anda dapat memilih untuk menolak panggilan masuk seperti yang ditunjukkan di bawah ini. Anda dapat memberikan alasan penolakan: tidak ada, sibuk, atau terlarang. Jika tidak ada yang disediakan, tidak ada yang dipilih secara default.

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

Tidak ada peristiwa yang diterbitkan untuk tindakan penolakan.

Mengalihkan panggilan

Anda dapat memilih untuk mengalihkan panggilan masuk ke titik akhir lain tanpa menjawabnya. Mengalihkan panggilan akan menghapus kemampuan aplikasi Anda untuk mengontrol panggilan menggunakan Automasi Panggilan.

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

Untuk mengalihkan panggilan ke nomor telepon, buat target dan ID pemanggil dengan 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);

Tidak ada peristiwa yang diterbitkan untuk pengalihan. Jika target adalah pengguna Communication Services atau nomor telepon yang dimiliki oleh sumber daya Anda, target tersebut menghasilkan peristiwa IncomingCall baru dengan bidang 'ke' yang diatur ke target yang Anda tentukan.

Mentransfer peserta dalam panggilan

Saat aplikasi Anda menjawab panggilan atau melakukan panggilan keluar ke titik akhir, titik akhir tersebut dapat ditransfer ke titik akhir tujuan lain. Mentransfer panggilan 1:1 menghapus aplikasi Anda dari panggilan dan karenanya menghapus kemampuannya untuk mengontrol panggilan menggunakan Automation Panggilan. Undangan panggilan ke target akan menampilkan ID pemanggil titik akhir yang sedang ditransfer. Menyediakan ID pemanggil kustom tidak didukung.

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

Saat aplikasi Anda menjawab panggilan grup atau melakukan panggilan grup keluar ke titik akhir atau menambahkan peserta ke panggilan 1:1, titik akhir dapat ditransfer dari panggilan ke titik akhir tujuan lain, kecuali titik akhir otomatisasi panggilan. Mentransfer peserta dalam panggilan grup akan menghapus titik akhir yang sedang ditransfer dari panggilan. Undangan panggilan ke target akan menampilkan ID pemanggil titik akhir yang sedang ditransfer. Menyediakan ID pemanggil kustom tidak didukung.

// 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 urutan menunjukkan alur yang diharapkan saat aplikasi Anda melakukan panggilan keluar lalu mentransfernya ke titik akhir lain.

Diagram urutan untuk melakukan panggilan 1:1 lalu mentransfernya.

Menambahkan peserta ke panggilan

Anda dapat menambahkan peserta (pengguna Communication Services atau nomor telepon) ke panggilan yang sudah ada. Saat menambahkan nomor telepon, anda harus memberikan ID penelepon. ID penelepon ini ditampilkan pada pemberitahuan panggilan kepada peserta yang ditambahkan.

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

Untuk menambahkan pengguna Communication Services, berikan CommunicationUserIdentifier alih-alih PhoneNumberIdentifier. ID pemanggil tidak wajib dalam hal ini.

AddParticipant menerbitkan atau AddParticipantSucceeded AddParticipantFailed acara, bersama dengan ParticipantUpdated menyediakan daftar peserta terbaru dalam panggilan.

Diagram urutan untuk menambahkan peserta ke panggilan.

Membatalkan permintaan tambahkan peserta

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

Hapus peserta dari panggilan

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 akan menerbitkan atau RemoveParticipantSucceeded RemoveParticipantFailed acara, bersama dengan acara yang ParticipantUpdated menyediakan daftar peserta terbaru dalam panggilan. Peserta yang dihapus dihilangkan dari daftar.
Diagram urutan untuk menghapus peserta dari panggilan.

Menutup panggilan

Tindakan Hang Up dapat digunakan untuk menghapus aplikasi Anda dari panggilan atau untuk mengakhiri panggilan grup dengan mengatur parameter forEveryone ke true. Untuk panggilan 1:1, menutup panggilan dengan peserta lain secara default.

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

Peristiwa CallDisconnected diterbitkan setelah tindakan hangUp berhasil diselesaikan.

Mendapatkan informasi tentang peserta panggilan

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

Mendapatkan informasi tentang semua peserta panggilan

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

Mendapatkan info terbaru tentang panggilan

CallConnectionProperties callConnectionProperties = await callConnection.GetCallConnectionPropertiesAsync();