Подробное описание того, как интегрировать конечную точку Apollo GraphQL для приложения IoT с помощью MQTT.
Прямо к
- Arduino Sketch для программирования узлов датчиков
- Репозиторий для конечной точки Apollo GraphQL
Требования
Программное обеспечение
- Базовое понимание запросов, схем и преобразователей 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.
- Подключитесь к
mqtt.eclipse.org
- Подписаться на
test/+/env
- Соблюдайте формат и значения входящих данных
Предполагая, что до этого момента все работает нормально, мы переходим к созданию конечной точки GraphQL с помощью Apollo.
GraphQL
На момент написания этого блога у меня было следующее:
node v10.15.0
npm v6.4.1
Мы будем использовать apollo-graphql-express
для создания конечной точки. Запустите свой любимый редактор кода с папкой mqtt-graphql-iot
.
Настраивать
- инициализировать каталог
npm init -y
- install
npm i --save express apollo-server-express graphql graphql-subscriptions graphql-mqtt-subscriptions mqtt
- установить
nodemon
как зависимость разработки:npm i --save-dev nodemon
- Добавьте
"dev": "nodemon server.js"
в"scripts"
и измените"main": "server.js"
вpackage.json
файле - создать в каталоге следующую структуру:
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.