Подробное описание того, как интегрировать конечную точку Apollo GraphQL для приложения IoT с помощью MQTT.

Прямо к

Требования

Программное обеспечение

  • Базовое понимание запросов, схем и преобразователей GraphQL
  • Javascript, NPM и Apollo-Server
  • Темы MQTT, публикация и подписка
  • IDE Ardunio v1.8.9

Аппаратное обеспечение

  • Сенсорный узел с возможностью подключения к WLAN (WiFi) (предпочтительно ESP32)
  • BME280 Датчик температуры и относительной влажности

Архитектура

Каждый датчик запрограммирован на отправку простых данных JSON о температуре и относительной влажности MQTT Broker. Формат следующий:

{
    "data": {
      "temp": 23.4,
      "humid": 34.2,
      "time": 1565530903
    }
}

Данные отправляются брокеру MQTT, например Mosquitto, HiveMQ и т. Д., Через модуль WLAN. Предпочтительно использовать Espressif ESP-32, поскольку он обеспечивает простое программирование через Arduino IDE, а также встроенный модуль WLAN / BLE. Данные отправляются в определенную тему:

test/<sensor_id>/env

Здесь sensor_id может быть чем-то жестко запрограммированным, например: 1, чтобы различать, какие данные датчика отправили данные. В терминах MQTT каждый узел датчика публикует информацию JSON в теме test/<sensor_id>/env. Наш сервер Apollo, обслуживающий конечную точку GraphQL, будет подписываться на тему с подстановочными знаками, чтобы получить все данные датчиков. Тема для подписки выглядит следующим образом:

test/+/env

Подписка на этот раздел предоставит всю информацию о датчиках из данных, опубликованных на test/<sensor_id>/env с разных датчиков.

Сервер Apollo, наконец, подпишется на эту тему и будет предоставлять данные IoT в реальном времени с датчиков на игровой площадке Apollo GraphQL (встроенный пользовательский интерфейс).

Настройка сенсорного узла

Здесь вы можете найти Arduino Sketch с использованием PubSubClient и ArduinoJson для публикации данных в формате JSON, упомянутом выше, в тестовом брокере Eclipse Mosquitto.

ESP32 подключается к датчику BME280 через интерфейс I2C и измеряет параметры окружающей среды, такие как температура и относительная влажность.

Проверка данных датчика

Как только прошивка на сенсорных узлах начнет публиковать данные, мы можем подписаться на темы, чтобы проверить, подходят ли входящие данные, с помощью клиента MQTT, такого как MQTT.FX.

  1. Подключитесь к mqtt.eclipse.org
  2. Подписаться на test/+/env
  3. Соблюдайте формат и значения входящих данных

Предполагая, что до этого момента все работает нормально, мы переходим к созданию конечной точки GraphQL с помощью Apollo.

GraphQL

На момент написания этого блога у меня было следующее:

  1. node v10.15.0
  2. npm v6.4.1

Мы будем использовать apollo-graphql-express для создания конечной точки. Запустите свой любимый редактор кода с папкой mqtt-graphql-iot.

Настраивать

  1. инициализировать каталог npm init -y
  2. installnpm i --save express apollo-server-express graphql graphql-subscriptions graphql-mqtt-subscriptions mqtt
  3. установить nodemon как зависимость разработки: npm i --save-dev nodemon
  4. Добавьте "dev": "nodemon server.js" в "scripts" и измените "main": "server.js" в package.json файле
  5. создать в каталоге следующую структуру:
graphql
| -- resolvers
     |-- index.js
| -- schema
     |-- index.js
package-lock.json
package.json
server.js
.gitignore

Создание схемы

Мы создаем нашу схему GraphQL в graphql/schema/index.js. Здесь вместо использования запроса или изменения GraphQL мы будем использовать подписку для подписки на брокера MQTT. В качестве фиктивного запроса мы добавим жестко запрограммированный список датчиков.

Схема предоставляет Subscription с именем subscribe2sensor, который принимает строковый параметр с именем topic, который будет нашей темой MQTT test/+/env. Данные, полученные от брокера MQTT, будут возвращены в той же форме, что и формат JSON, но с временными метками эпохи unix в секундах, покрытыми удобочитаемыми строками ISO. Это наблюдается в SensorData.

type SensorData {
    temp: Float!
    humid: Float!
    time: String!
}

Резольверы

Чтобы разрешить созданную схему, мы пишем соответствующую логику в graphql/resolvers/index.js. Здесь вместо стандартного PubSub мы используем MQTTPubSub для подключения к нашему MQTT Broker. Мы подписываемся на тему, переданную в качестве аргумента, и адаптируем наши полезные данные MQTT в соответствии с нашей схемой.

Серверный скрипт и промежуточное ПО

На основе Официальной документации Apollo для подписок можно добавить промежуточное ПО для веб-сокетов в наше express приложение. Вот server.js в корневом каталоге:

Зажги это 🔥

Время воплотить в реальность!

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

Выполните npm run dev в своем терминале, и вы увидите:

> nodemon server.js
[nodemon] 1.19.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node server.js`
server ready at http://localhost:4000/graphql
Subscriptions ready at ws://localhost:4000//graphql

Откройте GraphQL Playground в своем браузере:
http://localhost:4000/graphql

Напишите подписку, как указано ниже, или позвольте автозаполнению сделать все за вас. Используйте подстановочный знак + в теме, а именно. test/+/env.

subscription {
 subscribe2sensor(topic: "test/+/env") {
    temp
    humid
    time
  }
}

Нажмите кнопку воспроизведения и наблюдайте за данными Интернета вещей в реальном времени с помощью подписок GraphQL!

Надеюсь, это поможет любому, кто хочет адаптировать передовые веб-технологии с IoT.

Если вам нужна помощь с настройкой, оставьте несколько аплодисментов или комментариев.

Обо мне

Я Шантаноо, более известный в большинстве стран мира как Шань, и работаю научным сотрудником, занимающимся IoT-приложениями, пробую новые технологии и настраиваю их. Вы можете найти некоторые из моих работ на GitHub и связаться со мной через LinkedIn.