MQTT - AWS IoT Core

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

MQTT

MQTT (訊息佇列遙測傳輸) 是輕量級且廣泛採用的訊息通訊協定,專為受限的裝置所設計。 AWS IoT Core 支援的 MQTT 以 MQTT v3.1.1 規格MQTT v5.0 規格 為基礎,但如 AWS IoT 與 MQTT 規格的差異 所述具有若干差異。作為該標準的最新版本,MQTT 5 推出數項關鍵功能,使基於 MQTT 的系統更加強大,包括新的可擴展性增強功能、具備原因代碼回應的改良版錯誤報告、訊息和工作階段過期計時器,以及自訂使用者訊息標頭。如需有關支援的 MQTT 5 功能的詳細資訊,請參閱 MQTT 5 AWS IoT Core 支援的功能。 AWS IoT Core 還支持跨 MQTT 版本(MQTT 3 和 MQTT 5)通信。MQTT 3 發佈者可以將 MQTT 3 訊息傳送給可接收 MQTT 5 發佈訊息的 MQTT 5 訂閱者,反之亦然。

AWS IoT Core 支援透過 WSS 通訊協定使用 MQTT 通訊協定和 MQTT 的裝置連線,並以用戶端 ID 識別。AWS IoT 裝置開發套件 支援這兩種通訊協定,並且是將裝置連接至 AWS IoT Core的建議方式。設 AWS IoT 備 SDK 支持設備和客戶端連接和訪問 AWS IoT 服務所必需的功能。裝置 SDK 支援 AWS IoT 服務所需的驗證通訊協定,以及 MQTT 通訊協定和 WSS 通訊協定所需的連線識別碼需求。如需如何 AWS IoT 使用 AWS 裝置 SDK 連線至的資訊,以及支援語言範例 AWS IoT 的連結,請參閱使用裝置 AWS IoT 開發套件與 MQTT 連線。如需 MQTT 訊息之身分驗證方法和連接埠映射的詳細資訊,請參閱通訊協定、連接埠映射和身分驗證

雖然我們建議使用 AWS IoT 裝置 SDK 連線到 AWS IoT,但不需要這些軟體開發套件。但是,如果您不使用 AWS IoT 裝置 SDK,則必須提供必要的連線和通訊安全性。用戶端必須在連線請求中傳送伺服器名稱指示 (SNI) TLS 延伸。不包含 SNI 的連線嘗試將會被拒絕。如需詳細資訊,請參閱中的傳輸安全性 AWS IoT。使用 IAM 使用者和 AWS 登入資料驗證用戶端的用戶端必須提供正確的簽名版本 4 身份驗證。

使用裝置 AWS IoT 開發套件與 MQTT 連線

本節包含 AWS IoT 裝置 SDK 的連結,以及說明如何將裝置連接到的範例程式的原始程式碼。 AWS IoT此處鏈接的示例應用程序顯示如何通過 WSS AWS IoT 使用 MQTT 協議和 MQTT 進行連接。

注意

AWS IoT 裝置開發套件已經發行了 MQTT 5 用戶端。

C++

使用 AWS IoT C++ 裝置 SDK 連接裝置

Python

使用適用於 Python 的 AWS IoT 設備 SDK 來連接設備

JavaScript

使用 AWS IoT 裝置 SDK JavaScript 來連線裝置

Java

使用適用於 Java 的 AWS IoT 裝置 SDK 來連接裝置

注意

適用於 Java v2 的 AWS IoT 裝置開發套件現在支援安卓系統開發。如需詳細資訊,請參閱適用於 Android 的AWS IoT 裝置 SDK

Embedded C

使用嵌入式 C 的 AWS IoT 裝置 SDK 連接裝置

重要

此 SDK 適合經驗豐富的嵌入式軟體開發人員使用。

MQTT 服務品質 (QoS) 選項

AWS IoT 而 AWS IoT 裝置開發套件則支援 MQTT 服務品質 (Qo S) 等級和. 0 1 MQTT 協議定義了第三級 QoS 級別2,但 AWS IoT 不支持它。只有 MQTT 通訊協定支援 QoS 功能。HTTPS 透過傳遞查詢字串參數 ?qos=qos 來支援 QoS,其中值可以是 0 或 1。

此表格說明各個 QoS 層級如何影響訊息發佈至代理程式的方式,以及訊息代理程式發佈訊息的方式。

具有 QoS 層級…

訊息為…

說明

QoS 層級 0

傳送零次或更多次

此層級應用於透過可靠通訊連結傳送的訊息,或者可能會錯過沒有問題的訊息。

QoS 層級 1

至少傳送一次,然後重複,直到接收到 PUBACK 回應

在寄件者收到 PUBACK 回應以表示成功傳遞之後,才會將訊息視為完整的。

MQTT 持久性工作階段

持久性工作階段會存放用戶端的訂閱和訊息,服務品質 (QoS) 為 1,而這些用戶端尚未確認此服務品質。該裝置重新連線至持久性工作階段時,工作階段會繼續執行,訂閱會復原,且在重新連線之前接收和儲存的未確認的訂閱訊息皆會傳送至用戶端。

存儲的消息的處理被記錄在 CloudWatch 和 CloudWatch 日誌。如需有關寫入 CloudWatch 和 CloudWatch 記錄的項目的資訊,請參閱訊息代理程式指標佇列日誌項目

建立持久性工作階段

在 MQTT 3 中,您可以傳送 CONNECT 訊息並將 cleanSession 旗標設定為 0,以建立 MQTT 持久性工作階段。如果傳送 CONNECT 訊息的用戶端沒有工作階段,則會建立新的持久性工作階段。如果用戶端的工作階段已經存在,用戶端會繼續現有的工作階段。若要建立全新工作階段,請傳送 CONNECT 訊息並將 cleanSession 旗標設定為 1,當用戶端中斷連線時,代理程式將不會儲存任何工作階段狀態。

