教學課程:使用 AWS IoT 裝置 SDK 將裝置連接至 AWS IoT Core - AWS IoT Core

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

教學課程:使用 AWS IoT 裝置 SDK 將裝置連接至 AWS IoT Core

此教學課程示範如何將裝置連線至 AWS IoT Core,使其可以將資料傳送至接收自 AWS IoT。完成本教學課程後,您的裝置會配置為連接至 AWS IoT Core,而您將會了解裝置如何與 AWS IoT 進行通訊。

在此教學課程中,您將會:

此教學課程約需 1 小時方能完成。

開始本教學課程之前,請確定您有:
  • 已完成 開始使用 AWS IoT Core

    在該教學課程中您必須進行 設定您的裝置 的部分中,請為您的裝置選取 連接 Raspberry Pi 或其他裝置 選項,並使用 Python 語言選項來配置您的裝置。

    讓該教學課程中的終端機視窗處於開啟狀態,因為您還會在本教學課程中用到它。

  • 一個可執行適用 Python 的 AWS IoT 裝置 SDK v2 的裝置。

    本教學課程示範如何使用 Python 程式碼範例將裝置連線至 AWS IoT Core,這需要一個相對強大的裝置。

    若您使用是資源受限的裝置,這些程式碼範例可能無法在這些裝置上運作。在這種狀況下,您可能會因為 教學課程:使用 適用於 Embedded C 的 AWS IoT Device SDK 教學課程而學到更多。

為 AWS IoT 準備您的裝置

開始使用 AWS IoT Core 中,您準備好裝置和 AWS 帳戶,使其可進行通訊。本節檢閱適用於與 AWS IoT Core 的任何裝置連線之各方面的準備工作。

若為要連線至 AWS IoT Core 的裝置:

  1. 您必須具有 AWS 帳戶

    若您尚無 AWS 帳戶,設定您的 AWS 帳戶 中的程序會說明如何將其建立。

  2. 在該帳戶中,您必須具有為您 AWS 帳戶 和區域中之裝置定義的下列 AWS IoT 資源

    程序建立 AWS IoT 資源 中的程序說明如何為您在 AWS 帳戶 和區域中的裝置建立這些資源。

    • 以 AWS IoT 註冊並啟用以驗證裝置的裝置憑證

      憑證通常是使用 AWS IoT 物件建立並加以連接。雖然裝置不需要一個連線至 AWS IoT 的物件,其使裝置可使用其他的 AWS IoT 功能。

    • 連接至授權其連線至 AWS IoT Core 之裝置憑證的政策,執行希望其執行的所有動作。

  3. 可存取您 AWS 帳戶 之裝置端點的網際網路連線

    裝置端點的說明請參閱 AWS IoT 裝置資料和服務端點,可於 AWS IoT 主控台中的設定頁面找到。

  4. 通訊軟體,例如 AWS IoT 裝置 SDK 提供。本教學課程使用適用於 Python 的 AWS IoT 裝置 SDK v2

檢閱 MQTT 通訊協定

在我們談論範例應用程式之前,其有助於了解 MQTT 通訊協定。MQTT 通訊協定提供了一些優於其他網路通訊協定 (如 HTTP) 的優勢,這使其成為 IoT 裝置的熱門選擇。本節將會檢視 MQTT 適用於本教學課程的主要層面。如需 MQTT 與 HTTP 比較的資訊,請參閱 為您的裝置通訊選擇通訊協定

MQTT 使用一個發佈/訂閱通訊模型。

MQTT 通訊協定會與其主機一起使用發佈/訂閱通訊模型。此模型與 HTTP 使用的請求/回應模型不同。使用 MQTT,裝置會與由唯一用戶端 ID 識別的主機建立工作階段。如要傳送資料,裝置會將主題識別的訊息發佈至主機中的訊息代理程式。為了收到訊息代理程式的訊息,裝置會在訂閱請求中傳送主題篩選條件給訊息代理程式,以訂閱其會收到的主題。

