Node-RED 作為流程式視覺化開發工具,搭配 MQTT 訊息代理,能快速搭建 IoT 平臺雛形。本文著重於 Node-RED 環境的建置與設定,包含 npm 安裝、防火牆設定、設定檔修改等步驟。同時,也涵蓋 Mosquitto 訊息代理的安裝、安全設定及測試,包含使用者驗證、TLS 加密等關鍵環節,最後說明如何將 Node-RED 與 Mosquitto 整合,實現裝置訊息的釋出與訂閱,為後續 IoT 平臺開發奠定基礎。

安裝 Node.js 和 npm

首先,我們需要安裝 Node.js 和 npm。開啟終端機,輸入以下命令:

node -v
npm -v

這會顯示 Node.js 和 npm 的版本號。注意,版本號可能會根據您的作業系統和安裝時間而有所不同。

安裝 Node-RED

接下來,我們需要安裝 Node-RED。使用 npm 安裝 Node-RED 作為全域性模組:

npm install -g --unsafe-perm node-red

這個命令會安裝 Node-RED 和其依賴項。

設定 Node-RED

由於我們啟用了 UFW 防火牆,所有入站流量都被封鎖,除非明確允許。因此,我們需要允許 Node-RED 的流量:

ufw allow 1880/tcp

這會允許 Node-RED 的預設埠 1880 的流量。

啟動 Node-RED

現在,我們可以啟動 Node-RED:

node-red

然後,使用瀏覽器訪問 Node-RED 的管理面板。

修改 Node-RED 設定

為了提高 Node-RED 的可訪問性和功能性,我們需要修改其設定檔 settings.js。這個檔案位於 Node-RED 根目錄下。使用任何標準編輯器(如 nano)進行修改。

修改設定檔

使用 nano 編輯器開啟 settings.js 檔案:

nano /usr/lib/node-red/settings.js

進行必要的修改,然後儲存並關閉檔案。

上傳修改後的設定檔

如果您使用 FTP 程式(如 FileZilla)下載了設定檔,修改後需要上傳回雲端例項。使用您的根登入憑據連線到雲端例項,然後上傳修改後的設定檔。

圖表翻譯:

  flowchart TD
    A[安裝 Node.js 和 npm] --> B[安裝 Node-RED]
    B --> C[設定 Node-RED]
    C --> D[啟動 Node-RED]
    D --> E[修改 Node-RED 設定]
    E --> F[上傳修改後的設定檔]

這個流程圖顯示了安裝和設定 Node-RED 的步驟。

內容解密:

上述步驟解釋瞭如何安裝和設定 Node-RED。首先,我們需要安裝 Node.js 和 npm。然後,使用 npm 安裝 Node-RED 作為全域性模組。接下來,允許 Node-RED 的流量,然後啟動 Node-RED。最後,修改 Node-RED 的設定檔以提高其可訪問性和功能性。

使用FileZilla進行FTP連線和檔案編輯

首先,讓我們使用FileZilla連線到雲端例項。這需要一個公用IP地址和登入憑證。連線後,我們可以瀏覽檔案系統並找到要編輯的檔案。

編輯檔案

  1. 右鍵點選要編輯的檔案,然後選擇「編輯」。
  2. 檔案將會開啟在您電腦上的預設編輯器中,例如Notepad、TextMate或Notepad++。
  3. 編輯檔案後,儲存變更。FileZilla將會提示您是否要上傳修改的檔案到伺服器。

安全性注意事項

使用FileZilla的編輯功能時,所有上傳都是即時的。這意味著當您上傳修改的檔案時,變更將會立即生效於雲端例項或網站。為了避免意外修改,我們建議您下載原始檔案的副本,並在修改後有意上傳。

配置Node-RED設定檔

現在,讓我們回到編輯Node-RED設定檔。首先,我們需要取消註解admin root設定,以便我們可以在不同的端點存取Node-RED編輯器。

httpAdminRoot: '/admin',

啟用HTTPS

要啟用Node-RED的HTTPS,我們需要提供私鑰和憑證檔案的路徑。這可以從SSL安裝輸出或Apache配置檔案中獲得。

