首页 > 解决方案 > 如何判断 Azure IoT 中心设备孪生的更新何时完成?

问题描述

我正在开发一个 Web 应用程序来更改 Azure IoT 中心中的设备孪生。因此,Web 应用程序的用户可以通过我的 Web 对设备孪生进行更改,然后如果他愿意,他可以再次查询设备属性 - 但如果他足够快,他的更改还不会对设备孪生进行。

我正在使用 Microsoft.Azure.Devices.RegistryManager.UpdateTwinAsync() 来更改设备孪生。问题是这是一个异步方法,没有回调参数让我知道更新何时完成。因此,我不知道何时对设备双胞胎进行了更改 - 如果我在更新后查询过快,可能会获得旧版本。如何检测更新何时 100% 完成?

...当然,每个使用过 UpdateTwinAsync() 的人都遇到过这个问题,对吧?

编辑:

好的,我已经对此进行了一些测试,我很确定当调用

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

完成,即程序在这一行之后转到下一行,设备孪生尚未更新。相反,一些更新序列已在 IoT 中心启动。因此,此行之后的下一行无法确定设备孪生是否已更新。

对我来说,这听起来像是一个糟糕的设计。为什么要让 UpdateTwinAsync() 成为我可以“等待”的异步方法?

也许有一种方法可以通过立即在我的 UpdateDevice() 方法中获取设备双胞胎并检查双胞胎“版本”是否已增加,然后才从我的方法返回状态代码。仅供参考,我的方法称为 UpdateDevice(),浏览器在 Web 服务器后端调用它,后端又在 IoT Hub 上调用 UpdateTwinAsync()。

标签: azureazure-iot-hubasp.net-core-3.0.net-core-3.0

解决方案


您是否尝试过使用 await 运算符?这是代码。

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


推荐阅读