Python 虛擬 RTU/IIoT 模擬器,支援 IEC-20922 MQTT 通訊協定

專案設計目的 :在此專案中,我擴展了我先前基於 Python 的虛擬 PLC/RTU 模擬器函式庫(該函式庫透過 Modbus-TCP 和 S7Comm 與 SCADA 系統介接,相關連結:https://www.linkedin.com/pulse/python-virtual-plc-rtu-simulator-yuancheng-liu-elkgc),增加了對 IEC-20922 Message Queuing Telemetry Transport (MQTT) 通訊協定的支援功能。新功能設計包含兩個主要元件:
-
MQTT 通訊模組 :MQTT 通訊模組實作了符合 IEC 20922 標準的 MQTT 通訊協定堆疊,提供虛擬裝置與 MQTT Broker 之間的連線能力,以支援訊息發布與訂閱、主題管理、遙測資料交換以及指令/控制通訊。
-
RTU/IIoT 模擬器框架 :RTU/IIoT 模擬器框架模擬工業現場裝置、遠端終端單元 (RTU) 和 IIoT 感測器的操作行為。它管理數位分身 (cyber twin) 的虛擬裝置輸入與輸出,處理 MQTT 訊息,與實體世界模擬模組介接,並執行使用者定義的控制邏輯。
# Author: Yuancheng Liu
# Created: 2026/06/01
# Version: v_0.0.1
# Copyright: Copyright (c) 2026 Liu Yuancheng
# License: MIT License
1. 專案簡介
Message Queuing Telemetry Transport (MQTT) 通訊協定,標準化為 IEC 20922,是一種輕量級的發布/訂閱訊息傳輸協定,專為資源受限的裝置和低頻寬無線網路而設計。由於其簡潔性、可擴展性和低通訊開銷,MQTT 已成為工業物聯網 (IIoT) 領域以及製造、能源、交通和智慧基礎設施等行業的機器對機器 (M2M) 通訊中最廣泛採用的通訊標準之一。
在典型的 IIoT 部署中,現場裝置將操作資料發布到中央 MQTT Broker,而監管系統、人機介面 (HMI)、行動應用程式和監控平台則訂閱所需的資料串流。這種解耦的通訊模型簡化了系統整合,並為大規模工業監控和控制系統提供了靈活的架構。以下顯示了 MQTT 與 IIoT/RTU/PLC 的使用案例範例:

圖片來源 : https://macautoinc.com/industrial-communication-protocols/mqtt/
為了支援工業數位分身和 OT 網路安全研究平台的開發,本專案將提供一組可重複使用的 MQTT Broker 和 MQTT Client 模組,這些模組可以整合到不同的數位分身元件中。
1.1 系統概述
此模擬器專案 並非 1:1 模擬真實 RTU/IIoT/MU 硬體功能(非數位分身),而是著重於重現常見於支援 MQTT 的工業裝置的核心操作行為,包括:
-
裝置變數和標籤的儲存管理
-
MQTT 發布和訂閱通訊機制
-
遙測和控制資料交換工作流程
-
裝置控制邏輯的執行週期
-
現場裝置、控制器和監管系統之間的互動
而系統應用程式的主要目的將是提供有效的教育、原型製作和研究環境,例如:
-
研究工業自動化和 IIoT 架構的學術研究人員
-
學習 OT 通訊協定和 MQTT 裝置行為的學生
-
開發、測試或驗證支援 MQTT 的應用程式的開發人員
-
分析工業通訊流程和攻擊情境的 OT 網路安全專業人員
1.2 系統 ISA-95 架構
此模擬器使用戶能夠建構反映現代工業環境中常見的階層式架構的數位分身元件。如下圖所示,該框架遵循基於 ISA-95 模型簡化的四層 OT 架構:

-
在 Level 0 (實體製程現場 I/O 裝置),模擬的 IIoT 裝置、感測器和計量單元產生操作資料,代表從實體製程收集的測量值。在 Level 1 (控制器 LAN),虛擬 RTU 處理進來的資料並作為 MQTT 用戶端運作,將遙測和狀態資訊發布到 MQTT Broker。
-
位於 Level 2 (控制中心處理 LAN) 的 MQTT Broker 伺服器,充當中央通訊樞紐。它接收來自現場裝置的發布訊息,管理主題訂閱,儲存裝置資料,並在需要時執行伺服器端處理邏輯。同一網路區段內的控制 HMI 和操作員控制台也可以透過 Broker 訂閱或發布 MQTT 訊息。
-
在 Level 3 (營運管理區),監管應用程式,如監控工作站、工程桌面、行動裝置和觸控螢幕操作面板,運行 MQTT 用戶端服務來訂閱裝置資料、視覺化製程資訊並發出控制指令。
2. MQTT 通訊協定背景知識
Message Queuing Telemetry Transport (MQTT) 是一種輕量級訊息傳輸協定,標準化為 IEC 20922。它遵循 發布/訂閱通訊模型,其中裝置之間不直接通訊。相反地,所有訊息都透過中央 MQTT Broker 交換。
在 MQTT 系統中,充當 發布者 的裝置將資料發送到 Broker 上託管的特定主題,而 訂閱者 則接收它們感興趣的主題的訊息。這種架構簡化了通訊複雜性,提高了可擴展性,並能在低頻寬或不可靠的網路上實現高效運作。
2.1 MQTT 通訊協定封包結構
MQTT 通訊透過一系列在用戶端和 Broker 之間交換的通訊協定封包來執行。無論封包類型為何,每個 MQTT 封包都包含三個邏輯部分:
-
固定標頭 (必要)
-
變動標頭 (可選)
-
負載 (可選)
一般的 MQTT 封包結構如下圖所示:

有關詳細的封包分析,請參閱以下文件:
-
http://www.steves-internet-guide.com/mqtt-protocol-messages-overview/
-
https://www.hivemq.com/blog/mqtt-packets-comprehensive-guide/
這是一個將每個封包部分對應到擷取的 MATT 連線請求訊息的範例:

2.2 MQTT 通訊協定關鍵特性
輕量級標頭: 通訊協定封包非常小(通常只有幾個位元組),節省了頻寬、記憶體和電池壽命。
服務品質 (QoS): 開發人員可以選擇傳遞保證的等級:
-
QoS 0 (最多一次): 快速傳遞,但訊息可能會丟失。
-
QoS 1 (至少一次): 保證傳遞,但可能會有重複。
-
QoS 2 (恰好一次): 訊息恰好傳遞一次,沒有丟失或重複。
最後遺囑與宣告 (LWT): 允許裝置預先向 Broker 註冊一條訊息,如果裝置意外離線,該訊息將被自動廣播。
3. MQTT 虛擬 IIoT 和 RTU 設計
本節介紹 MQTT 通訊模組的詳細設計,並展示如何將它們整合到數位分身環境中。提供了兩個範例應用程式:
-
模擬的智慧工廠真空控制系統
-
物聯網無人機遙測接收系統
這些範例說明了如何將基於 MQTT 的通訊整合到工業控制架構的不同層級中。
3.1 MQTT 通訊模組設計
MQTT 通訊框架包含兩個主要元件:一個 MQTT Broker 模組和一個 MQTT Client 模組,用於提供模擬現場裝置、控制器和監管應用程式之間進行資料交換所需的訊息基礎設施。
3.1.1 MQTT Broker 設計
對於 MQTT Broker 模組,目前實作的 MQTT 封包類型如下所示。

# MQTT 封包類型常數 (目前所需,未來可能新增更多)
CONNECT = 0x10 # 與 MQTT Broker 建立連線
CONNACK = 0x20 # Broker 的連線確認
PUBLISH_Q0 = 0x30 # QoS 等級 0 (最多一次) 目前我們使用 QoS 等級 0 DUP = 0, Retain = 0
PUBLISH_Q1 = 0x32 # QoS 等級 1 (至少一次)
PUBLISH_Q2 = 0x34 # QoS 等級 2 (恰好一次)
PUBACK = 0x40 # 發布確認
SUBSCRIBE = 0x82 # 訂閱一個或多個主題
SUBACK = 0x90 # 訂閱確認
PINGREQ = 0xC0 # 保活請求
PINGRESP = 0xD0 # 保活回應
DISCONNECT = 0xE0 # 優雅地終止連線
對於每個 Broker 模組,當一個新的 MQTT 用戶端與其建立連線時,會建立一個專用的用戶端處理器執行緒,以獨立管理發布和訂閱請求。這種多執行緒架構允許多個 MQTT 用戶端同時與 Broker 通訊。
為了簡化參數存取並標準化資料交換,使用了以下主題命名慣例:
| 主題模式 | 目的 | 請求類型 |
|---|---|---|
parameters/get/ |
請求參數的目前值 | 發布 |
parameters/set/ |
更新參數的值 | 發布 |
parameters/value/ |
訂閱參數值更新 | 訂閱 |
除了基本的訊息路由之外,Broker 模組還提供了一個名為 executeLogic() 的空介面函數,允許使用者實作自訂資料處理和控制演算法,如下所示:
def executeLogic(self):
""" MQTT Broker 在主迴圈中執行控制邏輯的介面函數。"""
pass
使用者可以透過繼承基礎 MQTTBroker 類別並覆寫此函數來建立自訂 Broker,以實作應用程式特定的邏輯。此函數在每次透過發布請求更新參數值時自動觸發。它也可以在主執行迴圈中定期呼叫,以執行排定的資料處理任務。
為了簡化並最大化不同模擬裝置之間的相容性,所有參數值在內部都儲存為 string 資料類型。在需要時,可以透過應用程式特定的邏輯執行類型轉換。
3.1.2 MQTT Client 設計
MQTT Client 模組是使用 Eclipse Paho MQTT 函式庫實作的 https://pypi.org/project/paho-mqtt/ 。該用戶端提供了四個函數供數位分身模擬元件使用:
-
getParmVal()– 從 Broker 檢索參數值。 -
setParmVal()– 在 Broker 上更新參數值。 -
watch()– 訂閱指定的參數主題。 -
watchall()– 訂閱所有可用的參數主題。
3.2 數位分身整合設計
為了展示 MQTT 通訊框架的用法,開發了兩個數位分身元件:一個物聯網無人機遙測系統和一個智慧工廠真空控制系統。整體整合架構如下所示。

3.2.1 物聯網無人機遙測系統
在物聯網無人機模擬系統中,無人機模擬器作為 MQTT 用戶端運作,並持續將原始飛行遙測資料發布到 MQTT Broker。傳輸的資料包括:滾轉角、俯仰角、偏航角、高度、速度 和 GPS 位置 等資訊。
MQTT Broker 執行自訂處理邏輯,將原始感測器測量值轉換為易於理解的飛行狀態資訊。處理後的結果儲存在 Broker 的參數資料庫中。
無人機狀態監控控制台作為另一個 MQTT 用戶端運作,並訂閱處理後的遙測主題。透過持續接收來自 Broker 的更新,控制台提供無人機操作狀態和飛行條件的即時視覺化。
3.2.2 智慧工廠真空控制系統
智慧工廠真空系統展示了 MQTT 通訊與傳統 RTU 式控制架構的整合。
在實體製程模擬器中,溫度感測器、壓力感測器和風扇速度感測器產生模擬測量值,這些測量值透過基於 UDP 的電氣訊號模擬通道傳輸到 RTU。RTU 將這些測量值儲存在其內部參數字典中,並執行本地控制邏輯以確定適當的控制動作。
根據目前的運行狀況,RTU 可能會發出控制指令給:
-
風扇馬達控制器
-
氣管閥門控制器
-
其他模擬的現場裝置
這些控制指令透過與實體製程模型相同的模擬電氣訊號通道傳遞。
運行在 RTU 內部的 MQTT 用戶端將操作資料和系統狀態資訊發布到 MQTT Broker。工廠環境監控 HMI 訂閱這些 MQTT 主題,並透過即時儀表板顯示資訊。
MQTT 基礎設施也支援監管控制。當操作員透過控制儀表板修改系統配置時,該指令會發布到 MQTT Broker。RTU 訂閱相關的控制主題並接收更新的設定。這些操作員發出的指令可以覆蓋 RTU 的自動控制決策,從而允許在需要時進行手動干預。
收到新的控制參數後,RTU 會更新其內部控制狀態,並向風扇馬達控制器發出相應的指令,並打開氣管閥門,使實體製程模擬器做出相應的回應。
為了支援快速維護操作和工程測試,RTU 還託管了一個輕量級的嵌入式 MQTT Broker,直接連結到選定的控制參數。此功能使工程控制台和本地 HMI 能夠執行低延遲的直接控制和參數修改,而無需經過中央 MQTT 基礎設施。
4. 使用案例範例
為了展示 MQTT 虛擬 RTU/IIoT 模擬器的用法,本節介紹了一個簡單的風扇控制器 RTU 實作。該範例展示了如何整合 MQTT Broker 和 MQTT Client 模組來創建一個能夠執行自動控制邏輯,同時透過 MQTT 提供遙測和控制介面的 RTU。
以下 Python 模組作為基礎範例提供,可以擴展以建構更複雜的支援 MQTT 的工業裝置模擬器。
| 程式檔案 | 執行環境 | 描述 |
|---|---|---|
src/mqttComm.py |
python 3.7+ | 核心函式庫,實作 IEC-20922 MQTT 用戶端/Broker API,用於模擬 IIoT/RTU 與 SCADA 軟體之間資料和指令的互動。 |
src/mqttCommTest.py |
python 3.7+ | 的測試案例模組。它在背景執行緒中啟動一個 MQTT Broker 服務,建立兩個用戶端,並測試參數值發布/訂閱操作和控制邏輯。 |
testcase/mqtRtuClientTest.py |
python 3.7+ | 此模組是一個簡單的 RTU 連接程式,使用 MQTT lib 模組 來模擬一個 SCADA 裝置,其中包含一個 MQTT 用戶端,用於連接到 以設定參數的隨機值並讀取相關回應以驗證結果。 |
testcase/mqtRtuBrokerTest.py |
python 3.7+ | 此模組是一個簡單的 RTU 模擬程式,使用 lib 模組 來模擬一個 RTU,其中包含一個 MQTT Broker 和一個自動控制邏輯,用於處理來自用戶端的可變值讀取和變更設定。 |
No comment for this article.