https: {
  key: require("fs").readFileSync('/etc/letsencrypt/live/in24hrs.xyz/privkey.pem'),
  cert: require("fs").readFileSync('/etc/letsencrypt/live/in24hrs.xyz/cert.pem')
},

配置跨源資源共享

由於我們正在建立自己的IoT平臺,這將會在各種系統和裝置上使用,因此需要啟用跨源資源共享。這可以在設定檔中完成。

httpNodeCors: {
  origin: "*",
  methods: "GET,PUT,POST,DELETE"
},

保護Node-RED編輯器

現在,讓我們保護Node-RED編輯器,以避免未經授權的存取。這需要安裝一些管理工具。

# 安裝管理工具
npm install node-red-admin

接下來,我們將會配置Node-RED編輯器的安全性設定,以確保只有授權使用者可以存取編輯器。

安全的Node-RED編輯器和管理API

為了保護Node-RED編輯器和管理API,需要設定使用者名稱和密碼。首先,需要安裝node-red-admin工具,然後使用node-red-admin hash-pw命令生成密碼的雜湊值。接下來,需要在settings.js檔案中設定使用者名稱和密碼的雜湊值。

以下是設定使用者名稱和密碼的範例:

adminAuth: {
  type: "credentials",
  users: [
    {
      username: "admin",
      password: "$2a$08$NeGbPtKiHU4JCC.IyqGz3tG2PeV.W8As9NEa62F9HX.qGz3tEA79mm",
      permissions: "*"
    },
    {
      username: "guest",
      password: "$2a$08$Fg/yRxn8As9NEa6435SvdNeGbPtKiOe/IyqGz3tG2PeV.A.UvRaTIXe",
      permissions: "read"
    }
  ]
}

設定完成後,需要重新啟動Node-RED伺服器,然後就可以使用設定的使用者名稱和密碼登入Node-RED編輯器和管理API。

背景執行Node-RED

為了讓Node-RED在背景執行,需要使用以下命令:

node-red > node-red.log &

這個命令會將Node-RED的輸出重導到node-red.log檔案中,並且讓Node-RED在背景執行。

訊息代理(Message Broker)

訊息代理是IoT平臺的關鍵元件之一。MQTT是一種輕量級、開放、簡單的釋出/訂閱訊息傳輸協議,適合用於IoT裝置之間的通訊。Mosquitto是一種流行的MQTT代理伺服器,提供了許多功能和特性,包括WebSocket支援。

以下是MQTT的工作原理:

  • 訊息代理(Broker)負責接收和轉發訊息。
  • 訊息釋出者(Publisher)釋出訊息到代理伺服器。
  • 訊息訂閱者(Subscriber)訂閱代理伺服器的訊息。

MQTT的優點包括:

  • 輕量級:MQTT的封包頭部很小,適合用於IoT裝置。
  • 開放:MQTT是一種開放的協議,任何人都可以使用和實現。
  • 簡單:MQTT的協議很簡單,容易實現和理解。

Mosquitto是一種流行的MQTT代理伺服器,提供了許多功能和特性,包括WebSocket支援。以下是如何安裝和設定Mosquitto的步驟:

  1. 安裝Mosquitto:sudo apt-get install mosquitto
  2. 設定Mosquitto:sudo nano /etc/mosquitto/mosquitto.conf
  3. 啟動Mosquitto:sudo service mosquitto start

Mosquitto提供了許多功能和特性,包括WebSocket支援,讓IoT裝置可以使用WebSocket協議與Mosquitto進行通訊。

MQTT 的 Publish 和 Subscribe Paradigm

MQTT(Message Queuing Telemetry Transport)是一種輕量級的物聯網(IoT)通訊協定,廣泛用於物聯網裝置之間的通訊。MQTT 的 Publish 和 Subscribe Paradigm 是其核心機制之一。

Publish 和 Subscribe 的工作原理

在 MQTT 中,裝置可以扮演兩種角色:Publisher(釋出者)和 Subscriber(訂閱者)。Publisher 將訊息釋出到一個特定的主題(Topic),而 Subscriber 則訂閱這個主題,以接收釋出者的訊息。

