获取在 IotHub 设备上注册的直接方法列表 物联网即插即用创建自己的索引命令

问题描述

我正在研究一个示例物联网项目。其中 1 个物联网设备在 IotHub 上注册。它是暴露 1 直接控制器件温度的方法。在设备启动时,它正在 IoTHub 上注册回调以侦听方法调用请求。

根据我的理解和知识,在云端无法知道特定设备暴露了这么多直接方法以及该方法的名称。 (因为内部使用 MQTT/AMQP)。

不过,要确定是否有任何解决方法可以让终端设备注册直接方法。是否有任何 SDK 函数或 REST API 来获取终端设备注册的直接方法列表。

解决方法

您假设没有列出您设备的直接方法的内置支持是正确的。设备不会公布它默认实现的方法。

选项:

物联网即插即用

Microsoft 创建了 IoT Plug and play,它专注于“设备模型”。当即插即用设备连接到 IoT 中心时,它可以公开其设备模型。此模型的一部分是“命令”的概念,它转化为 IoT 中心的直接方法。您的设备可能还没有此设备型号,因为 PnP 是相当新的。设备制造商/开发人员可以将此模型集成到设备中。

创建自己的索引命令

如果您是为此设备编写代码的人,并且不想进行 PnP,则可以创建一个直接方法,列出您的设备支持的所有方法。当然,您需要知道该直接方法的名称才能调用它。

,

最近,Azure IoT 中心(版本 2020-09-30)已公开启用IoT 即插即用,其中设备模型是设备和面向服务的双方之间的“粘合剂” .查看有关此概念的更多详细信息 here。设备孪生已针对新属性进行了扩展,例如 modelId,它表示存储库中 pnp 模型的标识符,请参阅更多详细信息 here

一旦在设备孪生中填充了 modelId,设备就会知道所有预期的直接方法,包括它们的请求/响应架构、c2d 消息传递、报告和所需的属性以及遥测数据。另一方面,比如服务端,调用者知道如何调用设备上的直接方法等。

以下是短 pnp 模型的示例,其中包含一个遥测数据(Temperature)和一个用于以同步方式调用设备上的直接方法 SetTemp 的命令(没有 c2d 消息)。它已在 IoT Central 应用程序中创建:

pnp 模型(modelId = "dtmi:rk2021iotcfree:Test6vj;1"):

{
    "@id": "dtmi:rk2021iotcfree:Test6vj;1","@type": "Interface","contents": [
      {
        "@id": "dtmi:rk2021iotcfree:Test6vj:Temperature;1","@type": [
          "Telemetry","Temperature"
        ],"displayName": {
          "en": "Temperature"
        },"name": "Temperature","schema": "double","unit": "degreeCelsius"
      },{
        "@id": "dtmi:rk2021iotcfree:Test6vj:SetTemp;1","@type": "Command","commandType": "synchronous","displayName": {
          "en": "SetTemp"
        },"name": "SetTemp","request": {
          "@id": "dtmi:rk2021iotcfree:Test6vj:SetTemp:__request:temp;1","@type": "CommandPayload","displayName": {
            "en": "temp"
          },"name": "temp","schema": "double"
        }
      }
    ],"displayName": {
      "en": "Test"
    },"@context": [
      "dtmi:iotcentral:context;2","dtmi:dtdl:context;2"
    ]
}

基于 modelId,模拟的 device10 已作为 pnp 设备连接到 Azure IoT 中心,屏幕片段显示在直接方法上收到的消息 SetTemp 从 Azure IoT Explorer 工具调用:

enter image description here

enter image description here

以下屏幕片段显示了 device10 的设备孪生,如您所见,有一个 modelId 属性: enter image description here

我建议您使用 pnp 模型 作为您的解决方案。如果您只对命令感兴趣,您可以只为此创建模型的一个小子集,请参见以下示例:

{
    "@id": "dtmi:rk2021iotcfree:Test6vj;1","contents": [    
      {   
        "@type": "Command","name": "SetTemp"     
      }
    ],"@context": [
      "dtmi:dtdl:context;2"
    ]
}

哪里:

"@id": "dtmi:rk2021iotcfree:Test6vj;1"

代表modelId

"commandType": "synchronous" 

代表直接方法调用

"name": "SetTemp" 

代表方法名

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...