MQTT 支援持久性工作階段

訊息代理程式會收到來自裝置的訊息,並將訊息發佈至已加以訂閱的裝置。利用持久性工作階段 (即使啟動裝置以中斷連線,工作階段仍保持活動狀態),裝置可擷取中斷連線時所發佈的訊息。在裝置端,MQTT 支援服務品質層級 (QoS),以確保主機接收裝置所傳送的訊息。

檢閱 pubsub.py 裝置 SDK 範例應用程式

本節會從用於本教學課程中之適用於 Python 的 AWS IoT 裝置 SDK v2 檢閱 pubsub.py 範例應用程式。我們將在此檢閱其如何連接至 AWS IoT Core 以發佈及訂閱 MQTT 訊息。下一節將會展示一些練習,可協助您探索裝置如何連接並與 AWS IoT Core 通訊。

pubsub.py 範例應用程式會示範與 AWS IoT Core 連線之 MQTT 的這些層面:

通訊協定

pubsub.py 範例會示範使用 MQTT 和透過 WSS 的 MQTT 通訊協定的 MQTT 連線。AWS 通用執行時間 (AWS CRT) 程式庫提供低階通訊協定支援,並包含適用於 Python 的 AWS IoT 裝置 SDK v2。

MQTT

pubsub.py 範例呼叫 mqtt_connection_builder 中的 mtls_from_path (如圖所示),使用 MQTT 通訊協定來建立與 AWS IoT Core 的連線。mtls_from_path 會使用 X.509 憑證和 TLS v1.2 來驗證裝置。AWS CRT 程式庫會處理該連線的較低階詳細資料。

mqtt_connection = mqtt_connection_builder.mtls_from_path( endpoint=args.endpoint, cert_filepath=args.cert, pri_key_filepath=args.key, ca_filepath=args.ca_file, client_bootstrap=client_bootstrap, on_connection_interrupted=on_connection_interrupted, on_connection_resumed=on_connection_resumed, client_id=args.client_id, clean_session=False, keep_alive_secs=6 )
endpoint

您 AWS 帳戶 的 IoT 裝置端點

於範例應用程式中,此值會從命令列傳入。

cert_filepath

裝置憑證檔案的路徑。

於範例應用程式中,此值會從命令列傳入。

pri_key_filepath

使用其憑證檔案建立的裝置私密金鑰檔案路徑

於範例應用程式中,此值會從命令列傳入。

ca_filepath

根 CA 檔案的路徑。僅當 MQTT 伺服器使用不在您信任庫中的憑證時才需要。

於範例應用程式中,此值會從命令列傳入。

client_bootstrap

處理通訊端通訊活動的通用執行時間物件

在範例應用程式中,此物件就在呼叫 mqtt_connection_builder.mtls_from_path 之前進行實例化。

on_connection_interrupted
on_connection_resumed

裝置連線遭到中斷並回復時呼叫的回呼函數。

client_id

唯一在 AWS 區域 中識別此裝置的 ID。

於範例應用程式中,此值會從命令列傳入。

clean_session

是否啟動新的持續性工作階段,或者,若存在,則重新連接到現有的工作階段

keep_alive_secs

CONNECT 請求中傳送的保持活動值 (以秒為單位)。Ping 會在此時間間隔自動傳送。若在此值的 1.5 倍之後未收到 ping,則伺服器會假設連線中斷。

透過 WSS 的 MQTT

pubsub.py 範例呼叫 mqtt_connection_builder 中的 websockets_with_default_aws_signing (如圖所示),使用透過 WSS 的 MQTT 通訊協定來建立與 AWS IoT Core 的連線。websockets_with_default_aws_signing 會使用 Signature 第 4 版透過 WSS 建立 MQTT 連線,來驗證裝置。

