Поделиться через


Запись вызова при запуске

Запись вызовов часто используется непосредственно через пользовательский интерфейс вызывающего приложения, где пользователь активирует запись. Для приложений в таких отраслях, как банковские или медицинские услуги, запись звонков требуется от get-go. Служба должна автоматически записывать данные в целях соответствия требованиям. В этом примере показано, как записать вызов при запуске. Он использует Службы коммуникации Azure и Сетка событий Azure для активации функции Azure при запуске вызова. Он автоматически записывает каждый вызов в Службы коммуникации Azure ресурсе.

В этом кратком руководстве мы сосредоточимся на демонстрации обработки событий, запущенных вызовом, с помощью Функции Azure с помощью триггеров сетки событий. Для начала записи мы используем пакет SDK службы автоматизации вызовов для Службы коммуникации Azure.

Событие "Начало вызова" при форматировании запуска вызова следующим образом:


[
  {
    "id": "a8bcd8a3-12d7-46ba-8cde-f6d0bda8feeb",
    "topic": "/subscriptions/{subscription-id}/resourcegroups/{group-name}/providers/microsoft.communication/communicationservices/{communication-services-resource-name}",
    "subject": "call/{serverCallId}/startedBy/8:acs:bc360ba8-d29b-4ef2-b698-769ebef85521_0000000c-1fb9-4878-07fd-0848220077e1",
    "data": {
      "startedBy": {
        "communicationIdentifier": {
          "rawId": "8:acs:bc360ba8-d29b-4ef2-b698-769ebef85521_0000000c-1fb9-4878-07fd-0848220077e1",
          "communicationUser": {
            "id": "8:acs:bc360ba8-d29b-4ef2-b698-769ebef85521_0000000c-1fb9-4878-07fd-0848220077e1"
          }
        },
        "role": "{role}"
      },
      "serverCallId": "{serverCallId}",
      "group": {
        "id": "00000000-0000-0000-0000-000000000000"
      },
      "room": {
        "id": "{roomId}"
      },
      "isTwoParty": false,
      "correlationId": "{correlationId}",
      "isRoomsCall": true
    },
    "eventType": "Microsoft.Communication.CallStarted",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "eventTime": "2021-09-22T17:02:38.6905856Z"
  }
]

Примечание.

Использование Сетка событий Azure несет дополнительные затраты. Дополнительные сведения см. в Сетка событий Azure ценах.

Предварительные требования

