Получить список прямых методов, зарегистрированных на устройстве IoTHub

Я работаю над одним образцом проекта IoT. Где 1 IoT-устройство зарегистрировано на IoTHub. Он предоставляет 1 прямой метод контроля температуры устройства. При запуске устройства он регистрирует обратный вызов в IoTHub для прослушивания запросов на вызов метода.

Насколько я понимаю и знаю, на стороне облака мы никак не можем знать, что конкретное устройство предоставляет такое количество прямых методов и как называется этот метод. (Из-за внутреннего использования MQTT/AMQP).

Тем не менее, чтобы быть уверенным, есть ли какие-либо обходные пути для регистрации прямых методов конечным устройством. Есть ли какая-либо функция SDK или REST API для получения списка прямых методов, зарегистрированных конечным устройством.


person Yash Mochi    schedule 12.01.2021    source источник


Ответы (2)


Вы правы, предполагая, что нет встроенной поддержки, в которой перечислены прямые методы вашего устройства. Устройство не публикует, какие методы оно реализовало по умолчанию.

Опции:

Интернет вещей PnP

Microsoft создала IoT Plug and Play, ориентированный на модели устройств. Когда устройство Plug and Play подключается к Центру Интернета вещей, оно может сообщить модель своего устройства. Частью этой модели является концепция команд, которая преобразуется в прямой метод для Центра Интернета вещей. На вашем устройстве, вероятно, еще нет этой модели устройства, так как PnP — довольно новое явление. Производитель/разработчик устройства может интегрировать эту модель в устройство.

Создайте свою собственную команду индекса

Если вы пишете код для этого устройства и не хотите использовать PnP, вы можете создать прямой метод, в котором перечислены все методы, поддерживаемые вашим устройством. Конечно, вам нужно знать имя этого прямого метода, чтобы вызвать его.

person Matthijs van der Veer    schedule 12.01.2021
comment
IoT Plug and Play действительно является рекомендуемым путем для такого сценария. Это НЕ обходной путь, это встроенная поддержка. Поскольку Yash является здесь разработчиком устройства, они могут просто создать файл модели, описывающий реализацию их устройства, и опубликовать его. - person Stefan Wick MSFT; 12.01.2021
comment
Спасибо за отзыв Стефан. Согласен, PnP это не обходной путь, немного изменю ответ. Поскольку вопрос касается поддержки SDK/API, чтобы получить список прямых методов, я решил не предлагать PnP в качестве встроенной поддержки, хотя это путь вперед. - person Matthijs van der Veer; 12.01.2021
comment
Спасибо, Маттейс - проголосовал :-) - person Stefan Wick MSFT; 12.01.2021

Недавно Центр Интернета вещей Azure (версия 2020-09-30) был публично включен для IoT Plug and Play, где модель устройства является связующим звеном между устройством и сторонами, обращенными к службе. Подробнее об этой концепции см. здесь. Двойник устройства был расширен за счет нового свойства, такого как modelId, которое представляет собой идентификатор модели pnp в репозитории. Подробнее см. здесь.

После заполнения 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 Hub, а фрагмент экрана показывает полученное сообщение по прямому методу SetTemp. вызывается из инструмента Azure IoT Explorer:

введите здесь описание изображения

введите здесь описание изображения

следующий фрагмент экрана показывает устройство-близнец устройства10, как вы можете видеть, есть свойство 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" 

представляет имя метода

person Roman Kiss    schedule 12.01.2021