使用 IoT 中樞傳送雲端到裝置訊息 (Node.js)

Azure IoT 中樞是一項完全受控的服務,有助於讓數百萬個裝置和一個解決方案後端進行可靠且安全的雙向通訊。

本文示範如何:

  • 透過IoT 中樞,將雲端到裝置 (C2D) 訊息從解決方案後端傳送到單一裝置

  • 接收裝置上的雲端到裝置訊息

  • 從解決方案後端,要求確認收到從 IoT 中樞傳送到裝置的訊息 (意見反應)

注意

本文中所述的功能僅適用於 IoT 中樞的標準層。 如需基本和標準/免費IoT 中樞層的詳細資訊,請參閱為您的解決方案選擇正確的IoT 中樞層

在本文結尾處,您會執行兩個 Node.js 主控台應用程式:

  • simple_sample_deviceMicrosoft Azure IoT SDK for Node.js隨附的範例裝置應用程式,可連線到 IoT 中樞並接收雲端到裝置訊息。

  • SendCloudToDevice:透過 IoT 中樞 將雲端到裝置訊息傳送至裝置應用程式的服務應用程式,然後接收其傳遞通知。

注意

IoT 中樞會透過 Azure IoT 裝置 SDK 為許多裝置平台和語言 (C、Java、Python 及 JavaScript) 提供 SDK 支援。

若要深入了解雲端到裝置訊息,請參閱從 IoT 中樞傳送雲端到裝置訊息

必要條件

  • Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

  • Azure 訂用帳戶中的 IoT 中樞。 如果您還沒有中樞,可遵循建立 IoT 中樞中的步驟。

  • 在 IoT 中樞內註冊的裝置。 如果您尚未註冊裝置,請在Azure 入口網站中註冊一個裝置。

  • 本文使用 適用于 Node.js的 Azure IoT SDK 範例 程式碼。

    • 從 GitHub 下載或複製 SDK 存放庫到您的開發電腦。
    • 請確定您的開發電腦上安裝 Node.js 10.0.x 版或更新版本。 準備開發環境說明如何在 Windows 或 Linux 上安裝本文的 Node.js。
  • 請確定您的防火牆已開啟連接埠 8883。 本文中的裝置範例會使用 MQTT 通訊協定,其會透過連接埠 8883 進行通訊。 某些公司和教育網路環境可能會封鎖此連接埠。 如需此問題的詳細資訊和解決方法,請參閱連線至 IoT 中樞 (MQTT)

取得裝置連接字串

在本文中,您會執行模擬裝置的範例應用程式,以接收透過您IoT 中樞傳送的雲端到裝置訊息。 適用于 Node.js的 Microsoft Azure IoT SDK隨附的simple_sample_device範例應用程式會連線到 IoT 中樞,並作為模擬裝置。 此範例會使用 IoT 中樞上已註冊裝置的主要連接字串。

若要取得註冊至 IoT 中樞之裝置的主要連接字串,請遵循下列步驟:

  1. Azure 入口網站中選取 [資源群組]。 選取中樞所在的資源群組,然後從資源清單選取中樞。

  2. 在 IoT 中樞的左側窗格的[裝置管理] 底下,選取 [裝置]。

  3. 從裝置清單中,選取適當的裝置。

  4. 複製 [主要連接字串] 並儲存該值。

    此螢幕擷取畫面顯示如何擷取Azure 入口網站中註冊至 IoT 中樞之裝置的主要連接字串。

在裝置應用程式中接收訊息

在本節中,執行 simple_sample_device 範例裝置應用程式,以接收透過 IoT 中樞傳送的 C2D 訊息。 開啟新的命令提示字元,然後流覽至 azure-iot-sdk-node\device\samples\javascript 資料夾,位於您展開 Azure IoT Node.js SDK 的資料夾下。 執行下列命令,將 {Your device connection string} 預留位置值取代為您從 IoT 中樞的已註冊裝置複製的裝置連接字串。

set IOTHUB_DEVICE_CONNECTION_STRING={Your device connection string}
node simple_sample_device.js

下列輸出是在成功啟動並聯機到 IoT 中樞之後,來自範例裝置應用程式:

Client connected
Client connected
Client connected
Sending message: {"deviceId":"myFirstDevice","windSpeed":10.949952400617569,"temperature":26.0096515658525,"humidity":72.59398225838534}
Client connected
Client connected
send status: MessageEnqueued
Sending message: {"deviceId":"myFirstDevice","windSpeed":12.917649160180087,"temperature":27.336831253904613,"humidity":77.37300365434534}

在此範例中,裝置會叫用完整函式來通知 IoT 中樞已處理訊息,並可以從裝置佇列安全地移除訊息。 如果您使用 MQTT 傳輸且可以省略,則不需要 呼叫完成 。 AMQP 和 HTTPS 需要它。

透過 AMQP 和 HTTPS,但不是透過 MQTT,裝置也可以:

  • 放棄訊息,這會使得 IoT 中樞將訊息保留在裝置佇列中以供未來使用。
  • 拒絕訊息,這會永久移除裝置佇列中的訊息。

