azure - 如何判断 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()。
解决方案
您是否尝试过使用 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
推荐阅读
- sql - SQL / PostgreSQL 如何执行将某些列中的值合并为一行的查询
- python - 如何让 Pygame 的混音器播放我的 .mp3?
- xamarin - Xamarin AndroidX 迁移:应用启动时崩溃(System.InvalidCastException:AndroidX.AppCompat.Widget.Toolbar)
- .net - 在 {x:Bind} 中将 Double 值强制转换为 Single
- r - 尝试将列的值舍入到 R 中最接近的值时出错
- javascript - 裁剪图像时,新图像获取canvas padding fabric js
- html - 滚动时如何更改文本的颜色?
- pine-script - 使用 Tradingview 技术信号的 Tradingview 警报
- docker - docker中的redis集群为我自己报告docker0地址
- python - 如何在 django 中从多到多相关类中进行选择字段?