開始使用裝置管理 (Node.js)

後端應用程式可以使用Azure IoT 中樞基本類型,例如裝置對應項和直接方法,從遠端啟動及監視裝置上的裝置管理動作。 本文會示範後端應用程式和裝置應用程式如何共同運作,以使用 IoT 中樞初始化和監視遠端裝置重新啟動。

注意

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

使用直接方法從雲端中的後端應用程式起始裝置管理動作 (例如重新啟動、恢復出廠預設值,以及韌體更新)。 該裝置將負責:

  • 處理從 IoT 中樞傳送的方法要求。

  • 在裝置上初始化相對應的裝置特定動作。

  • 透過針對 IoT 中樞的報告屬性提供狀態更新。

您可以在雲端中使用後端 App 來執行裝置對應項查詢,以報告裝置管理動作的進度。

本文說明如何建立:

  • dmpatterns_getstarted_device.js:一個模擬裝置應用程式,使用直接方法重新啟動裝置,並報告上次重新啟動時間。 直接方法是從雲端叫用。

  • dmpatterns_getstarted_service.js:一個 .NET 主控台應用程式,可透過您的 IoT 中樞在模擬裝置應用程式中呼叫直接方法。 它會顯示回應和更新的回報屬性。

必要條件

  • IoT 中樞。 使用 CLIAzure 入口網站建立一個。

  • 已註冊的裝置。 在 Azure 入口網站中註冊一個。

  • Node.js 版本 10.0.x 或更新版本。 準備開發環境說明如何在 Windows 或 Linux 上安裝本文的 Node.js。

  • 請確定您的防火牆已開啟連接埠 8883。 本文中的裝置範例會使用 MQTT 通訊協定,其會透過連接埠 8883 進行通訊。 某些公司和教育網路環境可能會封鎖此連接埠。 如需此問題的詳細資訊和解決方法,請參閱連線至 IoT 中樞 (MQTT)

使用直接方法建立裝置應用程式

在本節中,您可:

  • 建立 Node.js 主控台應用程式,以回應雲端所呼叫的直接方法。

  • 觸發模擬裝置重新啟動。

  • 使用回報的屬性來啟用裝置對應項查詢,以識別裝置及其上次重新啟動時間。

  1. 建立名為 managed-device 的空白資料夾。 在 managed-device 資料夾中,于命令提示字元使用下列命令建立 package.json 檔案。 接受所有預設值:

    npm init
    
  2. Managed-device 資料夾中的命令提示字元中,執行下列命令來安裝 azure-iot-device Device SDK 套件和 azure-iot-device-mqtt 套件:

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. 使用文字編輯器,在Managed-device資料夾中建立dmpatterns_getstarted_device.js檔案。

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

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. 新增 connectionString 變數,並用它來建立用戶端執行個體。 將 {yourdeviceconnectionstring} 預留位置值取代為您在 IoT 中樞註冊新裝置時看到的裝置連接字串:

    var connectionString = '{yourdeviceconnectionstring}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. 新增下列函式以在裝置上實作直接方法

    var onReboot = function(request, response) {
    
        // Respond the cloud app for the direct method
        response.send(200, 'Reboot started', function(err) {
            if (err) {
                console.error('An error occurred when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.');
            }
        });
    
        // Report the reboot before the physical restart
        var date = new Date();
        var patch = {
            iothubDM : {
                reboot : {
                    lastReboot : date.toISOString(),
                }
            }
        };
    
        // Get device Twin
        client.getTwin(function(err, twin) {
            if (err) {
                console.error('could not get twin');
            } else {
                console.log('twin acquired');
                twin.properties.reported.update(patch, function(err) {
                    if (err) throw err;
                    console.log('Device reboot twin state reported')
                });  
            }
        });
    
        // Add your device's reboot API for physical restart.
        console.log('Rebooting!');
    };
    
  7. 開啟您 IoT 中樞的連線,並啟動直接方法接聽程式︰

    client.open(function(err) {
        if (err) {
            console.error('Could not open IotHub client');
        }  else {
            console.log('Client opened.  Waiting for reboot method.');
            client.onDeviceMethod('reboot', onReboot);
        }
    });
    
  8. 儲存並關閉 dmpatterns_getstarted_device.js檔案。

注意

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

取得 IoT 中樞連接字串

在本文中,您會建立後端服務,在裝置上叫用直接方法。 若要透過 IoT 中樞在裝置上叫用直接方法,則服務需要有服務連線權限。 根據預設,每個 IoT 中樞都是使用授與此權限且名為 service 的共用存取原則所建立。

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

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

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

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

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

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

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

建立服務應用程式以觸發重新開機

在本節中,您會建立 Node.js 主控台應用程式,此應用程式會使用直接方法起始遠端重新開機。 應用程式使用裝置對應項查詢來探索該裝置的上次重新開機時間。

  1. 建立名為 trigger-reboot-on-device 的空白資料夾。 在 trigger-reboot-on-device 資料夾中,于命令提示字元使用下列命令建立 package.json 檔案。 接受所有預設值:

    npm init
    
  2. trigger-reboot-on-device資料夾中的命令提示字元中,執行下列命令來安裝azure-iothub Device SDK 套件和 azure-iot-device-mqtt套件:

    npm install azure-iothub --save
    
  3. 使用文字編輯器,在trigger-reboot-on-device資料夾中建立dmpatterns_getstarted_service.js檔案。

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

    'use strict';
    
    var Registry = require('azure-iothub').Registry;
    var Client = require('azure-iothub').Client;
    
  5. 新增下列變數宣告,並將 {iothubconnectionstring} 預留位置值取代為先前在取得 IoT 中樞連接字串內複製的 IoT 中樞連接字串:

    var connectionString = '{iothubconnectionstring}';
    var registry = Registry.fromConnectionString(connectionString);
    var client = Client.fromConnectionString(connectionString);
    var deviceToReboot = 'myDeviceId';
    
  6. 新增下列函式來叫用裝置方法,以重新啟動目標裝置︰

    var startRebootDevice = function(twin) {
    
        var methodName = "reboot";
    
        var methodParams = {
            methodName: methodName,
            payload: null,
            timeoutInSeconds: 30
        };
    
        client.invokeDeviceMethod(deviceToReboot, methodParams, function(err, result) {
            if (err) {
                console.error("Direct method error: "+err.message);
            } else {
                console.log("Successfully invoked the device to reboot.");  
            }
        });
    };
    
  7. 新增下列函式來查詢裝置並取得上次重新啟動時間︰

    var queryTwinLastReboot = function() {
    
        registry.getTwin(deviceToReboot, function(err, twin){
    
            if (twin.properties.reported.iothubDM != null)
            {
                if (err) {
                    console.error('Could not query twins: ' + err.constructor.name + ': ' + err.message);
                } else {
                    var lastRebootTime = twin.properties.reported.iothubDM.reboot.lastReboot;
                    console.log('Last reboot time: ' + JSON.stringify(lastRebootTime, null, 2));
                }
            } else 
                console.log('Waiting for device to report last reboot time.');
        });
    };
    
  8. 新增下列函式來呼叫可觸發重新啟動直接方法,並查詢上次重新啟動時間的函式︰

    startRebootDevice();
    setInterval(queryTwinLastReboot, 2000);
    
  9. 儲存並關閉 dmpatterns_getstarted_service.js 檔案。

執行應用程式

您現在可開始執行應用程式。

  1. Managed-device 資料夾中的命令提示字元中,執行下列命令以開始接聽重新開機直接方法。

    node dmpatterns_getstarted_device.js
    
  2. trigger-reboot-on-device 資料夾中的命令提示字元中,執行下列命令來觸發遠端重新開機,並查詢裝置對應項以尋找上次重新開機時間。

    node dmpatterns_getstarted_service.js
    
  3. 您會在主控台中看到重新開機直接方法的裝置回應和重新開機狀態。

    下列顯示服務所傳送重新開機直接方法的裝置回應:

    manageddevice 應用程式輸出

    下列顯示服務觸發重新開機,並輪詢裝置對應項以取得上次重新開機時間:

    triggerrebootondevice 應用程式輸出

自訂及延伸裝置管理動作

您的 IoT 解決方案可以透過使用裝置對應項和雲端到裝置方法基元,擴充一組已定義的裝置管理模式或啟用自訂模式。 其他裝置管理動作範例還包括恢復出廠預設值、韌體更新、軟體更新、電源管理、網路和連線管理,以及資料加密。

裝置維護期間

一般而言,您會設定讓裝置在產生最短中斷和停機時間的時機執行動作。 裝置維護期間是用來定義裝置組態更新時機的常用模式。 您的後端解決方案可以使用所需的裝置對應項 (twin) 屬性,在您的裝置上定義可啟用維護期間的原則並啟用該原則。 當裝置收到維護期間原則時,它可以使用回報的裝置對應項 (twin) 屬性來回報原則的狀態。 接著,後端 App 便可使用裝置對應項 (twin) 查詢來證明是否符合裝置及每個原則的規定。

後續步驟

在本文中,您已使用直接方法在裝置上觸發遠端重新開機。 您已使用報告屬性來從裝置回報上次重新開機時間,以及查詢裝置對應項來從雲端探索裝置的上次重新開機時間。

若要繼續開始使用 IoT 中樞和裝置管理模式,例如端對端映像型更新,請參閱 Azure IoT 中樞的裝置更新文章,使用 Raspberry Pi 3 B+ 參考映像

若要了解如何擴充 IoT 解決方案,以及在多部裝置上排程方法呼叫,請參閱排程及廣播作業