如果發生導致裝置無法完成、放棄或拒絕訊息的情況,IoT 中樞在固定的逾時期間之後,會將訊息排入佇列以再次傳遞。 基於這個原因,裝置應用程式中的訊息處理邏輯必須是「等冪」,如此一來,多次接收相同訊息才會產生相同的結果。

如需雲端到裝置訊息生命週期及 IoT 中樞如何處理雲端到裝置訊息的詳細資訊,請參閱從 IoT 中樞傳送雲端到裝置訊息

注意

如果您使用 HTTPS 而非 MQTT 或 AMQP 作為傳輸,用戶端實例會不常 (至少每 25 分鐘) 檢查來自IoT 中樞的訊息。 如需 MQTT、AMQP 和 HTTPS 支援之間差異的詳細資訊,請參閱雲端到裝置的通訊指引選擇通訊協定

取得 IoT 中樞連接字串

在本文中,您會建立後端服務,以透過您的 IoT 中樞傳送雲端到裝置訊息。 若要傳送雲端到裝置訊息,則服務需要服務連線權限。 根據預設,每個 IoT 中樞都是透過授與此權限且名為服務的共用存取原則所建立。

若要取得服務原則的 IoT 中樞連接字串,請遵循下列步驟:

  1. Azure 入口網站中選取 [資源群組]。 選取中樞所在的資源群組,然後從資源清單選取中樞。

  2. 在 IoT 中樞的左側窗格中,選取 [共用存取原則]。

  3. 從原則清單中,選取服務原則。

  4. 複製 [主要連接字串] 並儲存該值。

顯示如何從您在 Azure 入口網站中的 IoT 中樞擷取連接字串的螢幕擷取畫面。

如需 IoT 中樞共用存取原則和權限的詳細資訊,請參閱存取控制及權限

傳送雲端到裝置訊息

在本節中,您會建立 Node.js 主控台應用程式,將雲端到裝置訊息傳送至模擬裝置應用程式。 您需要來自裝置的裝置識別碼和 IoT 中樞連接字串。

  1. 建立新的名為 sendcloudtodevicemessage的空資料夾。 開啟命令提示字元,流覽至 sendcloudtodevicemessage 資料夾,然後執行下列命令,在該資料夾中建立 package.json 檔案。 在命令所呈現 npm 的每個提示中按Enter鍵,以接受該提示的預設值:

    npm init
    
  2. 在命令提示字元中,於 sendcloudtodevicemessage 資料夾中執行下列命令以安裝 azure-iothub 套件:

    npm install azure-iothub --save
    
  3. 使用文字編輯器,在 sendcloudtodevicemessage 資料夾中建立 SendCloudToDeviceMessage.js 檔案。

  4. SendCloudToDeviceMessage.js 檔案開頭新增下列 require 陳述式:

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. SendCloudToDeviceMessage.js 檔案中新增下列程式碼。 將 「{iot 中樞連接字串}」 和 「{device ID}」 預留位置值取代為您先前注意的 IoT 中樞連接字串和裝置識別碼:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. 加入下列函式來將作業結果列印至主控台︰

    function printResultFor(op) {
      return function printResult(err, res) {
        if (err) console.log(op + ' error: ' + err.toString());
        if (res) console.log(op + ' status: ' + res.constructor.name);
      };
    }
    
  7. 加入下列函式來將傳遞意見反應訊息列印至主控台︰

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. 加入下列程式碼,當裝置收到雲端到裝置訊息時,會將訊息傳送至您的裝置,並處理意見反應訊息︰

    serviceClient.open(function (err) {
      if (err) {
        console.error('Could not connect: ' + err.message);
      } else {
        console.log('Service client connected');
        serviceClient.getFeedbackReceiver(receiveFeedback);
        var message = new Message('Cloud to device message.');
        message.ack = 'full';
        message.messageId = "My Message ID";
        console.log('Sending message: ' + message.getData());
        serviceClient.send(targetDevice, message, printResultFor('send'));
      }
    });
    
  9. 儲存並關閉 SendCloudToDeviceMessage.js 檔案。

執行應用程式

您現在已準備好執行應用程式。

  1. azure-iot-sdk-node\device\samples\javascript資料夾中的命令提示字元中,執行下列命令以將遙測傳送至IoT 中樞,並接聽雲端到裝置訊息:

    node simple_sample_device.js
    

    執行模擬裝置應用程式

  2. 在命令提示字元中,於 sendcloudtodevicemessage 資料夾中執行下列命令,以傳送雲端到裝置訊息並等候通知的意見反應︰

    node SendCloudToDeviceMessage.js
    

    執行應用程式以傳送雲端到裝置命令

    注意

    為了簡單起見,本文不會實作任何重試原則。 在生產環境程式碼中,您應該如暫時性錯誤處理文章所建議,實作重試原則 (例如指數型輪詢)。

後續步驟

在本文中,您已了解如何傳送和接收雲端到裝置的訊息。