在 MQTT 5 中,您可以設定 Clean Start 旗標和 Session Expiry Interval 來處理持久性會話。「全新啟動」可控制連線工作階段的開始和前一個工作階段的結束。當您設定 Clean Start = 1 時,系統會建立新的工作階段,任何既有的先前工作階段都會終止。當您設定Clean Start = 0 時,連線工作階段會繼續先前的工作階段 (若有)。工作階段過期間隔控制了連線工作階段的結束。工作階段過期間隔指定了工作階段在中斷連線後維持的時間 (以秒為單位的 4 位元組整數)。如果設定 Session Expiry interval =0,系統會在中斷連線時立即終止工作階段。如果 CONNECT 訊息中未指定工作階段過期間隔,則預設值為 0。

MQTT 5 全新啟動和工作階段過期
屬性值 描述
Clean Start= 1 建立一個新的工作階段,並終止先前的工作階段 (若有)。
Clean Start= 0 若有先前的工作階段,則恢復工作階段。
Session Expiry Interval> 0 維持工作階段。
Session Expiry interval= 0 不維持工作階段。

在 MQTT 5 中,如果您設定Clean Start =1Session Expiry Interval >0,則等同於 MQTT 3 全新工作階段。如果您設定Clean Start =0Session Expiry Interval >0,則等同於 MQTT 3 持久性工作階段。

注意

不支援跨 MQTT 版本 (MQTT 3 和 MQTT 5) 持久性工作階段。MQTT 3 持久性工作階段無法恢復為 MQTT 5 工作階段,反之亦然。

持久性工作階段期間的操作

用戶端使用連線認可 (CONNACK) 訊息中的 sessionPresent 屬性,以判斷持久性工作階段是否存在。如果 sessionPresent1,表示存在持久性工作階段,且用戶端的任何已儲存訊息會在用戶端收到 CONNACK 後傳遞至用戶端,如重新連線至持久性工作階段後的訊息流量所述。如果 sessionPresent1,則用戶端不需要重新訂閱。但是,如果 sessionPresent0,表示不存在持久性工作階段,而且用戶端必須重新訂閱其主題篩選條件。

在用戶端加入持久性工作階段之後,它可以繼續發佈訊息並訂閱主題篩選條件,各個操作上無需任何額外的旗標。

重新連線至持久性工作階段後的訊息流量

持久性工作階段代表用戶端與 MQTT 訊息代理程式之間的持續連線。當用戶端使用持久性工作階段連接至訊息代理程式時,訊息代理程式會儲存用戶端在連線期間所進行的所有訂閱。當用戶端中斷連線時,訊息代理程式會存放未認可的 QoS 1 訊息,以及發佈到用戶端所訂閱之主題的新 QoS 1 訊息。系統會根據帳戶限制儲存訊息。將捨棄超出上限的訊息將。如需持久性訊息限制的詳細資訊,請參閱 AWS IoT Core 端點和配額。當用戶端重新連線至持久性工作階段時,所有訂閱都會恢復,而且所有存放的訊息都會傳送至用戶端,其傳送速率為每秒最多 10 則訊息。在 MQTT 5 中,如果具有訊息過期間隔的傳出 QoS1 在用戶端離線時過期,則用戶端在連線恢復後將不會收到過期的訊息。

重新連線之後,存放的訊息會以每秒 10 個存放訊息為限的速率傳送至用戶端,以及任何目前的訊息流量,直到達到 Publish requests per second per connection 限制為止。由於已存放訊息的傳遞速率有限,如果工作階段有 10 個以上的存放訊息要在重新連線後傳遞,將需要數秒鐘才能傳遞所有存放訊息。

結束持久性工作階段

持久性工作階段可透過下列方式結束:

  • 當持久性工作階段過期時間經過時。當訊息代理程式偵測到用戶端已中斷連線時 (包括用戶端中斷連線或連線逾時),持久性工作階段過期計時器將會啟動。

  • 用戶端傳送將 cleanSession 旗標設定為 1CONNECT 訊息。

在 MQTT 3 中,持久性工作階段到期時間預設值是一小時,這適用於帳戶中的所有工作階段。

在 MQTT 5 中,您可以設定 CONNECT 和 DISCONNECT 封包上的每個工作階段的工作階段過期間隔。

對於 DISCONNECT 封包的工作階段過期間隔:

  • 如果目前工作階段的過期間隔為 0,則無法將 DISCONNECT 封包上的工作階段過期間隔設定為大於 0。

  • 如果目前工作階段的過期間隔大於 0,且您將 DISCONNECT 封包上的工作階段過期間隔設為 0,則工作階段將於 DISCONNECT 結束。

  • 否則,DISCONNECT 上的工作階段過期間隔會更新目前工作階段的過期間隔。

注意

當工作階段結束時,等待傳送給用戶端的存放訊息會被捨棄;但即使無法傳送,仍會依照標準的簡訊費率計費。如需訊息定價的詳細資訊,請參閱 AWS IoT Core 定價。您可以設定過期時間間隔。

持久性工作階段過期後重新連線

如果用戶端在過期之前沒有重新連接至其持久性工作階段,工作階段將會結束並捨棄其存放的訊息。當用戶端在工作階段過期後重新連線,並將 cleanSession 旗標設為 0 時,服務會建立新的持久性工作階段。這個工作階段無法使用先前工作階段的任何訂閱或訊息,因為上一個工作階段過期時,這些訂閱或訊息將被捨棄。

持久性工作階段訊息費用

AWS 帳戶 當訊息代理程式傳送訊息給用戶端或離線持續工作階段時,訊息會向您收取費用。當具有持久性工作階段的離線裝置重新連線並繼續其工作階段時,存放的訊息會傳遞至裝置,並再次向您的帳戶收費。如需訊息定價的詳細資訊,請參閱 AWS IoT Core 定價:簡訊

使用標準限制增加程序,可以增加預設的持久性工作階段一小時過期時間。請注意,增加工作階段到期時間可能會增加您的訊息費用,因為額外的時間可能允許離線裝置存放更多訊息,而且將會按照標準簡訊速率向您的帳戶收取這些額外的訊息費用。工作階段過期時間為近似值,工作階段最多可以比帳戶限制長 30 分鐘;不過,工作階段不會短於帳戶限制。如需工作階段限制的詳細資訊,請參閱 AWS Service Quotas

MQTT 保留訊息

AWS IoT Core 支援 MQTT 通訊協定中所述的「保留」旗標。當用戶端在其發佈的 MQTT 訊息上設定 RETAIN 旗標時,會 AWS IoT Core 儲存該訊息。然後可以將其傳送給新訂閱者,透過呼叫 GetRetainedMessage 操作對其進行檢索,並在 AWS IoT 主控台內予以檢視。

使用 MQTT 保留訊息的範例
  • 作為初始組態訊息

    MQTT 保留訊息會在用戶端訂閱主題後傳送至用戶端。如果您希望所有訂閱主題的用戶端在訂閱後立即收到 MQTT 保留訊息,您可以發佈設定 RETAIN 旗標的組態訊息。只要發佈新的組態訊息,訂閱用戶端也會收到該組態的更新。

  • 作為最後一個已知的狀態訊息

    裝置可以在目前狀態訊息上設定 RETAIN 旗標,以便 AWS IoT Core 將其儲存起來。當應用程式連線或重新連線時,他們可以訂閱此主題,並在訂閱保留的訊息主題後立即取得上次回報的狀態。透過這種方式,可以避免等到來自裝置的下一個訊息才能查看目前狀態。

AWS IoT Core中含有 MQTT 保留訊息的常見任務

AWS IoT Core 使用已設定「保留」旗標來儲存 MQTT 訊息。這些保留訊息會像一般 MQTT 訊息一樣,傳送給已訂閱主題的所有用戶端,而且這些訊息也會存放起來,以傳送給該主題的新訂閱者。

MQTT 保留訊息需要特定的政策動作,才能授權用戶端存取這些訊息。如需保留訊息政策的使用範例,請參閱 保留訊息政策範例

本節說明與保留訊息有關的常見操作。

  • 建立保留訊息

    用戶端會決定當其發佈 MQTT 訊息時是否保留訊息。用戶端可以在使用裝置 SDK 發佈訊息時設定 RETAIN 旗標。應用程式和服務可以在使用 Publish 動作發佈 MQTT 訊息時設定 RETAIN 旗標。

    每個主題名稱只會保留一則訊息。已設定 RETAIN 旗標並發佈至主題的新訊息,會取代先前傳送至主題的任何現有保留訊息。

    請注意:您無法發佈至已設定 RETAIN 旗標的預留主題

  • 訂閱保留訊息主題

    用戶端會訂閱保留訊息主題,如同訂閱其他任何 MQTT 訊息主題一樣。透過訂閱保留訊息主題而接收的保留訊息已設定 RETAIN 旗標。

    AWS IoT Core 當用戶端將具有 0 位元組訊息承載的保留訊息發佈至保留的訊息主題時,會從中刪除保留的訊息。訂閱保留訊息主題的用戶端也會收到 0 個位元組訊息。

    訂閱內含保留訊息主題的萬用字元主題篩選條件,可讓用戶端接收向保留訊息主題發佈的後續訊息,但不會在訂閱時即傳遞保留訊息。

    請注意:若要在訂閱時即收到保留訊息,訂閱要求中的主題篩選條件必須完全符合保留訊息主題。

    訂閱保留訊息主題時接收的保留訊息已設定 RETAIN 旗標。訂閱用戶端在訂閱後接收的保留訊息未設定 RETAIN 旗標。

  • 擷取保留訊息

    當用戶端訂閱帶有保留訊息的主題時,系統就會自動將保留訊息傳遞給用戶端。若要讓用戶端在訂閱時即接收保留訊息,則必須訂閱保留訊息的確切主題名稱。訂閱內含保留訊息主題的萬用字元主題篩選條件,可讓用戶端接收向保留訊息主題發佈的後續訊息,但不會在訂閱時即傳遞保留訊息。

    服務和應用程式可以透過呼叫 ListRetainedMessagesGetRetainedMessage 來列出和擷取保留訊息。

    設定 RETAIN 旗標的情況下,無法防止用戶端將訊息發佈至保留訊息主題。這可能會導致非預期的結果,例如保留訊息與訂閱主題接收到的訊息不相符。

    使用 MQTT 5 時,如果保留的訊息已設定訊息過期間隔,且保留的訊息已經過期,則該主題的新訂閱者在訂閱成功後將不會收到保留的訊息。

  • 列出保留訊息主題

    您可以透過呼叫 ListRetainedMessages 列出保留訊息,且可以在 AWS IoT 主控台中檢視保留訊息。

  • 取得保留訊息的詳細資訊

    您可以透過呼叫 GetRetainedMessage 取得保留訊息的詳細資訊,且可以在 AWS IoT 主控台中檢視這些資訊。

  • 保留「Will」訊息

    裝置連線時建立的 MQTT Will 訊息,可以藉由在 Connect Flag bits 欄位中設定 Will Retain 旗標來加以保留。

  • 刪除保留訊息

    裝置、應用程式和服務可以透過將已設定 RETAIN 旗標的訊息和空白 (0 個位元組) 訊息承載發佈至要刪除的保留訊息主題名稱,以此刪除保留訊息。這類郵件會從中刪除保留的郵件 AWS IoT Core,會傳送至訂閱主題的用戶端,但不會由保留 AWS IoT Core。

    您也可以透過在 AWS IoT 主控台中存取保留訊息,來刪除保留訊息。使用 AWS IoT 主控台刪除的保留訊息,也會將 0 個位元組的訊息傳送給已訂閱保留訊息主題的用戶端。

    保留訊息遭刪除後即無法還原。用戶端需要發佈新的保留訊息,以取代已刪除的訊息。

  • 對保留訊息進行偵錯和疑難排解

    AWS IoT 主控台提供多種工具,可協助您針對保留訊息進行疑難排解:

    • Retained messages (保留訊息) 頁面

      AWS IoT 主控台中的 Retained messages (保留訊息) 頁面會提供分頁清單,列出由您帳戶在目前區域存放的保留訊息。在此頁面上,您可以:

      • 查看每則保留訊息的詳細資訊,例如訊息承載、QoS,以及保留訊息的接收時間。

      • 更新保留訊息的內容。

      • 刪除保留訊息。

    • MQTT test client (MQTT 測試用戶端)

      AWS IoT 主控台中的 MQTT test client (MQTT 測試用戶端) 頁面可以訂閱和發佈至 MQTT 主題。發佈選項可讓您在發佈的訊息上設定 RETAIN 旗標,以模擬裝置可能出現的行為。

    某些非預期的結果可能是中如何實作保留訊息的這些方面所造成的 AWS IoT Core。

    • 保留訊息限制

      當帳戶儲存保留的訊息數目上限時,會傳回限制 AWS IoT Core 回應以 RETAIN set 發佈的訊息,且承載大於 0 位元組為止,直到刪除某些保留訊息且保留的訊息計數低於限制為止。

    • 保留訊息的傳遞順序

      我們不能保證保留訊息和訂閱訊息的傳遞順序。

計費和保留訊息

AWS IoT Core 定價:簡訊中所述,藉由使用 AWS IoT 主控台或呼叫 Publish,從用戶端發佈已設定 RETAIN 旗標的訊息會產生額外的簡訊費用。

用戶端、使用 AWS IoT 主控台或呼叫擷取保留的訊息,除了一般 API 使用費外,還會GetRetainedMessage產生訊息傳遞費用。AWS IoT Core 定價:簡訊中說明了額外費用。

裝置意外中斷連線時發佈的 MQTT Will 訊息會產生簡訊費用,如 AWS IoT Core 定價:簡訊中所述。

如需簡訊成本的詳細資訊,請參閱 AWS IoT Core 定價:簡訊

比較 MQTT 保留訊息和 MQTT 持久性工作階段

保留訊息和持久性工作階段是 MQTT 的標準功能,可讓裝置接收在離線時發佈的訊息。可以透過持久性工作階段發佈的保留訊息。本節說明這些功能的主要特色及其運作方式。

保留訊息

持久性工作階段

主要功能

保留訊息可用於在連線後對大型裝置群組進行設定或通知。

若您希望裝置在重新連線後,僅接收發佈至主題之最後一則訊息時,即可使用保留訊息。

對於具有間歇性連線且可能會遺漏數則重要訊息的裝置,持久性工作階段能發揮重要作用。

裝置可以與持久性工作階段連線,以便接收在離線時傳送的訊息。

範例

保留訊息可以在裝置上線時提供與其環境有關的組態資訊。初始組態可能包含其應訂閱的其他訊息主題清單,或是應該如何設定其本機時區的相關資訊。

透過行動網路連線且具有間歇性連線的裝置,可能會使用持久性工作階段,以避免在裝置超出網路覆蓋範圍或需要關閉行動無線電時遺失所傳送的重要訊息。

在主題的初始訂閱時收到的訊息

訂閱含有保留訊息的主題後,就會收到最近保留訊息。

若訂閱的主題沒有保留訊息,在有發佈至該主題的訊息前,不會收到任何訊息。

重新連線後的訂閱主題

如果沒有持久性工作階段,用戶端必須在重新連線後訂閱主題。

已訂閱的主題會在重新連線後還原。

重新連線後收到的訊息

訂閱含有保留訊息的主題後,就會收到最近保留訊息。

在裝置中斷連線時,以 QOS = 1 發佈且以 QOS =1 訂閱的所有訊息都會在裝置重新連線後傳送。

資料/工作階段過期

在 MQTT 3 中的訊息不會過期。這些訊息在遭取代或刪除前都會存放起來。在 MQTT 5 中,保留的訊息會在您設定的訊息過期間隔後過期。如需詳細資訊,請參閱訊息過期

如果用戶端未在逾時期間內重新連線,則持久性工作階段會過期。持久性工作階段過期後,在裝置中斷連線時,用戶端的訂閱和以 QOS = 1 發佈並以 QOS =1 訂閱的已儲存訊息都會遭到刪除。過期的訊息將不會傳遞。如需持久性工作階段之工作階段過期的詳細資訊,請參閱 MQTT 持久性工作階段

如需持久性工作階段的相關資訊,請參閱 MQTT 持久性工作階段

發佈用戶端會透過「保留訊息」判斷是否要在連線後保留訊息並將其傳遞至裝置,以及先前是否有工作階段。發佈者可選擇是否存放訊息,而所存放的訊息會傳遞至透過 QoS 0 或 QoS 1 訂閱進行訂閱的所有現有和未來用戶端。保留訊息一次只會保留一則指定主題的相關訊息。

帳戶存放的保留訊息數量達到上限時,在系統刪除部分保留訊息且保留訊息計數低於上限前, AWS IoT Core 會針對已設定 RETAIN 且承載大於 0 個位元組的發佈訊息傳回調節回應。

MQTT 保留訊息和 AWS IoT 裝置陰影

保留訊息和 Device Shadow 都會保留裝置中的資料,但它們的行為不同,用途也不同。本節說明其異同。

保留訊息

Device Shadow

訊息承載具有預先定義的結構或結構描述

如實作所定義。MQTT 不會為其訊息承載指定結構或結構描述。

AWS IoT 支援特定的資料結構。

更新訊息承載會產生事件訊息

發佈保留訊息會將訊息傳送至訂閱的用戶端,但不會產生其他更新訊息。

更新 Device Shadow 會產生更新訊息,其中會描述變更

已將訊息更新進行編號

不會自動將保留訊息進行編號。 Device Shadow 文件具有自動版本號碼和時間戳記。

訊息承載會連接至物件資源

保留訊息不會連接至物件資源。

Device Shadow 會連接至物件資源。

更新訊息承載的個別元素

如果不更新整個訊息承載,則無法變更訊息的個別元素。

您可以更新 Device Shadow 文件的個別元素,無需更新整個 Device Shadow 文件。

用戶端在訂閱時收到訊息資料

用戶端在訂閱含有保留訊息的主題後,會自動收到保留訊息。

用戶端可以訂閱 Device Shadow 更新,但必須特意請求目前狀態。

索引和可搜尋性

不會為保留訊息建立可供搜尋的索引。

機群索引製作會建立 Device Shadow 資料的索引,以供搜尋和彙總。

MQTT Last Will and Testament (LWT) 訊息

Last Will and Testament (LWT) 是 MQTT 的功能。用戶端可使用 LWT 指定一則訊息,代理程式將在發生意外中斷連線的情況時,將該訊息發佈至用戶端定義的主題,並傳送至訂閱該主題的所有用戶端。用戶端指定的訊息稱為 LWT 訊息或 Will 訊息,而用戶端定義的主題稱為「Will 主題」。您可以在裝置連線至代理程式時指定 LWT 訊息。這些訊息可藉由在連線期間,於 Connect Flag bits 欄位中設定 Will Retain 旗標的方式加以保留。例如,如果 Will Retain 旗標設定為 1,Will 訊息將會儲存在代理程式中相關聯的 Will 主題中。如需詳細資訊,請參閱 Will 訊息

代理程式會儲存 Will 訊息,直到發生意外中斷連線。發生這種情況時,代理程式會將訊息發佈到訂閱 Will 主題的所有用戶端,以通知發生中斷連線。如果用戶端使用 MQTT DISCONNECT 訊息透過用戶端起始的中斷連線從代理程式中斷連線,則代理程式將不會發佈儲存的 LWT 訊息。在所有其他情況下,都會送出 LWT 訊息。如需代理程式將傳送 LWT 訊息的完整中斷連線案例清單,請參閱連線/中斷連線事件

使用 connectAttributes

ConnectAttributes 可讓您在 IAM 政策中指定要在連線訊息中使用的屬性,例如 PersistentConnectLastWill。透過 ConnectAttributes,您可以建置預設不允許裝置存取新功能的政策,如果裝置遭到入侵,這會很有幫助。

connectAttributes 支援下列功能:

PersistentConnect

當用戶端和代理程式之間的連線中斷時,使用 PersistentConnect 功能可儲存用戶端在連線期間進行的所有訂閱。

LastWill

當用戶端意外中斷連線時,使用 LastWill 功能可將訊息發佈至 LastWillTopic

根據預設,您的政策具有非持久性連線,而且沒有傳遞此連線的屬性。如果您想要有持久性連線,必須在 IAM 政策中指定持久性連線。

如需 ConnectAttributes 範例,請參閱連線政策範例

MQTT 5 支援的功能

AWS IoT Core 對 MQTT 5 的支援是以 MQTT v5.0 規格為基礎,但有一些差異,如中所述。AWS IoT 與 MQTT 規格的差異

共享訂閱

AWS IoT Core 支援 MQTT 3 和 MQTT 5 的共用訂閱。共享訂閱允許多個用戶端共享一個主題的訂閱,而且只有一個用戶端會使用隨機分佈接收發佈至該主題的訊息。共享訂閱可以在多個訂閱用戶之間有效地負載平衡 MQTT 訊息。例如,假設您有 1,000 部裝置發佈至相同主題,而 10 個後端應用程式則處理這些訊息。於此種情況下,後端應用程式可訂閱相同的主題,且每個應用程式將隨機接收由裝置發佈至共享主題的訊息。這實際上是「共享」這些訊息的負載。共享訂閱還可提供更好的彈性。當任何後端應用程式中斷連線時,代理程式會將負載分配給群組中剩餘的訂閱用戶。

如要使用共享訂閱,用戶端訂閱共享訂閱的主題篩選條件,如下所示:

$share/{ShareName}/{TopicFilter}
  • $share 是個常值字串,表示共享訂閱的主題篩選條件,必須以 $share 開頭。

  • {ShareName} 是個字元字串,用來指定一組訂閱用戶使用的共享名稱。共享訂閱的主題篩選條件必須包含 ShareName,且後面接著 / 字元。{ShareName} 不得包含下列字元:/+、或 #{ShareName} 的大小上限為 128 個位元組。

  • {TopicFilter} 會遵循與非共享訂閱相同的主題篩選條件語法。{TopicFilter} 的大小上限為 256 個位元組。

  • $share/{ShareName}/{TopicFilter} 所需的兩個斜線 (/) 不包含於主題和主題篩選條件中最大斜線數目限制中。

具有相同 {ShareName}/{TopicFilter} 的訂閱屬於相同的共享訂閱群組。您可以建立多個共享訂閱群組,且不超過每個群組的共享訂閱限制。如需詳細資訊,請參閱《AWS 一般參考》中的 AWS IoT Core 端點和配額

下表對非共享訂閱與共享訂閱進行了比較:

訂閱 描述 主題篩選條件範例
非共享訂閱 每個用戶端都會建立個別訂閱以接收已發佈的訊息。將訊息發佈至某個主題時,該主題的所有訂閱用戶都會收到該訊息的副本。
sports/tennis sports/#
共享訂閱 多個用戶端可共享一個主題的訂閱,且只有一個用戶端會使用隨機分佈接收發佈至該主題的訊息。
$share/consumer/sports/tennis $share/consumer/sports/#
非共享訂閱流程 共享訂閱流程
MQTT 3 和 MQTT 5 英寸的常規訂閱。 AWS IoT Core
MQTT 3 和 MQTT 5 英寸的共享訂閱。 AWS IoT Core

使用共享訂閱的重要注意事項

  • 當發佈至 QoS0 訂閱用戶的嘗試失敗時,不會發生重試嘗試,且會捨棄該訊息。

  • 當對具有全新工作階段的 QoS1 訂閱用戶嘗試發佈失敗時,該訊息將會傳送至群組中的另一個訂閱用戶以進行多次重試。在所有重試嘗試之後無法傳遞的訊息將遭捨棄。

  • 當對具有持續性工作階段的 QoS1 訂閱用戶嘗試發佈因為訂閱用戶離線而失敗時,該訊息將不會排入佇列,且會嘗試傳送至群組中的另一個訂閱用戶。在所有重試嘗試之後無法傳遞的訊息將遭捨棄。

  • 共享訂閱不會收到保留的訊息

  • 當共享訂閱包含萬用字元 (# 或 +) 時,可能會有多個與主題相符的共享訂閱。若發生這種情況,訊息代理程式會複製發佈訊息,並將其傳送至每個相符之共享訂閱中的隨機用戶端。共享訂閱的萬用字元行為可說明於下圖中。

    中包含萬用字元的共用訂閱 AWS IoT Core。

    於此範例中,有三個與發佈 MQTT 主題 sports/tennis 相符的共享訂閱。訊息代理程式會複製已發佈的訊息,並將該訊息傳送至每個相符群組中的隨機用戶端。

    用戶端 1 和用戶端 2 共享訂閱:$share/consumer1/sports/tennis

    用戶端 3 和用戶端 4 共享訂閱:$share/consumer1/sports/#

    用戶端 5 和用戶端 6 共享訂閱:$share/consumer2/sports/tennis

如需有關共享訂閱限制的詳細資訊,請參閱《AWS 一般參考》中的 AWS IoT Core 端點和配額。若要在AWS IoT 主控台中使用 AWS IoT MQTT 用戶端測試共用訂閱,請參閱。在 MQTT 用戶端中測試共享訂閱如需有關共享訂閱的更多資訊,請參閱 MQTTv5.0 規格中的共享訂閱

全新啟動和工作階段過期

您可以使用「全新啟動」和「工作階段過期」,以更具彈性的方式處理持久性工作階段。「全新啟動」旗標指出工作階段是否應在不使用現有工作階段的情況下啟動。「工作階段過期」間隔指出中斷連線後保留工作階段的時間長度。可在中斷連線時修改工作階段過期間隔。如需詳細資訊,請參閱 MQTT 持久性工作階段

所有 ACK 的原因代碼

您可以使用原因代碼更輕鬆地偵錯或處理錯誤訊息。訊息代理程式會根據與代理程式的互動類型 (「訂閱」、「發佈」、「確認」) 傳回原因代碼。如需更多詳細資訊,請參閱 MQTT 原因代碼。如需 MQTT 原因代碼的完整清單,請參閱 MQTT v5 規格

主題別名

主題別名是一種雙位元組整數,可用來取代主題名稱。使用主題別名可以最佳化主題名稱的傳輸,以降低計量資料服務的資料成本。 AWS IoT Core 預設限制為 8 個主題別名。如需詳細資訊,請參閱《AWS 一般參考》中的 AWS IoT Core 端點和配額

訊息過期

您可以對已發佈的訊息新增訊息過期值。這些值表示訊息過期間隔 (以秒為單位)。如果訊息尚未在該間隔內傳送給訂閱者,則訊息將會過期並予以移除。如果未設定訊息過期值,訊息就不會過期。

在傳出流量中,訂閱者會收到一條訊息,告知過期間隔的剩餘時間。例如,如果傳入發佈訊息的訊息過期時間為 30 秒,且在 20 秒後路由給訂閱者,則訊息過期欄位會更新為 10。訂閱者收到的訊息可能具有值為 0 的更新 MEI。這是因為在剩餘時間達到 999 毫秒以下,它將更新為 0。

在中 AWS IoT Core,郵件到期間隔下限為 1。如果從用戶端將間隔設定為 0,則系統會將其調整為 1。訊息過期間隔上限為 604800 (7 天)。任何較高的值都將調整為最大值。

在跨版本通訊中,訊息過期行為取決於傳入發佈訊息的 MQTT 版本。例如,若某個訊息的訊息過期時間是由透過 MQTT5 連線的工作階段所傳送,則其可能會在使用 MQTT3 工作階段訂閱的裝置上過期。下表列出訊息過期功能如何支援下列類型的發佈訊息:

發佈訊息類型 訊息過期間隔
常規發佈 如果伺服器無法在指定的時間內傳遞訊息,則過期的訊息將遭移除,而訂閱者將不會收到這些訊息。這包括裝置未發佈其 QoS 1 訊息等情況。
保留 如果保留的訊息到期,而新用戶端訂閱了該主題,則該用戶端將不會在訂閱時收到訊息。
遺言 遺言訊息的間隔會在用戶端中斷連線之後啟動,而伺服器會嘗試將遺言訊息傳遞給其訂閱者。
佇列訊息 如果具有訊息過期間隔的傳出 QoS1 在用戶端離線時過期,則用戶端在持久性工作階段恢復後將不會收到過期的訊息。

其他 MQTT 5 功能

伺服器中斷連線

中斷連線時,伺服器可以主動向用戶端傳送 DISCONNECT 以通知連線關閉,並提供中斷連線的原因代碼。

請求/回應

發佈者可以請求接收者在接收時將回應傳送至發佈者指定的主題。

封包大小上限

用戶端和伺服器可以分別指定其支援的最大封包大小。

承載格式和內容類型

您可以在發佈訊息時指定承載格式 (二進位、文字) 和內容類型。這些會轉發給訊息接收者。

MQTT 5 屬性

MQTT 5 屬性是 MQTT 標準的重要新增項目,旨在支援新的 MQTT 5 功能,例如工作階段過期和請求/回應模式。在中 AWS IoT Core,您可以建立可轉寄輸出郵件內容的規則,或使用 HTTP 發佈來發佈具有某些新內容的 MQTT 訊息。

下表列出所有支援的 MQTT 5 內容。 AWS IoT Core

屬性 描述 輸入類型 封包
承載格式指示器 此布林值可列舉字串值,用於表示承載是否已格式化為 UTF-8。 位元組 PUBLISH、CONNECT
內容類型 描述承載內容的 UTF-8 字串。 UTF-8 字串。 PUBLISH、CONNECT
回應主題 此 UTF-8 字串描述了要在請求-回應流程中作為接收者發佈目標的主題。主題不得包含萬用字元。 UTF-8 字串。 PUBLISH、CONNECT
相互關聯資料 請求訊息的傳送者使用的二進位資料,用以識別回應訊息所對應的請求。 二進位 PUBLISH、CONNECT
使用者屬性 一組 UTF-8 字串對。這個屬性可能在單一封包中出現多次。接收者將以與傳送索引鍵值對相同的順序來接收索引鍵。 UTF-8 字串對 CONNECT、PUBLISH、遺言屬性、SUBSCRIBE、DISCONNECT、UNSUBSCRIBE
訊息過期間隔時間 4 位元組整數,代表訊息過期間隔時間 (以秒為單位)。如果不存在,則訊息不會到期。 4 位元組整數 PUBLISH、CONNECT
工作階段過期間隔時間

4 位元組整數,代表工作階段到期間隔 (以秒為單位)。 AWS IoT Core 最多支持 7 天,默認最多為一小時。如果您設置的值超過了帳戶的最大值, AWS IoT Core 將在 CONNACK 中返回調整後的值。

4 位元組整數 CONNECT、CONNACK、DISCONNECT
已指派的用戶端識別碼 裝置未指定用戶端 ID AWS IoT Core 時所產生的隨機用戶端 ID。隨機用戶端 ID 必須是新的用戶端識別碼,且目前由代理程式管理的任何其他工作階段都未予以使用。 UTF-8 字串。 CONNACK
伺服器保持連線 2 位元組整數,代表伺服器指派的保持連線時間。如果用戶端離線的時間超過保持連線時間,伺服器將中斷用戶端的連線。 2 位元組整數 CONNACK
請求問題資訊 此布林值指出發生失敗時是否傳送原因字串或使用者屬性。 位元組 CONNECT
接收上限 2 位元組整數,代表無需接收 PUBACK 即可傳送的 PUBLISH QOS > 0 封包數目上限。 2 位元組整數 CONNECT、CONNACK
主題別名上限 此值表示將接受為主題別名的最高值。預設值為 0。 2 位元組整數 CONNECT、CONNACK
QoS 上限 AWS IoT Core 支援的 QoS 的最大值。預設為 1。 AWS IoT Core 不支援 QoS2。 位元組 CONNACK
保留可用

Boolean 值,指出 AWS IoT Core 訊息代理程式是否支援保留訊息。預設為 1。

位元組 CONNACK
封包大小上限 AWS IoT Core 接受和發送的最大數據包大小。不能超過 128 KB。 4 位元組整數 CONNECT、CONNACK
可用的萬用字元訂閱

Boolean 值,指出 AWS IoT Core 訊息代理程式是否支援可用萬用字元訂閱。預設為 1。

位元組 CONNACK
可用的訂閱識別碼

布林值,指出 AWS IoT Core 訊息代理程式是否支援可用的訂閱識別碼。預設值為 0。

位元組 CONNACK

MQTT 原因代碼

MQTT 5 引入了改進的錯誤報告與原因代碼響應。 AWS IoT Core 可以返回原因代碼,包括但不限於以下按數據包分組的代碼。如需 MQTT 5 支援原因代碼的完整清單,請參閱 MQTT v5 規格

CONNACK 原因代碼
Value Hex 原因代碼名稱 描述
0 0x00 Success (成功) 已接受連線。
128 0x80 未指定的錯誤 伺服器不願揭露失敗原因,或者沒有其他適用的原因代碼。
133 0x85 用戶端識別碼無效 用戶端識別碼是有效字串,但未獲伺服器允許。
134 0x86 使用者名稱或密碼錯誤 伺服器不接受用戶端指定的使用者名稱或密碼。
135 0x87 未獲授權 用戶端未獲得連線的授權。
144 0x90 主題名稱無效 遺言主題名稱已正確產生,但未獲伺服器接受。
151 0x97 超過配額 已超出實作或管理施加的限制。
155 0x9B 不支援 QoS。 伺服器不支援遺言 QoS 中的 QoS 集。
PUBACK 原因代碼
Value Hex 原因代碼名稱 描述
0 0x00 Success (成功) 已接受訊息。QoS 1 訊息的發佈作業繼續進行。
128 0x80 未指定的錯誤 接收者不接受發佈內容,但不願揭露原因,或不符合其中一個其他值。
135 0x87 未獲授權 PUBLISH 未經授權。
144 0x90 主題名稱無效 主題名稱格式不正確,但未獲用戶端或伺服器接受。
145 0x91 使用中的封包識別碼 封包識別碼已在使用中。這可能表示用戶端與伺服器之間的工作階段狀態不相符。
151 0x97 超過配額 已超出實作或管理施加的限制。
DISCONNECT 原因代碼
Value Hex 原因代碼名稱 描述
129 0x81 格式錯誤的封包 接收到的封包不符合此規格。
130 0x82 協定錯誤 收到非預期或亂序的封包。
135 0x87 未獲授權 請求未獲得授權。
139 0x8B 伺服器關閉 伺服器正在關閉。
141 8D 保持連線逾時 連線已關閉,因為未接收任何封包的時間已達到保持連線時間的 1.5 倍。
142 0x8E 已接管工作階段 系統已連接到使用相同 ClientID 的另一個連線,導致此連線關閉。
143 0x8F 主題篩選條件無效 意願主題名稱格式正確,但未獲伺服器接受。
144 0x90 主題名稱無效 主題名稱格式正確,但未獲此用戶端或伺服器接受。
147 0x93 超過接收上限 用戶端或伺服器已收到超過其未傳送 PUBACK 或 PUBCOMP 的發佈項目接收上限。
148 0x94 主題別名無效 用戶端或伺服器已收到 PUBLISH 封包,其中包含的主題別名大於 CONNECT 或 CONNACK 封包中傳送的主題別名上限。
151 0x97 超過配額 已超出實作或管理施加的限制。
152 0x98 管理動作 由於系統執行管理動作,導致連線關閉。
155 0x9B 不支援 QoS。 用戶端指定的 QoS 大於 CONNACK 中 QoS 上限指定的 QoS。
161 0xA1 不支援訂閱識別碼 伺服器不支援訂閱識別碼;未接受訂閱。
PUBACK 原因代碼
Value Hex 原因代碼名稱 描述
0 0x00 授予 QoS 0 已接受訂閱,且傳送的 QoS 上限為 QoS 0。這可能是低於請求的 QoS。
1 0x01 授予 QoS 1 已接受訂閱,且傳送的 QoS 上限為 QoS 1。這可能是低於請求的 QoS。
128 0x80 未指定的錯誤 未接受訂閱,伺服器不願揭露原因,或者其他原因代碼均不適用。
135 0x87 未獲授權 用戶端未獲授權進行此訂閱。
143 0x8F 主題篩選條件無效 主題篩選器的格式正確,但不允許此用戶端使用。
145 0x91 使用中的封包識別碼 指定的封包識別碼已在使用中。
151 0x97 超過配額 已超出實作或管理施加的限制。
UNSUBACK 原因代碼
Value Hex 原因代碼名稱 描述
0 0x00 Success (成功) 訂閱已刪除。
128 0x80 未指定的錯誤 取消訂閱無法完成,伺服器不願揭露原因,或者其他原因代碼均不適用。
143 0x8F 主題篩選條件無效 主題篩選器的格式正確,但不允許此用戶端使用。
145 0x91 使用中的封包識別碼 指定的封包識別碼已在使用中。

AWS IoT 與 MQTT 規格的差異

雖然訊息代理程式實作以 MQTT v3.1.1 規格與 MQTT 5.0 規格為基礎,但有些部分與規格有異,內容如下:

  • AWS IoT 不支援 MQTT 3 的下列封包:發生錯誤、公開和發佈。

  • AWS IoT 不支持 MQTT 5 的以下數據包:發布,發布,發布版本和身份驗證。

  • AWS IoT 不支援 MQTT 5 伺服器重新導向。

  • AWS IoT 僅支援 MQTT 服務品質 (QoS) 等級 0 和 1 級。 AWS IoT 不支援使用 QoS 層級 2 進行發佈或訂閱。請求 QoS 2 時,訊息代理程式不會傳送 PUBACK 或 SUBACK。

  • 在中 AWS IoT,訂閱 QoS 層級為 0 的主題表示郵件會傳遞零次或多次。一則訊息可能會傳送超過一次。傳送超過一次的訊息在發送時可能會使用不同的封包 ID。在這些情況下,DUP 旗標就不會設置。

  • 在回應連線請求時,訊息代理程式會傳送 CONNACK 訊息。此訊息包含了一個旗標,指出連線是否會恢復先前的工作階段。

  • 在傳送額外的控制封包或中斷連線請求之前,用戶端必須等待其裝置從 AWS IoT 訊息代理程式接收 CONNACK 訊息。

  • 當用戶端訂閱主題,訊息代理程式傳送 SUBACK 以及用戶端開始接收符合的新訊息這段期間可能會發生延遲。

  • 當用戶端在主題篩選條件中使用萬用字元 # 以訂閱主題時,主題階層中位於及低於其層級的所有字串都會相符。不過,父系主題不相符。例如,訂閱主題 sensor/# 會收到向主題 sensor/sensor/temperaturesensor/temperature/room1 發佈的訊息,但不會收到向 sensor 發佈的訊息。如需萬用字元的詳細使用資訊,請參閱 主題篩選條件

  • 訊息代理程式使用用戶端 ID 來識別每一個用戶端。用戶端 ID 作為 MQTT 承載的一部分從用戶端傳遞至訊息代理程式。具有相同用戶端 ID 的兩個用戶端,不能同時連線至訊息代理程式。當用戶端使用另一個用戶端正在使用的用戶端 ID 連線至訊息代理程式,系統會接受新的用戶端連線,而先前連線的用戶端會中斷連線。

  • 在極少數情況下,訊息代理程式可能會以不同的封包 ID 重新傳送相同的邏輯 PUBLISH 訊息。

  • 包含萬用字元的主題篩選條件訂閱無法接收保留訊息。若要接收保留訊息,訂閱請求必須包含與保留訊息主題完全相符的主題篩選條件。

  • 訊息代理程式不保證接收訊息及 ACK 的順序。

  • AWS IoT 可能有與規格不同的限制。如需詳細資訊,請參閱AWS IoT 參考指南中的 AWS IoT Core 訊息代理程式和通訊協定限制和配額

  • 不支援 MQTT DUP 旗標。