Настройка нашей локальной среды

  1. С помощью Visual Studio Code установите расширение Функции Azure.

  2. С расширением создайте функцию Azure, следуя этим инструкциям.

    Настройте функцию со следующими инструкциями:

    • Язык: C#
    • Шаблон: триггер Сетка событий Azure
    • Имя функции: определяемое пользователем

    После создания вы увидите функцию, созданную в каталоге следующим образом:

    
    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.EventGrid;
    using Microsoft.Extensions.Logging;
    using Azure.Messaging.EventGrid;
    using System.Threading.Tasks;
    
    namespace Company.Function
    {
        public static class acs_recording_test
        {
            [FunctionName("acs_recording_test")]
            public static async Task RunAsync([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
            {
                log.LogInformation(eventGridEvent.EventType);
            }
    
        }
    }
    
    

Настройка функции Azure для получения CallStarted события

  1. Настройте функцию Azure для выполнения действий при CallStarted активации события.

    public static async Task RunAsync([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
    {
        if(eventGridEvent.EventType == "Microsoft.Communication.CallStarted")
        {
            log.LogInformation("Call started");
            var callEvent = eventGridEvent.Data.ToObjectFromJson<CallStartedEvent>();
            
            // CallStartedEvent class is defined in documentation, but the objects looks like this:
            // public class CallStartedEvent
            // {
            //     public StartedBy startedBy { get; set; }
            //     public string serverCallId { get; set; }
            //     public Group group { get; set; }
            //     public bool isTwoParty { get; set; }
            //     public string correlationId { get; set; }
            //     public bool isRoomsCall { get; set; }
            // }
            // public class Group
            // {
            //     public string id { get; set; }
            // }
            // public class StartedBy
            // {
            //     public CommunicationIdentifier communicationIdentifier { get; set; }
            //     public string role { get; set; }
            // }
            // public class CommunicationIdentifier
            // {
            //     public string rawId { get; set; }
            //     public CommunicationUser communicationUser { get; set; }
            // }
            // public class CommunicationUser
            // {
            //     public string id { get; set; }
            // }
        }
    }

Начать запись

  1. Создайте метод для обработки CallStarted событий. Этот метод активирует запись для запуска при запуске вызова.

    public static async Task RunAsync([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
    {
        if(eventGridEvent.EventType == "Microsoft.Communication.CallStarted")
        {
            log.LogInformation("Call started");
            var callEvent = eventGridEvent.Data.ToObjectFromJson<CallStartedEvent>();
            await startRecordingAsync(callEvent.serverCallId);
        }
    }

    public static async Task startRecordingAsync (String serverCallId)
    {
        CallAutomationClient callAutomationClient = new CallAutomationClient(Environment.GetEnvironmentVariable("ACS_CONNECTION_STRING"));
        StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator(serverCallId));
        recordingOptions.RecordingChannel = RecordingChannel.Mixed;
        recordingOptions.RecordingContent = RecordingContent.AudioVideo;
        recordingOptions.RecordingFormat = RecordingFormat.Mp4;        
        var startRecordingResponse = await callAutomationClient.GetCallRecording()
            .StartRecordingAsync(recordingOptions).ConfigureAwait(false);
    }

Локальное выполнение

Чтобы запустить функцию локально, можно нажать клавишу F5 Visual Studio Code. Мы используем ngrok, чтобы подключить нашу локальную функцию Azure с Сетка событий Azure.

  1. После запуска функции мы настроим ngrok. (Необходимо скачать ngrok для вашей среды.)

     ngrok http 7071
    

    Скопируйте ссылку ngrok, указанную в месте выполнения функции.

  2. Настройте события CallStarted через сетку событий в Службы коммуникации Azure ресурсе. Мы делаем это с помощью Azure CLI. Вам нужен идентификатор ресурса для ресурса Службы коммуникации Azure, найденного в портал Azure. (Идентификатор ресурса выглядит примерно так: /subscriptions/<<AZURE SUBSCRIPTION ID>>/resourceGroups/<<RESOURCE GROUP NAME>>/providers/Microsoft.Communication/CommunicationServices/<<RESOURCE NAME>>)

    
    az eventgrid event-subscription create --name "<<EVENT_SUBSCRIPTION_NAME>>" --endpoint-type webhook --endpoint "<<NGROK URL>>/runtime/webhooks/EventGrid?functionName=<<FUNCTION NAME>> " --source-resource-id "<<RESOURCE_ID>>"  --included-event-types Microsoft.Communication.CallStarted
    
    
  3. Теперь, когда все подключено, протестируйте поток, запустив вызов ресурса. Вы увидите журналы консоли в терминале, где выполняется функция. Вы можете проверка, что запись начинается с помощью функции записи вызовов в пакете SDK для вызова и проверка для логического включения true.

Развернуть в Azure

Чтобы развернуть функцию Azure в Azure, необходимо выполнить следующие инструкции. После развертывания мы настроим сетку событий для ресурса Службы коммуникации Azure. С URL-адресом развернутой функции Azure (URL-адрес, найденный в портал Azure под функцией), мы выполните аналогичную команду:


az eventgrid event-subscription update --name "<<EVENT_SUBSCRIPTION_NAME>>" --endpoint-type azurefunction --endpoint "<<AZ FUNCTION URL>> " --source-resource-id "<<RESOURCE_ID>>"

Так как мы обновляем созданную подписку на события, обязательно используйте то же имя подписки на события, которое вы использовали на предыдущем шаге.

Вы можете протестировать, выполнив вызов в ресурсе, как показано на предыдущем шаге.