共用方式為


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

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

本文章說明如何:

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

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

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

注意

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

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

  • simple_sample_device適用於 Node.js 的 Microsoft Azure IoT SDK 隨附的範例裝置應用程式,會連線至您的 IoT 中樞,然後接收雲端到裝置訊息。

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

注意

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

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

必要條件

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

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

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

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

    • 請將 SDK 存放庫從 GitHub 下載或複製到您的開發機器。
    • 確定 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. 複製 [主要連接字串] 並儲存該值。

    Screenshot that shows how to retrieve the primary connection string for a device registered to your IoT hub in the Azure portal.

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

在本節中,執行 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 傳輸,則不需要呼叫 complete,而且可以省略。 若是 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. 複製 [主要連接字串] 並儲存該值。

Screenshot that shows how to retrieve the connection string from your IoT Hub in the Azure portal.

如需 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 hub connection string}" 和 "{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
    

    Run the simulated device app

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

    node SendCloudToDeviceMessage.js
    

    Run the app to send the cloud-to-device command

    注意

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

下一步

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