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


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

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

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

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

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

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

Предпосылки

Чтобы выполнить действия, описанные в этом руководстве, вам потребуется:

Обзор

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

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

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

Снимок экрана: определение Функций Azure с кодом.

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

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

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

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

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

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

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

    Кнопка

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

  1. На портале Azure откройте приложение-функцию, развернутую в подписке. Затем перейдите вконсоль> разработки. В консоли выполните следующие команды, чтобы установить пакеты:

    cd IoTCIntegration
    npm install
    

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

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

    Снимок экрана: параметр перезапуска в Функциях Azure.

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

    Снимок экрана: URL-адрес функции get в Функциях Azure.

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

"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.

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

Выделенные ресурсы

Шаблон диспетчера ресурсов создает следующие ресурсы в вашей подписке Azure.

  • Функциональное приложение
  • План службы приложений
  • учетная запись хранения
  • Хранилище ключей

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

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

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

Снимок экрана: параметр редактирования шаблона для шаблона Azure Resource Manager.

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

{
  "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 гарантирует, что приложение-функция работает постоянно.

Примеры

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

Пример 1. Подключение устройств частиц через мост устройства

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

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

Вставьте URL-адрес функции из вашего приложения-функции, и вы увидите, что устройства Particle отображаются как неназначенные устройства в IoT Central. Дополнительные сведения см. в блоге о том, как интегрировать проекты на базе Particle с 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. Подключение устройств из сети вещей через мост устройства

Чтобы подключить сетевые устройства Things к 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
};

Замечание

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

Ограничения

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