本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
示範使用 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訊息主題
-
執行此程序時,請確定可同時看見終端機視窗和具有MQTT測試用戶端的視窗。此外,請確定您的MQTT測試用戶端仍訂閱 # 個主題篩選條件。如果未訂閱,請訂閱 # 主題篩選條件。
-
在終端機視窗中,輸入這些命令,以使用在 中建立的組態檔案執行 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 主控台中繼續進行。
-
在 AWS IoT 主控台的測試MQTT用戶端 中,選擇發佈至主題索引標籤。
-
在 Topic name (主題名稱) 中輸入
test/dc/subtopic
。 -
在 Message payload (訊息承載) 中,檢閱郵件內容。
-
選擇發佈以發佈MQTT訊息。
-
在終端機視窗中,注意從 AWS IoT Device Client 接收到類似這樣的訊息項目。
2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
-
在您看到顯示訊息已接收的訊息項目後,請輸入
^C
(Ctrl-C) 以停止 AWS IoT Device Client。 -
輸入此命令以檢視訊息日誌檔案的結尾,並查看您從MQTT測試用戶端 發佈的訊息。
tail ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
透過檢視日誌檔案中的訊息,您已證明 AWS IoT Device Client 收到您從MQTT測試用戶端發佈的訊息。
使用萬用字元訂閱多個MQTT訊息主題
這些程序示範 AWS IoT Device Client 如何使用萬用字元訂閱和記錄MQTT訊息。若要做到這一點,您必須:
-
更新 AWS IoT Device Client 用來訂閱主題的主題篩選條件MQTT。
-
更新裝置所使用的政策,以允許新的訂閱。
-
執行 AWS IoT Device Client 並從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萬用字元。這說明以 開頭的所有MQTT主題的訂閱test/dc/
。 AWS IoT Device Client 會將從此訂閱收到的訊息承載寫入 中名為 的檔案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 政策中使用萬用字元。
-
在
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 Device Client 示範萬用字元訂閱。
示範 AWS IoT Device Client 如何訂閱和接收多個MQTT訊息主題
-
在MQTT測試用戶端 中,檢查訂閱。如果MQTT測試用戶端已訂閱
#
主題篩選條件中的 ,請繼續下一個步驟。如果不是,請在MQTT測試用戶端 中,在訂閱主題索引標籤中,在主題篩選條件 中輸入#
(井號字元),然後選擇訂閱以訂閱主題。 -
在連接至 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 Device 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 Device 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 Device Client。 -
輸入此命令以檢視訊息日誌檔案的結尾,並查看您從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 裝置用戶端來示範遠端動作 (任務)。