MQTT 介面
路徑:專案檢視> 設定 > 介面 > 連按兩下 MQTT
使用 MQTT 介面可依照 MQTT 標準發佈資料。
請注意,要透過 MQTT 通訊協定傳輸的標記或警報必須在群組中定義。
參數 | 描述 |
---|---|
啟用 MQTT 介面 | 用於啟動 MQTT 服務的主標識。 選取的標記群組將會發佈到 MQTT 代理程式。 |
啟用警報 | 選取的警報群組將會發佈到 MQTT 代理程式。 只要警報狀態有變更,即會發佈警報。 |
標記組態
參數 | 描述 |
---|---|
啟用 | 啟用包含在群組中的標記以觸發發佈「資料 (Pub)」。群組中包含的標記可使用訂閱「資料 (Sub)」更新。 |
標記群組 | 在滿足指派的原則條件時將會傳輸的標記之清單。 |
QoS |
要使用的 QoS
|
保留 | 此標識定義訊息是否由代理程式儲存為指定主題的最後已知有效值。新的用戶端在訂閱主題時,會收到為該主題保留的最後訊息。 |
持續性 |
若為真,QoS 大於 0 的訊息將排入可供使用的檔案系統檔案之佇列,即使在面板重設之後,或者與 MQTT 伺服器之間中斷的通訊重新建立時。 |
原則 | 定義用於決定何時發佈標記值的條件。若為空白,則使用在表格頂部定義的「預設推送原則」。 |
管理推送原則
原則包括觸發準則與多項(可選)條件,必須驗證後才可傳輸標記值。
觸發程序
參數 | 描述 |
---|---|
計時器 |
持續執行發佈,即使在值沒有變更時。
|
在變更時 |
在標記值變更時執行發佈。
|
條件
條件包含條件的資料夾。每個資料夾可能有兩種類型:
- 滿足下列所有條件 (AND)
- 滿足下列任意條件 (OR)
所有資料夾必須經過驗證才可進行觸發程序請求的傳輸。在所有包含的條件為真時驗證「滿足下列所有條件」類型的資料夾,而在至少一個包含的條件為真時驗證「滿足下列任意條件」類型的資料夾。
標記介面
「標記介面」可讓您定義要用於交換 the MQTT 介面狀態相關資訊的標記。
參數 | 描述 | 資料類型 |
---|---|---|
啟用 |
控制 MQTT 介面的狀態。 如果此參數為空(未附加至標記),MQTT 介面將一律啟用。
|
布林值 讀寫 |
狀態 |
報告 MQTT 介面的狀態。
|
不帶正負號的整數 唯讀 |
最近錯誤 |
如有錯誤,將報告錯誤訊息。 您可以寫入空白字串以清除錯誤訊息。 |
字串 讀寫 |
已傳送訊息 | 已從 HMI 裝置傳送至遠端 MQTT 伺服器的訊息量。 |
不帶正負號的整數 唯讀 |
已接收訊息 | HMI 裝置從遠端 MQTT 伺服器接收的訊息量。 |
不帶正負號的整數 唯讀 |
佇列長度 | 暫時快取在本地緩衝區中、等待傳送的訊息數量。 |
不帶正負號的整數 唯讀 |
佇列大小 | 可暫時快取在本地緩衝區中的訊息最大數。 |
不帶正負號的整數 唯讀 |
設定
主題 | 描述 |
---|---|
最大待處理訊息數 | 存在通訊錯誤時可在 RAM 中排入佇列的訊息數。只要 MQTT 伺服器恢復為可連線,佇列訊息即會發佈。 |
預設值 | 用於「標記組態」表中未定義之主題的「QoS」、「保留」與「持續性」參數的值。 |
主題與裝載
支援的主題有五種類型:
主題 | 描述 |
---|---|
出生 | 這是在 HMI 裝置啟動時只發佈一次的特殊主題。 |
將會 |
在裝置啟動時發佈但由 MQTT Broker 儲存和保持隱藏的特殊主題。如果偵測到用戶端非正常地中斷連線,將由 MQTT Broker 發佈。 |
資料 (Pub) | 主題依照與標記群組關聯的傳輸原則發布標記值。 |
資料 (Sub) | 主題用於訂閱標記。裝載是用於識別收到的標記值的範本。 |
警報 | 用於發佈警報的主題 |
對於每個主題,裝載定義關聯值的結構。請注意,在主題與裝載定義中可以使用預留位置。
預留位置 | 描述 |
---|---|
${clientId} | MQTT 用戶端 ID |
${currentTimestamp} | 目前時間 |
${protocolName} | 關聯到標記的通訊協定之名稱 |
${tagGroup} | 標記所屬的群組之名稱 |
${tagName} | 標記的名稱 |
${alarmGroup} | 警報所屬的群組之名稱 |
${alarmName} | 警報的名稱 |
${value} | 最後已知的標記值 |
${timestamp} | 讀取標記值時的時間戳記 |
${activeValue} | 警報變為作用中時的標記名稱 |
${quality} | 標記的品質(如可靠性) |
${activeTimestamp} | 產生警報的最新事件的時間戳記 |
${inactiveTimestamp} | 停止警報條件的最新事件的時間戳記 |
${ackTimestamp} | 操作員確認警報時的時間戳記 |
${description} | 警報描述 |
${customField1} | 警報自訂欄位 1 |
${customField2} | 警報自訂欄位 2 |
${state} | 警報狀態 |
${severity} | 警報嚴重性 |
${lowLimit} | 警報「下限」 |
${highLimit} | 警報「上限」 |
${[0]} | 如果警報描述中可用,則為第一個實時標記的值,第二個實時標記的值為 [1],依此類推 |
${[Tag1]} | 如果警報描述中可用,則為「標記 1」實時標記的值 |
${any} | 通用標籤。可用於訂閱裝載 |
JSON 裝載
選擇 JSON 格式時,為字串值加上引號以符合 JSON 語法。
可以使用 JSON 格式來最佳化通訊,以在單一訊息內包含多條訊息。選擇「訊息彙總」時,訊息在所選逾時到期後或者要傳送的訊息達到所選大小時傳送到 MQTT 伺服器。
多個標記
在訂閱/發佈主題中使用 JSON 格式可管理多個標記,如下列範例所示:
若要比對收到的訊息,如:
{ "x": { "tagName": "Tag1", "value": 1 }, "y": { "tagName": "Tag2", "value": 2 } }
您可以使用模式:
{ "${any}": { "tagName": "${tagName}", "value": "${value}" } }
若要比對收到的訊息,如:
[ { "tagName": "Tag1", "value": 1 }, { "tagName": "Tag2", "value": 2 } ]
您可以使用模式:
[ { "tagName": "${tagName}", "value": "${value}" } ]
若要比對收到的訊息,如:
{ "Tag1": { "value": 1 }, "Tag2": { "value": 2 } }
您可以使用模式:
{ "${tagName}": { "value": "${value}"} }
若要比對陣列傳入訊息的一個或所有元素,如:
{ "Tag1": { "value": "[1, 2, 3, 4, 5, 6, 7, 8]" } }
您可以使用模式:
{ "${tagName}": { "value": "${value.1}"} }
{ "${tagName}": { "value": "${value}"} }
對於發佈的主題,需要標記/標記群組來建立觸發條件,但訊息現在可以使用實時標記語法包含其他標記值。在裝載模式中甚至可以省略觸發標記。
範例:
{ "tag1" : "${[Tag1]}", "tag2" : "${[Tag2]}" }
對於訂閱的主題,可以使用同樣的實時標記語法來寫入任何標記值(請注意,只能寫入從觸發條件列出的標記)。
範例:
{ "tag1" : "${[Tag1]}", "tag2" : "${[Tag2]}" }
{ "t" : "${tagName}", "v" : "${value}", "tag2" : "${[Tag2]}" }"
MQTT 代理程式設定
目前支援的 MQTT 代理程式包括:
- 通用 MQTT 代理程式
- Azure
- Amazon AWS
- IBM BlueMix
- Murano
請注意,有些參數取決於選擇的代理程式。
通用 MQTT 代理程式
參數 | 描述 |
---|---|
代理程式位址 |
包含連接埠編號的 MQTT 伺服器名稱或 IP 位址(如 "127.0.0.1:1883") 一般而言,預設 TCP/IP 連接埠為 1883,在使用 MQTT over SSL 時則為連接埠 8883。 |
用戶端 ID | 用戶端 ID 是連線到 MQTT 代理程式的每個 MQTT 用戶端的識別碼。您可以建立您喜歡的 ID,但每個代理程式必須唯一。代理程式使用它來識別用戶端與用戶端的目前狀態。 |
使用者名稱 密碼 |
如果 MQTT 代理程式設定為需要使用有效的使用者名稱與密碼進行用戶端身份驗證 |
保持連接的時間 (秒) | 沒有資料流時傳送 PING 請求到伺服器之前的時間間隔(用於瞭解用戶端及伺服器是否仍然啟用且可連線)。 |
使用清潔的工作階段 | 當清潔的工作階段標識設為假時,代理程式將為用戶端建立持久的工作階段。所有資訊與訊息保留至下次用戶端請求清潔的工作階段時。如果清潔的工作階段標識設為假,且代理程式已經有可用於用戶端的工作階段,它將使用現有的工作階段,並將之前排入佇列的訊息傳送給用戶端。 |
使用舊值 | 「使用舊值」標識使用戶端遵循 MQTT 規格 3.1 |
啟用 TLS
如果 MQTT 伺服器設定為使用 TLS 連線,則 HMI 裝置必須向伺服器提供其自己的憑證。即使不是必要的,但每個用戶端皆應有自己的憑證(不過您可以將同一憑證部署到所有用戶端)。
要求伺服器與用戶端憑證由同一授權單位簽署。
參數 | 描述 |
---|---|
啟用 TLS | 啟用 TLS 加密 |
CA 憑證 | 已在 Mosquitto 代理程式上簽署伺服器憑證的 CA 之公共憑證 |
用戶端憑證 | HMI 裝置的公共憑證。必須從 CA 憑證簽署 |
用戶端密鑰 | 與用戶端憑證關聯的私鑰 |
TLS 版本 |
要使用的 TLS 版本(必須與 MQTT 代理程式中使用的加密等級一致)
|
不安全 | 此選項停用伺服器憑證中伺服器主機名稱的驗證。這在測試初始伺服器組態時可能有用,但惡意的第三方可能會透過 DNS 詐騙等方式冒充您的伺服器。請僅在測試中使用此選項。 |
請注意,您可以使用「附加到標記」在執行階段透過巨集、JavaScript 或組態頁面等輸入 MQTT 參數。這在使用不同的值(如用戶端 ID)時(即使下載同一專案到不同的 HMI 裝置)可能有用。
如果使用標記定義 MQTT 設定(如用戶端 ID),請確保不要在與 MQTT 伺服器交換的標記清單中納入這些標記,以免傳回錯誤的設定。
用於憑證的字串標記必須大到足以包含整個憑證(如 2.048 位元組)。憑證的格式必須是 ASCII,包含第一行與最後一行,如下列範例所示。
MQTT 代理程式範例
下面是一個小範例,說明如何設定應用程式以與 MQTT 伺服器通訊。在此範例中,我們設定 HMI 裝置使用憑證與開放原始碼 MQTT 代理程式 (https://mosquitto.org) 通訊。憑證將使用公共 OpenSSL-Win32 程式庫 (https://www.openssl.org) 建立。
產生憑證
下列指令檔將建立多個伺服器與用戶端憑證,以及一個用於簽署伺服器與用戶端憑證的公共憑證授權單位,並且驗證這些憑證的真實性。
- ca.crt
- server.crt, server.key
- client.crt, client.ket
檔案:CreateCertificates.cmd
@echo off set OpenSSL="C:\Program Files (x86)\OpenSSL-Win32\bin\openssl.exe" rem Generate self signed CA certificate (Certificate Autority) %OpenSSL% req -nodes -batch -new -x509 -days 1000 -keyout ca.key -subj "/CN=Broker/O=company.com" -out ca.crt rem Generate MQTT Server private key %OpenSSL% genrsa -out server.key 2048 rem Generate MQTT Server certificate signed request %OpenSSL% req -batch -new -key server.key -subj "/CN=localhost/O=company.com" -out server.csr rem Sign the MQTT Server certificate %OpenSSL% x509 -req -days 1000 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt rem Generate HMI Client private key %OpenSSL% genrsa -out client.key 2048 rem Generate HMI Client Server certificate signed request %OpenSSL% req -batch -new -key client.key -subj "/CN=client/O=company.com" -out client.csr rem Sign the HMI Client certificate %OpenSSL% x509 -req -days 1000 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt rem Remove unnecessary files del *.rnd *.srl *.csr pause
請注意,伺服器主機名稱為 localhost (/CN=localhost),這表示您無法使用安全連線,在代理程式位址中您無法寫入「localhost」網域。僅當 MQTT 伺服器與 HMI 裝置在同一裝置上執行時才可使用「localhost」網域,否則,要想連線 MQTT 伺服器,您必須使用 IP 位址與「不安全」標識。
MQTT 代理程式組態
伺服器憑證(server.crt、server.key)與授權單位憑證 (ca.crt) 必須放入 MQTT 資料夾的子資料夾,例如「certs」子資料夾。
必須設定「mosquitto.conf」檔案才可使用 TLS 支援
# ================================================================= # Default listener # ================================================================= ...(omiss) ...# Port to use for the default listener.#port 1883 port 8883 # ----------------------------------------------------------------- # Certificate based SSL/TLS support # ----------------------------------------------------------------- ...(omiss) ...#cafile #capath cafile certs/ca.crt certfile certs/server.crt keyfile certs/server.key tls_version tlsv1.2
MQTT 代理程式可使用下列指令從 dos 指令視窗啟動:
mosquitto -v -c mosquitto.conf
MQTT 用戶端
為便於測試,啟動訂閱了所有主題的 MQTT 用戶端可能有用,這樣您可以看到將要與 HMI 裝置交換的訊息。由於我們使用的是 TLS 通訊,因此必須提供用戶端憑證。我們可以複製 certs-client 子資料夾中的 client.crt、client.key 及授權單位憑證 ca.crt。
因此用於啟動 MQTT 用戶端的指令為:
mosquitto_sub --cafile certs-client\ca.crt --cert certs-client\client.crt --key certs-client\client.key -p 8883 -t /#
HMI 裝置
若要設定 HMI 裝置,我們必須提供:
- 使用 MQTT 伺服器在其中執行的 IP 位址設定代理程式位址參數
- 將連接埠位址設定為 8883
- 載入授權單位憑證、用戶端憑證及用戶端密鑰檔案
- 將 TLS 版本設定為版本 1.2 以與 MQTT 伺服器設定一致
- 由於您可能使用 IP 位址引用 MQTT 伺服器,這與伺服器憑證所宣告的網域不同,因此您必須設定「不安全」標識
為執行第一次測試,您可以保留主題與裝載的預設值,並設定您要傳輸到 MQTT 代理程式的警報群組與標記群組。