mqtt_connection = mqtt_connection_builder.websockets_with_default_aws_signing( endpoint=args.endpoint, client_bootstrap=client_bootstrap, region=args.signing_region, credentials_provider=credentials_provider, websocket_proxy_options=proxy_options, ca_filepath=args.ca_file, on_connection_interrupted=on_connection_interrupted, on_connection_resumed=on_connection_resumed, client_id=args.client_id, clean_session=False, keep_alive_secs=6 )
endpoint

您 AWS 帳戶 的 IoT 裝置端點

於範例應用程式中,此值會從命令列傳入。

client_bootstrap

處理通訊端通訊活動的通用執行時間物件

在範例應用程式中,此物件就在呼叫 mqtt_connection_builder.websockets_with_default_aws_signing 之前進行實例化。

region

Signature 第 4 版身分驗證所使用的 AWS 簽名區域。於 pubsub.py 中,其會傳遞在命令列中輸入的參數。

於範例應用程式中,此值會從命令列傳入。

credentials_provider

提供用於身分驗證的 AWS 憑證

在範例應用程式中,此物件就在呼叫 mqtt_connection_builder.websockets_with_default_aws_signing 之前進行實例化。

websocket_proxy_options

HTTP 代理選項 (若使用代理主機)

在範例應用程式中,此值就在呼叫 mqtt_connection_builder.websockets_with_default_aws_signing 之前進行初始化。

ca_filepath

根 CA 檔案的路徑。僅當 MQTT 伺服器使用不在您信任庫中的憑證時才需要。

於範例應用程式中,此值會從命令列傳入。

on_connection_interrupted
on_connection_resumed

裝置連線遭到中斷並回復時呼叫的回呼函數。

client_id

在 AWS 區域 中唯一識別此裝置的 ID。

於範例應用程式中,此值會從命令列傳入。

clean_session

是否啟動新的持續性工作階段,或者,若存在,則重新連接到現有的工作階段

keep_alive_secs

CONNECT 請求中傳送的保持活動值 (以秒為單位)。Ping 會在此時間間隔自動傳送。若在此值的 1.5 倍之後未收到 ping,則伺服器會假設連線中斷。

HTTPS

HTTPS 呢?AWS IoT Core 支援發佈 HTTPS 請求的裝置。從程式設計的角度來看,裝置會將 HTTPS 請求傳送至 AWS IoT Core,就像任何其他應用程式一樣。有關從裝置傳送 HTTP 訊息的 Python 程式範例,請參閱使用 Python requests 程式庫的 HTTPS 程式碼範例。此範例會使用 HTTPS 將訊息傳送至 AWS IoT Core,以便 AWS IoT Core 將其解譯為 MQTT 訊息。

AWS IoT Core 支援來自裝置的 HTTPS 請求時,請務必檢閱 為您的裝置通訊選擇通訊協定 的相關資訊,此可讓您就您裝置通訊使用何種通訊協定做出明智的決定。

持久性工作階段

於範例應用程式中,將 clean_session 參數設定為 False 表示連線應該是持續的。於實踐中,這意味著透過此呼叫開啟的連線重新連接至現有的持久性工作階段 (如若存在)。否則,其會建立並連線至新的持續工作階段。

使用持續性工作階段,在裝置未連線時,訊息代理程式會儲存傳送至裝置的訊息。當裝置重新連線至持續性工作階段時,訊息代理程式會將所有已訂閱的儲存訊息傳送至裝置。

若無持續性工作階段,裝置將不會收到裝置未連線時傳送的訊息。要使用哪個選項取決於您的應用程式,及是否必須對裝置未連接時產生訊息進行通訊。如需更多詳細資訊,請參閱 MQTT 持久性工作階段

服務品質

當裝置發佈並訂閱訊息時,可設定偏好的服務品質 (QoS)。AWS IoT 支援用於發佈和訂閱作業的 QoS 層級 0 和 1。如需在 AWS IoT 中之 QoS 層級的詳細資訊,請參閱 MQTT 服務品質 (QoS) 選項

Python 的 AWS CRT 執行時間會為其支援的 QoS 層級定義這些常數:

