如何使用NiFi等构建IIoT系统
您认为构建一个先进的工业物联网原型需要多长时间:
从传感器收集数据到每个工厂的网关
将传感器数据从一个或多个工厂移至云或数据中心
自动热部署新配置到所有边缘设备
支持大规模数据量和端到端安全性
使用正确的工具,您可以在不到一小时的时间内构建这样的系统!在此博客文章中,我将向您展示如何使用Raspberry Pi硬件和开源软件(MQTT代理、Apache NiFi、MiNiFi和MiNiFi C2 Server)实现高级IIoT原型。我将专注于体系结构,连接性,数据收集和自动重新配置。
工业物联网架构
有大量的物联网参考架构。通常,在工业环境中,您无法直接访问传感器和控制系统。网关用于桥接OT和IT世界。因此,IIoT体系结构通常包括边缘设备、网关、区域中心和最终的存储/处理系统。
下图显示了我们系统的全局体系结构以及将在每个级别使用的软件工具。
物联网架构
在边缘级别,传感器收集数字世界中的信息,并通过各种有线和无线协议(串口、RS-485、MODBUS、CAN总线、OPC UA、BLE、WiFi等)将其发送到网关。在我们的示例中,我们将使用各种传感器(光线、温度、摄像头、加速度计等),这些传感器通过WiFi将数据发送到网关。
网关是运行Mosquitto Broker和MiNiFi代理的Raspberry Pi。Mosquitto 是一个开源的轻量级消息传递代理,我们使用它通过MQTT协议公开传感器数据。MQTT的占地面积极小,使其适用于IoT应用程序和资源受限的硬件,例如电话或微控制器。
Apache MiNiFi是Apache NiFi的子项目,是一种轻量级代理,它实现了Apache NiFi的核心功能,侧重于边缘的数据收集。
MiNiFi的设计目标是:体积小,资源消耗低,代理的集中管理和边缘智能。通过站点到站点协议(S2S),可以将MiNiFi与NiFi轻松集成,以构建可扩展,安全并提供完整信息托管(来源)的端到端流管理解决方案。
在我们的系统中,MiNiFi将订阅Mosquitto Broker的所有主题,并将每条新消息转发到区域级别的NiFi。我们也可以使用它连接到SCADA系统或任何其他OT数据提供者。
在区域级别,我们有两个组成部分:
Apache NiFi 是一个功能强大的数据流平台,具有300多个现成的连接器。得益于其UI,设计数据流变得轻松快捷。
NiFi不会为了简单而放弃能力。确实,这是一个高度可扩展的分布式系统,具有可靠的交付、背压和负载分配。这些功能使NiFi成为物联网应用的绝佳工具,在这些应用中网络质量可能会面临挑战。
在我们的系统中,NiFi发挥着中心作用,即从每个工厂收集数据并将其路由到多个系统和应用程序(HDFS、HBase、Kafka、S3等)。
MiNiFi C2服务器(MiNiFi Command&Control) 是当前正在开发的Apache NiFi的另一个子项目。它的作用是为野外成百上千的MiNiFi代理提供配置的中心点。C2服务器管理应用程序的版本化类(MiNiFi流配置),并通过Rest API公开它们。MiNiFi代理可以以定义的频率连接到该API以更新其配置。
一旦数据到达公司服务器、云或数据中心,便可以实施大量应用程序。实时监控,过程分析和优化或预测性维护就是其中的几个示例。数据处理和用例实现将在以后的文章中讨论。
系统实施
让我们开始构建我们的原型。
准备Raspberry Pi:MQTT和MiNiFi
要安装Mosquitto MQTT代理和MiNiFi代理,请在Raspberry Pi上运行以下命令。
为了减小体积,MiNiFi打包了最少的默认处理器集。通过在lib目录中部署NAR(NiFi存档),可以添加任何NiFi处理器。在下面的块的最后一个命令中,我添加了MQTT处理器的NAR。
sudo apt-get update#install and run Mosquitto broker on default port 1883sudo apt-get install mosquitomosquito#install and prepare MiNiFi agentwget http://apache.crihan.fr/dist/nifi/minifi/0.4.0/minifi-0.4.0-bin.tar.gz tar -xvf minifi-0.4.0-bin.tar.gzcd minifi-0.4.0#add mqtt processorwget https://github.com/ahadjidj-hw/NiFi/raw/master/nifi-mqtt-nar-1.5.0.nar -P ./lib/
默认情况下,配置MiNiFi代理程序需要编辑文件./conf/config.yml以包括使用的处理器及其配置的列表。可以手动编写配置,也可以使用NiFi UI设计配置,然后将流程导出为模板。该模板是一个XML文件,我们需要使用MiNiFi工具包将其转换为YML文件。这是一个配置文件的示例,该文件尾部一个文件,并通过S2S将每一行发送到远程NiFi。
对于我们的项目,我们将不使用这些手动步骤。由于许多MiNiFi代理在地理位置分散的工厂上运行,因此无法手动停止、编辑config.yml,然后在每次需要更改其配置时重新启动每个代理。
MiNiFi使用“更改接收器”,通过该“更改接收器”将可能的新配置通知给代理。变更接收器是可插入模块,目前支持三种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 fromnifi.minifi.notifier.ingestors.pull.http.hostname=c2-server# Port on which to pull configurations fromnifi.minifi.notifier.ingestors.pull.http.port=10080# Path to pull configurations fromnifi.minifi.notifier.ingestors.pull.http.path=/c2/config# Query string to pull configurations withnifi.minifi.notifier.ingestors.pull.http.query=class=iot-minifi-raspberry-agent# Period on which to pull configurations from, defaults to 5 minutes if commented outnifi.minifi.notifier.ingestors.pull.http.period.ms=60000
使用此配置,每个MiNiFi代理每隔1分钟会在http://c2-server:10080/c2/config 查询C2服务器REST API,并要求“ iot-minifi-raspberry-agent”类的最新配置。
注意:1分钟的频率仅用于演示目的。您不会如此频繁地更新代理。
现在就不要启动您的代理,让我们转到区域级别并配置MiNiFi C2服务器和NiFi。
安装和配置MiNiFi C2服务器
在可从MiNiFi代理访问的公共服务器上安装MiNiFi C2服务器。您可以将C2分层部署用于受网络限制的应用程序,如以下几行所述。运行以下命令以安装C2服务器:
wget http://apache.crihan.fr/dist/nifi/minifi/0.4.0/minifi-c2-0.4.0-bin.tar.gztar -xvf minifi-c2-0.4.0-bin.tar.gzcd minifi-c2-0.4.0
C2服务器通过按类组织的REST API公开MiNiFi应用程序。C2支持可插拔的“配置提供程序”,当前支持:
该CacheConfigurationProvider,它 着眼于目录上的文件系统或S3
该DelegatingConfigurationProvider,委托给另一C2服务器允许分层C2结构
该NiFiRestConfigurationProvider,从一个NiFi实例在其REST API拉模板
配置C2服务器以使用NiFi作为配置提供程序。编辑文件./conf/minifi-c2-context.xml 并提供NiFi服务器地址 http://nifi-dev:8080
安装和配置NiFi服务器
在C2服务器可访问的服务器上安装NiFi并运行它。
wget http://apache.crihan.fr/dist/nifi/1.6.0/nifi-1.6.0-bin.tar.gz tar -xvf nifi-1.6.0-bin.tar.gzcd nifi-1.6.0./bin/nifi.sh start
让我们在http://nifi-dev:8080/nifi/ 上连接到NiFi UI,并创建将在MiNiFi代理中运行的流。但是在此之前,请在根画布上添加一个输入端口,并将其命名为“来自Raspberry MiNiFi”。NiFi将从此处接收来自MiNiFi的流文件。
添加consumerMQTT处理器以订阅Mosquitto代理并订阅iot / sensors下的所有主题。请注意,此处的tcp://raspberrypi:1883与tcp://localhost:1883等效,因为此流将在Raspberry Pi上运行。
使用UpdateAttribute处理器添加“版本”属性,我们将使用该属性来显示重新配置功能。您可以添加所需的任何属性:时间戳记,座席名称,位置等。
最后,添加一个远程进程组(RPG)以将使用的事件发送到NiFi。连接这三个处理器。
现在,您的流程类似于以下屏幕截图。左侧的数据流将在NiFi中运行,以接收来自MiNiFi的数据。正确的流程仅用于设计,并且可以在每个Raspberry Pi上有效运行。
将正确的流程另存为模板,名称为“ iot-minifi-raspberry-agent.v1”。这里的命名约定非常重要。我们必须使用与MiNiFi引导程序配置中使用的类名相同的名称。
部署并启动应用程序
在Raspberry Pi上启动MiNiFi代理之前,让我们看一下C2服务器是否配置正确。在Web浏览器中打开以下URL:http://c2-server:10080/c2/config?class=iot-minifi-raspberry-agent&version=1 。C2 Server答复一个文件,其中包含我们构建的模板的配置,格式为YML。那很棒。
C2 Rest API调用的结果
如果查看C2日志,则可以看到服务器收到带有参数{class = [iot-minifi-raspberry-agent],version = [1]}的查询。
REST API调用后的C2服务器日志
现在,体系结构的不同组件(MQTT,MiNiFi,NiFi和C2)之间的通信正在工作,请使用以下命令在Raspberry Pi上启动MiNiFi代理:
./bin/minifi.sh start
几秒钟后,您会看到以下C2服务器日志。主机192.168.1.50(这是Raspberry Pi的IP地址)要求C2服务器为其提供最新版本的类“ iot-minifi-raspberry-agent”。与我们先前使用Web浏览器进行的呼叫相比,您会注意到MiNiFi代理未指定版本。如果现在在./conf/config.yml中打开MiNiFi代理配置,您将找到我们从C2 Rest API中检索到的相同conf文件。
C2服务器日志
此外,MQTT还显示MiNiFi代理已连接到代理并订阅了主题iot / sensors /#
MiNiFi代理启动后的MQTT日志
完善!IIoT系统运行得像灵符。现在,让我们启动传感器以生成数据并将其发布在MQTT中。然后,MiNiFi将开始使用数据并将其发送到NiFi,如以下屏幕截图所示,其中我们已收到196条消息。
现在,让我们使用NiFi的来源功能检查这些消息之一。该数据来自光传感器“ iot/sensors/LightIntensity/z”,应用程序版本为1。
自动化热重新部署
现在我们的IIoT正在运行,并且数据正在从每个工厂流到我们的数据中心,让我们部署一个新的应用程序。对于我们的测试,我们将对我们的MiNiFi代理配置进行较小的修改。转到NiFi网络用户界面,然后编辑updateAttribute处理器。将“版本”属性设置为2而不是1,并将流保存在新模板“ iot-minifi-raspberry-agent.v2”中。就这样!新的应用程序将自动部署。
您可以在下面看到C2服务器日志,显示检测到新版本V2。C2服务器的缓存中没有此版本,因此开始下载和转换过程。
C2 Server对新模板的反应
然后,MiNiFi代理会检测到新配置,备份以前的配置,部署新的配置,然后重新启动。
现在,让我们看一下来自代理的数据。如您在下面的出处界面中所见,该数据来自陀螺仪,并且具有应用程序版本2。
结论
Apache NiFi及其生态系统(MiNiFi和C2服务器)是用于端到端IoT数据管理的强大工具。它可用于轻松快速地构建具有灵活架构和高级功能(自动热部署,数据出处,背压等)的高级IoT应用程序。
原文链接:https://www.freecodecamp.org/news/building-an-iiot-system-using-apache-nifi-mqtt-and-raspberry-pi-ce1d6ed565bc/
作者:Abdelkrim Hadjidj
如何使用NiFi等构建IIoT系统的更多相关文章
- Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(二)
七. 构建临时系统 1. 通用编译指南 a. 确认是否正确设置了 LFS 环境变量 echo $LFS b. 假定你已经正确地设置了宿主系统的符号链接: 1)shell 使用的是 bash. 2)sh ...
- Spring Boot中使用 Spring Security 构建权限系统
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全 ...
- 在TensorFlow中基于lstm构建分词系统笔记
在TensorFlow中基于lstm构建分词系统笔记(一) https://www.jianshu.com/p/ccb805b9f014 前言 我打算基于lstm构建一个分词系统,通过这个例子来学习下 ...
- Linux From Scratch(从零开始构建Linux系统,简称LFS)(二)
七. 构建临时系统 1. 通用编译指南 a. 确认是否正确设置了 LFS 环境变量 echo $LFS b. 假定你已经正确地设置了宿主系统需求和符号链接 c. 对于每个软件包: (1). 确保解压软 ...
- LFS7.10——构建LFS系统
参考:LFS7.10——准备Host系统 LFS7.10——构造临时Linux系统 本文正式开始构建LFS系统,后面所有命令的执行都是在root用户下完成的. 这时开始构建LFS前准备工作 更改$LF ...
- Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(一)
一. 准备工作 1. 需要一个Linux宿主系统,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架构上可以运行的其它发行版 如果想实现Win7与Linux双系统,可参考我的 ...
- Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(一)
一. 准备工作 1. 装有Linux宿主系统的树莓派主板,可参考 Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器) 2. 参考网址:Linux From Scratch ...
- 基于Spring、SpringMVC、MyBatis、Druid、Shrio构建web系统
源码下载地址:https://github.com/shuaijunlan/Autumn-Framework 在线Demo:http://autumn.shuaijunlan.cn 项目介绍 Autu ...
- alfs学习笔记-自动化构建lfs系统
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客 ...
随机推荐
- oracle 以SYSDBA远程连接数据库
在服务器用sysdba登陆 grant sysdba to system 然后在远程就可以sysdba登陆数据库了
- UIButton总结
UIButton 1. 功能 既能显示文字,又能显示图片(能显示2张图片,背景图片.内容图片) 长按高亮的时候可以切换图片\文字 直接通过addTarget...方法监听点击 2. 状态 normal ...
- 爬虫之正则表达式re模块
为什么要学正则表达式 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网站去搜索) 爬 (将所有的网站的内容全部爬下来) 取 (去掉对我们没用处的数据) 处理数据(按照我们想要的 ...
- Docker从入门到精通(三)——概念与执行流程
前面我们大概介绍了docker是什么以及如何安装docker,但是对里面出现的一些名词,可能大家还不熟悉,这篇文章就来为大家解惑. 1.容器化平台 Docker 是提供应用打包,部署与运行应用的容器化 ...
- GIS应用|快速开发在线路径导航应用
导航应用可用于路径规划及仿真,并且常作为一个重要模块融入到各类企业管理业务中,如面向物流管理.商品配送.车辆监控等场景,那么如何开发一个简单的在线路径导航应用呢?SuperMap Online为您解答 ...
- 『学了就忘』Linux系统管理 — 83、Linux中进程的查看(top命令)
目录 1.top命令介绍 2.top命令示例 3.top命令输出项解释 4.top命令常用的实例 1.top命令介绍 top命令是用来动态显示系统中进程的命令. [root@localhost ~]# ...
- 使用.NET 6开发TodoList应用(1)——系列背景
前言 想到要写这样一个系列博客,初衷有两个:一是希望通过一个实践项目,将.NET 6 WebAPI开发的基础知识串联起来,帮助那些想要入门.NET 6服务端开发的朋友们快速上手,对使用.NET 6开发 ...
- Vue3.0是如何变快的
1.diff算法优化 + Vue2中的虚拟dom是进行全量的对比 https://vue-next-template-explorer.netlify.app/ + Vue3新增了静态标记(Patch ...
- java 多线程 读写互斥锁ReentrantReadWriteLock:读读不互斥,读写互斥,写写互斥
ReentrantReadWriteLock: 类ReentrantLock具有相互互斥的排他效果,也就是说,同一时间,只有一个线程执行lock()方法后面的任务.这样做虽然可以解决问题,但是效率非常 ...
- Python sys模块 os模块、OS.open() | open() | OS._exit() | sys.exit() | exit()
sys模块:负责程序和Python交互. sys常用方法:=========================== sys.stdout.write('please:')val = sys.stdin ...