Azure IoT 中心 RegistryManager 更新许多双胞胎 - 仅当属性存在时

Azure IoT Hub RegistryManager update many twins - only if properties exist

如何确保 RegistryManager.UpdateTwins2Async() 只更新设备孪生的属性,如果它们不存在则从不添加它们?解释...

我正在 .NET Core 3.1 中开发 Azure IoT Web 应用程序。我需要使用补丁更新 IoT 中心中的多个设备设备孪生。到目前为止,我正在这样做

var updateTask = await mRegistryManager.UpdateTwins2Async(finalTwinList);

但是现在我们有一个包含额外属性的新版本的 IoT 设备,因此我只想更新具有这些属性的设备中的属性(即只有具有新版本的设备)。

我知道 UpdateTwins2Async() 方法会更改在设备中找到的属性,但我很确定如果它们不存在,它会添加它们。如果这些新属性被添加到旧设备上,那将是非常糟糕的。

那么如何确保 UpdateTwins2Async() 只更新属性而不添加它们?

我将 post 这个作为答案,但它可能不适合您的解决方案。如果您想确保只对正确的设备执行此操作,您可以先使用查询检索它们,然后再次检查您的 finalTwinList。

var list = new List<Twin>();
var sql = "SELECT * FROM devices WHERE is_defined(properties.desired.yourtaghere)";
var query = registryManager.CreateQuery(sql, 100);
while (query.HasMoreResults)
{
    var page = await query.GetNextAsTwinAsync();
    foreach (var twin in page)
    {
        list.Add(twin);
    }
}

// now check your finalTwinList, any device ID that's not also in your newly created list can go!

如果您一次只更新少量设备并且您的集线器中有几千台设备,那么该查询就有些过分了。您可以将其更改为更具体:

SELECT * FROM devices
  WHERE deviceId IN ['entries', 'from', 'your', 'list']
  AND is_defined(properties.desired.yourtaghere)