Python 服務品質層級
MQTT QoS 層級 SDK 所使用的 Python 符號值 描述
QoS 層級 0 mqtt.QoS.AT_MOST_ONCE 無論是否收到訊息,都只會嘗試傳送一次訊息。該訊息可能根本不會傳送,例如,若裝置未連線或網路發生錯誤。
QoS 層級 1 mqtt.QoS.AT_LEAST_ONCE 訊息會重複傳送,直到收到 PUBACK 確認為止。

於範例應用程式中,發佈和訂閱請求的 QoS 層級為 1 (mqtt.QoS.AT_LEAST_ONCE)。

  • 發佈時的 QoS

    當裝置發佈 QoS 層級 1 的訊息時,其會重複傳送訊息,直到收到來自訊息代理程式的 PUBACK 回應為止。若裝置未連線,訊息會在重新連線後佇列等待傳送。

  • 訂閱時的 QoS

    當裝置訂閱 QoS 層級 1 的訊息時,訊息代理程式會儲存裝置訂閱的訊息,直至其可傳送至裝置為止。訊息代理程式會重新傳送訊息,直至收到來自裝置的 PUBACK 回應。

訊息發佈

成功建立 AWS IoT Core 連線之後,裝置便可發佈訊息。pubsub.py 範例經由呼叫 mqtt_connection 物件的 publish 操作來完成此作業。

mqtt_connection.publish( topic=args.topic, payload=message, qos=mqtt.QoS.AT_LEAST_ONCE )
topic

識別訊息的訊息主題名稱

於範例應用程式中,這會從命令列傳入。

payload

將訊息承載格式化為字串 (例如,JSON 文件)

於範例應用程式中,這會從命令列傳入。

JSON 文件是一種常用的承載格式,可為其他 AWS IoT 服務識別; 然而,訊息承載的資料格式可為發佈者和訂閱者同意的任何內容。但在某些狀況下,對大多數的作業而言,其他 AWS IoT 服務僅識別 JSON 和 CBOR。

qos

此訊息的 QoS 層級

訊息訂閱

如要自 AWS IoT 和其他服務和裝置接收訊息,裝置會依其主題名稱訂閱這些訊息。裝置可透過指定主題名稱訂閱個別訊息,及透過指定可包含萬用字元字的主題篩選條件訂閱一組訊息。pubsub.py 範例會使用顯示於此處的程式碼來訂閱訊息,並註冊回呼函數,以於收到訊息之後進行處理。

subscribe_future, packet_id = mqtt_connection.subscribe( topic=args.topic, qos=mqtt.QoS.AT_LEAST_ONCE, callback=on_message_received ) subscribe_result = subscribe_future.result()
topic

要訂閱的主題。此可為主題名稱或主題篩選條件。

於範例應用程式中,這會從命令列傳入。

qos

訊息代理程式是否應該在裝置中斷連線斷時儲存這些訊息。

mqtt.QoS.AT_LEAST_ONCE 的值 (QoS 層級 1) 需要在建立連線時指定持久性工作階段 (clean_session=False)。

callback

呼叫來處理訂閱訊息的函數。

mqtt_connection.subscribe 函式會傳回一個未來和一個封包 ID。若訂閱請求已順利啟動,傳回的封包 ID 大於 0。如要確定訊息代理程式收到訂閱並已註冊,您必須等待非同步作業的結果傳回,如程式碼範例中所示。

回呼函數

pubsub.py 範例中的回呼會在裝置收到訂閱訊息時進行處理。

def on_message_received(topic, payload, **kwargs): print("Received message from topic '{}': {}".format(topic, payload)) global received_count received_count += 1 if received_count == args.count: received_all_event.set()
topic

訊息的主題

即使您已訂閱了主題篩選條件,此為所接收訊息的特定主題名稱。

payload

訊息承載

此格式為應用程式專用。

kwargs

可能的其他引數,如 mqtt.Connection.subscribe 中所述。

