azure-iot-sdk - .NET 从 Microsoft.Azure.Devices.Client.ModuleClient 获取 DeviceId
问题描述
我想从 IoT-Hub 分配给我的模块的Microsoft.Azure.Devices.Client.ModuleClient获取分配的设备 ID。
在运行时检索设备 ID 的最佳方法是什么?
解决方案
所以我们必须使用后端解决方案来读取模块孪生属性,比如 deviceId。这是设计使然,您必须按照以下文档中的说明使用后端应用程序:模块双胞胎,在模块应用程序内部只有 Desired 和 Reported 可用。
示例控制台 C# 应用程序:利用“registryManager”使用查询语言查询所有设备。查询功能由RegistryManager 类中的C# 服务 SDK公开。
var query = registryManager.CreateQuery("SELECT * FROM devices", 100);
完整的示例控制台 C# 代码片段如下所示。[使用 Microsoft.Azure.Devices;]
using Microsoft.Azure.Devices;
using Microsoft.Azure.Devices.Common.Exceptions;
using Newtonsoft.Json;
using System;
using System.Threading.Tasks;
namespace CreateIds
{
class Program
{
const string connectionString ="<>";
static void Main(string[] args)
{
GetDeviceIdAsync().Wait();
}
private static async Task GetDeviceIdAsync()
{
RegistryManager registryManager =
RegistryManager.CreateFromConnectionString(connectionString);
try
{
var query = registryManager.CreateQuery("SELECT * FROM devices", 100);
while (query.HasMoreResults)
{
var page = await query.GetNextAsTwinAsync();
foreach (var twin in page)
{
Console.WriteLine(JsonConvert.SerializeObject(twin.DeviceId));
}
}
}
catch (DeviceAlreadyExistsException dvcEx)
{
Console.WriteLine("Error : {0}", dvcEx);
}
}
}
}
更新 1:使用 'Where' 子句从devices.modules获取 deviceId 示例 json twin如下所示。现在我们必须使用像 moduleId='sampleModule' 这样的 'Where' 子句进行查询
Sample:{"deviceId":"devkitdps","moduleId":"sampleModule","etag":"AAAAAAAAAAE=","version":4,"status":"enabled","statusUpdateTime":"0001-01-01T00:00:00Z","connectionState":"Disconnected","lastActivityTime":"0001-01-01T00:00:00Z","cloudToDeviceMessageCount":0,"authenticationType":"sas","x509Thumbprint":{"primaryThumbprint":null,"secondaryThumbprint":null},"properties":{"desired":{"$metadata":{"$lastUpdated":"0001-01-01T00:00:00Z"},"$version":1},"reported":{"DateTimeLastAppLaunch":"2020-06-23T17:22:19.4938255-07:00","$metadata":{"$lastUpdated":"2020-06-24T00:22:19.6523448Z","DateTimeLastAppLaunch":{"$lastUpdated":"2020-06-24T00:22:19.6523448Z"}},"$version":3}}}
var query = registryManager.CreateQuery("SELECT * FROM devices.modules Where moduleId='sampleModule'", 100);
while (query.HasMoreResults)
{
var page = await query.GetNextAsTwinAsync();
foreach (var twin in page)
{
Console.WriteLine(JsonConvert.SerializeObject(twin.DeviceId));
}
}
如果您需要进一步的帮助,请告诉我们!
推荐阅读
- python - 在不丢失基数信息的情况下对 TensorFlow 数据集进行窗口化?
- ibm-midrange - 在 AS400 中显示程序消息
- forms - Vee Validate Nuxt JS 属性或方法“必需”未在实例上定义,但在渲染期间引用
- reactjs - 测试函数是否只调用一次的首选方法是什么?
- javascript - 使用 html 代码从变量中获取所有 id
- node.js - KoaJs 自定义 ErrorHandler 中间件现在可以工作
- python - 无法读取网址
- android - 在谷歌播放控制台中上传 apk 时出错
- flutter - 如何在pageView builder颤动中将第一页显示为一半?
- c++ - 使用 CDDS_ITEMPREPAINT 强制调用 OnCustomDraw