Поделиться через


Используйте мост устройств IoT Central для подключения других облаков IoT к IoT Central

Мост устройств IoT Central — это решение с открытым исходным кодом, которое подключает другие облака Интернета вещей, такие как Sigfox, облако устройства частиц и сеть вещей к приложению IoT Central. Мост устройств работает путем пересылки данных с устройств, подключенных к другим облакам IoT, в ваше приложение IoT Central. Мост устройств только пересылает данные в IoT Central, он не отправляет команды или обновления свойств из IoT Central обратно на устройства.

Мост устройства позволяет объединить мощность IoT Central с такими устройствами, как:

  • Устройства отслеживания активов, подключенные к сети низкой мощности Sigfox.
  • Устройства мониторинга качества воздуха в облаке устройства-частицы.
  • Устройства мониторинга влажности почвы в сети вещей.

Вы можете использовать функции приложения IoT Central, такие как правила и аналитика данных, создавать рабочие процессы в приложениях Power Automate и Azure Logic или экспортировать данные.

Решение для моста устройств предоставляет несколько ресурсов Azure в вашу подписку Azure, которые работают вместе для преобразования и пересылки сообщений устройств в IoT Central.

Необходимые компоненты

Для выполнения шагов из этого руководства вам понадобится следующее:

Обзор

Мост устройства IoT Central — это решение с открытым кодом в GitHub. Данное решение использует настраиваемый шаблон Azure Resource Manager для развертывания нескольких ресурсов в вашей подписке Azure, включая приложение-функцию в Функциях Azure.

Приложение-функция — это основная часть моста устройств. Оно получает запросы HTTP POST от других платформ IoT через простой веб-перехватчик. Репозиторий Azure IoT Central Device Bridge включает примеры, показывающие, как подключить облака Sigfox, Particle и The Things Network. Вы можете расширить это решение для подключения к своему пользовательскому облаку IoT, если ваша платформа может отправлять запросы HTTP POST в ваше приложение-функцию.

Приложение-функция преобразует данные в формат, принятый IoT Central, и пересылает их с помощью службы подготовки устройств и клиентских API устройств:

Screenshot of an Azure Functions definition showing the code.

Если ваше приложение IoT Central распознает идентификатор устройства в перенаправленном сообщении, телеметрия с устройства отображается в IoT Central. Если приложение IoT Central не распознает идентификатор устройства, приложение-функция пытается зарегистрировать новое устройство с идентификатором устройства. Новое устройство отображается как неназначенные устройства на странице "Устройства" в приложении IoT Central. На странице "Устройства" можно назначить новое устройство шаблону устройства, а затем просмотреть данные телеметрии.

Развертывание моста устройств

Для развертывания моста устройств для вашей подписки:

  1. В приложении IoT Central перейдите на страницу групп подключений устройств с разрешениями>.

    1. Запишите Область идентификатора. Это значение используется при развертывании моста устройств.

    2. На той же странице откройте группу регистрации SAS-IoT-Devices. На странице группы SAS-IoT-Devices скопируйте Первичный ключ. Это значение используется при развертывании моста устройств.

  2. Используйте следующую кнопку "Развернуть в Azure ", чтобы открыть пользовательский шаблон Resource Manager, который развертывает приложение-функцию в подписке. Используйте область действия идентификатора и первичный ключ из предыдущего шага:

    Deploy to Azure Button

После завершения развертывания необходимо установить пакеты npm, необходимые функции:

  1. На портале Microsoft Azure откройте приложение-функцию, которое было развернуто в вашей подписке. После этого перейдите в Инструменты разработки>Консоль. Для установки пакетов выполните следующие команды в консоли:

    cd IoTCIntegration
    npm install
    

    Выполнение этих команд может занять несколько минут. Вы можете спокойно игнорировать любые предупреждающие сообщения.

  2. После завершения установки пакета выберите Перезагрузить на странице Обзор приложения-функции:

    Screenshot that shows the restart option in Azure Functions.

  3. Теперь функция готова к использованию. Внешние системы могут использовать запросы HTTP POST для отправки данных устройства через мост устройств в ваше приложение IoT Central. Чтобы получить URL-адрес функции, перейдите к коду > Функции IoTCIntegration > и URL-адресу функции Get>:

    Screenshot that shows the get function URL in Azure Functions.

Тексты сообщений, отправляемых на мост устройства, должны иметь следующий формат:

"device": {
  "deviceId": "my-cloud-device"
},
"measurements": {
  "temp": 20.31,
  "pressure": 50,
  "humidity": 8.5,
  "ledColor": "blue"
}

