Общая архитектура IoT Platform
3 уровня
- Devices: IoT устройства подключенные к IoT Core по какому-нибудь стандартному протоколу (самые популярные MQTT, Modbus, COAP, HTTP, ...) через интернет, локальную сеть или специальный шлюз
- IoT Core: брокер сообщений, адаптеры протоколов, система регистрации и мониторинга устройств, менеджер правил
- Уровень бизнес-приложений: сервисы как-либо обрабатывающих данные с устройств и посылающие управляющие команды на устройства
Выбор Middleware для IoT Core
В качестве брокера сообщений я буду использовать Rabbit MQ - легко настроить, нужно немного ресурсов, масштабируемый из коробки (cluster), куча дополнительных плагинов.
В качестве адаптеров протоколов будут выступать плагины для RabbitMQ: MQTT, COAP, HTTP - при необходимости можно добавить свой.
В качестве системы мониторинга будет выступать связка Prometheus+AlertManager+Grafana.
В качестве менеджера правил будем использовать NodeRed.
В качестве системы регистрации и управления устройствами - "самописное" приложение на базе Spring-Boot+Thymeleaf+Bootstrap.
В качестве базы данных (хранение информации об устройствах, OTA, история телеметрии) - PostgreSQL.
Docker: docker-compose для локальной разработки и тестирования
Структура проекта
docker-config
- файлы конфигурации для контейнеров
- Dockerfile кастомные cборки контейнеров
- api.env переменные окружения
docker-data
- изменяемые данные из контейнеров - дабы не потерять их при пересоздании
compose.yml
- инструкции для запуска и настройки контейнеров
- зависимости между контейнерами
Интересные моменты
RabbitMQ
Кастомная сборка. Сразу подключаются плагины management и mqtt.
Перед запуском необходимо сгенерить ключи для tls. Для этого в папке docker-config выполнить следующие команды:
Nginx
Так же вместе с middleware компонентами запускается nginx - дабы иметь одну точку доступа:
- RabbitMQ: http://localhost:8082/rabbitmq/
login/pass: ${RABBITMQ_ADMIN_USER}/RABBITMQ_ADMIN_PASSWORD} - Grafana: http://localhost:8082/grafana/
- Prometheus: http://localhost:8082/prometheus/
- Node-Red: http://localhost:8082/node-red/
ссылка на код в github