Планирование и трансляция заданий (.NET)

Центр Интернета вещей Azure позволяет планировать и отслеживать задания по обновлению для миллионов устройств. Что можно сделать с помощью заданий?

  • Обновление требуемых свойств

  • Обновление тегов

  • Вызов прямых методов

Задание выступает в роли оболочки для одного из этих действий и отслеживает его выполнение для определенного набора устройств в соответствии с запросом на двойнике устройства. Например, внутреннее приложение может использовать задание для вызова прямого метода перезапуска на 10 000 устройств. Вы можете определить набор устройств с помощью запроса на двойнике устройства и запланировать момент времени в будущем для выполнения задания. Задание отслеживает ход выполнения по мере того, как каждое из устройств получает вызов и выполняет прямой метод перезагрузки.

Дополнительные сведения об этих возможностях см. в указанных ниже статьях.

Примечание

Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовых и стандартных и бесплатных уровнях Центр Интернета вещей см. в статье Выбор подходящего уровня Центр Интернета вещей для решения.

В этой статье показано, как создать два консольных приложения .NET (C#):

  • Приложение устройства (SimulateDeviceMethods), которое реализует прямой метод LockDoor, вызываемый внутренним приложением.

  • Внутреннее приложение (ScheduleJob), которое создает два задания. Одно задание вызывает прямой метод lockDoor, а другое задание отправляет нужные обновления свойств на несколько устройств.

Примечание

Дополнительные сведения о средствах SDK, доступных для создания приложения устройства и внутреннего приложения, см. в статье Пакеты SDK для Интернета вещей Azure.

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

  • приведенному.

  • Центр Интернета вещей. Создайте его с помощью CLI или портал Azure.

  • Зарегистрированное устройство. Зарегистрируйте его на портале Azure.

  • Убедитесь, что в брандмауэре открыт порт 8883. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.

Создание приложения виртуального устройства

В этом разделе вы создадите консольное приложение .NET, которое отвечает на вызов прямого метода, выполняемый серверной частью решения.

  1. В Visual Studio выберите Создать новый проект, а затем выберите шаблон проекта Консольное приложение (.NET Framework) . Нажмите кнопку Далее, чтобы продолжить.

  2. В разделе Настроить новый проект введите имя проекта SimulateDeviceMethods и выберите Далее.

    Снимок экрана: всплывающее окно

  3. Примите версию .NET Framework по умолчанию и выберите Создать для создания проекта.

  4. В обозревателе решений щелкните правой кнопкой мыши проект SimulateDeviceMethods и выберите пункт Управление пакетами NuGet.

  5. В окне Диспетчер пакетов NuGet выберите Обзор и найдите Microsoft.Azure.Devices.Client. Нажмите кнопку Установить.

    Снимок экрана: диспетчер пакетов NuGet в Visual Studio.

    В результате выполняется скачивание и установка пакета NuGet SDK для устройств Azure IoT и его зависимостей, а также добавляется соответствующая ссылка.

  6. Добавьте следующие инструкции using в начало файла Program.cs :

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Text;
    
  7. Добавьте следующие поля в класс Program . Замените значение заполнителя строкой подключения устройства, записанной в предыдущем разделе.

    static string DeviceConnectionString = "<yourDeviceConnectionString>";
    static DeviceClient Client = null;
    
  8. Добавьте следующий код, чтобы реализовать прямой метод на устройстве:

    static Task<MethodResponse> LockDoor(MethodRequest methodRequest, object userContext)
    {
        Console.WriteLine();
        Console.WriteLine("Locking Door!");
        Console.WriteLine("\nReturning response for method {0}", methodRequest.Name);
    
        string result = "'Door was locked.'";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
    
  9. Добавьте следующий метод, чтобы реализовать прослушиватель двойников устройства на устройстве:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
    {
        Console.WriteLine("Desired property change:");
        Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    }
    
  10. И наконец, добавьте этот код в метод Main, чтобы открыть подключение к Центру Интернета вещей и инициализировать прослушиватель метода:

    try
    {
        Console.WriteLine("Connecting to hub");
        Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
          TransportType.Mqtt);
    
        Client.SetMethodHandlerAsync("LockDoor", LockDoor, null);
        Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null);
    
        Console.WriteLine("Waiting for direct method call and device twin update\n Press enter to exit.");
        Console.ReadLine();
    
        Console.WriteLine("Exiting...");
    
        Client.SetMethodHandlerAsync("LockDoor", null, null);
        Client.CloseAsync().Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    
  11. Сохраните результаты работы и создайте решение.

Примечание

Для простоты в этой статье не реализуются политики повторных попыток. В рабочем коде следует реализовать политики повтора (например, повторную попытку подключения), как указано в статье Обработка временных сбоев.

Получение строки подключения центра Интернета вещей

В этой статье вы создадите серверную службу, которая планирует задание для вызова прямого метода на устройстве, планирует задание для обновления двойника устройства и отслеживает ход выполнения каждого задания. Для выполнения этих операций службе требуются разрешения registry read и registry write. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой registryReadWrite, которая предоставляет это разрешение.

Чтобы получить строку подключения Центра Интернета вещей для политики registryReadWrite, выполните следующие действия:

  1. На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.

  2. В левой части центра выберите Политики общего доступа.

  3. В списке политик выберите политику registryReadWrite.

  4. Скопируйте основную строку подключения и сохраните значение.

    Снимок экрана: получение строки подключения

Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.

Планирование заданий для вызова прямого метода и обновления свойств двойника устройства

В этом разделе вы создадите консольное приложение .NET на языке C#, которое использует задания для вызова прямого метода LockDoor и для обновления свойств на нескольких устройствах.

  1. В Visual Studio выберите Файл>Создать>Проект. В окне Создание проекта выберите Консольное приложение (.NET Framework) и нажмите кнопку Далее.

  2. В Настроить новый проект, присвойте проекту имя ScheduleJob, а потом выберите Создать.

    Настройка проекта ScheduleJob и присвоение ему имени

    Снимок экрана: всплывающее окно

  3. Примите версию .NET Framework по умолчанию и выберите Создать для создания проекта.

  4. В обозревателе решений щелкните правой кнопкой мыши проект ScheduleJob и выберите Управление пакетами NuGet.

  5. В окне Диспетчер пакетов NuGet щелкните Обзор, найдите и выберите Microsoft.Azure.Devices, а затем щелкните Установить.

    В результате выполняется скачивание и установка пакета NuGet SDK для служб Azure IoT и его зависимостей, а также добавляется соответствующая ссылка.

  6. Добавьте следующие инструкции using в начало файла Program.cs :

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  7. Добавьте следующую инструкцию using, если она отсутствует в инструкциях по умолчанию.

    using System.Threading;
    using System.Threading.Tasks;
    
  8. Добавьте следующие поля в класс Program . Замените заполнители строкой подключения Центра Интернета вещей, скопированной в разделе Получение строки подключения центра Интернета вещей, и именем устройства.

    static JobClient jobClient;
    static string connString = "<yourIotHubConnectionString>";
    static string deviceId = "<yourDeviceId>";
    
  9. Добавьте следующий метод в класс Program .

    public static async Task MonitorJob(string jobId)
    {
        JobResponse result;
        do
        {
            result = await jobClient.GetJobAsync(jobId);
            Console.WriteLine("Job Status : " + result.Status.ToString());
            Thread.Sleep(2000);
        } while ((result.Status != JobStatus.Completed) && 
          (result.Status != JobStatus.Failed));
    }
    
  10. Добавьте следующий метод в класс Program .

    public static async Task StartMethodJob(string jobId)
    {
        CloudToDeviceMethod directMethod = 
          new CloudToDeviceMethod("LockDoor", TimeSpan.FromSeconds(5), 
          TimeSpan.FromSeconds(5));
    
        JobResponse result = await jobClient.ScheduleDeviceMethodAsync(jobId,
            $"DeviceId IN ['{deviceId}']",
            directMethod,
            DateTime.UtcNow,
            (long)TimeSpan.FromMinutes(2).TotalSeconds);
    
        Console.WriteLine("Started Method Job");
    }
    
  11. Добавьте другой метод в класс Program.

    public static async Task StartTwinUpdateJob(string jobId)
    {
        Twin twin = new Twin(deviceId);
        twin.Tags = new TwinCollection();
        twin.Tags["Building"] = "43";
        twin.Tags["Floor"] = "3";
        twin.ETag = "*";
    
        twin.Properties.Desired["LocationUpdate"] = DateTime.UtcNow;
    
        JobResponse createJobResponse = jobClient.ScheduleTwinUpdateAsync(
            jobId,
            $"DeviceId IN ['{deviceId}']", 
            twin, 
            DateTime.UtcNow, 
            (long)TimeSpan.FromMinutes(2).TotalSeconds).Result;
    
        Console.WriteLine("Started Twin Update Job");
    }
    
  12. Наконец, добавьте следующие строки в метод Main :

    Console.WriteLine("Press ENTER to start running jobs.");
    Console.ReadLine();
    
    jobClient = JobClient.CreateFromConnectionString(connString);
    
    string methodJobId = Guid.NewGuid().ToString();
    
    StartMethodJob(methodJobId);
    MonitorJob(methodJobId).Wait();
    Console.WriteLine("Press ENTER to run the next job.");
    Console.ReadLine();
    
    string twinUpdateJobId = Guid.NewGuid().ToString();
    
    StartTwinUpdateJob(twinUpdateJobId);
    MonitorJob(twinUpdateJobId).Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  13. Сохраните результаты работы и создайте решение.

Запуск приложений

Теперь все готово к запуску приложений.

  1. В обозревателе решений Visual Studio щелкните правой кнопкой мыши решение и выберите пункт Назначить запускаемые проекты.

  2. Выберите Общие свойства>Запускаемый проект, затем пункт Несколько запускаемых проектов.

  3. Убедитесь, что SimulateDeviceMethods находится в верхней части списка, за которым следует ScheduleJob. Установите значение Запуск для обоих действий и щелкните ОК.

  4. Запустите проекты, щелкнув Запуск, или перейдите к меню Отладка и щелкните Начать отладку.

    Отобразятся выходные данные с устройства и серверных приложений.

    Выполнение приложений для планирования заданий

Дальнейшие действия

По материалам этой статьи вы запланировали задания для запуска прямого метода и обновления свойств двойника устройства.

Для продолжения работы с Центром Интернета вещей и шаблонами управления устройствами обновите образ в соответствии с инструкциями из руководства по обновлению устройств для Центра Интернета вещей Azure: использование эталонного образа для Raspberry Pi 3 B +.