示範使用 AWS IoT Device Client 訂閱訊息 - AWS IoT Core

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

示範使用 AWS IoT Device Client 訂閱訊息

在本節中,您會示範兩種類型的訊息訂閱:

  • 單一主題訂閱

  • 萬用字元主題訂閱

為這些練習建立的此政策中的政策陳述式會授予 Raspberry Pi 執行這些動作的許可:

  • iot:Receive

    授予 AWS IoT Device Client 許可,以接收與Resource物件中命名的主題相符MQTT的主題。

    { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/subtopic" ] }
  • iot:Subscribe

    授予 AWS IoT Device Client 許可,以訂閱與Resource物件中命名MQTT的主題篩選條件相符的主題篩選條件。

    { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic" ] }

訂閱單一MQTT訊息主題

此程序示範 AWS IoT Device Client 如何訂閱和記錄MQTT訊息。

在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中,列出 ~/dc-configs/dc-pubsub-custom-config.json 的內容或在文字編輯器中開啟檔案來檢閱其內容。找到 samples 物件,它應該如下所示。

"samples": { "pub-sub": { "enabled": true, "publish-topic": "test/dc/pubtopic", "publish-file": "~/messages/sample-ws-message.json", "subscribe-topic": "test/dc/subtopic", "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"

請注意,該subscribe-topic值是 AWS IoT Device Client 在執行時將訂閱MQTT的主題。 AWS IoT Device Client 會將從此訂閱收到的訊息承載寫入 subscribe-file值中名為 的檔案。

從 AWS IoT Device Client 訂閱MQTT訊息主題
  1. 執行此程序時,請確定可同時看見終端機視窗和具有MQTT測試用戶端的視窗。此外,請確定您的MQTT測試用戶端仍訂閱 # 個主題篩選條件。如果未訂閱,請訂閱 # 主題篩選條件。

  2. 在終端機視窗中,輸入這些命令,以使用在 中建立的組態檔案執行 AWS IoT Device Client建立組態檔

    cd ~/aws-iot-device-client/build ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-custom-config.json

    在終端機視窗中, AWS IoT Device Client 會顯示資訊訊息,以及執行時發生的任何錯誤。

    如果終端機視窗中未顯示任何錯誤,請在 AWS IoT 主控台中繼續進行。

  3. 在 AWS IoT 主控台的測試MQTT用戶端 中,選擇發佈至主題索引標籤。

  4. Topic name (主題名稱) 中輸入 test/dc/subtopic

  5. Message payload (訊息承載) 中,檢閱郵件內容。

  6. 選擇發佈以發佈MQTT訊息。

  7. 在終端機視窗中,注意從 AWS IoT Device Client 接收到類似這樣的訊息項目。

    2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
  8. 在您看到顯示訊息已接收的訊息項目後,請輸入 ^C(Ctrl-C) 以停止 AWS IoT Device Client。

  9. 輸入此命令以檢視訊息日誌檔案的結尾,並查看您從MQTT測試用戶端 發佈的訊息。

    tail ~/.aws-iot-device-client/log/pubsub_rx_msgs.log

透過檢視日誌檔案中的訊息,您已證明 AWS IoT Device Client 收到您從MQTT測試用戶端發佈的訊息。

使用萬用字元訂閱多個MQTT訊息主題

這些程序示範 AWS IoT Device Client 如何使用萬用字元訂閱和記錄MQTT訊息。若要做到這一點,您必須:

  1. 更新 AWS IoT Device Client 用來訂閱主題的主題篩選條件MQTT。

  2. 更新裝置所使用的政策,以允許新的訂閱。

  3. 執行 AWS IoT Device Client 並從MQTT測試主控台發佈訊息。

使用萬用字元主題篩選條件建立組態檔案以訂閱多個MQTT訊息MQTT主題
  1. 在連接至 Raspberry Pi 本機主機電腦的終端機視窗中,開啟 ~/dc-configs/dc-pubsub-custom-config.json 進行編輯,並找出 samples 物件。

  2. 在文字編輯器中,找出 samples 物件並更新 subscribe-topic 值,如下所示。

    "samples": { "pub-sub": { "enabled": true, "publish-topic": "test/dc/pubtopic", "publish-file": "~/messages/sample-ws-message.json", "subscribe-topic": "test/dc/#", "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"

    subscribe-topic值是MQTT主題篩選條件,結尾為MQTT萬用字元。這說明以 開頭的所有MQTT主題的訂閱test/dc/。 AWS IoT Device Client 會將從此訂閱收到的訊息承載寫入 中名為 的檔案subscribe-file

  3. 將修改的組態檔儲存為 ~/dc-configs/dc-pubsub-wild-config.json,然後退出編輯器。

修改 Raspberry Pi 使用的政策,以允許訂閱和接收多個MQTT訊息主題
  1. 在連接至 Raspberry Pi 的本機主機電腦上的終端機視窗中,於最喜歡的文字編輯器中開啟 ~/policies/pubsub_test_thing_policy.json 進行編輯,然後找出檔案中的 iot::Subscribeiot::Receive 政策陳述式。

  2. iot::Subscribe 政策陳述式中,更新資源物件中的字串,用 * 取代 subtopic,使其如下所示。

    { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*" ] }
    注意

    MQTT 主題篩選條件萬用字元+(加號) 和 #(井字號)。結尾帶有 # 的訂閱請求會訂閱所有以 # 字元前面的字串為開頭的主題 (例如本例中的 test/dc/)。

    不過,授權此訂閱的政策陳述式中的資源值,必須使用 *(星號) 取代主題篩選條件 中的 #(井號)ARN。這是因為政策處理器使用與 MQTT 不同的萬用字元。

    如需有關在政策中為主題和主題篩選條件使用萬用字元的詳細資訊,請參閱 在 MQTT和 AWS IoT Core 政策中使用萬用字元

  3. iot::Receive 政策陳述式中,更新資源物件中的字串,用 * 取代 subtopic,使其如下所示。

    { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*" ] }
  4. 將更新後的政策文件儲存為 ~/policies/pubsub_wild_test_thing_policy.json,然後退出編輯器。

  5. 輸入此指令來更新此教學課程的政策,以使用新的資源定義。

    aws iot create-policy-version \ --set-as-default \ --policy-name "PubSubTestThingPolicy" \ --policy-document "file://~/policies/pubsub_wild_test_thing_policy.json"

    如果命令成功,它會傳回類似這樣的回應。請注意,policyVersionId 現在是 2,表示這是此政策的第二個版本。

    如果成功更新了政策,您可以繼續進行下一個程序。

    { "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/PubSubTestThingPolicy", "policyDocument": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"iot:Connect\"\n ],\n \"Resource\": [\n \"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n ]\n },\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"iot:Publish\"\n ],\n \"Resource\": [\n \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n ]\n },\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"iot:Subscribe\"\n ],\n \"Resource\": [\n \"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*\"\n ]\n },\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"iot:Receive\"\n ],\n \"Resource\": [\n \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n ]\n }\n ]\n}\n", "policyVersionId": "2", "isDefaultVersion": true }

    如果收到因政策版本過多而無法儲存新政策的錯誤,請輸入此命令來列出政策的目前版本。檢閱此命令傳回的清單,找出可以刪除的政策版本。

    aws iot list-policy-versions --policy-name "PubSubTestThingPolicy"

    輸入此命令來刪除不再需要的版本。請注意,您無法刪除預設政策版本。預設政策版本的 isDefaultVersion 值為 true

    aws iot delete-policy-version \ --policy-name "PubSubTestThingPolicy" \ --policy-version-id policyId

    刪除政策版本後,請重試此步驟。

透過更新的組態檔案和政策,您已準備好使用 AWS IoT Device Client 示範萬用字元訂閱。

示範 AWS IoT Device Client 如何訂閱和接收多個MQTT訊息主題
  1. MQTT測試用戶端 中,檢查訂閱。如果MQTT測試用戶端已訂閱#主題篩選條件中的 ,請繼續下一個步驟。如果不是,請在MQTT測試用戶端 中,在訂閱主題索引標籤中,在主題篩選條件 中輸入 #(井號字元),然後選擇訂閱以訂閱主題。

  2. 在連接至 Raspberry Pi 的本機主機電腦終端機視窗中,輸入這些命令來啟動 AWS IoT 裝置用戶端。

    cd ~/aws-iot-device-client/build ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-wild-config.json
  3. 在本機主機電腦上的終端視窗中觀看 AWS IoT Device Client 輸出時,請返回MQTT測試用戶端 。在 Publish to a topic (發佈至主題) 索引標籤中的 Topic name (主題名稱) 輸入 test/dc/subtopic,然後選擇 Publish (發佈)。

  4. 在終端機視窗中,尋找如下訊息來確認已收到訊息:

    2021-11-10T16:34:20.101Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 76 bytes
  5. 在本機主機電腦的終端視窗中觀看 AWS IoT Device Client 輸出時,請返回MQTT測試用戶端 。在 Publish to a topic (發佈至主題) 索引標籤中的 Topic name (主題名稱) 輸入 test/dc/subtopic2,然後選擇 Publish (發佈)。

  6. 在終端機視窗中,尋找如下訊息來確認已收到訊息:

    2021-11-10T16:34:32.078Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 77 bytes
  7. 看到確認收到兩個訊息的訊息後,輸入 ^C(Ctrl-C) 以停止 AWS IoT Device Client。

  8. 輸入此命令以檢視訊息日誌檔案的結尾,並查看您從MQTT測試用戶端 發佈的訊息。

    tail -n 20 ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
    注意

    記錄檔案僅包含訊息承載。訊息主題不會記錄在接收到的訊息日誌檔案中。

    您也可以在收到的日誌中看到 AWS IoT Device Client 發佈的訊息。這是因為萬用字元主題篩選條件會包含該訊息主題,有時候,訂閱請求可能由訊息代理程式處理,然後才將發佈的訊息傳送給訂閱者。

日誌檔案中的項目會示範已收到訊息。您可以使用其他主題名稱重複此程序。所有主題名稱以 test/dc/ 為開頭的訊息應該會被接收並記錄。主題名稱以任何其他文字為開頭的訊息都會被忽略。

示範 AWS IoT Device Client 如何發佈和訂閱MQTT訊息後,請繼續 教學課程:使用 AWS IoT 裝置用戶端來示範遠端動作 (任務)