如何构建自己动手的IIoT架构

在过去的一年中,我们设计(并继续支持)多个IIoT项目。 您可能已经听说过IIoT,但以防万一,我们将尝试尽可能简单地解释它的含义以及为什么它对高负载解决方案的开发人员,架构师和管理员如此有趣。



物联网-物联网-涉及控制设备,旨在执行简单的家庭任务(当汽车停下时打开车库门,使用运动传感器或命令打开灯,监控房间温度),然后在物联网下-工业物联网-通常存在鉴于行业数据的“数字化”,通常可以借助机器学习在此基础上进行专家分析。


例如,您可以收集和分析来自旋转电动机的数据,以便及时了解故障并节省维修费用。 更换完全损坏的涡轮机比及时维修要昂贵得多。 另一个例子是煤矿开采。 分析矿井中空气成分的数据可以使您及时应对超出允许值的情况。 这有助于防止威胁矿工生命的情况。


数据流-从现场传感器,工业机器,气体传感器-到达汇聚中心,再到数据处理和分析平台。


我们想谈谈这种体系结构的外观,如何非常简单地收集和分析数据,并讨论各个应用程序的细节。 我们将依靠英语文章的翻译和我们自己的设计经验。 本文已翻译 ,并附有我们的解释和补充。


在第一篇文章中,我们将尝试创建一个IIoT架构,在该架构中,我们将进一步从传感器传输数据,然后将其传输到提供处理,分析,机器学习和传入数据监控的系统。


创建的架构


在工业物联网中,通常无法直接访问传感器和控制系统,因此,网关用于连接OT(运营技术)和IT(信息技术)级别。


因此,IIoT体系结构通常包括:终端设备,网关,区域集线器,最后是信息处理和存储系统。


创建的架构应提供机会:


  • 从传感器收集数据到网关
  • 将数据传输到云或数据中心
  • 自动更新网关配置
  • 维护安全的数据传输和处理

在图像上:创建的系统和软件的体系结构,我们将在每个级别上使用它来构建它。



传感器收集数据,并使用各种有线和无线协议(串行,RS-485,MODBUS,CAN总线,OPC UA,BLE,WiFi等)将其发送到网关。 在我们的示例中,我们将牢记数据通过WiFi到达网关。


作为网关,我们将使用Raspberry Pi,将在其上启动Mosquitto代理和MiNiFi代理。 Mosquitto是一个开源的轻量级消息代理,我们将使用它进一步使用MQTT协议从传感器传输数据。 MQTT增加了最小的开销,因此当终端设备的硬件资源受到限制时(例如,使用电话和微控制器),可以方便地在物联网中使用。


Apache MiNiFi-一个子项目Apache NiFi-一个轻量级代理,实现Apache NiFi的核心功能,专门设计用于收集最终设备上的数据。


MiNiFi结构紧凑,使用资源最少,并且可以集中管理所有代理。 它可以使用站点到站点(S2S)轻松连接到NiFi,这使您可以构建完善的数据流控制-可扩展,安全并清晰地了解信息传输的所有阶段。


在我们的系统中,MiNiFi将订阅所有Mosquitto经纪人主题,并将每条消息转发到区域级别设置的NiFi。 您也可以使用它连接到SCADA系统或任何其他OT数据源。


在区域级别,有两个组成部分:


Apache NiFi是功能强大的数据流管理系统,支持200多个连接器。 图形界面使您可以快速轻松地设计数据流。


NiFi不会为了简单而牺牲功能。 它是一个具有良好扩展性的分布式系统,可确保传递,背压(在将数据上传到其他较慢的系统之前存储数据的能力)和负载平衡。 NiFi的这一功能使它成为经常在不稳定网络环境中工作的IoT应用程序的出色工具。


在我们的系统中,NiFi是一个数据收集中心,可将其重定向到各种系统和应用程序(HDFS,HBase,Kafka,S3等)。


MiNiFi C2服务器(MiNiFi命令与控制)是另一个仍在开发中的Apache NiFi子项目。 它的作用是成为现场(各种大厅,工厂,地区)生产的成千上万的MiNiFi代理配置的中心点。 C2服务器管理MiNiFi流配置(使用C2术语-应用程序的版本化类),并通过Rest API发布它们。 MiNiFi代理可以以给定的频率连接到此API,以更新其自身的配置。


因此,让我们开始创建我们的原型。


域名协议


为了进一步配置应相互联系的各种系统,让我们就将在配置中使用的域名达成一致。


#  Apache NiFi      192.168.0.20 nifi.iot.local #  Apache MiNiFi C2     MiNiFi 192.168.0.20 minifi-c2.iot.local #raspberry pi,      Apache MiNiFi  MQTT  192.168.0.68 iot-hub-1.iot.local 

Raspberry Pi准备:MQTT和MiNiFi


要安装MQTT Mosquitto代理和MiNiFi代理,请在Raspberry Pi上运行以下命令。


默认情况下,MiNiFi包含最少的数据处理程序集。 您可以通过将NAR存档(NiFi存档)添加到库目录来从NiFI套件中添加其他处理程序。


使用最后一个命令,我们添加NAR MQTT处理程序。


 sudo apt-get update #install and run Mosquitto broker on default port 1883 sudo apt-get install mosquitto mosquitto #install and prepare MiNiFi agent wget 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.gz cd minifi-0.4.0 #add mqtt processor wget https://github.com/ahadjidj-hw/NiFi/raw/master/nifi-mqtt-nar-1.5.0.nar -P ./lib/ 

现在,让我们在Raspberry Pi随附的服务器上安装MiNiFi C2配置管理服务器


MiNiFi C2服务器的安装和配置。


将MiNiFi C2服务器安装在MiNiFi代理可以使用的公共服务器上。 可以将C2服务器的分层分发用于复杂的网络基础结构,如下所述。 运行以下命令以安装C2服务器:


 wget http://apache.crihan.fr/dist/nifi/minifi/0.4.0/minifi-c2-0.4.0-bin.tar.gz tar -xvf minifi-c2-0.4.0-bin.tar.gz cd minifi-c2-0.4.0 

  • C2服务器将发布类组织的配置。 C2支持可插拔的“配置提供程序”:
  • CacheConfigurationProvider,它根据文件系统或S3中指定的配置更新配置
  • DelegatingConfigurationProvider,它将委派传递到另一个C2服务器以创建C2服务器的层次结构。
  • NiFiRestConfigurationProvider,通过其REST API从Apache NiFi服务器中删除模板。

我们将C2服务器配置为使用NiFi作为配置提供程序。 编辑文件./conf/minifi-c2-context.xml,取消注释xml块


 <bean class="org.apache.nifi.minifi.c2.provider.nifi.rest.NiFiRestConfigurationProvider"> 

并写下NiFi服务器的地址( http://nifi.iot.local:8080


 <constructor-arg> <value>http://nifi.iot.local:8080/nifi-api</value> </constructor-arg> 

在Raspberry Pi上进一步配置MiNiFi


默认情况下,要添加处理程序及其配置,您需要编辑./conf/config.yml配置。 也可以手动编写配置,也可以使用Apache NiFi GUI创建配置,然后将配置导出为模板。 模板是XML文件,必须使用MiNiFi工具包将其转换为MiMLiFi YML配置文件。 这是一个示例配置文件,该文件监视设备上的文件并使用S2S协议将每个新行转发到NiFi。


对于我们的项目,我们将不使用手动调整。 确实,如果有很多MiNiFi代理,那么每次配置更改时,手动停止,编辑config.yml并重新启动代理将不容易。


MiNiFi使用Change Ingestor,代理可以通过它了解新的可能配置。 Change Ingestor是一个插件,MiNiFi本机支持三个ChangeIngestor。


  • FileChangeIngestor
  • RestChangeIngestor
  • PullHttpChangeIngestor

我们将使用PullHttpChangeIngestor定期访问C2服务器并下载新配置。 要配置此Ingestor,您需要编辑./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=minifi-c2.iot.local # 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代理将使用REST API协议访问http://minifi-c2.iot.local:每分钟10080 / c2 / config的C2服务器,并为iot-minifi-raspberry-agent类请求新的配置
重要的一点是:设置1分钟的频率仅用于演示。 在生产环境中,您很可能不必以这种频率更新代理。


在启动代理之前,让我们进入控制级别并配置MiNiFi C2服务器和Apache NiFi本身。


安装和配置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.gz cd nifi-1.6.0 ./bin/nifi.sh start 

http:// nifi-dev:8080 / nifi /上连接到NiFi界面,并创建将在MiNiFi代理上运行的流,但是在此之前,在根层中添加Input Port(通过按菜单上的Input Port按钮添加)并命名它来自Raspberry MiNiFi。 NiFi将从此处接收来自MiNiFi的流文件。


添加Funnel并将Input Port连接到Funnel-在以后的文章中,我们将介绍Apache NiFi方面的数据处理。


添加一个处理器消耗MQTT来订阅Mosquitto代理,并在所有主题iot / sensors /上对其进行签名*请注意,tcp:// raspberrypi:1883等效于tcp:// localhost:1883,因为此线程将在Raspberry Pi上运行



使用Processor UpdateAttribute来添加“ version”属性,我们将使用该属性来通知系统有关重新配置的信息。 您可以添加任何其他属性:时间戳,位置,座席名称等。



最后,添加远程进程组(RPG)-将收到的事件发送到NiFi。 结合所有这三个过程。



现在,您的视频流应如下图所示。 左流将在Apache NiFi本身上启动,并将从Apache MiNiFi接收数据。 右侧线程不会在Apache Nifi内启动,该线程是为原型设计和配置目的而创建的,它将在Raspberry Pi上运行。



将正确的流另存为名为“ iot-minifi-raspberry-agent.v1”的模板。 这里的命名原则非常重要。 我们必须使用与MiNiFi配置中使用的类名称相同的名称。


这非常重要-您不仅需要突出显示存储的组件,还需要突出显示它们之间的关系。



放置和启动应用程序


在Raspberry Pi上启动MiNiFi代理之前,让我们验证C2服务器的配置是否正确。 在浏览器中打开URL: http:// c2-server:10080 / c2 / config?Class = iot-minifi-raspberry-agent&version = 1 C2 Server应该以包含以YML格式构建的模板配置的文件作为响应。



如果服务器(而不是配置)引发Java异常,则您在此处提到的C2服务器中遇到问题:
https://github.com/apache/nifi-minifi/pull/126#issuecomment-388856304
您将需要安装版本0.3.0或从C2服务器目录的lib文件夹中删除javax.ws.rs-api-2.1.jar文件。


如果查看C2服务器日志,则可以看到服务器已接受参数{class = [iot-minifi-raspberry-agent],版本= [1]}的请求。



现在,已在各个体系结构组件(MQTT,MiNiFi,NiFi和C2)之间建立了连接,请使用以下命令在Raspberry Pi上启动MiNiFi代理:


 ./bin/minifi.sh start 

几秒钟后,您应该看到C2服务器日志。 主机192.168.1.50(在我们的示例中为Raspberry Pi设备的IP地址)请求C2服务器提供“ iot-minifi-raspberry-agent”类的最新版本。 与我们先前在浏览器中所做的请求相比,您可以注意到MiNiFi并未指出版本。 如果您在./conf/config.yml中打开MiNiFi代理的配置,您将看到我们在浏览器中收到的相同配置,即手动设置请求。



MQTT显示MiNiFi代理已连接到代理并订阅了iot / sensors /#主题



变速箱控制


太好了,现在让我们的传感器开始生成数据并将其发布到MQTT。 MiNiFi将开始上传信息并发送到NiFi,如下面的屏幕快照所示。


重要提示:为了使Apache NiFi组件开始工作,必须单击“播放”按钮。


现在,让我们看一下NiFi中的这些帖子之一。 信息来自“ iot /传感器/ LightIntensity / z”传感器,应用程序版本-1



MiNiFi配置更新


现在我们的基础架构正在运行,数据将进入“数据中心”,让我们安装新的MiNiFi配置。 转到Apache NiFi界面并编辑updateAttribute处理程序。 将“版本”属性更改为2而不是1,然后保存新的“ iot-minifi-raspberry-agent.v2”模板。 仅此而已。 新配置将自动部署。


您可以查看C2服务器日志,查看是否检测到V2的新版本,服务器未在其缓存中找到并加载它。



然后,MiNiFi发现新配置,保留以前的配置,卸载新配置并重新启动:



在下一篇文章中,我们将讨论如何组装传感器并将其集成到我们的体系结构中。 之后,我们将讨论数据分析。

Source: https://habr.com/ru/post/zh-CN415933/


All Articles