Как построить систему IIoT с помощью Apache NiFi, MiNiFi, C2 Server, MQTT и Raspberry Pi

1656611306 kak postroit sistemu iiot s pomoshhyu apache nifi minifi c2

Абделькрим Хаджидж

1*PDI8zodftnRpT2YpFZg8_g
Фото Брента Де Рантера на Unsplash

Как вы думаете, сколько времени нужно, чтобы создать передовой прототип промышленного Интернета вещей, который может:

  • Собирайте данные от датчиков к шлюзу на каждой фабрике
  • Переместите данные датчиков из одного или нескольких заводов в облако или центр обработки данных
  • Автоматическое развертывание новых конфигураций на всех периферийных устройствах
  • Поддержка большого объема данных и сквозная защита

С помощью правильного инструмента вы сможете построить такую ​​систему менее чем через час! В этом блоге я покажу вам, как реализовать расширенный прототип IIoT с помощью аппаратного обеспечения Raspberry Pi и открытого программного обеспечения (MQTT брокер, Apache NiFi, MiNiFi и MiNiFi C2 Server). Я сосредоточусь на архитектуре, подключении, сборе данных и автоматической переконфигурации.

Эта статья должна стать началом серии статей об Интернете. Обработка периферий и анализ данных будут предметом следующих статей, следите за обновлениями 🙂

Промышленная архитектура IoT

Существует множество эталонных архитектур IoT. Часто в промышленных условиях вы не имеете прямого доступа к датчикам и системам управления. Шлюз используется для соединения OT и IT-мира. По этой причине архитектура IIoT часто включает в себя периферийные устройства, шлюзы, региональные концентраторы и, наконец, системы хранения/обработки.

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

1*3VQlvDAxQimCkjdcSzhteg
архитектура IIoT

На уровне края, датчики собирают информацию о цифровом мире и посылают ее в шлюз через различные проводные и беспроводные протоколы (последовательный, RS-485, MODBUS, CAN, OPC UA, BLE, WiFi и т.д.). В нашем примере мы будем использовать разные датчики (света, температуры, камеры, акселерометры и т.п.), которые посылают данные к шлюзу через WiFi.

Шлюз это Raspberry Pi, управляющий брокером Mosquitto и агентом MiNiFi. Mosquitto – это легкий посредник обмена сообщениями с открытым исходным кодом, используемый для раскрытия данных датчиков с помощью протокола MQTT. MQTT имеет минимальный размер, что делает его пригодным для приложений Интернета вещей и оборудования с ограниченными ресурсами, например телефонов или микроконтроллеров.

Apache MiNiFi – подпроект Apache NiFi – это легкий агент, реализующий основные функции Apache NiFi, сосредотачиваясь на сборе данных на периферии.

Цели дизайна MiNiFi: малый размер и низкое потребление ресурсов, централизованное управление агентами и предельный интеллект. MiNiFi можно легко интегрировать с NiFi с помощью протокола S2S (Site-to-Site), чтобы создать сквозное решение для управления потоками, масштабируемое, безопасное и обеспечивающее полную цепь хранения информации (происхождение).

В нашей системе MiNiFi будет подписываться по всем темам брокера Mosquitto и пересылать каждое новое сообщение NiFi на региональном уровне. Мы также можем использовать его для подключения к системе SCADA или любому другому поставщику данных OT.

На региональном уровне, имеем две составляющие:

Apache NiFi – это мощная платформа потока данных с более чем 200 готовыми разъемами. Благодаря его интерфейсу проектирование потоков данных становится резвым и обычным.

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

В нашей системе NiFi играет центральную роль в сборе данных с каждой фабрики и маршрутизации их в несколько систем и программ (HDFS, HBase, Kafka, S3 и т.п.).

MiNiFi C2 Server (MiNiFi Commande & Control) — еще один разрабатываемый сейчас подпроект Apache NiFi. Его роль состоит в том, чтобы обеспечить центральную точку конфигурации для сотен или тысяч агентов MiNiFi в дикой природе. Сервер C2 управляет версионными классами приложений (конфигурации потока MiNiFi) и предоставляет их через Rest API. Агенты MiNiFi могут подключаться к этому API с определенной частотой, чтобы обновлять свою конфигурацию.

После того, как данные попадают на серверы компании, вкл Облака или в центре обработки данных, существует большой набор программ, которые можно реализовать. Мониторинг в режиме реального времени, анализ и оптимизация процессов или прогнозное обслуживание – это несколько примеров. Обработка данных и реализация вариантов использования будут оговорены в следующей статье.

Реализация системы

Приступаем к созданию нашего прототипа.

Подготовка Raspberry Pi: MQTT и MiNiFi

Чтобы установить брокер Mosquitto MQTT и агент MiNiFi, выполните следующие команды на Raspberry Pi.

Чтобы иметь небольшой размер, MiNiFi комплектуется минимальным набором процессоров по умолчанию. Можно добавить любой процессор NiFi, развернув NAR (архив NiFi) в каталоге lib. В последнюю команду блока ниже я добавляю процессор NAR MQTT.

