Планирование и трансляция заданий (.NET)
Центр Интернета вещей Azure позволяет планировать и отслеживать задания по обновлению для миллионов устройств. Что можно сделать с помощью заданий?
Обновление требуемых свойств
Обновление тегов
Вызов прямых методов
Задание выступает в роли оболочки для одного из этих действий и отслеживает его выполнение для определенного набора устройств в соответствии с запросом на двойнике устройства. Например, внутреннее приложение может использовать задание для вызова прямого метода перезапуска на 10 000 устройств. Вы можете определить набор устройств с помощью запроса на двойнике устройства и запланировать момент времени в будущем для выполнения задания. Задание отслеживает ход выполнения по мере того, как каждое из устройств получает вызов и выполняет прямой метод перезагрузки.
Дополнительные сведения об этих возможностях см. в указанных ниже статьях.
Двойники устройств и свойства: Начало работы с двойниками устройств и Общие сведения о двойниках устройств и их использование в Центре Интернета вещей.
Прямые методы: руководство разработчика Центр Интернета вещей — прямые методы
Примечание.
Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовых и бесплатных уровнях Центр Интернета вещей см. в разделе "Выбор подходящего уровня Центр Интернета вещей" для решения.
В этой статье показано, как создать два консольных приложения .NET (C#):
Приложение устройства (SimulateDeviceMethods), которое реализует прямой метод LockDoor, вызываемый внутренним приложением.
Внутреннее приложение (ScheduleJob), которое создает два задания. Одно задание вызывает прямой метод lockDoor, а другое задание отправляет нужные обновления свойств на несколько устройств.
Примечание.
Дополнительные сведения о средствах SDK, доступных для создания приложения устройства и внутреннего приложения, см. в статье Пакеты SDK для Интернета вещей Azure.
Необходимые компоненты
Visual Studio.
Центр Интернета вещей в подписке Azure. Если у вас еще нет центра, выполните действия, описанные в разделе Создание центра Интернета вещей.
Устройство, зарегистрированное в центре Интернета вещей. Если у вас нет устройства в Центре Интернета вещей, выполните действия, описанные в разделе "Регистрация устройства".
Убедитесь, что в брандмауэре открыт порт 8883. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.
Создание приложения виртуального устройства
В этом разделе вы создадите консольное приложение .NET, которое отвечает на вызов прямого метода, выполняемый серверной частью решения.
В Visual Studio выберите Создать новый проект, а затем выберите шаблон проекта Консольное приложение (.NET Framework). Выберите Далее для продолжения.
В разделе Настроить новый проект введите имя проекта SimulateDeviceMethods и выберите Далее.
Примите версию .NET Framework по умолчанию и выберите Создать для создания проекта.
В обозревателе решений щелкните правой кнопкой мыши проект SimulateDeviceMethods и выберите пункт Управление пакетами NuGet.
В окне Диспетчер пакетов NuGet выберите Обзор и найдите Microsoft.Azure.Devices.Client. Выберите Установить.
В результате выполняется скачивание и установка пакета NuGet SDK для устройств Azure IoT и его зависимостей, а также добавляется соответствующая ссылка.
Добавьте следующие инструкции
using
в начало файла Program.cs :using Microsoft.Azure.Devices.Client; using Microsoft.Azure.Devices.Shared; using Newtonsoft.Json; using System.Threading.Tasks; using System.Text;
Добавьте следующие поля в класс Program . Замените значение заполнителя строкой подключения устройства, записанной в предыдущем разделе.
static string DeviceConnectionString = "<yourDeviceConnectionString>"; static DeviceClient Client = null;
Добавьте следующий код, чтобы реализовать прямой метод на устройстве:
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)); }
Добавьте следующий метод, чтобы реализовать прослушиватель двойников устройства на устройстве:
private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, object userContext) { Console.WriteLine("Desired property change:"); Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); }
И наконец, добавьте этот код в метод 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); }
Сохраните результаты работы и создайте решение.
Примечание.
Для простоты в этой статье не реализуются политики повторных попыток. В рабочем коде следует реализовать политики повтора (например, повторную попытку подключения), как указано в статье Обработка временных сбоев.
Получение строки подключения центра Интернета вещей
В этой статье вы создадите серверную службу, которая планирует задание для вызова прямого метода на устройстве, планирует задание для обновления двойника устройства и отслеживает ход выполнения каждого задания. Для выполнения этих операций службе требуются разрешения registry read и registry write. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой registryReadWrite, которая предоставляет это разрешение.
Чтобы получить строку подключения Центра Интернета вещей для политики registryReadWrite, выполните следующие действия:
На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.
В левой части центра выберите Политики общего доступа.
В списке политик выберите политику registryReadWrite.
Скопируйте основную строку подключения и сохраните значение.
Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.
Планирование заданий для вызова прямого метода и обновления свойств двойника устройства
В этом разделе вы создадите консольное приложение .NET на языке C#, которое использует задания для вызова прямого метода LockDoor и для обновления свойств на нескольких устройствах.
В Visual Studio выберите Файл>Создать>Проект. В окне Создание проекта выберите Консольное приложение (.NET Framework) и нажмите кнопку Далее.
В Настроить новый проект, присвойте проекту имя ScheduleJob, а потом выберите Создать.
Примите версию .NET Framework по умолчанию и выберите Создать для создания проекта.
В обозревателе решений щелкните правой кнопкой мыши проект ScheduleJob и выберите Управление пакетами NuGet.
В окне Диспетчер пакетов NuGet щелкните Обзор, найдите и выберите Microsoft.Azure.Devices, а затем щелкните Установить.
В результате выполняется скачивание и установка пакета NuGet SDK для служб Azure IoT и его зависимостей, а также добавляется соответствующая ссылка.
Добавьте следующие инструкции
using
в начало файла Program.cs :using Microsoft.Azure.Devices; using Microsoft.Azure.Devices.Shared;
Добавьте следующую инструкцию
using
, если она отсутствует в инструкциях по умолчанию.using System.Threading; using System.Threading.Tasks;
Добавьте следующие поля в класс Program . Замените заполнители строкой подключения Центра Интернета вещей, скопированной в разделе Получение строки подключения центра Интернета вещей, и именем устройства.
static JobClient jobClient; static string connString = "<yourIotHubConnectionString>"; static string deviceId = "<yourDeviceId>";
Добавьте следующий метод в класс 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)); }
Добавьте следующий метод в класс 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"); }
Добавьте другой метод в класс 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"); }
Примечание.
Дополнительные сведения о синтаксисе запросов см. в статье Язык запросов Центра Интернета вещей для двойников устройств и двойников модулей, заданий и маршрутизации сообщений.
Наконец, добавьте следующие строки в метод 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();
Сохраните результаты работы и создайте решение.
Запуск приложений
Теперь все готово к запуску приложений.
В обозревателе решений Visual Studio щелкните правой кнопкой мыши решение и выберите пункт Назначить запускаемые проекты.
Выберите Общие свойства>Запускаемый проект, затем пункт Несколько запускаемых проектов.
Убедитесь, что
SimulateDeviceMethods
находится в верхней части списка, за которым следуетScheduleJob
. Установите значение Запуск для обоих действий и щелкните ОК.Запустите проекты, щелкнув Запуск, или перейдите к меню Отладка и щелкните Начать отладку.
Отобразятся выходные данные с устройства и серверных приложений.
Следующие шаги
По материалам этой статьи вы запланировали задания для запуска прямого метода и обновления свойств двойника устройства.
Для продолжения работы с Центром Интернета вещей и шаблонами управления устройствами обновите образ в соответствии с инструкциями из руководства по обновлению устройств для Центра Интернета вещей Azure: использование эталонного образа для Raspberry Pi 3 B +.