當 Publisher 釋出一條訊息時,訊息會被送到 MQTT 代理(Broker),Broker 會將訊息轉發給所有訂閱了該主題的 Subscriber。這樣,Subscriber 就可以接收到釋出者的訊息。

MQTT 的優點

MQTT 的 Publish 和 Subscribe Paradigm 有以下優點:

  • 解耦: Publisher 和 Subscriber 之間的解耦,使得系統更加靈活和可擴充套件。
  • 可靠性: MQTT 的 QoS(Quality of Service)機制可以確保訊息的可靠傳遞。
  • 低延遲: MQTT 的 Publish 和 Subscribe Paradigm 可以實現低延遲的訊息傳遞。

QoS 的工作原理

QoS 是 MQTT 中的一個重要機制,負責確保訊息的可靠傳遞。QoS 有三個級別:

  • QoS 0: 最多一次(At most once),訊息可能會丟失。
  • QoS 1: 至少一次(At least once),訊息可能會被重複傳遞。
  • QoS 2: 恰好一次(Exactly once),訊息只會被傳遞一次。

當 Publisher 釋出一條訊息時,可以指定 QoS 級別。Subscriber 也可以指定 QoS 級別,以確保訊息的可靠傳遞。

Keep Alive 的工作原理

Keep Alive 是 MQTT 中的一個機制,負責維持 Client 和 Broker 之間的連線。Client 需要定期向 Broker 傳送控制包,以維持連線。若 Client 沒有傳送控制包,Broker 會認為連線已斷開。

Keep Alive 的時間間隔可以由 Client 和 Broker 協商。若 Client 和 Broker 之間的連線斷開,Client 會嘗試重新連線。

MQTT 通訊協定在物聯網平臺中的應用

MQTT(Message Queuing Telemetry Transport)是一種輕量級的物聯網通訊協定,廣泛應用於物聯網平臺。它提供了一種高效、可靠的方式,讓裝置之間可以進行雙向通訊。

Keep Alive 機制

MQTT 中的 Keep Alive 機制是用來維持裝置與伺服器之間的連線。當裝置連線到伺服器時,它會設定一個 Keep Alive 間隔,如果裝置在這個間隔內沒有傳送任何資料,伺服器就會關閉連線,並發布一個 Last Will 訊息。

Last Will 和 Testament

Last Will 和 Testament 是 MQTT 中的一個特殊訊息,當裝置與伺服器之間的連線斷開時,伺服器會發布這個訊息給所有訂閱者。這個訊息可以讓其他裝置和應用程式知道裝置的狀態,並進行相應的處理。

保留訊息

保留訊息(Retained Message)是一種特殊的 MQTT 訊息,當裝置發布了一個保留訊息時,伺服器會將其儲存起來,直到裝置發布另一個訊息覆蓋它。當其他裝置訂閱相同的主題時,伺服器會立即發布保留訊息給它們。

WebSocket

WebSocket 是一個網路協定,提供了瀏覽器和伺服器之間的雙向通訊。MQTT 可以與 WebSocket 結合,讓瀏覽器可以與 MQTT 伺服器進行通訊。

訊息代理的選擇

選擇合適的訊息代理是建立物聯網平臺的關鍵。MQTT 是一個輕量級、可靠的訊息代理,特別適合於物聯網應用。其他訊息代理,如 AMQP 和 CoAP,也有其優缺點,需要根據具體需求進行選擇。

MQTT 的優點

MQTT 有以下優點:

  • 輕量級:MQTT 的協定頭部很小,減少了資料傳輸的負擔。
  • 可靠:MQTT 提供了保證資料傳輸的機制,確保資料不會丟失。
  • 雙向通訊:MQTT 支援裝置和伺服器之間的雙向通訊。
  • 低功耗:MQTT 的設計減少了功耗,適合於電池供應的裝置。

MQTT 的應用場景