pubsub.py 範例中,on_message_received 只會顯示主題及其承載。其還會計算在達到限制後,所收到結束程式的訊息。

您的應用程式會評估主題和承載,以決定要執行的動作。

裝置中斷連線及重新連線

pubsub.py 範例包含在裝置中斷連線及重新建立連線時呼叫的回呼函數。您的裝置對這些事件採取的動作為應用程式專用。

裝置首次連線時,必須訂閱要接收的主題。若裝置的工作階段在重新連線時存在,則會還原其訂閱,並在重新連線後將來自這些訂閱的任何儲存訊息傳送至裝置。

若裝置的工作階段在重新連線時不復存在,則必須重新訂閱其訂閱。持續性工作階段具有限的存留期,當裝置中斷連線過久時,可能會過期。

連線您的裝置並與 AWS IoT Core 進行通訊

本節提供一些練習,協助您探索將裝置連線至 AWS IoT Core 的不同層面。於這些練習中,您將會使用 AWS IoT 主控台中的 MQTT 測試用戶端,查看裝置發佈的內容,及將訊息發佈至裝置。這些練習使用來自適用於 Python 的 AWS IoT 裝置 SDK v2pubsub.py 範例,並以您 開始使用 AWS IoT Core 教學課程經驗為基礎。

對於這些練習,您會從 pubsub.py 範例程式開始。

注意

這些練習假設您已完成 開始使用 AWS IoT Core 教學課程,並使用該教學課程中的裝置終端機視窗。

訂閱萬用字元主題篩選條件

在本練習中,您會修改用來呼叫 pubsub.py 以訂閱萬用字元主題篩選條件並根據訊息主題處理所接收訊息的命令列。

演練程序

在此練習中,想像您的裝置包含溫度控制和光源控制。其會使用這些主題名稱來識別與其相關的訊息。

  1. 開始練習之前,請試著從裝置上的 開始使用 AWS IoT Core 教學課程執行此命令,確保所有項目都準備好進行練習。

    cd ~/aws-iot-device-sdk-python-v2/samples python3 pubsub.py --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint

    您應該會看到與在教學課程入門中看到的相同輸出。

  2. 在此練習中,請變更這些命令列參數。

    動作

    命令列參數

    Effect

    add

    --message ""

    僅限配置 pubsub.py 加以聆聽

    add

    --count 2

    收到兩則訊息後結束程式

    change

    --topic device/+/details

    定義要訂閱的主題篩選條件

    對初始命令列進行這些變更會產生此命令列。在裝置的終端機視窗中輸入此命令。

    python3 pubsub.py --message "" --count 2 --topic device/+/details --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint

    程式應該會顯示如下所示的內容:

    Connecting to a3qexamplesffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-24d7cdcc-cc01-458c-8488-2d05849691e1'... Connected! Subscribing to topic 'device/+/details'... Subscribed with QoS.AT_LEAST_ONCE Waiting for all messages to be received...

    若您在終端機上看到類似的內容,表示您的裝置已準備就緒,且會收聽主題名稱開頭為 device,結尾為 /detail 的訊息。所以,讓我們來進行測試。

  3. 以下為您的裝置可能會收到的幾個訊息。

    主題名稱

    訊息承載

    device/temp/details

    { "desiredTemp": 20, "currentTemp": 15 }

    device/light/details

    { "desiredLight": 100, "currentLight": 50 }

  4. 在 AWS IoT 主控台中使用 MQTT 測試用戶端,將上一個步驟中說明的訊息傳送至您的裝置。

    1. 在 AWS IoT 主控台中開啟 MQTT 測試用戶端

    2. Subscribe to a topic (訂閱主題) 的 Subscription topic (訂閱主題) 欄位中,輸入主題篩選條件:device/+/details,再選擇 Subscribe to topic (訂閱主題)。

    3. 在 MQTT 測試用戶端的 Subscriptions (訂閱) 欄中,選擇 device/+/details

    4. 若為上表中的每個主題,請於 MQTT 測試用戶端中執行下列動作:

      1. Publish (發佈) 中,輸入來自表格中 Topic name (主題名稱) 欄的值。

      2. 在主題名稱下方的訊息承載欄位中,輸入來自表格中 Message payload (訊息承載) 欄的值。

      3. 觀看 pubsub.py 正在執行的終端機視窗,並在 MQTT 測試用戶端中,選擇 Publish to topic (發佈至主題)。

      您應該看到該訊息是由終端機視窗中的 pubsub.py 所收到。