Каждый ключ в объекте measurements должен соответствовать имени типа телеметрии в шаблоне устройства в приложении IoT Central. Это решение не поддерживает указание идентификатора интерфейса в тексте сообщения. Таким образом, если два разных интерфейса имеют тип телеметрии с одинаковым именем, измерение отображается в обоих потоках телеметрии в вашем приложении IoT Central.

Вы можете включить в текст поле timestamp, чтобы указать дату и время сообщения в формате UTC. Это поле должно быть в формате ISO 8601. Например, 2020-06-08T20:16:54.602Z. Если вы не укажете метку времени, будут использоваться текущая дата и время.

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

deviceId должен быть буквенно-цифровым, строчным и может содержать дефис.

Если вы не включаете modelId поле или если IoT Central не распознает идентификатор модели, сообщение с нераспознанным deviceId создает новое неназначаемое устройство в IoT Central. Оператор может вручную перенести устройство на правильный шаблон устройства. Дополнительные сведения см. в статье "Управление устройствами в приложении > Azure IoT Central" Для переноса устройств в шаблон.

Примечание.

Пока устройство не будет назначено шаблону, все вызовы HTTP функции возвращают состояние ошибки 403.

Чтобы включить ведение журнала для приложения-функции с помощью приложения Аналитика, перейдите к журналам мониторинга > в приложении-функции в портал Azure. Выберите Включить Application Insights.

Подготовленные ресурсы

Шаблон Resource Manager подготавливает следующие ресурсы в вашей подписке Azure:

  • Приложение-функция
  • План службы приложений
  • Storage account
  • Хранилище ключей

В хранилище ключей хранится ключ группы SAS для вашего приложения IoT Central.

Приложение-функция работает по плану потребления. Хотя этот вариант не предлагает выделенных вычислительных ресурсов, он позволяет мосту устройств обрабатывать сотни сообщений устройств в минуту, что подходит для небольших групп устройств или устройств, которые отправляют сообщения реже. Если приложение зависит от потоковой передачи большого количества сообщений устройства, замените план потребления выделенным планом службы приложений. Этот план предлагает выделенные вычислительные ресурсы, которые сокращают время отклика сервера. При использовании стандартного плана службы приложений максимальная наблюдаемая производительность функции из Azure в этом репозитории составляла около 1500 сообщений устройства в минуту. Подробнее см. в разделе Варианты размещения в Функциях Azure.

Чтобы использовать выделенный план службы приложений вместо плана потребления, отредактируйте настраиваемый шаблон перед развертыванием. Выберите Редактировать шаблон.

Screenshot that shows the edit template option for an Azure Resource Manager template.

Замените следующий сегмент:

{
  "type": "Microsoft.Web/serverfarms",
  "apiVersion": "2015-04-01",
  "name": "[variables('planName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "name": "[variables('planName')]",
    "computeMode": "Dynamic",
    "sku": "Dynamic"
  }
},

на

{
  "type": "Microsoft.Web/serverfarms",
  "sku": {
      "name": "S1",
      "tier": "Standard",
      "size": "S1",
      "family": "S",
      "capacity": 1
  },
  "kind": "app",
  "name": "[variables('planName')]",
  "apiVersion": "2016-09-01",
  "location": "[resourceGroup().location]",
  "tags": {
      "iotCentral": "device-bridge",
      "iotCentralDeviceBridge": "app-service-plan"
  },
  "properties": {
      "name": "[variables('planName')]"
  }
},

После этого отредактируйте шаблон, чтобы включить "alwaysOn": true в конфигурацию ресурса functionapp в разделе "properties": {"SiteConfig": {...}} Конфигурация alwaysOn гарантирует, что приложение-функция всегда работает.

Примеры

В следующих примерах показано, как настроить мост устройств для различных облаков IoT:

Пример 1: Подключение устройств Particle через мост устройств

Чтобы подключить устройство Particle через мост устройств к IoT Central, перейдите в консоль Particle и создайте новую интеграцию с веб-перехватчиком. Установите для формата запроса значение JSON. В разделе Расширенные настройки используйте следующий пользовательский формат основного текста:

{
  "device": {
    "deviceId": "{{{PARTICLE_DEVICE_ID}}}"
  },
  "measurements": {
    "{{{PARTICLE_EVENT_NAME}}}": "{{{PARTICLE_EVENT_VALUE}}}"
  }
}

Вставьте URL-адрес функции из приложения-функции, и вы увидите, что устройства с частицами отображаются как неназначенные устройства в IoT Central. Чтобы узнать больше, прочтите статью блога Вот как интегрировать проекты на основе частиц с Azure IoT Central.

Пример 2: Подключение устройств Sigfox через мост устройств

Некоторые платформы могут не разрешать указывать формат сообщений устройств, отправленных через веб-перехватчик. Для таких систем вы должны преобразовать полезную нагрузку сообщения в ожидаемый формат тела до того, как мост устройств обработает ее. Вы можете выполнить преобразование в той же функции, которая запускает мост устройства.

В этом разделе показано, как преобразовать полезную нагрузку интеграции веб-перехватчика Sigfox в формат тела, ожидаемый мостом устройства. Облако Sigfox передает данные устройства в шестнадцатеричном строковом формате. В целях удобства мост устройств включает функцию преобразования для этого формата, которая принимает подмножество возможных типов полей в полезной нагрузке устройства Sigfox: int и uint из 8, 16, 32 или 64 бит; float 32 или 64 бит; с прямым порядком байтов и прямым порядком байтов. Чтобы обрабатывать сообщения из интеграции с веб-перехватчиком Sigfox, внесите следующие изменения в файл IoTCIntegration/index.js в приложении-функции.

Чтобы преобразовать полезную нагрузку сообщения, добавьте следующий код перед вызовом handleMessage в строке 21, заменив payloadDefinition определением полезной нагрузки Sigfox:

const payloadDefinition = 'gforce::uint:8 lat::uint:8 lon::uint:16'; // Replace this with your payload definition

req.body = {
    device: {
        deviceId: req.body.device
    },
    measurements: require('./converters/sigfox')(payloadDefinition, req.body.data)
};

Устройства Sigfox ожидают ответа с кодом 204. Добавьте нижеприведенный код после вызова handleMessage в строке 21:

context.res = {
    status: 204
};

Пример 3: Подключение устройств из The Things Network через мост устройств

Чтобы подключить устройства The Things Network к IoT Central:

  • Добавьте новую интеграцию HTTP в приложение в The Things Network: Интеграция приложений > добавляет интеграцию > HTTP.>
  • Убедитесь, что приложение включает функцию декодировщика, которая автоматически преобразует полезные данные сообщений устройства в JSON перед отправкой в функцию: декодирования функций полезных > данных приложений>.

В следующем примере показана функция декодера JavaScript, которую можно использовать для декодирования общих числовых типов из двоичных данных:

function Decoder(bytes, port) {
  function bytesToFloat(bytes, decimalPlaces) {
    var bits = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0];
    var sign = (bits >>> 31 === 0) ? 1.0 : -1.0;
    var e = bits >>> 23 & 0xff;
    var m = (e === 0) ? (bits & 0x7fffff) << 1 : (bits & 0x7fffff) | 0x800000;
    var f = Math.round((sign * m * Math.pow(2, e - 150)) * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces);
    return f;
  }

  function bytesToInt32(bytes, signed) {
    var bits = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
    var sign = 1;

    if (signed && bits >>> 31 === 1) {
      sign = -1;
      bits = bits & 0x7FFFFFFF;
    }

    return bits * sign;
  }

  function bytesToShort(bytes, signed) {
    var bits = bytes[0] | (bytes[1] << 8);
    var sign = 1;

    if (signed && bits >>> 15 === 1) {
      sign = -1;
      bits = bits & 0x7FFF;
    }

    return bits * sign;
  }

  return {
    temperature: bytesToFloat(bytes.slice(0, 4), 2),
    presscounter: bytesToInt32(bytes.slice(4, 8), true),
    blueLux: bytesToShort(bytes.slice(8, 10), false)
  };
}

После определения интеграции добавьте следующий код перед вызовом handleMessage в строке 21 файла IoTCIntegration/index.js приложения-функции. Этот код переводит текст вашей HTTP-интеграции в ожидаемый формат.

req.body = {
  device: {
    deviceId: req.body.end_device_ids.device_id.toLowerCase()
  },
  measurements: req.body.uplink_message.decoded_payload
};

Примечание.

В предыдущем фрагменте кода используется удобный для человека идентификатор устройства. Сообщение "Сеть вещей" также содержит технический идентификатор, к которому можно получить доступ.req.body.dev_eui.toLowerCase() Дополнительные сведения см. в разделе "Сеть вещей — форматы данных".

Ограничения

Мост устройств только пересылает сообщения в IoT Central и не отправляет сообщения обратно на устройства. Это ограничение заключается в том, почему свойства и команды не работают для устройств, которые подключаются к IoT Central через этот мост устройства. Поскольку операции двойника устройства не поддерживаются, невозможно обновить свойства устройства через мост устройств. Для использования этих функций устройство должно напрямую подключаться к IoT Central с помощью одного из пакетов SDK для устройств Интернета вещей Azure.

Следующие шаги

Теперь, когда вы узнали, как развернуть мост устройств IoT Central, можно перейти к следующему шагу: