步驟 3:示範使用 AWS IoT 裝置用戶端來訂閱訊息 - AWS IoT Core

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

步驟 3:示範使用 AWS IoT 裝置用戶端來訂閱訊息

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

  • 單一主題訂閱

  • 萬用字元主題訂閱

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

  • iot:Receive

    授予 AWS IoT 裝置用戶端許可來接收與 Resource 物件中名稱相符的 MQTT 主題。

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

    授予 AWS IoT 裝置用戶端許可來訂閱與 Resource 物件中名稱相符的 MQTT 主題篩選條件。

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

訂閱單一 MQTT 訊息主題

此程序示範 AWS IoT 裝置用戶端訂閱和記錄 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 值是 MQTT 主題,AWS IoT 裝置用戶端會在執行時訂閱該主題。此 AWS IoT 裝置用戶端會將從此訂閱接收到的訊息承載寫入 subscribe-file 值中指定的檔案。

從 AWS IoT 裝置用戶端訂閱 MQTT 訊息主題
  1. 請確保這兩個終端機視窗和有 MQTT test client (MQTT 測試用戶端) 的視窗,會在您執行此程序時顯示出來。此外,請確保 MQTT test client (MQTT 測試用戶端) 仍然訂閱了 # 主題篩選條件。如果未訂閱,請訂閱 # 主題篩選條件。

  2. 在終端機視窗中輸入這些命令,使用在 建立組態檔 中建立的組態檔來執行 AWS IoT 裝置用戶端。

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

    在終端機視窗中,AWS IoT 裝置用戶端會顯示資訊訊息和執行時所發生的任何錯誤。

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

  3. 在 AWS IoT 主控台的 MQTT test client (MQTT 測試用戶端) 中,選擇 Publish to a topic (發佈至主題) 索引標籤。

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

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

  6. 請選擇 Publish (發佈) 來發佈 MQTT 訊息。

  7. 在終端機視窗中,監看 AWS IoT 裝置用戶端的已接收訊息項目,如下所示。

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

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

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

藉由檢視日誌檔案中的訊息,您示範了 AWS IoT 裝置用戶端收到您從 MQTT 測試用戶端發佈的訊息。

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

這些程序會示範 AWS IoT 裝置用戶端可以使用萬用字元訂閱並記錄 MQTT 訊息。若要做到這一點,您必須:

  1. 更新 AWS IoT 裝置用戶端用來訂閱 MQTT 主題的主題篩選條件。

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

  3. 執行 AWS IoT 裝置用戶端並從 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 主題篩選條件。本節說明訂閱所有以 test/dc/ 為開頭的 MQTT 主題。此 AWS IoT 裝置用戶端會將從此訂閱接收到的訊息承載寫入 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 policies

  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 裝置用戶端來示範萬用字元訂閱。

示範 AWS IoT 裝置用戶端訂閱並接收多個 MQTT 訊息主題的方式
  1. MQTT test client (MQTT 測試用戶端) 中,檢查訂閱。如果 MQTT test client (MQTT 測試用戶端) 訂閱了 # 主題篩選條件,請繼續下一個步驟。如果沒有,進入 MQTT test client (MQTT 測試用戶端),在 Subscribe to a topic (訂閱主題) 索引標籤的 Topic filter (主題篩選條件) 中,輸入 # (井號字元),然後選擇 Subscribe (訂閱) 進行訂閱。

  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 裝置用戶端在本機主機電腦的終端機視窗中輸出的同時,返回至 MQTT test 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 裝置用戶端在本機主機電腦的終端機視窗中輸出的同時,返回至 MQTT test 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 裝置用戶端。

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

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

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

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

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

在示範 AWS IoT 裝置用戶端發佈和訂閱 MQTT 訊息的方式之後,請繼續進行 教學課程:示範遠端動作 (工作) AWS IoT 裝置用戶端