sudo apt-get update#install and run Mosquitto broker on default port 1883sudo apt-get install mosquittomosquitto#install and prepare MiNiFi agentwget  -xvf minifi-0.4.0-bin.tar.gzcd minifi-0.4.0#add mqtt processorwget  -P ./lib/

По умолчанию для настройки агента MiNiFi необходимо отредактировать файл ./conf/config.yml, чтобы включить список используемых процессоров и их конфигурацию. Конфигурацию можно написать вручную или создать с помощью интерфейса NiFi и экспортировать поток в качестве шаблона. Шаблон – это файл XML, который нам нужно преобразовать в файл YML с помощью инструментария MiNiFi. Вот пример конфигурационного файла, который передает каждую строчку на удаленный NiFi через S2S.

Для проекта мы не будем использовать эти действия вручную. Поскольку многие агенты MiNiFi работают на географически распределенных фабриках, невозможно остановить вручную, отредактировать config.yml, а затем перезапустить каждый агент каждый раз, когда его конфигурацию нужно изменить.

MiNiFi использует a «Изменить поставщика» посредством которого агент сообщается о потенциальной новой конфигурации. Приемники изменений – это подключаемые модули и сейчас OOTB поддерживаются три приемника:

  • FileChangeIngestor
  • RestChangeIngestor
  • PullHttpChangeIngestor

Мы будем использовать PullHttpChangeIngestor, чтобы запрашивать сервер C2 каждый период времени и загружать любую новую доступную конфигурацию. Чтобы настроить этот ингестор, отредактируйте файл ./conf/bootstrap.conf, раскомментируйте соответствующие строки и установите свойства ингестора таким образом:

nifi.minifi.notifier.ingestors=org.apache.nifi.minifi.bootstrap.configuration.ingestors.PullHttpChangeIngestor
# Hostname on which to pull configurations from
nifi.minifi.notifier.ingestors.pull.http.hostname=c2-server
# Port on which to pull configurations from
nifi.minifi.notifier.ingestors.pull.http.port=10080
# Path to pull configurations from
nifi.minifi.notifier.ingestors.pull.http.path=/c2/config
# Query string to pull configurations with
nifi.minifi.notifier.ingestors.pull.http.query=class=iot-minifi-raspberry-agent
# Period on which to pull configurations from, defaults to 5 minutes if commented out
nifi.minifi.notifier.ingestors.pull.http.period.ms=60000

С этой конфигурацией каждый агент MiNiFi будет запрашивать API REST сервера C2 каждые 1 минуту и ​​запрашивать последнюю конфигурацию для класса iot-minifi-raspberry-agent.

Примечание: частота 1 минута предназначена только для демонстрационных целей. Вы не будете так часто обновлять своих агентов.

Не запускайте своего агента сейчас, а давайте перейдем на региональный уровень и настроим сервер MiNiFi C2 и NiFi.

Установка и настройка сервера MiNiFi C2

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

wget  -xvf minifi-c2-0.4.0-bin.tar.gzcd minifi-c2-0.4.0

Сервер C2 предоставляет программы MiNiFi через REST API, организованный по классам. C2 поддерживает подключаемые «Провайдеры конфигурации» и поддерживает:

  • The CacheConfigurationProvider, какой просматривает каталог в файловой системе или на S3
  • The DelegatingConfigurationProvider, который делегирует другой сервер C2, чтобы разрешить иерархические структуры C2
  • The NiFiRestConfigurationProvider, который извлекает шаблоны из экземпляра NiFi через его REST API

Установите сервер C2 на использование NiFi в качестве поставщика конфигурации. Отредактируйте файл ./conf/minifi-c2-context.xml и укажите адрес сервера NiFi http://nifi-dev:8080

Установка и настройка сервера NiFi

Установите NiFi на сервер, доступный с сервера C2, и запустите его.

wget  -xvf nifi-1.6.0-bin.tar.gzcd nifi-1.6.0./bin/nifi.sh start

Давайте подключимся к интерфейсу NiFi и создадим поток, работающий в агентах MiNiFi. Но перед этим добавьте входной порт к корневому полотну и назовите его с Raspberry MiNiFi. Именно здесь NiFi будет получать файлы потока от MiNiFi.

Добавьте процессор consumeMQTT, чтобы подписаться на брокера Mosquitto и подписаться на все темы в разделе iot/датчики. Обратите внимание, что tcp://raspberrypi:1883 здесь эквивалентен tcp://localhost:1883, поскольку этот поток будет работать на Raspberry Pi.

1*_2o7XYaLQis3B_K7UeMlNA

Используйте процессор UpdateAttribute для добавления a «версия» атрибут, который мы используем, чтобы показать функцию перенастройки. Вы можете добавить любой нужный атрибут: метку времени, название агента, местоположение и т.д.

1*AlovfoMCxTmo8fwIY_T9Jg

И, наконец, добавьте группу удаленных процессов (RPG), чтобы отправлять происходящее в NiFi. Подключите эти три процессора.

1*pipjKZaixzgo6mx61D4ioA

