您認為構建一個先進的工業物聯網原型需要多長時間:
從傳感器收集數據到每個工廠的網關
將傳感器數據從一個或多個工廠移至雲或數據中心
自動熱部署新配置到所有邊緣設備
支持大規模數據量和端到端安全性
使用正確的工具,您可以在不到一小時的時間內構建這樣的系統!在此博客文章中,我將向您展示如何使用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