移至主內容

用AWS IoT Core MQTT訂閱溫度數據:5分鐘打通感測器到雲端

工廠IT技術人員專用AWS IoT CoreMQTT訂閱ATLANTIS 自有品牌

用AWS IoT Core MQTT訂閱溫度數據:5分鐘打通感測器到雲端

台灣31年工業儀錶製造商 ATLANTIS 昶特有限公司系列教學文章第二篇:接續第一篇 RS-485接AWS IoT Core的基礎,本篇教你如何用 AWS IoT Core 主控台的 MQTT 測試客戶端,在5分鐘內「訂閱」到現場溫度感測器發布的即時數據,並提供 Python(paho-mqtt)與 boto3 兩種訂閱範例,讓工廠IT技術人員能自行驗證資料流是否正確送達雲端。

「Re-Atlantis」是我們的品牌使命——重現古代理想文明對精密測量的追求。當柏拉圖描繪的理想國強調秩序與精準,我們相信,資料從感測器到雲端的每一段路徑,也應該同樣精準、同樣可被驗證。這也是為什麼本篇要特別聚焦在「訂閱(Subscribe)」——因為沒有驗證過的資料流,永遠不能算是真正打通了雲端。詳見 ATLANTIS 品牌故事

一、發布(Publish)與訂閱(Subscribe):MQTT的核心概念

在第一篇文章中,我們示範了如何把 RS-485 溫度數據透過 MQTT 協定「發布(Publish)」到 AWS IoT Core。但發布之後,資料去了哪裡?誰能看到?這就是本篇要解決的問題——訂閱(Subscribe)

5分鐘
用AWS主控台
完成第一次訂閱驗證
3種
QoS等級
影響資料送達可靠度
0元
AWS IoT Core
主控台測試客戶端免費
1條
RS-485匯流排
可對應多個MQTT主題

MQTT(Message Queuing Telemetry Transport)是一種「發布/訂閱」(Pub/Sub)架構的輕量級通訊協定,專為頻寬有限、網路不穩定的物聯網環境設計——這正好符合工廠現場的網路條件。在這個架構下,發布者(Publisher)訂閱者(Subscriber)互不直接連線,而是透過一個「訊息代理(Broker)」中介,AWS IoT Core本身就是這個Broker。

為什麼工廠IT一定要學會「訂閱」?

很多工廠在導入雲端監控時,只完成了「發布」這一步,就急著往下做Lambda、DynamoDB、儀表板,卻從未親自驗證過「資料到底有沒有正確送達」。這會導致一個常見的除錯困境:當儀表板顯示的數據異常時,工程師不知道問題出在感測器、閘道器、網路,還是雲端規則設定。而學會用MQTT訂閱工具直接查看Broker上的原始訊息,正是排除這種困境最快的方法。

二、5分鐘實作:用AWS IoT Core主控台的MQTT測試客戶端訂閱數據

① ATLANTIS 溫度變送器 RS-485 / Modbus RTU 現場即時讀值 ② Python發布程式 Publish 主題: factory/line1/temperature ③ AWS IoT Core MQTT Broker 主題路由與轉發 TLS 8883 埠 ④ 主控台 MQTT測試客戶端 即時訂閱驗證 ⑤ Python 程式訂閱 後續處理

本篇的重點在於④與⑤:先用主控台的MQTT測試客戶端快速驗證資料流是否暢通(不需寫任何程式),確認無誤後,再進一步用Python程式訂閱同一個主題,把資料接進自己的應用程式或後續的Lambda處理流程。

步驟一:登入AWS IoT Core主控台

登入AWS管理主控台後,搜尋「IoT Core」進入服務頁面,左側選單找到「MQTT測試客戶端(MQTT test client)」。這是AWS內建的網頁版MQTT用戶端,不需要安裝任何軟體,也不需要憑證即可測試(僅限主控台內部使用,實際裝置仍須憑證驗證)。

步驟二:訂閱主題

在「訂閱主題」欄位輸入 factory/line1/temperature(或使用萬用字元 factory/# 訂閱該路徑下所有子主題),點擊「訂閱」。此時畫面會進入等待狀態,等待有裝置發布訊息到這個主題。

步驟三:從現場執行發布程式,觀察是否即時顯示

接著回到第一篇文章的範例二(Python發布程式),在現場工控電腦上執行。若一切設定正確,主控台的訂閱畫面會在1~2秒內顯示剛剛發布的JSON訊息內容,包含溫度值、裝置ID與時間戳記。

驗證成功時,你應該會看到類似這樣的訊息

{
    "device_id": "ATL-STT-001",
    "temperature": 68.4,
    "unit": "C",
    "timestamp": 1784812345
}

如果5分鐘內沒有看到任何訊息,代表資料流中斷在某個環節——可能是憑證權限不足、主題名稱打錯、或現場網路無法連上AWS端點。下一節會列出常見排錯清單。

三、MQTT主題命名規則:工廠現場的最佳實踐

很多工廠在剛開始導入時,會把所有感測器都發布到同一個籠統的主題(例如 sensor/data),結果隨著感測點增加,資料變得難以區分與管理。以下是我們建議的主題命名結構,兼顧擴充性與查詢彈性。

主題階層範例值用途說明
廠區factory固定前綴,識別為工廠端資料
廠區代號taipei-plant1若有多廠區,於此區分
產線代號line1識別資料來源產線
裝置類型temperature / pressure區分感測器類型,方便訂閱時篩選
裝置IDATL-STT-001唯一識別碼,對應實體變送器

完整主題範例:factory/taipei-plant1/line1/temperature/ATL-STT-001。這樣的結構讓你可以用萬用字元彈性訂閱,例如訂閱 factory/taipei-plant1/line1/temperature/# 只看該產線所有溫度數據,或訂閱 factory/+/+/temperature/#+代表單層萬用字元)跨廠區查看所有溫度類感測器,而不需要為每個裝置寫死固定訂閱清單。

MQTT的三種QoS等級:資料送達可靠度的關鍵設定

QoS等級送達保證適用情境工廠應用建議
QoS 0最多送達一次(可能遺失)對即時性要求高、可容忍偶爾漏資料高頻率但非關鍵的環境監測(如一般溫濕度)
QoS 1至少送達一次(可能重複)資料完整性優先,可接受偶爾重複建議工廠壓力/溫度告警數據採用此等級
QoS 2精確送達一次要求最嚴謹但延遲較高計費、安全相關的關鍵事件記錄

對於多數工廠的溫度壓力監控應用,我們建議採用QoS 1,在「不遺漏異常事件」與「系統效能」之間取得平衡。AWS IoT Core目前對QoS 2的支援視情境而異,實作前建議查閱AWS官方文件確認最新支援範圍。

四、用Python程式訂閱:讓資料自動流入你的應用程式

主控台驗證成功後,下一步是用程式「常駐訂閱」,讓資料可以自動導入你自己的資料庫、告警系統或儀表板,而不是每次都手動開主控台查看。以下範例使用 paho-mqtt 套件,這是Python中最常見的MQTT用戶端函式庫。

範例一:用 paho-mqtt 訂閱 AWS IoT Core 溫度主題

# pip install paho-mqtt==1.6.1 --break-system-packages
import json
import ssl
import paho.mqtt.client as mqtt

ENDPOINT = "your-endpoint.iot.ap-northeast-1.amazonaws.com"
TOPIC = "factory/taipei-plant1/line1/temperature/#"

def on_connect(client, userdata, flags, rc):
    print(f"連線結果代碼:{rc}")
    client.subscribe(TOPIC, qos=1)
    print(f"已訂閱主題:{TOPIC}")

def on_message(client, userdata, msg):
    payload = json.loads(msg.payload.decode())
    print(f"[{msg.topic}] 裝置 {payload.get('device_id')}"
        f" 溫度:{payload.get('temperature')}°C")
    # 此處可接續寫入資料庫、觸發告警或轉發至其他系統

client = mqtt.Client(client_id="factory-subscriber-01")
client.tls_set(
    ca_certs="root-CA.crt",
    certfile="certificate.pem.crt",
    keyfile="private.pem.key",
    tls_version=ssl.PROTOCOL_TLSv1_2
)

client.on_connect = on_connect
client.on_message = on_message

client.connect(ENDPOINT, 8883, keepalive=60)
client.loop_forever()

這段程式會持續在背景執行,一旦有新的溫度數據發布到符合訂閱條件的主題,on_message 函式就會自動被觸發。這也是後續系列文章中「Lambda自動觸發運算」架構的本地端對照版本——先在自己的伺服器上用這套邏輯驗證資料處理流程,之後再決定是否遷移到Lambda無伺服器架構。

範例二:用 boto3 透過 IoT Data Plane 發布測試訊息(除錯用)

如果想在不接觸實體感測器的情況下,快速測試訂閱端程式是否正常運作,可以用 boto3iot-data 客戶端手動發布一則測試訊息。

# pip install boto3 --break-system-packages
import boto3
import json

client = boto3.client("iot-data", region_name="ap-northeast-1")

test_payload = {
    "device_id": "ATL-TEST-000",
    "temperature": 25.0,
    "unit": "C",
    "timestamp": 1784812999
}

response = client.publish(
    topic="factory/taipei-plant1/line1/temperature/ATL-TEST-000",
    qos=1,
    payload=json.dumps(test_payload)
)

print("測試訊息已發布,請確認訂閱端是否收到")

這個範例特別適合工廠IT在沒有實體感測器在旁邊的辦公室環境先行測試整條雲端邏輯,等程式驗證無誤後,再拿到產線現場接上真正的ATLANTIS溫度變送器。

五、ATLANTIS 支援數位輸出的溫度量測產品,如何對應MQTT架構

能夠穩定地被MQTT訂閱,前提是感測器本身的數位輸出要穩定、精度足夠。以下是幾款適合搭配本文架構、串接雲端監控的ATLANTIS溫度量測產品。

LTPT-410RS系列 溫度液位傳送器

LTPT-410RS系列 溫度液位傳送器 —— 可同時測量溫度與液位,高可靠性、高穩定性設計,適合搭配RS-485集中監控後接續發布至AWS IoT Core

ATTX-200 防爆溫度傳送器

ATTX-200 防爆溫度傳送器 —— Pt100傳感器搭配補償電路,全焊接防爆外殼,適合危險環境的溫度雲端監控應用

DTT-P4 二線式大圓頭溫度傳送器

DTT-P4 二線式大圓頭溫度傳送器 —— PT100Ω轉4-20mA標準輸出,適合搭配類比輸入模組轉換為數位訊號後接入MQTT發布架構

DTS-STS 數位溫度開關

DTS-STS 數位溫度開關 —— 雙組開關輸出+類比訊號輸出+OLED顯示,適合同時需要本地告警與雲端監控的雙重需求場合

六、常見排錯清單:訂閱不到資料時,依序檢查這五項

檢查順序可能原因排除方式
1訂閱與發布的主題名稱不一致(大小寫、路徑錯誤)複製貼上比對兩端主題字串,避免手動輸入誤差
2IoT Policy未授權該憑證訂閱/發布特定主題檢查Policy中的iot:Subscribeiot:Publish資源範圍是否涵蓋該主題
3憑證未啟用或未附加到對應的Thing於主控台確認憑證狀態為Active並已附加Policy與Thing
4現場網路無法對外連線至8883埠確認防火牆規則允許對AWS IoT端點的TLS連線
5發布程式本身執行時發生例外但未捕捉加上try/except並印出錯誤訊息,確認發布程式真的有執行到publish那一行

資深工程師分享:「工廠IT在第一次串接雲端服務時,最常見的錯誤不是程式寫錯,而是『以為連上了但其實沒有』。養成用MQTT測試客戶端先驗證的習慣,可以省下大半除錯時間——這跟儀錶校正的邏輯是一樣的:先確認量測基準沒問題,再往下談自動化。」

七、案例分享:某北部食品加工廠的溫度監控訂閱驗證流程

以下案例經匿名化處理,客戶為台灣北部一家食品加工廠,原先僅有本地端SCADA系統顯示溫度數據,導入AWS IoT Core的過程中,特別重視「資料送達驗證」這一步。

階段驗證方式發現的問題解決方式
PoC初期主控台MQTT測試客戶端訂閱訂閱不到任何訊息發現IoT Policy誤將資源範圍設為特定裝置ID,未涵蓋新增測試裝置
PoC中期Python paho-mqtt訂閱程式常駐運行偶爾收到重複訊息確認QoS 1本身允許重複送達,於應用層加上去重邏輯(依timestamp與device_id)
PoC後期boto3手動發布測試訊息驗證訂閱端穩定性訂閱端程式長時間運行後偶爾斷線加上自動重連機制與心跳(keepalive)參數調整
正式上線持續監控訂閱端日誌與AWS CloudWatch指標建立每日巡檢清單,確認訂閱端程式存活狀態

這個案例說明了一件事:「打通雲端」不是終點,而是「持續驗證」的開始。工廠IT技術人員在建立自動化監控系統時,也必須建立一套「監控監控系統本身」的機制,避免訂閱端程式默默斷線卻無人察覺。

資料來源與延伸閱讀

本文技術架構參考 AWS IoT Core 官方文件(docs.aws.amazon.com/iot)、MQTT.org 發布之 MQTT 5.0 規範,以及 Eclipse Paho 專案官方文件。QoS等級行為與AWS IoT Core支援範圍請以AWS官網最新公告為準。ATLANTIS產品技術規格引用自內部產品規格書與出廠檢驗報告。

九、20 大常見問題 FAQ(MQTT訂閱與AWS IoT Core)

1. MQTT的發布與訂閱一定要用同一個主題名稱嗎?
主題字串必須完全一致(大小寫敏感),或訂閱端使用萬用字元(+單層、#多層)涵蓋發布端的主題路徑,否則訂閱端不會收到任何訊息。
2. AWS IoT Core主控台的MQTT測試客戶端安全嗎?可以在正式環境使用嗎?
主控台測試客戶端主要用於開發與除錯階段的快速驗證,正式環境的資料處理建議透過憑證驗證的程式化訂閱(如本文paho-mqtt範例)或Lambda規則引擎自動處理,不建議長期依賴人工開主控台監看。
3. 訂閱主題時用萬用字元「+」和「#」有什麼差別?
+代表比對單一層級(例如factory/+/temperature可比對factory/line1/temperature),#代表比對該層級以下所有內容(必須放在主題結尾,例如factory/#可比對所有以factory開頭的主題)。
4. QoS 1的「至少送達一次」會不會造成資料重複計算?
有可能。QoS 1保證訊息至少送達一次,但在網路重傳情境下可能重複。建議在應用層依device_idtimestamp組合做去重判斷,尤其是涉及計費或觸發次數計算的場景。
5. paho-mqtt和AWSIoTPythonSDK該用哪一個?
AWSIoTPythonSDK是AWS官方針對IoT Core優化的SDK,內建重連與QoS處理邏輯;paho-mqtt則是通用的MQTT函式庫,彈性較高、社群資源豐富。若只針對AWS IoT Core開發,兩者皆可,選擇熟悉的工具即可,本文兩篇分別示範供讀者比較。
6. 訂閱端程式斷線後,錯過的訊息還找得回來嗎?
若使用「持久性連線(Persistent Session)」並設定適當的訂閱品質,AWS IoT Core可在裝置離線期間暫存部分訊息,恢復連線後補送;但仍有訊息佇列上限與時間限制,關鍵數據建議額外透過規則引擎同步寫入DynamoDB做永久保存,而非僅依賴MQTT暫存機制。
7. IoT Policy要怎麼寫,才能限制某個裝置只能訂閱特定主題?
在IoT Policy的JSON文件中,將iot:Subscribeiot:Receive動作的Resource欄位,指定為該裝置專屬的主題路徑(例如factory/taipei-plant1/line1/temperature/ATL-STT-001),避免使用過於寬鬆的萬用字元授權,降低單一憑證外洩的影響範圍。
8. 訂閱到的溫度數據要怎麼存進資料庫?
最常見做法是在on_message回呼函式中,將解析後的資料寫入資料庫(如DynamoDB、RDS或InfluxDB)。若採用AWS原生架構,也可以透過IoT Core規則引擎直接將符合條件的訊息路由寫入DynamoDB,不需自行寫訂閱程式。
9. 一個AWS帳號可以同時訂閱多少個主題?
單一MQTT連線可同時訂閱多個主題(通常無嚴格數量限制,但受限於AWS帳號的整體訊息與連線配額),實務上建議依邏輯分組使用萬用字元訂閱,而非為每個裝置單獨建立一條訂閱規則。
10. 現場網路斷線時,發布端的資料會遺失嗎?
若發布端(現場閘道器)具備本地佇列機制,斷線期間的資料可暫存於本地,待網路恢復後補送;若未實作此機制,斷線期間產生的資料將直接遺失。建議在發布程式中加入本地暫存與重試邏輯。
11. 訂閱端程式要部署在哪裡?工廠內部還是雲端?
兩者皆可。部署在工廠內部(如工控電腦)適合需要立即本地反應的場景(如觸發本地告警燈);部署在雲端(如EC2或Lambda)適合集中式資料處理與長期歷史分析,可依實際應用需求混合部署。
12. Lambda可以直接當作MQTT訂閱端嗎?
Lambda本身不維持長連線,因此不是傳統意義上的「常駐訂閱端」,而是透過AWS IoT Core規則引擎設定「當某主題收到訊息時觸發Lambda執行」,效果上等同於事件驅動的訂閱處理,這也是後續系列文章會展開的架構。
13. 訂閱到的JSON格式如果錯誤,程式會怎樣?
若使用json.loads()解析格式錯誤的資料,會拋出例外導致程式中斷。建議在on_message中加上try/except例外處理,記錄錯誤訊息並略過該筆異常資料,避免整個訂閱程式因單筆錯誤資料而終止。
14. 如何確認訂閱端程式是否還「活著」?
可以搭配定期心跳機制:訂閱端每隔一段時間主動發布一則「心跳」訊息到特定主題,另外用CloudWatch告警或簡單的監控腳本檢查該心跳主題是否持續有訊息送達,若超過預期時間未收到心跳,即發送異常通知。
15. 訂閱多個工廠據點的數據,主題該怎麼設計?
建議在主題結構中明確加入廠區代號(如本文範例的taipei-plant1),並在頂層管理端使用萬用字元(如factory/+/line1/temperature/#)跨廠區訂閱同類型數據,同時仍保留依廠區獨立查詢的彈性。
16. 用MQTT訂閱和直接呼叫API拉取數據,哪個比較適合即時監控?
MQTT訂閱屬於「推送(Push)」模式,數據一產生就主動送達,延遲低且不需頻繁輪詢;API拉取屬於「拉取(Pull)」模式,需要定期查詢,可能有延遲且耗費更多請求次數。即時監控場景建議優先採用MQTT訂閱架構。
17. 訂閱端如果同時開很多個連線會不會被限流?
AWS IoT Core對每個帳號的連線數與訊息傳遞速率有配額限制(實際數值請查閱AWS官方文件的服務配額頁面),大量訂閱端應用建議合併連線或評估是否需要申請提高配額,避免超出預設限制導致連線被拒絕。
18. 訂閱到的溫度數據,時間戳記要用UTC還是本地時間?
建議發布端統一使用UTC時間戳記(如Unix Epoch秒數)傳輸,訂閱端或前端顯示時再依使用者所在時區轉換為本地時間,避免跨系統、跨服務因時區不一致導致的時間比對錯誤。
19. 主控台的MQTT測試客戶端可以看到歷史訊息嗎?
不行,主控台測試客戶端只能看到訂閱之後即時發布的新訊息,無法回溯訂閱之前已發布過的歷史數據。若需要歷史數據查詢,必須透過規則引擎將數據寫入DynamoDB或S3等儲存服務後再行查詢。
20. 導入MQTT訂閱架構後,工廠IT還需要學什麼進階技能?
建議接續學習AWS IoT Core規則引擎的SQL語法(用於篩選與路由訊息)、Lambda事件驅動架構、以及DynamoDB資料建模,這些正是本系列文章後續篇章要展開的內容,可依實際專案進度逐步學習。

十、下一步:讓 ATLANTIS 協助你完成感測器選型與雲端串接規劃

31年工業儀錶製造經驗 × 完整數位輸出產品線

從變送器選型、RS-485/Modbus對照,到MQTT主題架構規劃,我們可以陪工廠IT團隊完成從硬體到雲端的完整驗證流程。

📞 02-2820-3405 免費選型諮詢 📧 線上快速詢價

業務一部 Ian:ian@atlantis.com.tw | 業務二部 Nori:nori@atlantis.com.tw


文章更新時間:2026年7月|作者:ATLANTIS 應用工程團隊|本文為系列教學文章第二篇,接續第一篇RS-485接AWS IoT Core的基礎,下一篇將深入「Lambda入門:當溫度數據抵達時自動觸發運算」。