演練結果

有了此 pubsub.py,使用萬用字元主題篩選條件訂閱訊息,加以訊息,並將其顯示於終端機視窗中。請注意您如何訂閱單一主題篩選條件,並呼叫回呼函數來處理具有兩個不同主題的訊息。

處理主題篩選條件訂閱

建置於上一個練習上,修改 pubsub.py 範例應用程式來評估訊息主題,並根據主題處理訂閱的訊息。

演練程序

如要評估訊息主題
  1. pubsub.py 複製至 pubsub2.py

  2. 以您最愛的文字編輯器或 IDE 中開啟 pubsub2.py 檔案。

  3. pubsub2.py 中,尋找 on_message_received 函數。

  4. on_message_received 中,請在以 print("Received message 開頭的行之後及以 global received_count 開頭的行之前插入下列程式碼。

    topic_parsed = False if "/" in topic: parsed_topic = topic.split("/") if len(parsed_topic) == 3: # this topic has the correct format if (parsed_topic[0] == 'device') and (parsed_topic[2] == 'details'): # this is a topic we care about, so check the 2nd element if (parsed_topic[1] == 'temp'): print("Received temperature request: {}".format(payload)) topic_parsed = True if (parsed_topic[1] == 'light'): print("Received light request: {}".format(payload)) topic_parsed = True if not topic_parsed: print("Unrecognized message topic.")
  5. 儲存您的變更,並使用此命令列執行修改後的程式。

    python3 pubsub2.py --message "" --count 2 --topic device/+/details --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
  6. 在 AWS IoT 主控台中,開啟 MQTT 測試用戶端

  7. Subscribe to a topic (訂閱主題) 的 Subscription topic (訂閱主題) 欄位中,輸入主題篩選條件:device/+/details,再選擇 Subscribe to topic (訂閱主題)。

  8. 在 MQTT 測試用戶端的 Subscriptions (訂閱) 欄中,選擇 device/+/details

  9. 若為此表格中的每個主題,請在 MQTT 測試用戶端中執行下列動作:

    主題名稱

    訊息承載

    device/temp/details

    { "desiredTemp": 20, "currentTemp": 15 }

    device/light/details

    { "desiredLight": 100, "currentLight": 50 }

    1. Publish (發佈) 中,輸入來自表格中 Topic name (主題名稱) 欄的值。

    2. 在主題名稱下方的訊息承載欄位中,輸入來自表格中 Message payload (訊息承載) 欄的值。

    3. 觀看 pubsub.py 正在執行的終端機視窗,並在 MQTT 測試用戶端中,選擇 Publish to topic (發佈至主題)。

    您應該看到該訊息是由終端機視窗中的 pubsub.py 所收到。

您應該會在終端機視窗中看到類似的內容。

Connecting to a3qexamplesffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-af794be0-7542-45a0-b0af-0b0ea7474517'... Connected! Subscribing to topic 'device/+/details'... Subscribed with QoS.AT_LEAST_ONCE Waiting for all messages to be received... Received message from topic 'device/light/details': b'{ "desiredLight": 100, "currentLight": 50 }' Received light request: b'{ "desiredLight": 100, "currentLight": 50 }' Received message from topic 'device/temp/details': b'{ "desiredTemp": 20, "currentTemp": 15 }' Received temperature request: b'{ "desiredTemp": 20, "currentTemp": 15 }' 2 message(s) received. Disconnecting... Disconnected!

演練結果

在本練習中,您已新增程式碼,讓範例應用程式能辨識並處理回呼函數中的多個訊息。有了這個,您的裝置可以接收訊息並對其採取行動。

裝置接收和處理多則訊息的另一種方式是分別訂閱不同訊息,並將每個訂閱分配給各自的回呼函數。

從您的裝置發佈訊息

您可使用 pubsub.py 範例應用程式,以發佈來自您裝置的訊息。在其會發佈訊息時,這些訊息無法作為 JSON 文件加以讀取。此練習會修改範例應用程式,以便能夠發佈在可由 AWS IoT Core 讀取之訊息承載中的 JSON 文件。

演練程序

在本練習中,下列訊息將會與 device/data 主題一起傳送。

{ "timestamp": 1601048303, "sensorId": 28, "sensorData": [ { "sensorName": "Wind speed", "sensorValue": 34.2211224 } ] }
如要準備 MQTT 測試用戶端監控本練習的訊息
  1. Subscribe to a topic (訂閱主題) 的 Subscription topic (訂閱主題) 欄位中,輸入主題篩選條件:device/data,再選擇 Subscribe to topic (訂閱主題)。

  2. 在 MQTT 測試用戶端的 Subscriptions (訂閱) 欄中,選擇 device/data

  3. 讓 MQTT 測試用戶端視窗保持開啟狀態,以等待來自您裝置的訊息。

如要使用 pubsub.py 範例應用程式傳送 JSON 文件
  1. 在您的裝置上,將 pubsub.py 複製至 pubsub3.py

  2. Edit (編輯) pubsub3.py,變更其格式化所發佈訊息的方式。

    1. 在文字編輯器中開啟 pubsub3.py

    2. 找出這行程式碼:

      message = "{} [{}]".format(message_string, publish_count)

    3. 將其變更為:

      message = "{}".format(message_string)

    4. 找出這行程式碼:

      message_json = json.dumps(message)

    5. 將其變更為:

      message = "{}".json.dumps(json.loads(message))

    6. 儲存您的變更。

  3. 在您的裝置上,執行此命令以傳送訊息兩次。

    python3 pubsub3.py --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --topic device/data --count 2 --message '{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}' --endpoint your-iot-endpoint
  4. 於 MQTT 測試用戶端中,檢查是否已解譯並格式化訊息承載中的 JSON 文件,例如:

    顯示 JSON 訊息承載如何顯示於 AWS IoT 主控台之 MQTT 用戶端的映像。

依預設,pubsub3.py 也會訂閱其傳送的訊息。您您應會看到其在應用程式輸出中收到訊息。終端機視窗看起來與下列內容相似。

Connecting to a3qEXAMPLEsffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-5cff18ae-1e92-4c38-a9d4-7b9771afc52f'... Connected! Subscribing to topic 'device/data'... Subscribed with QoS.AT_LEAST_ONCE Sending 2 message(s) Publishing message to topic 'device/data': {"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]} Received message from topic 'device/data': b'{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}' Publishing message to topic 'device/data': {"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]} Received message from topic 'device/data': b'{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}' 2 message(s) received. Disconnecting... Disconnected!

演練結果

有了這個,您的裝置可產生訊息傳送至 AWS IoT Core 來測試基本連線能力,並提供裝置訊息以供 AWS IoT Core 處理。例如,您可使用此應用程式,從您的裝置傳送測試資料,以測試 AWS IoT 規則動作。

檢視結果

本教學課程中的範例為您提供了有關裝置如何與 AWS IoT Core 進行通訊之基礎知識的實作經驗,此為您 AWS IoT 解決方案的基本部分。當您的裝置可與 AWS IoT Core 進行通訊時,其可將訊息傳遞至 AWS 服務及其可採取行動的其他裝置。同樣地,AWS 服務和其他裝置可處理造成訊息傳回您裝置的資訊。

當您準備好進一步探索 AWS IoT Core 時 ,請試試這些教學課程: