问题描述
我正在研究一个示例物联网项目。其中 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 工具调用:
以下屏幕片段显示了 device10 的设备孪生,如您所见,有一个 modelId 属性:
我建议您使用 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"
代表方法名