本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
步驟 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 訊息主題
-
請確保這兩個終端機視窗和有 MQTT test client (MQTT 測試用戶端) 的視窗,會在您執行此程序時顯示出來。此外,請確保 MQTT test client (MQTT 測試用戶端) 仍然訂閱了 # 主題篩選條件。如果未訂閱,請訂閱 # 主題篩選條件。
-
在終端機視窗中輸入這些命令,使用在 建立組態檔 中建立的組態檔來執行 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 主控台中繼續進行。
-
在 AWS IoT 主控台的 MQTT test client (MQTT 測試用戶端) 中,選擇 Publish to a topic (發佈至主題) 索引標籤。
-
在 Topic name (主題名稱) 中輸入
test/dc/subtopic
。 -
在 Message payload (訊息承載) 中,檢閱郵件內容。
-
請選擇 Publish (發佈) 來發佈 MQTT 訊息。
-
在終端機視窗中,監看 AWS IoT 裝置用戶端的已接收訊息項目,如下所示。
2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
-
在看到顯示訊息已收到的已接收訊息項目時,請輸入
^C
(Ctrl-C) 來停止 AWS IoT 裝置用戶端。 -
輸入此命令來檢視訊息日誌檔案的結尾,查看您從 MQTT test client (MQTT 測試用戶端) 發佈的訊息。
tail ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
藉由檢視日誌檔案中的訊息,您示範了 AWS IoT 裝置用戶端收到您從 MQTT 測試用戶端發佈的訊息。
使用萬用字元訂閱多個 MQTT 訊息主題
這些程序會示範 AWS IoT 裝置用戶端可以使用萬用字元訂閱並記錄 MQTT 訊息。若要做到這一點,您必須:
-
更新 AWS IoT 裝置用戶端用來訂閱 MQTT 主題的主題篩選條件。
-
更新裝置所使用的政策,以允許新的訂閱。
-
執行 AWS IoT 裝置用戶端並從 MQTT 測試主控台發佈訊息。
使用萬用字元 MQTT 主題篩選條件建立用於訂閱多個 MQTT 訊息主題的組態檔
-
在連接至 Raspberry Pi 本機主機電腦的終端機視窗中,開啟
~/dc-configs/dc-pubsub-custom-config.json
進行編輯,並找出samples
物件。 -
在文字編輯器中,找出
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
中指定的檔案。 -
將修改的組態檔儲存為
~/dc-configs/dc-pubsub-wild-config.json
,然後退出編輯器。
修改 Raspberry Pi 使用的政策,以允許訂閱和接收多個 MQTT 消息主題
-
在連接至 Raspberry Pi 的本機主機電腦上的終端機視窗中,於最喜歡的文字編輯器中開啟
~/policies/pubsub_test_thing_policy.json
進行編輯,然後找出檔案中的iot::Subscribe
和iot::Receive
政策陳述式。 -
在
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。
-
在
iot::Receive
政策陳述式中,更新資源物件中的字串,用*
取代subtopic
,使其如下所示。{ "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/
*
" ] } -
將更新後的政策文件儲存為
~/policies/pubsub_wild_test_thing_policy.json
,然後退出編輯器。 -
輸入此指令來更新此教學課程的政策,以使用新的資源定義。
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 訊息主題的方式
-
在 MQTT test client (MQTT 測試用戶端) 中,檢查訂閱。如果 MQTT test client (MQTT 測試用戶端) 訂閱了
#
主題篩選條件,請繼續下一個步驟。如果沒有,進入 MQTT test client (MQTT 測試用戶端),在 Subscribe to a topic (訂閱主題) 索引標籤的 Topic filter (主題篩選條件) 中,輸入#
(井號字元),然後選擇 Subscribe (訂閱) 進行訂閱。 -
在連接至 Raspberry Pi 的本機主機電腦終端機視窗中,輸入這些命令來啟動 AWS IoT 裝置用戶端。
cd ~/aws-iot-device-client/build ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-wild-config.json
-
在觀看 AWS IoT 裝置用戶端在本機主機電腦的終端機視窗中輸出的同時,返回至 MQTT test client (MQTT 測試用戶端)。在 Publish to a topic (發佈至主題) 索引標籤中的 Topic name (主題名稱) 輸入
test/dc/subtopic
,然後選擇 Publish (發佈)。 -
在終端機視窗中,尋找如下訊息來確認已收到訊息:
2021-11-10T16:34:20.101Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 76 bytes
-
在觀看 AWS IoT 裝置用戶端在本機主機電腦的終端機視窗中輸出的同時,返回至 MQTT test client (MQTT 測試用戶端)。在 Publish to a topic (發佈至主題) 索引標籤中的 Topic name (主題名稱) 輸入
test/dc/subtopic2
,然後選擇 Publish (發佈)。 -
在終端機視窗中,尋找如下訊息來確認已收到訊息:
2021-11-10T16:34:32.078Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 77 bytes
-
在您看到確認已接收到兩則訊息的訊息之後,請輸入
^C
(Ctrl-C) 來停止 AWS IoT 裝置用戶端。 -
輸入此命令來檢視訊息日誌檔案的結尾,查看您從 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 裝置用戶端。