Ваш поток теперь выглядит как на скриншоте ниже. Левый поток будет работать в NiFi для получения данных от MiNiFi. Здесь правильный поток предназначен только для дизайна и будет эффективно работать на каждом Raspberry Pi.

1*8qMAq8mrVgwbY3MM4G6WZg

Сохраните правильный поток как шаблон под названием iot-minifi-raspberry-agent.v1. Здесь очень важное условие наименования. Мы должны использовать то же имя, что и имя класса, используемое в конфигурации загрузчика MiNiFi.

Разверните и запустите приложение

Прежде чем запускать агенты MiNiFi на Raspberry Pi, давайте проверим, хорошо ли настроен сервер C2. Откройте такой URL в своем браузере: ?class=iot-minifi-raspberry-agent&version=1. Сервер C2 соответствует файлу, содержащему конфигурацию созданного нами шаблона в формате YML. Это восхитительно.

1*dswF9vj5b8f8arb5dOAqAg
Результаты вызова C2 Rest API

Если вы посмотрите на журналы C2, вы увидите, что сервер получил запрос с параметрами {class=[iot-minifi-raspberry-agent]версия=[1]}

1*bGTZK8FAhk1lZyksark5Zw
Сервер C2 ведет журналы после вызова Rest API

Теперь, когда связь между разными компонентами архитектуры (MQTT, MiNiFi, NiFi и C2) работает, запустите агент MiNiFi на Raspberry Pi с помощью команды:

./bin/minifi.sh start

Через несколько секунд вы увидите следующие журналы сервера C2. Хост 192.168.1.50 (это IP-адрес Raspberry Pi) попросил сервер C2 предоставить ему последнюю версию класса iot-minifi-raspberry-agent. По сравнению с нашим предыдущим вызовом с веб-браузером вы заметите, что агент MiNiFi не указал версию. Если вы откроете конфигурацию агента MiNiFi по адресу ./conf/config.yml, вы найдете тот же файл conf, который мы получили с C2 Rest API.

1*7Q4mCfsw_eUUVhJflVvs4g
Журналы сервера C2

Кроме того, MQTT показывает, что агент MiNiFi подключился к брокеру и подписался на тему iot/sensors/#

1*nKnkdcvyDHg9V3mkX5j57Q
Журналы MQTT после запуска агента MiNiFi

Идеально! Система IIoT работает как волшебная. Теперь запустим наши датчики для генерирования данных и публикации их в MQTT. Затем MiNiFi начнет потреблять данные и отправлять их на NiFi, как показано на следующем снимке экрана, где мы получили 196 сообщений.

1*_3ePgulNqJI5y7bf8PuV8g

Теперь давайте проверим одно из этих сообщений с функцией происхождения NiFi. Эти данные поступают от датчика освещенности. “iot/sensors/LightIntensity/z” и версия приложения 1.

1*J3H9LUSHv-0_0o65xE3PrA

Automagic Warm Redeploy

Теперь, когда наш IIoT работает и данные поступают из каждой фабрики в наш центр обработки данных, давайте развернем новую программу. Для нашего теста мы внесем незначительные изменения в конфигурацию нашего агента MiNiFi. Выделите веб-интерфейс NiFi и отредактируйте процессор updateAttribute. Установите атрибут «version» на 2 вместо 1 и сохраните поток в новом шаблоне «iot-minifi-raspberry-agent.v2». Это все! Новое приложение будет автоматически развернуто.

Ниже можно увидеть журналы сервера C2, которые показывают, что была обнаружена новая версия V2. Сервер C2 не имеет этой версии в кэше и начинает процесс загрузки и преобразования.

1*m3jNaye1W-hWBIdvKsxK8w
Реакция сервера C2 на новый шаблон

Затем агенты MiNiFi обнаруживают новую конфигурацию, создают резервную копию предыдущей конфигурации, разворачивают новую и перезапускают.

1*CpLj2Fvhyw7J3KPjPsSU-A

Теперь давайте посмотрим на данные, поступающие от агентов. Как вы можете видеть в нижеприведенном интерфейсе происхождения, эти данные поступают из гироскопа и имеют версию программы 2.

1*143i4FJ_vk6jkZQywxzxig

Выводы

Apache NiFi и его экосистема (MiNiFi и сервер C2) являются мощными инструментами для сквозного управления данными IoT. Его можно использовать для быстрого и легкого создания расширенных приложений IoT с гибкими архитектурами и расширенными функциями (автоматическое горячее развертывание, происхождение данных, обратное давление и т.п.).

В следующих статьях я покажу вам, как использовать эти данные, защитить платформу и реализовать расширенные сценарии края. Между тем, вы можете прочитать эту статью о том, как Renault, многонациональный производитель автомобилей, использует Apache NiFi в проектах IIoT и какие лучшие методы они применяли.

Спасибо, что прочли. Как обычно, отзывы и предложения приветствуются.

Если вы нашли эту статью полезной, дайте ей несколько хлопаний и следите за мной, чтобы получить больше статей о больших данных и Интернете вещей!

1*ZEb8WxL62ot7Wv5nRuinbQ
Плески и подписка

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *