0

我正在研究一个示例物联网项目。在 IotHub 上注册了 1 个 IoT 设备。1.直接曝光控制设备温度的方法。在设备启动时,它正在 IoTHub 上注册回调以侦听方法调用请求。

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

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

4

2 回答 2

3

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

选项:

物联网即插即用

微软创建了物联网即插即用,专注于“设备模型”。当即插即用设备连接到 IoT 中心时,它可以知道其设备型号。这个模型的一部分是“命令”的概念,它转化为物联网中心的直接方法。您的设备可能还没有此设备型号,因为 PnP 很新。设备制造商/开发商可以将此模型集成到设备中。

创建自己的索引命令

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

于 2021-01-12T13:19:51.340 回答
2

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

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

以下是短 pnp 模型的示例,其中包含一个遥测数据(温度)和一个用于以同步方式调用设备上的直接方法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 中心,屏幕片段显示从 Azure IoT Explorer 工具调用的直接方法SetTemp收到的消息:

在此处输入图像描述

在此处输入图像描述

以下屏幕片段显示了 device10 的设备孪生,您可以看到有一个 modelId 属性: 在此处输入图像描述

我确实建议为您的解决方案使用pnp 模型。如果您只对命令感兴趣,则可以仅为此创建模型的一小部分,请参见以下示例:

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

在哪里:

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

代表modelId

"commandType": "synchronous" 

表示直接方法调用

"name": "SetTemp" 

表示方法名

于 2021-01-12T16:36:58.893 回答