Как я могу узнать, когда завершено обновление двойника устройства Azure IoT Hub? - PullRequest
0 голосов
/ 03 августа 2020

Я разрабатываю веб-приложение, которое вносит изменения в двойники устройств в Azure IoT Hub. Таким образом, пользователь веб-приложения может внести изменения в двойник устройства через мою сеть, а затем он может снова запросить свойства устройства, если захочет - но если он будет достаточно быстрым, его изменения еще не будут внесены в двойник устройства.

Я использую Microsoft. Azure .Devices.RegistryManager.UpdateTwinAsyn c () для изменения двойников устройств. Проблема в том, что это метод asyn c, у которого нет параметра обратного вызова, чтобы сообщить мне, когда обновление завершится. Поэтому я не могу знать, когда было внесено изменение в двойник устройства - и могу получить более старую версию, если я запрошу ее слишком быстро после обновлений. Как я могу определить, когда обновления выполнены на 100%?

... наверняка, все, кто использовал UpdateTwinAsyn c (), сталкивались с этой проблемой, верно? *

Хорошо, я проверил это и почти уверен, что после завершения вызова

await registryManager.UpdateTwinAsync(deviceId, patch, etag);

, т.е. программа перейдет к следующей строке после этого двойник устройства еще НЕ обновлялся. Скорее, в Центре Интернета вещей была запущена некоторая последовательность обновления. Следовательно, следующая после этой строки не может быть уверена, что двойник устройства обновлен.

Для меня это звучит как плохой дизайн. Зачем делать UpdateTwinAsyn c () асинхронным c методом, который я могу «ожидать»?

Возможно, есть способ обойти это, немедленно извлеките двойника устройства в моем методе UpdateDevice () и проверьте, не двойная "версия" была увеличена и только после этого возвращала код состояния из моего метода. К вашему сведению, мой метод называется UpdateDevice (), и браузер вызывает его на бэкэнде веб-сервера, который, в свою очередь, вызывает UpdateTwinAsyn c () в Центре Интернета вещей.

1 Ответ

0 голосов
/ 04 августа 2020

Вы пробовали использовать оператор ожидания? Вот код.

var twin = await registryManager.GetTwinAsync("myDeviceId");
var patch =
    @"{
        tags: {
            location: {
                region: 'US',
                plant: 'Redmond43'
            }
        }
    }";
await registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);

var query = registryManager.CreateQuery(
  "SELECT * FROM devices WHERE tags.location.plant = 'Redmond43'", 100);
var twinsInRedmond43 = await query.GetNextAsTwinAsync();
Console.WriteLine("Devices in Redmond43: {0}", 
  string.Join(", ", twinsInRedmond43.Select(t => t.DeviceId)));

Для получения дополнительной информации https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-csharp-csharp-twin-getstarted

...