教學課程:傳送 Amazon SNS通知 - AWS IoT Core

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

教學課程:傳送 Amazon SNS通知

本教學課程示範如何建立將MQTT訊息資料傳送至 Amazon SNS主題的 AWS IoT 規則,以便以SMS文字訊息傳送。

在本教學課程中,只要溫度超過規則中設定的值,您就可以建立規則,將訊息資料從天氣感應器傳送至 Amazon SNS主題的所有訂閱者。該規則會在回報的溫度超過規則設定值時進行偵測,然後建立新的訊息承載資料,其中僅包含裝置 ID、回報的溫度及超過的溫度限制。規則會將新的訊息承載作為JSON文件傳送至SNS主題,該主題會通知所有訂閱者。 SNS

您會在本教學課程中學到什麼:
  • 如何建立和測試 Amazon SNS通知

  • 如何從 AWS IoT 規則呼叫 Amazon SNS通知

  • 如何在規則SQL查詢陳述式中使用簡單的查詢和函數

  • 如何使用MQTT用戶端測試 AWS IoT 規則

此教學課程約需 30 分鐘方能完成。

開始本教學課程之前,請確定您有:

步驟 1:建立傳送SMS文字訊息的 Amazon SNS主題

此程序會說明如何建立天氣感應器可以傳送訊息資料的 Amazon SNS主題。然後,Amazon SNS主題會透過超過溫度限制的SMS簡訊通知其所有訂閱者。

建立傳送SMS文字訊息的 Amazon SNS主題
  1. 建立 Amazon SNS主題。

    1. 登入 Amazon SNS主控台

    2. 在左側導覽窗格中,選擇主題

    3. Topics (主題) 頁面上,選擇 Create new topic (建立新主題)。

    4. Details (詳細資訊) 中,選擇 Standard (標準) 類型。根據預設,主控台會建立FIFO主題。

    5. 名稱 中,輸入SNS主題名稱。針對本教學,輸入 high_temp_notice

    6. 向下捲動到頁面底部,並選擇 Create topic (建立主題)。

      主控台會開啟新主題的 Details (詳細資訊) 頁面。

  2. 建立 Amazon SNS訂閱。

    注意

    您在此訂閱中使用的電話號碼可能會因您將在本教學課程中傳送訊息而產生簡訊費用。

    1. high_temp_notice 主題詳細資訊頁面中,選擇 Create subscription (建立訂閱)。

    2. 建立訂閱 中,在詳細資訊區段中,在通訊協定清單中,選擇 SMS

    3. Endpoint (端點) 中,輸入可接收簡訊的電話號碼。請務必將其輸入,使其以 + 開頭,包含國碼和地區碼,且不包含任何其他標點符號字元。

    4. 選擇 Create subscription (建立訂閱)。

  3. 測試 Amazon SNS通知。

    1. Amazon SNS主控台 的左側導覽窗格中,選擇主題

    2. 若要開啟主題的詳細資料頁面,請於 Topics (主題) 的主題清單中,選擇 high_temp_notice

    3. 如要開啟 Publish message to topic (將訊息發佈至主題) 頁面,請於 high_temp_notice 詳細資訊頁面中,選擇 Publish message (發佈訊息)。

    4. Publish message to topic (將訊息發佈至主題) 的 Message body (訊息內文) 區段下,在 Message body to send to the endpoint (要傳送至端點的訊息內文) 中,輸入簡短訊息。

    5. 捲動到頁面底部,並選擇 Publish message (發佈訊息)。

    6. 在您先前建立訂閱時所使用的手機號碼上,確認已收到訊息。

    若您並未收到測試訊息,請再次檢查電話號碼及手機設定。

    在繼續教學課程之前,請務必從 Amazon SNS主控台發佈測試訊息。

步驟 2:建立 AWS IoT 規則以傳送文字訊息

在本教學課程中建立的 AWS IoT 規則會訂閱device/device_id/dataMQTT主題,其中 device_id是傳送訊息之裝置的 ID。主題篩選條件會將這些主題描述為 device/+/data,其中 + 為與兩個正斜線字元間之任何字串相符的萬用字元。此規則也會測試訊息裝載中的 temperature 欄位值。

當規則從相符主題收到訊息時,會從device_id主題名稱、訊息承載temperature的值中取得 ,並為其測試的限制新增常數值,然後將這些值作為JSON文件傳送至 Amazon SNS通知主題。

例如,來自天氣感應器裝置編號 32 MQTT的訊息使用 device/32/data主題,並具有如下所示的訊息承載:

{ "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }

規則的規則查詢陳述式會從訊息承載取得temperature值、device_id從主題名稱取得 max_temperature ,並新增常數值,將看起來像這樣的訊息承載傳送至 Amazon SNS主題:

{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30 }
建立 AWS IoT 規則以偵測過限溫度值,並建立要傳送至 Amazon SNS主題的資料
  1. 開啟AWS IoT 主控台 的規則中樞

  2. 若此為您的第一個規則,請選擇 Create (建立) 或 Create a rule (建立規則)。

  3. Create a rule (建立規則) 中:

    1. Name (名稱) 中,輸入 temp_limit_notify

      請記住,規則名稱在您的 AWS 帳戶 和 區域中必須是唯一的,而且不能有任何空格。我們在此名稱中使用底線字元來分隔規則名稱中的字詞。

    2. Description (說明) 中,說明規則。

      有意義的說明可讓您更容易記住此規則的作用及您建立規則的原因。說明可依所需而定,因此請盡可能詳細說明。

  4. Create a rule (建立規則) 的 Rule query statement (規則查詢陳述式) 中:

    1. 使用SQL版本 中,選取 2016-03-23

    2. Rule query statement (規則查詢陳述式) 編輯方塊中輸入陳述式:

      SELECT topic(2) as device_id, temperature as reported_temperature, 30 as max_temperature FROM 'device/+/data' WHERE temperature > 30

      本陳述式:

      • 接聽具有符合主題篩選條件且temperature值大於 30 device/+/data之主題MQTT的訊息。

      • 從主題字串中選取第二個元素,並將其指定給 device_id 欄位。

      • 從訊息承載選取值 temperature 欄位,並將其指派給 reported_temperature 欄位。

      • 建立常數值 30 來表示限制值,並將其指定給 max_temperature 欄位。

  5. 若要開啟此規則的規則動作清單,請於 Set one or more actions (設定一個或多個動作) 中,選擇 Add action (新增動作)。

  6. 選取動作 中,選擇傳送訊息做為SNS推送通知

  7. 若要開啟所選取動作的組態頁面,請在動作清單底部選擇 Configure action (設定動作)。

  8. Configure action (設定動作):

    1. SNS目標 中,選擇選取 ,尋找名為 high_temp_notice SNS的主題,然後選擇選取

    2. 訊息格式 中,選擇 RAW

    3. 選擇或建立角色以授予執行此動作的 AWS IoT 存取權中,選擇建立角色

    4. Create a new role (建立新角色) 的 Name (名稱) 中,輸入新角色的唯一名稱。在本教學課程中,使用 sns_rule_role

    5. 選擇 Create Role (建立角色)。

    若您要重複此教學課程或重複使用現有的角色,請先選擇 Update role (更新角色),再繼續進行。這會更新角色的政策文件以使用SNS目標。

  9. 選擇 Add action (新增動作),並返回 Create a rule (建立規則) 頁面。

    在新動作的動態磚中,在傳送訊息作為SNS推送通知 下,您可以看到規則將呼叫SNS的主題。

    這是您將新增至此規則的唯一規則動作。

  10. 如要建立並完成此步驟,請於 Create a rule (建立規則) 中,向下捲動至底部,然後選擇 Create rule (建立規則)。

步驟 3:測試 AWS IoT 規則和 Amazon SNS通知

若要測試您的新規則,您將使用MQTT用戶端來發佈和訂閱此規則所使用的MQTT訊息。

MQTT主控台中在新視窗中開啟用戶端 AWS IoT。這可讓您編輯規則,而不會遺失MQTT用戶端的組態。如果您離開MQTT用戶端前往主控台中的另一個頁面,則不會保留任何訂閱或訊息日誌。

使用MQTT用戶端測試您的規則
  1. MQTT主控台的 AWS IoT 用戶端 中,訂閱輸入主題,在此情況下為 device/+/data

    1. 在MQTT用戶端的訂閱 下,選擇訂閱主題

    2. Subscription topic (訂閱主題) 中,輸入輸入主題篩選條件 device/+/data 的主題 。

    3. 將剩下的欄位保留為其預設設定。

    4. 請選擇 Subscribe to topic (訂閱主題)。

      Subscriptions (訂閱) 欄中,Publish to a topic (發佈到主題) 之下,device/+/data 隨即顯示。

  2. 使用特定裝置 ID device/32/data,將訊息發佈至輸入主題。您無法發佈至包含萬用字元MQTT的主題。

    1. 在MQTT用戶端的訂閱 下,選擇發佈至主題

    2. Publish (發佈) 欄位中輸入輸入主題名稱 device/32/data

    3. 複製此處顯示的範例資料,並在主題名稱下方的編輯方塊中貼上範例資料。

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. 選擇發佈至主題以發佈MQTT訊息。

  3. 確認簡訊已傳送。

    1. 在MQTT用戶端的訂閱 下,您先前訂閱的主題旁有一個綠點。

      該綠點表示自上次查看後,已收到一個或多個新訊息。

    2. Subscriptions (訂閱) 下,選擇 device/+/data,來檢查訊息承載是否與您剛剛發佈的內容相符,如下所示:

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    3. 檢查您用來訂閱SNS主題的電話,並確認訊息承載的內容如下所示:

      {"device_id":"32","reported_temperature":38,"max_temperature":30}

      請注意,device_id 值是個帶有引號的字串,而 temperature 值是個數字。這是因為 topic() 函數從輸入訊息的主題名稱中提取字串,而 temperature 值會使用輸入訊息承載的數值。

      若要將 device_id 值設為數值,請將規則查詢陳述式中的 topic(2) 替換為:

      cast(topic(2) AS DECIMAL)

      請注意,將 topic(2) 值轉換為數值,DECIMAL 值僅適用於該部分主題僅包含數字字元時。

  4. 嘗試傳送訊息,MQTT其中溫度未超過限制。

    1. 在MQTT用戶端的訂閱 下,選擇發佈至主題

    2. Publish (發佈) 欄位中輸入輸入主題名稱 device/33/data

    3. 複製此處顯示的範例資料,並在主題名稱下方的編輯方塊中貼上範例資料。

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. 若要傳送訊息MQTT,請選擇發佈至主題

    您應該能看到您在 device/+/data 訂閱中傳送的訊息。不過,因溫度值低於規則查詢陳述式中的最高溫度,所以您不應收到簡訊。

    若您並未看到正確的行為,請查看疑難排解提示。

訊息SNS規則疑難排解

若您並未看到預期的結果,請查看以下事項。

  • 您收到錯誤的橫幅

    若在您發佈輸入訊息時出現錯誤,請先更正該錯誤。下列步驟可協助您修正該錯誤。

  • 您在MQTT用戶端中看不到輸入訊息

    每次將輸入訊息發佈至device/22/data主題時,如果您訂閱device/+/data主題篩選條件,該訊息都應出現在MQTT用戶端中,如 程序中所述。

    要檢查的事項
    • 檢查您訂閱的主題篩選條件

      若您依程序中所述訂閱了輸入訊息主題,則每次發佈輸入訊息時都應該會看到其複本。

      若您並未訊息,請檢查您訂閱的主題名稱,並將其與所發佈的主題進行比較。主題名稱區分大小寫,且您訂閱的主題必須與所發佈訊息承載的主題相同。

    • 檢查訊息發佈功能

      在MQTT用戶端的訂閱 下,選擇 device/+/data ,檢查發佈訊息的主題,然後選擇發佈至主題 。您應該會在訊息清單中出現主題下方的編輯方塊中看到訊息承載。

  • 您未收到SMS訊息

    若要讓您的規則運作,它必須具有正確的政策,授權它接收訊息並傳送SNS通知,而且它必須接收訊息。

    要檢查的事項
    • 檢查MQTT用戶端 AWS 區域 的 和您建立的規則

      您執行MQTT用戶端的主控台必須與您建立的規則位於相同的 AWS 區域中。

    • 檢查訊息承載中的溫度值是否超過測試閾值

      若溫度值小於或等於 30 (如規則查詢陳述式中所定義),則規則將不會執行其任何動作。

    • 檢查規則查詢陳述式中的輸入訊息主題

      若要讓規則正常運作,它必須收到一則訊息,其中包含與規則查詢陳述式子FROM句中的主題篩選條件相符的主題名稱。

      檢查規則查詢陳述式中主題篩選條件的拼寫與MQTT用戶端中主題的拼寫。主題名稱區分大小寫,且郵件的主題必須與規則查詢陳述式中的主題篩選條件相符。

    • 檢查輸入訊息承載的內容

      若要讓規則正常運作,它必須在SELECT陳述式中宣告的訊息承載中找到資料欄位。

      檢查規則查詢陳述式中temperature欄位的拼寫與MQTT用戶端中訊息承載的拼寫。欄位名稱區分大小寫,規則查詢陳述式中的 temperature 欄位必須與訊息承載中的 temperature 欄位相符。

      請確定訊息承載中的JSON文件格式正確。如果 JSON 有任何錯誤,例如缺少逗號,則規則將無法讀取它。

    • 檢查規則動作中重新發佈的訊息主題

      重新發佈規則動作發佈新訊息的主題必須符合您在MQTT用戶端中訂閱的主題。

      開啟您建立於主控台中的規則,並檢查規則動作重新發佈訊息的主題。

    • 檢查規則所使用的角色

      規則動作必須具有接收原始主題及發佈新主題的權限。

      授權規則接收訊息資料的政策並加以重新發佈為所使用的主題所特定的。若變更用於重新發佈訊息資料的主題,則必須更新規則動作的角色,來更新其政策以與目前主題相符。

      若您懷疑這會是問題,請編輯 Republish (重新發佈) 規則動作並建立新角色。規則動作建立的新角色會收到執行這些動作所需的授權。

步驟 4:檢閱結果及後續步驟

於本教學課程中:
  • 您已建立並測試 Amazon SNS通知主題和訂閱。

  • 您在規則SQL查詢陳述式中使用簡單的查詢和函數,為您的通知建立新的訊息。

  • 您已建立 AWS IoT 規則,以傳送使用自訂訊息承載的 Amazon SNS通知。

  • 您使用MQTT用戶端來測試您的 AWS IoT 規則。

後續步驟

使用此規則傳送一些簡訊之後,請嘗試使用其來查看教學課程的某些層面如何影響訊息,及訊息傳送的時間。此處有幾種簡單的入門方式。

  • 變更 device_id 在輸入訊息的主題中,並觀察文字訊息內容中的效果。

  • 變更規則查詢陳述式中所選取的欄位,並觀察簡訊內容中的影響。

  • 變更規則查詢陳述式中的測試,以測試最低溫度,而非最高溫度。請記得變更 max_temperature 的名稱!

  • 新增重新發佈規則動作,以在傳送SNS通知MQTT時傳送訊息。

  • 請嘗試本系列中的下一個教學課程,並了解如何進行 教學課程:將裝置資料儲存在 DynamoDB 表格中