MQTT 的應用場景包括:

  • 物聯網:MQTT 是物聯網的理想協定,特別適合於低功耗、低頻寬的應用。
  • 工業控制:MQTT 可以用於工業控制系統,提供可靠的資料傳輸。
  • 智慧家居:MQTT 可以用於智慧家居系統,提供裝置之間的通訊。

安裝訊息代理(Message Broker)

現在,我們已經討論了釋出/訂閱機制的基礎和代理(Broker)如何運作,讓我們在雲端例項上安裝和設定MQTT代理。我們將在系統上安裝Mosquitto代理。Ubuntu儲存庫中有Mosquitto的最新版本,可以透過apt套件管理器進行安裝:

# apt update
# apt install mosquitto mosquitto-clients

第一個命令更新套件列表,而第二個命令安裝Mosquitto代理和本地客戶端套件。安裝完成後,Mosquitto會立即啟動,我們可以使用以下命令檢查:

# lsof -i :1883

輸出結果顯示Mosquitto正在監聽標準MQTT埠1883。

測試Mosquitto代理

為了測試代理是否正常運作,我們可以開啟兩個終端視窗,分別用於訂閱和釋出訊息。首先,在一個終端視窗中,訂閱一個主題(Topic):

# mosquitto_sub -h localhost -t testTopic

然後,在另一個終端視窗中,釋出一條訊息到該主題:

# mosquitto_pub -h localhost -t testTopic -m "Hello world !"

如果一切正常,則在訂閱的終端視窗中應該會看到釋出的訊息。

保護Mosquitto代理

為了保護Mosquitto代理,我們可以使用使用者名稱和密碼進行驗證。Mosquitto安裝包中包含了一個工具,稱為mosquitto_passwd,可以用於生成一個特殊的密碼檔案,稱為mosquitto_passwd。這個檔案會將使用者名稱和密碼組合儲存在/etc/mosquitto/passwd中,以雜湊和不可讀的格式儲存。

# mosquitto_passwd -c /etc/mosquitto/passwd anand
# mosquitto_passwd /etc/mosquitto/passwd guest

輸入密碼後,密碼會被儲存在密碼檔案中。然後,我們需要將這些詳細資訊新增到Mosquitto配置檔案中,並重新啟動Mosquitto代理。

圖表翻譯:

  flowchart TD
    A[安裝Mosquitto] --> B[啟動Mosquitto]
    B --> C[測試Mosquitto]
    C --> D[保護Mosquitto]
    D --> E[重新啟動Mosquitto]

內容解密:

Mosquitto代理的安裝和配置過程包括更新套件列表、安裝Mosquitto代理和本地客戶端套件、啟動Mosquitto代理、測試代理是否正常運作、保護Mosquitto代理使用使用者名稱和密碼驗證、以及重新啟動Mosquitto代理。這些步驟確保Mosquitto代理的正常運作和安全性。

訊息代理(Message Broker)設定與安全

在本章中,我們將探討如何設定和安全化Mosquitto訊息代理。Mosquitto是一個流行的開源訊息代理,廣泛用於物聯網(IoT)和其他應用中。

設定Mosquitto

首先,我們需要設定Mosquitto以禁止匿名連線。為此,我們需要在Mosquitto的設定檔中新增兩行:

allow_anonymous false
password_file /etc/mosquitto/passwd

第一行設定禁止匿名連線,第二行指定了密碼檔的位置。Mosquitto將使用這個檔案來驗證每個連線請求。

啟動Mosquitto

為了使設定生效,我們需要重新啟動Mosquitto。首先,我們需要找到Mosquitto的程序ID(PID):

lsof -i :1883

然後,我們可以使用kill命令停止Mosquitto:

kill 352

接下來,我們可以重新啟動Mosquitto,指定設定檔和啟用詳細輸出:

mosquitto -c /etc/mosquitto/mosquitto.conf -v &

安全化Mosquitto

Mosquitto可以使用TLS(Transport Layer Security)來安全化連線。為此,我們需要生成一個憑證和私鑰。然後,我們可以在Mosquitto的設定檔中新增以下行:

listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

這些設定指定了Mosquitto的TLS設定,包括憑證、私鑰和CA憑證。

訊息代理日誌設定

最後,我們可以設定Mosquitto的日誌設定。為此,我們可以在Mosquitto的設定檔中新增以下行:

log_type all
log_timestamp true
log_dest stdout
log_dest topic
sys_interval 15

這些設定指定了Mosquitto的日誌設定,包括日誌型別、時間戳、日誌目的地和系統間隔。

圖表翻譯:

  flowchart TD
    A[設定Mosquitto] --> B[禁止匿名連線]
    B --> C[啟動Mosquitto]
    C --> D[安全化Mosquitto]
    D --> E[設定日誌]
    E --> F[完成]

這個圖表展示了設定和安全化Mosquitto的流程。

內容解密:

Mosquitto是一個強大的訊息代理,需要正確設定和安全化以確保其穩定性和安全性。在本章中,我們探討瞭如何設定和安全化Mosquitto,包括禁止匿名連線、啟動Mosquitto、安全化Mosquitto和設定日誌。這些設定可以幫助您建立一個安全和可靠的訊息代理系統。

Mosquitto 代理伺服器配置最佳實踐

Mosquitto 是一種流行的 MQTT 代理伺服器,廣泛應用於物聯網和其他需要實時通訊的領域。為了確保 Mosquitto 代理伺服器的安全性和效率,需要進行適當的配置。以下是配置 Mosquitto 代理伺服器的最佳實踐。

啟用日誌記錄

為了分析 Mosquitto 代理伺服器的工作情況和除錯問題,需要啟用日誌記錄。可以在配置檔案中新增以下行來啟用日誌記錄:

connection_messages true
autosave_interval 900

這些行將啟用所有活動的日誌記錄,包括新連線、訂閱、釋出、斷開連線、錯誤和警告。日誌記錄將每 15 分鐘儲存一次。

啟用永續性

為了確保 Mosquitto 代理伺服器的永續性,需要啟用永續性。可以在配置檔案中新增以下行來啟用永續性:

persistence true
persistence_file broker_log.txt
persistence_location /var/lib/mosquitto/

這些行將啟用永續性,並將永續性詳細資訊儲存在 broker_log.txt 檔案中。

禁止匿名客戶端

為了提高安全性,需要禁止匿名客戶端。可以在配置檔案中新增以下行來禁止匿名客戶端:

allow_anonymous false
password_file /etc/mosquitto/passwd

這些行將禁止所有匿名連線,並提供一個密碼檔案進行身份驗證。

配置安全的 MQTT 聽眾

為了確保 MQTT 通訊的安全性,需要配置安全的 MQTT 聽眾。可以在配置檔案中新增以下行來配置安全的 MQTT 聽眾:

listener 1883 localhost
listener 8883
certfile /etc/letsencrypt/live/in24hrs.xyz/cert.pem
cafile /etc/letsencrypt/live/in24hrs.xyz/chain.pem
keyfile /etc/letsencrypt/live/in24hrs.xyz/privkey.pem

這些行將配置兩個 MQTT 聽眾:一個是本地的、未加密的 MQTT 聽眾,另一個是安全的、加密的 MQTT 聽眾。安全的 MQTT 聽眾使用 SSL/TLS 證書進行加密。

內容解密:
  • connection_messages true:啟用所有活動的日誌記錄。
  • autosave_interval 900:每 15 分鐘儲存一次日誌記錄。
  • persistence true:啟用永續性。
  • persistence_file broker_log.txt:指定永續性詳細資訊儲存檔案。
  • persistence_location /var/lib/mosquitto/:指定永續性詳細資訊儲存位置。
  • allow_anonymous false:禁止所有匿名連線。
  • password_file /etc/mosquitto/passwd:提供一個密碼檔案進行身份驗證。
  • listener 1883 localhost:配置本地的、未加密的 MQTT 聽眾。
  • listener 8883:配置安全的、加密的 MQTT 聽眾。
  • certfile /etc/letsencrypt/live/in24hrs.xyz/cert.pem:指定 SSL/TLS 證書檔案。
  • cafile /etc/letsencrypt/live/in24hrs.xyz/chain.pem:指定 SSL/TLS 證書鏈檔案。
  • keyfile /etc/letsencrypt/live/in24hrs.xyz/privkey.pem:指定 SSL/TLS 私鑰檔案。

圖表翻譯:

  graph LR
    A[Mosquitto 代理伺服器] -->|啟用日誌記錄|> B[日誌記錄]
    B -->|儲存日誌記錄|> C[日誌檔案]
    A -->|啟用永續性|> D[永續性詳細資訊]
    D -->|儲存永續性詳細資訊|> E[永續性檔案]
    A -->|禁止匿名客戶端|> F[身份驗證]
    F -->|驗證客戶端|> G[安全的 MQTT 聽眾]
    G -->|配置安全的 MQTT 聽眾|> H[SSL/TLS 證書]
    H -->|加密 MQTT 通訊|> I[安全的 MQTT 通訊]

這個圖表展示了 Mosquitto 代理伺服器的配置過程,包括啟用日誌記錄、永續性、禁止匿名客戶端和配置安全的 MQTT 聽眾。

訊息代理伺服器的設定與測試

在本章中,我們將深入探討訊息代理伺服器的設定與測試。首先,我們需要確認 Mosquitto 訊息代理伺服器是否正在執行。可以使用以下命令來檢查:

lsof -i :1883

這個命令會顯示 Mosquitto 訊息代理伺服器的程序 ID、使用者、檔案描述符、型別、裝置、大小/偏移、節點和名稱。若伺服器正在執行,則會顯示類似以下的輸出:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mosquitto 831 mosquitto  3u  IPv4 1131147      0t0  TCP localhost:1883 (LISTEN)

若要停止 Mosquitto 訊息代理伺服器,可以使用以下命令:

kill 831

訊息代理伺服器的日誌設定

為了方便地監控 Mosquitto 訊息代理伺服器的執行狀態,我們可以將其日誌輸出到一個檔案中。可以使用以下命令來設定日誌輸出:

# cat mosquitto.log

或者,可以使用以下命令來實時監控日誌輸出:

# tail -f mosquitto.log

安全 MQTT 通訊的設定

為了啟用安全的 MQTT 通訊,我們需要在防火牆中開啟 8883 埠。可以使用以下命令來設定:

# ufw allow 8883

這個命令會在防火牆中新增一條規則,允許 8883 埠的入站流量。輸出如下:

Rule added
Rule added (v6)
圖表翻譯:
  flowchart TD
    A[訊息代理伺服器] --> B[設定日誌輸出]
    B --> C[監控日誌輸出]
    C --> D[啟用安全 MQTT 通訊]
    D --> E[設定防火牆]
    E --> F[新增規則]

這個圖表顯示了我們在本章中設定和測試 Mosquitto 訊息代理伺服器的流程。從設定日誌輸出到啟用安全 MQTT 通訊,每一步都非常重要,以確保我們的 IoT 平臺的穩定性和安全性。

建立關鍵元件

在開始建立IoT平臺的旅程時,我們首先定義了平臺的終極目標和高層次內容。到目前為止,我們已經建立了一個功能齊全的雲端例項和訊息代理。下一步是開始建立平臺的其他元件。

從建置雲端例項、安裝 Node-RED 與 MQTT Broker,到設定安全連線和許可權控管,本文完整闡述了建構 IoT 平臺基礎設施的關鍵步驟。透過逐步的指令操作和圖表解說,讀者得以理解每個元件的功用和彼此間的關聯。然而,系統的安全性並非一蹴可幾,持續監控日誌、更新軟體版本和定期檢視安全策略同等重要。展望未來,整合各個元件、開發使用者介面和資料視覺化工具將是建構完整 IoT 平臺的下一階段挑戰。對於有意打造高度客製化和安全可靠 IoT 平臺的開發者而言,本文提供的實務指引將是 invaluable 的起點。玄貓認為,掌握這些基礎知識,並持續學習新興技術,才能在快速發展的 IoT 領域保持競爭力。