共用方式為


教學課程:將在 Linux 或 Windows 上執行的 IoT 隨插即用多個元件裝置應用程式連線至 IoT 中樞

本教學課程說明如何建置具有元件的範例 IoT 隨插即用裝置應用程式、將其連線至您的 IoT 中樞,並使用 Azure IoT 總管工具來檢視其傳送至中樞的資訊。 範例應用程式以 C 撰寫,並且包含在適用於 C 的 Azure IoT 裝置 SDK 中。解決方案建立器可使用 Azure IoT 檔案總管工具直接了解 IoT 隨插即用裝置的功能,而不需檢視任何裝置程式碼。

瀏覽程式碼

在本教學課程中,您已:

  • 下載範例程式碼。
  • 建置範例程式碼。
  • 執行範例裝置應用程式,並驗證其是否連線到您的 IoT 中樞。
  • 檢閱原始程式碼。

必要條件

在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。

您可以在 Linux 或 Windows 上完成本教學課程。 本教學課程中的殼層命令會遵循路徑分隔符號 '/' 的 Linux 慣例,如果您在 Windows 上遵循,請務必針對 '\' 交換這些分隔符號。

必要條件會因作業系統而有所不同:

Linux

本教學課程假設您使用 Ubuntu Linux。 本教學課程中的步驟已使用 Ubuntu 18.04 進行測試。

若要在 Linux 上完成本教學課程,您必須在本機 Linux 環境上安裝下列軟體:

使用 apt-get 命令,安裝 GCCGitcmake 和所有必要的相依性:

sudo apt-get update
sudo apt-get install -y git cmake build-essential curl libcurl4-openssl-dev libssl-dev uuid-dev

確認 cmake 的版本高於 2.8.12,而且 GCC 的版本高於 4.4.7

cmake --version
gcc --version

Windows

若要在 Windows 上完成此教學課程,請在您的本機 Windows 環境上安裝下列軟體:

下載程式碼

如果您已完成教學課程:將在 Linux 或 Windows 上執行的範例 IoT 隨插即用裝置應用程式連線至 IoT 中樞,則您已經下載了程式碼。

在此教學課程中,您會準備可用來複製及建置 Azure IoT 中樞裝置 C SDK 的開發環境。

在您選擇的資料夾中開啟命令提示字元。 執行下列命令,將 Azure IoT C SDK 和程式庫 GitHub 存放庫複製到下列位置:

git clone https://github.com/Azure/azure-iot-sdk-c.git
cd azure-iot-sdk-c
git submodule update --init

預期此作業需要幾分鐘的時間才能完成。

建置並執行程式碼

您可以使用 Visual Studio 或在命令列上使用 cmake,來建立和執行程式碼。

使用 Visual Studio

  1. 開啟所複製存放庫的根資料夾。 幾秒後,Visual Studio 中的 CMake 支援就會建立執行和偵錯專案所需的所有項目。

  2. 當 Visual Studio 準備就緒時,在方案總管中瀏覽至 iothub_client/samples/pnp/pnp_temperature_controller/ 範例。

  3. 以滑鼠右鍵按一下 pnp_temperature_controller.c 檔案,然後選取 [新增偵錯設定]。 選取 [預設]

  4. Visual Studio 會開啟 launch.vs.json 檔案。 編輯此檔案,以下列程式碼片段所示的方式,設定必要的環境變數。 當您完成下列程序後,您會記下範圍識別碼和註冊主要金鑰:設定 IoT 隨插即用的環境快速入門和教學課程

    {
      "version": "0.2.1",
      "defaults": {},
      "configurations": [
        {
          "type": "default",
          "project": "iothub_client\\samples\\pnp\\pnp_temperature_controller\\pnp_temperature_controller.c",
          "projectTarget": "",
          "name": "pnp_temperature_controller.c",
          "env": {
            "IOTHUB_DEVICE_SECURITY_TYPE": "DPS",
            "IOTHUB_DEVICE_DPS_ID_SCOPE": "<Your ID scope>",
            "IOTHUB_DEVICE_DPS_DEVICE_ID": "my-pnp-device",
            "IOTHUB_DEVICE_DPS_DEVICE_KEY": "<Your enrollment primary key>"
          }
        }
      ]
    }
    
  5. 以滑鼠右鍵按一下 pnp_temperature_controller.c 檔案,然後選取 [設定為起始項目]

  6. 若要追蹤 Visual Studio 中的程式碼執行,請在 pnp_temperature_controller.c 檔案中,將中斷點新增至 main 函式。

  7. 您現在可以從 [偵錯] 功能表中執行和偵錯範例。

裝置現在已可接收命令和屬性更新,並已開始將遙測資料傳送至中樞。 完成後續步驟後,請讓範例保持執行狀態。

在命令列上使用 cmake

建置範例:

  1. 在複製的裝置 SDK 根資料夾中建立 cmake 子資料夾,並瀏覽至該資料夾:

    cd azure-iot-sdk-c
    mkdir cmake
    cd cmake
    
  2. 執行下列命令,以產生並建立 SDK 的專案檔和範例:

    cmake ..
    cmake --build .
    

設定您的環境中,您建立了四個環境變數,以將範例設定為使用裝置佈建服務 (DPS) 來連線到您的 IoT 中樞:

  • 值為 DPSIOTHUB_DEVICE_SECURITY_TYPE
  • 使用 DPS 識別碼範圍的 IOTHUB_DEVICE_DPS_ID_SCOPE
  • 使用值 my-pnp-deviceIOTHUB_DEVICE_DPS_DEVICE_ID
  • 使用註冊主要金鑰的 IOTHUB_DEVICE_DPS_DEVICE_KEY
  • 使用值 global.azure-devices-provisioning.netIOTHUB_DEVICE_DPS_ENDPOINT

若要深入了解範例設定,請參閱範例讀我檔案

若要執行範例:

  1. cmake 資料夾瀏覽至包含可執行檔的資料夾並且執行:

    # Bash
    cd iothub_client/samples/pnp/pnp_temperature_controller
    ./pnp_temperature_controller
    
    REM Windows
    cd iothub_client\samples\pnp\pnp_temperature_controller\Debug
    pnp_temperature_controller.exe
    

裝置現在已可接收命令和屬性更新,並已開始將遙測資料傳送至中樞。 完成後續步驟後,請讓範例保持執行狀態。

使用 Azure IoT 檔案總管來驗證程式碼

當裝置用戶端範例啟動之後,請使用 Azure IoT 總管工具來驗證其是否正確運作。

  1. 開啟 Azure IoT 檔案總管。

  2. 在 [IoT 中樞] 頁面上,如果您尚未新增與 IoT 中樞的連線,請選取 [+ 新增連線]。 針對您先前建立的 IoT 中樞輸入連接字串,然後選取 [儲存]

  3. 在 [IoT 隨插即用設定] 頁面上,選取 [+ 新增] > [本機資料夾],然後選取您用來儲存模型檔案的本機 models 資料夾。

  4. 在 [IoT 中樞] 頁面上,按一下您想要使用的中樞名稱。 您將會看見已向 IoT 中樞註冊的裝置清單。

  5. 按一下您先前建立之裝置的裝置識別碼

  6. 左側功能表會顯示裝置可用的不同類型資訊。

  7. 選取 [IoT 隨插即用元件] 來檢視裝置的模型資訊。

  8. 您可以檢視裝置的不同元件。 預設元件和任何其他元件。 選取要使用的元件。

  9. 選取 [遙測] 頁面,然後選取 [啟動],以檢視裝置針對此元件傳送的遙測資料。

  10. 選取 [屬性 (唯讀)] 頁面,以檢視針對此元件回報的唯讀屬性。

  11. 選取 [屬性 (可寫入)] 頁面,檢視您可針對此元件更新的可寫入屬性。

  12. 名稱選取屬性、為其輸入新的值,然後選取 [更新需要的值]

  13. 若要看見新值顯示,請選取 [重新整理] 按鈕。

  14. 選取 [命令] 頁面,以檢視此元件的所有命令。

  15. 選取您想要測試的命令,並設定參數 (如果有的話)。 選取 [傳送命令],以便在裝置上呼叫命令。 在範例程式碼執行所在的命令提示字元視窗中,您可以看到您的裝置回應命令。

檢閱程式碼

這個範例會實作 IoT 隨插即用的溫度控制器裝置。 此範例會使用多個元件來執行模型。 溫度裝置的數字對應項定義語言 (DTDL) 模型檔案會定義裝置所實作的遙測、屬性和命令。

IoT 隨插即用 helper 函式

在此範例中,程式碼會使用 /common 資料夾中的一些 helper 函式:

pnp_device_client_ll 包含 IoT 隨插即用的 connect 方法,其中包含作為參數的 model-idPnP_CreateDeviceClientLLHandle

pnp_protocol:包含 IoT 隨插即用 helper 函式:

  • PnP_CreateReportedProperty
  • PnP_CreateReportedPropertyWithStatus
  • PnP_ParseCommandName
  • PnP_CreateTelemetryMessageHandle
  • PnP_ProcessTwinData
  • PnP_CopyPayloadToString
  • PnP_CreateDeviceClientLLHandle_ViaDps

這些通用的 helper 函式,足以讓您在自己的專案中使用。 此範例會在對應至模型中每個元件的三個檔案中使用這些函式:

  • pnp_deviceinfo_component
  • pnp_temperature_controller
  • pnp_thermostat_component

例如,在 pnp_deviceinfo_component 檔案中,SendReportedPropertyForDeviceInformation 函式會使用兩個 helper 函式:

if ((jsonToSend = PnP_CreateReportedProperty(componentName, propertyName, propertyValue)) == NULL)
{
    LogError("Unable to build reported property response for propertyName=%s, propertyValue=%s", propertyName, propertyValue);
}
else
{
    const char* jsonToSendStr = STRING_c_str(jsonToSend);
    size_t jsonToSendStrLen = strlen(jsonToSendStr);

    if ((iothubClientResult = IoTHubDeviceClient_LL_SendReportedState(deviceClientLL, (const unsigned char*)jsonToSendStr, jsonToSendStrLen, NULL, NULL)) != IOTHUB_CLIENT_OK)
    {
        LogError("Unable to send reported state for property=%s, error=%d", propertyName, iothubClientResult);
    }
    else
    {
        LogInfo("Sending device information property to IoTHub.  propertyName=%s, propertyValue=%s", propertyName, propertyValue);
    }
}

範例中的每個元件都會遵循此模式。

程式碼流程

main 函式會初始化連線,並傳送模型識別碼:

deviceClient = CreateDeviceClientAndAllocateComponents();

程式碼會使用 PnP_CreateDeviceClientLLHandle 來連線到 IoT 中樞、將 modelId 設定為選項,以及設定適用於直接方法和裝置對應項更新的裝置方法和裝置對應項回呼處理常式:

g_pnpDeviceConfiguration.deviceMethodCallback = PnP_TempControlComponent_DeviceMethodCallback;
g_pnpDeviceConfiguration.deviceTwinCallback = PnP_TempControlComponent_DeviceTwinCallback;
g_pnpDeviceConfiguration.modelId = g_temperatureControllerModelId;
...

deviceClient = PnP_CreateDeviceClientLLHandle(&g_pnpDeviceConfiguration);

&g_pnpDeviceConfiguration 也包含連線資訊。 環境變數 IOTHUB_DEVICE_SECURITY_TYPE 會判斷範例是否使用連接字串或裝置佈建服務來連線到 IoT 中樞。

裝置傳送模型識別碼時,就會變成 IoT 隨插即用裝置。

回呼處理常式就緒之後,裝置就會回應對應項更新和直接方法呼叫:

  • 針對裝置對應項回呼,PnP_TempControlComponent_DeviceTwinCallback 會呼叫 PnP_ProcessTwinData 函式來處理資料。 PnP_ProcessTwinData 會使用「訪客模式」來剖析 JSON,然後瀏覽每個屬性,並在每個元素上呼叫 PnP_TempControlComponent_ApplicationPropertyCallback

  • 針對命令回呼,PnP_TempControlComponent_DeviceMethodCallback 函式會使用 helper 函式來剖析命令和元件名稱:

    PnP_ParseCommandName(methodName, &componentName, &componentNameSize, &pnpCommandName);
    

    然後,PnP_TempControlComponent_DeviceMethodCallback 函式會在元件上呼叫命令:

    LogInfo("Received PnP command for component=%.*s, command=%s", (int)componentNameSize, componentName, pnpCommandName);
    if (strncmp((const char*)componentName, g_thermostatComponent1Name, g_thermostatComponent1Size) == 0)
    {
        result = PnP_ThermostatComponent_ProcessCommand(g_thermostatHandle1, pnpCommandName, rootValue, response, responseSize);
    }
    else if (strncmp((const char*)componentName, g_thermostatComponent2Name, g_thermostatComponent2Size) == 0)
    {
        result = PnP_ThermostatComponent_ProcessCommand(g_thermostatHandle2, pnpCommandName, rootValue, response, responseSize);
    }
    else
    {
        LogError("PnP component=%.*s is not supported by TemperatureController", (int)componentNameSize, componentName);
        result = PNP_STATUS_NOT_FOUND;
    }
    

main 函式會初始化傳送至 IoT 中樞的唯讀屬性:

PnP_TempControlComponent_ReportSerialNumber_Property(deviceClient);
PnP_DeviceInfoComponent_Report_All_Properties(g_deviceInfoComponentName, deviceClient);
PnP_TempControlComponent_Report_MaxTempSinceLastReboot_Property(g_thermostatHandle1, deviceClient);
PnP_TempControlComponent_Report_MaxTempSinceLastReboot_Property(g_thermostatHandle2, deviceClient);

main 函式會進入迴圈,以更新每個元件的事件和遙測資料:

while (true)
{
    PnP_TempControlComponent_SendWorkingSet(deviceClient);
    PnP_ThermostatComponent_SendTelemetry(g_thermostatHandle1, deviceClient);
    PnP_ThermostatComponent_SendTelemetry(g_thermostatHandle2, deviceClient);
}

PnP_ThermostatComponent_SendTelemetry 函式會顯示如何使用 PNP_THERMOSTAT_COMPONENT 結構。 此範例會使用此結構,將兩個控溫器的相關資訊儲存在溫度控制器中。 程式碼會使用 PnP_CreateTelemetryMessageHandle 函式來準備訊息並傳送訊息:

messageHandle = PnP_CreateTelemetryMessageHandle(pnpThermostatComponent->componentName, temperatureStringBuffer);
...
iothubResult = IoTHubDeviceClient_LL_SendEventAsync(deviceClientLL, messageHandle, NULL, NULL);

main 函式最後會終結不同的元件,並關閉與中樞的連線。

本教學課程說明如何建置具有元件的範例 IoT 隨插即用裝置應用程式、將其連線至您的 IoT 中樞,並使用 Azure IoT 總管工具來檢視其傳送至中樞的資訊。 範例應用程式是以 C# 撰寫的,並隨附於適用於 C# 的 Azure IoT 裝置 SDK 中。 解決方案建置人員可以使用 Azure IoT 總管工具來了解 IoT 隨插即用裝置的功能,而不需檢視任何裝置程式碼。

瀏覽程式碼

在本教學課程中,您已:

  • 下載範例程式碼。
  • 建置範例程式碼。
  • 執行範例裝置應用程式,並驗證其是否連線到您的 IoT 中樞。
  • 檢閱原始程式碼。

必要條件

在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。

您可以在 Linux 或 Windows 上執行本教學課程。 本教學課程中的殼層命令會遵循路徑分隔符號 '/' 的 Linux 慣例,如果您在 Windows 上遵循,請務必針對 '\' 交換這些分隔符號。

使用範例程式碼複製 SDK 存放庫

如果您已完成教學課程:將在 Windows 上執行的範例 IoT 隨插即用裝置應用程式連線至 IoT 中樞 (C#),您已經複製了存放庫。

從 C# GitHub 存放庫的 Azure IoT 範例複製範例。 在您選擇的資料夾中開啟命令提示字元。 執行下列命令,複製適用於 .NET 的 Microsoft Azure IoT SDK GitHub 存放庫:

git clone https://github.com/Azure/azure-iot-sdk-csharp.git

建置程式碼

您現在可以建置範例並加以執行。 執行下列命令以建置範例:

cd azure-iot-sdk-csharp/iothub/device/samples/solutions/PnpDeviceSamples/TemperatureController
dotnet build

執行裝置範例

若要執行範例,請執行下列命令:

dotnet run

裝置現在已可接收命令和屬性更新,並已開始將遙測資料傳送至中樞。 完成後續步驟後,請讓範例保持執行狀態。

使用 Azure IoT 總管來驗證程式碼

當裝置用戶端範例啟動之後,請使用 Azure IoT 總管工具來驗證其是否正確運作。

  1. 開啟 Azure IoT 檔案總管。

  2. 在 [IoT 中樞] 頁面上,如果您尚未新增與 IoT 中樞的連線,請選取 [+ 新增連線]。 針對您先前建立的 IoT 中樞輸入連接字串,然後選取 [儲存]

  3. 在 [IoT 隨插即用設定] 頁面上,選取 [+ 新增] > [本機資料夾],然後選取您用來儲存模型檔案的本機 models 資料夾。

  4. 在 [IoT 中樞] 頁面上,按一下您想要使用的中樞名稱。 您將會看見已向 IoT 中樞註冊的裝置清單。

  5. 按一下您先前建立之裝置的裝置識別碼

  6. 左側功能表會顯示裝置可用的不同類型資訊。

  7. 選取 [IoT 隨插即用元件] 來檢視裝置的模型資訊。

  8. 您可以檢視裝置的不同元件。 預設元件和任何其他元件。 選取要使用的元件。

  9. 選取 [遙測] 頁面,然後選取 [啟動],以檢視裝置針對此元件傳送的遙測資料。

  10. 選取 [屬性 (唯讀)] 頁面,以檢視針對此元件回報的唯讀屬性。

  11. 選取 [屬性 (可寫入)] 頁面,檢視您可針對此元件更新的可寫入屬性。

  12. 名稱選取屬性、為其輸入新的值,然後選取 [更新需要的值]

  13. 若要看見新值顯示,請選取 [重新整理] 按鈕。

  14. 選取 [命令] 頁面,以檢視此元件的所有命令。

  15. 選取您想要測試的命令,並設定參數 (如果有的話)。 選取 [傳送命令],以便在裝置上呼叫命令。 在範例程式碼執行所在的命令提示字元視窗中,您可以看到您的裝置回應命令。

檢閱程式碼

這個範例會實作 IoT 隨插即用的溫度控制器裝置。 這個範例所實作的模型會使用多個元件溫度裝置的數字對應項定義語言 (DTDL) 模型檔案會定義裝置所實作的遙測、屬性和命令。

裝置程式碼會使用標準 CreateFromConnectionString 方法連線到您的 IoT 中樞。 裝置會在連線要求中,傳送其實作之 DTDL 模型的模型識別碼。 傳送模型識別碼的裝置是 IoT 隨插即用裝置:

private static DeviceClient InitializeDeviceClient(string hostname, IAuthenticationMethod authenticationMethod)
{
    var options = new ClientOptions
    {
        ModelId = ModelId,
    };

    var deviceClient = DeviceClient.Create(hostname, authenticationMethod, TransportType.Mqtt, options);
    deviceClient.SetConnectionStatusChangesHandler((status, reason) =>
    {
        s_logger.LogDebug($"Connection status change registered - status={status}, reason={reason}.");
    });

    return deviceClient;
}

模型識別碼會儲存於程式碼中,如下列程式碼片段所示:

private const string ModelId = "dtmi:com:example:TemperatureController;1";

當裝置連線到您的 IoT 中樞之後,程式碼就會註冊命令處理常式。 reboot 命令會定義於預設元件中。 getMaxMinReport 命令會個別定義於這兩個控溫器元件中:

await _deviceClient.SetMethodHandlerAsync("reboot", HandleRebootCommandAsync, _deviceClient, cancellationToken);
await _deviceClient.SetMethodHandlerAsync("thermostat1*getMaxMinReport", HandleMaxMinReportCommandAsync, Thermostat1, cancellationToken);
await _deviceClient.SetMethodHandlerAsync("thermostat2*getMaxMinReport", HandleMaxMinReportCommandAsync, Thermostat2, cancellationToken);

針對這兩個控溫器元件上所需的屬性更新,會有個別的處理常式:

_desiredPropertyUpdateCallbacks.Add(Thermostat1, TargetTemperatureUpdateCallbackAsync);
_desiredPropertyUpdateCallbacks.Add(Thermostat2, TargetTemperatureUpdateCallbackAsync);

範例程式碼會從每個控溫器元件傳送遙測:

await SendTemperatureAsync(Thermostat1, cancellationToken);
await SendTemperatureAsync(Thermostat2, cancellationToken);

SendTemperatureTelemetryAsync 方法會使用 PnpHhelper 類別來建立每個元件的訊息:

using Message msg = PnpHelper.CreateIothubMessageUtf8(telemetryName, JsonConvert.SerializeObject(currentTemperature), componentName);

PnpHelper 類別包含可以搭配多個元件模型使用的其他範例方法。

使用 Azure IoT 總管工具,檢視來自這兩個控溫器元件的遙測和屬性:

Azure IoT 總管中的多個元件裝置

您也可以使用 Azure IoT 總管工具,在這兩個控溫器元件的其中之一或是預設元件中呼叫命令。

本教學課程說明如何建置具有元件的範例 IoT 隨插即用裝置應用程式、將其連線至您的 IoT 中樞,並使用 Azure IoT 總管工具來檢視其傳送至中樞的資訊。 範例應用程式是以 Java 撰寫的,並隨附於適用於 Java 的 Azure IoT 裝置 SDK 中。 解決方案建置人員可以使用 Azure IoT 總管工具來了解 IoT 隨插即用裝置的功能,而不需檢視任何裝置程式碼。

瀏覽程式碼

在本教學課程中,您已:

  • 下載範例程式碼。
  • 建置範例程式碼。
  • 執行範例裝置應用程式,並驗證其是否連線到您的 IoT 中樞。
  • 檢閱原始程式碼。

必要條件

在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。

您可以在 Linux 或 Windows 上執行本教學課程。 本教學課程中的殼層命令會遵循路徑分隔符號 '/' 的 Linux 慣例,如果您在 Windows 上遵循,請務必針對 '\' 交換這些分隔符號。

若要完成本教學課程,請在本機開發環境中安裝下列軟體:

下載程式碼

如果您已完成教學課程:將範例 IoT 隨插即用裝置應用程式連線至 IoT 中樞 (Java),您已經複製了存放庫。

在您選擇的目錄中開啟命令提示字元。 執行下列命令,將 Azure IoT Java SDK 和程式庫 GitHub 存放庫複製到下列位置:

git clone https://github.com/Azure/azure-iot-sdk-java.git

預期此作業需要幾分鐘的時間才能完成。

建置程式碼

在所複製 Java SDK 存放庫中,瀏覽至溫度控制器範例的根資料夾,並加以建置:

cd azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample
mvn clean package

執行裝置範例

設定您的環境中,您建立了四個環境變數,以將範例設定為使用裝置佈建服務 (DPS) 來連線到您的 IoT 中樞:

  • 值為 DPSIOTHUB_DEVICE_SECURITY_TYPE
  • 使用 DPS 識別碼範圍的 IOTHUB_DEVICE_DPS_ID_SCOPE
  • 使用值 my-pnp-deviceIOTHUB_DEVICE_DPS_DEVICE_ID
  • 使用註冊主要金鑰的 IOTHUB_DEVICE_DPS_DEVICE_KEY
  • 使用值 global.azure-devices-provisioning.netIOTHUB_DEVICE_DPS_ENDPOINT

若要執行範例應用程式,請瀏覽至 /device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample 資料夾,然後執行下列命令:

mvn exec:java -Dexec.mainClass="samples.com.microsoft.azure.sdk.iot.device.TemperatureController"

裝置現在已可接收命令和屬性更新,並已開始將遙測資料傳送至中樞。 完成後續步驟後,請讓範例保持執行狀態。

使用 Azure IoT 總管來驗證程式碼

當裝置用戶端範例啟動之後,請使用 Azure IoT 總管工具來驗證其是否正確運作。

  1. 開啟 Azure IoT 檔案總管。

  2. 在 [IoT 中樞] 頁面上,如果您尚未新增與 IoT 中樞的連線,請選取 [+ 新增連線]。 針對您先前建立的 IoT 中樞輸入連接字串,然後選取 [儲存]

  3. 在 [IoT 隨插即用設定] 頁面上,選取 [+ 新增] > [本機資料夾],然後選取您用來儲存模型檔案的本機 models 資料夾。

  4. 在 [IoT 中樞] 頁面上,按一下您想要使用的中樞名稱。 您將會看見已向 IoT 中樞註冊的裝置清單。

  5. 按一下您先前建立之裝置的裝置識別碼

  6. 左側功能表會顯示裝置可用的不同類型資訊。

  7. 選取 [IoT 隨插即用元件] 來檢視裝置的模型資訊。

  8. 您可以檢視裝置的不同元件。 預設元件和任何其他元件。 選取要使用的元件。

  9. 選取 [遙測] 頁面,然後選取 [啟動],以檢視裝置針對此元件傳送的遙測資料。

  10. 選取 [屬性 (唯讀)] 頁面,以檢視針對此元件回報的唯讀屬性。

  11. 選取 [屬性 (可寫入)] 頁面,檢視您可針對此元件更新的可寫入屬性。

  12. 名稱選取屬性、為其輸入新的值,然後選取 [更新需要的值]

  13. 若要看見新值顯示,請選取 [重新整理] 按鈕。

  14. 選取 [命令] 頁面,以檢視此元件的所有命令。

  15. 選取您想要測試的命令,並設定參數 (如果有的話)。 選取 [傳送命令],以便在裝置上呼叫命令。 在範例程式碼執行所在的命令提示字元視窗中,您可以看到您的裝置回應命令。

檢閱程式碼

這個範例會實作 IoT 隨插即用的溫度控制器裝置。 這個範例所實作的模型會使用多個元件溫度裝置的數字對應項定義語言 (DTDL) 模型檔案會定義裝置所實作的遙測、屬性和命令。

裝置程式碼會使用標準的 DeviceClient 類別連線到您的 IoT 中樞。 裝置會在連線要求中,傳送其實作之 DTDL 模型的模型識別碼。 傳送模型識別碼的裝置是 IoT 隨插即用裝置:

private static void initializeDeviceClient() throws URISyntaxException, IOException {
    ClientOptions options = new ClientOptions();
    options.setModelId(MODEL_ID);
    deviceClient = new DeviceClient(deviceConnectionString, protocol, options);

    deviceClient.registerConnectionStatusChangeCallback((status, statusChangeReason, throwable, callbackContext) -> {
        log.debug("Connection status change registered: status={}, reason={}", status, statusChangeReason);

        if (throwable != null) {
            log.debug("The connection status change was caused by the following Throwable: {}", throwable.getMessage());
            throwable.printStackTrace();
        }
    }, deviceClient);

    deviceClient.open();
}

模型識別碼會儲存於程式碼中,如下列程式碼片段所示:

private static final String MODEL_ID = "dtmi:com:example:Thermostat;1";

當裝置連線到您的 IoT 中樞之後,程式碼就會註冊命令處理常式。

deviceClient.subscribeToDeviceMethod(new MethodCallback(), null, new MethodIotHubEventCallback(), null);

針對這兩個控溫器元件上所需的屬性更新,有個別的處理常式:

deviceClient.startDeviceTwin(new TwinIotHubEventCallback(), null, new GenericPropertyUpdateCallback(), null);
Map<Property, Pair<TwinPropertyCallBack, Object>> desiredPropertyUpdateCallback = Stream.of(
        new AbstractMap.SimpleEntry<Property, Pair<TwinPropertyCallBack, Object>>(
                new Property(THERMOSTAT_1, null),
                new Pair<>(new TargetTemperatureUpdateCallback(), THERMOSTAT_1)),
        new AbstractMap.SimpleEntry<Property, Pair<TwinPropertyCallBack, Object>>(
                new Property(THERMOSTAT_2, null),
                new Pair<>(new TargetTemperatureUpdateCallback(), THERMOSTAT_2))
).collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue));

deviceClient.subscribeToTwinDesiredProperties(desiredPropertyUpdateCallback);

範例程式碼會從每個控溫器元件傳送遙測:

sendTemperatureReading(THERMOSTAT_1);
sendTemperatureReading(THERMOSTAT_2);

sendTemperatureReading 方法會使用 PnpHhelper 類別來建立每個元件的訊息:

Message message = PnpHelper.createIotHubMessageUtf8(telemetryName, currentTemperature, componentName);

PnpHelper 類別包含可以搭配多個元件模型使用的其他範例方法。

使用 Azure IoT 總管工具,檢視來自這兩個控溫器元件的遙測和屬性:

Azure IoT 總管中的多個元件裝置

您也可以使用 Azure IoT 總管工具,在這兩個控溫器元件的其中之一或是預設元件中呼叫命令。

本教學課程說明如何建置具有元件的範例 IoT 隨插即用裝置應用程式、將其連線至您的 IoT 中樞,並使用 Azure IoT 總管工具來檢視其傳送至中樞的資訊。 範例應用程式是專為 Node.js 所撰寫的,並且包含在適用於 Node.js 的 Azure IoT 中樞裝置 SDK 中。 解決方案建置人員可以使用 Azure IoT 總管工具來了解 IoT 隨插即用裝置的功能,而不需檢視任何裝置程式碼。

瀏覽程式碼

在本教學課程中,您已:

  • 下載範例程式碼。
  • 執行範例裝置應用程式,並驗證其是否連線到您的 IoT 中樞。
  • 檢閱原始程式碼。

必要條件

在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。

若要完成本教學課程,您的開發電腦上必須要有 Node.js。 您可以從 nodejs.org 下載多個平台的最新建議版本。

您可以使用下列命令,以確認開發電腦上目前的 Node.js 版本:

node --version

下載程式碼

如果您已完成教學課程:將在 Windows 上執行的範例 IoT 隨插即用裝置應用程式連線至 IoT 中樞 (Node),您已經複製了存放庫。

在您選擇的目錄中開啟命令提示字元。 執行下列命令,將適用於 Node.js 的 Microsoft Azure IoT SDK GitHub 存放庫複製到下列位置:

git clone https://github.com/Azure/azure-iot-sdk-node

安裝必要的程式庫

您可以使用裝置 SDK 建置包含的範例程式碼。 您所建置的應用程式會模擬具有多個元件且連線至 IoT 中樞的隨插即用裝置。 應用程式會傳送遙測資料和屬性,並接收命令。

  1. 在本機終端機視窗中,移至您複製的存放庫資料夾,然後瀏覽至 /azure-iot-sdk-node/device/samples/javascript 資料夾。 然後執行下列命令來安裝必要的程式庫:
npm install

此命令會安裝要在資料夾中執行範例所需的相關 npm 檔案。

檢閱程式碼

瀏覽至 azure-iot-sdk-node/device/samples/javascript 資料夾。

azure-iot-sdk-node/device/samples/javascript 資料夾包含 IoT 隨插即用溫度控制器裝置的範例程式碼。

pnp_temperature_controller.js 檔案中的程式碼會實作 IoT 隨插即用溫度控制器裝置。 這個範例所實作的模型會使用多個元件溫度裝置的數字對應項定義語言 (DTDL) 模型檔案會定義裝置所實作的遙測、屬性和命令。

在您選擇的程式碼編輯器中開啟 pnp_temperature_controller.js 檔案。 範例程式碼會顯示如何:

  • 定義 modelId,這是您所要實作裝置的 DTMI。 此 DTMI 是使用者定義的,而且必須符合溫度控制器 DTDL 模型的 DTMI。

  • 實作在溫度控制器 DTDL 模型中定義的元件。 實際溫度控制器中的元件應該會執行這兩個介面。 這兩個介面已在中央存放庫中發佈。 在此範例中,這兩個介面分別是:

    • 控溫器
    • Azure 所開發的裝置資訊
  • 定義元件名稱。 這個範例有兩個恒溫器和一個裝置資訊元件。

  • 定義裝置所回應命令的命令名稱。

  • 定義 serialNumber 常數。 serialNumber 是固定的任何指定裝置。

  • 定義命令處理常式。

  • 定義用來傳送命令回應的函式。

  • 定義協助程式函式來記錄命令要求。

  • 定義協助程式函式來建立屬性。

  • 定義用於屬性更新的接聽程式。

  • 定義從這個裝置傳送遙測的函式。 恒溫器和預設元件都會傳送遙測。 此函式會接收元件名稱來作為參數。

  • 定義 main 函式,此函式會:

    • 使用裝置 SDK 來建立裝置用戶端,並連線到您的 IoT 中樞。 裝置會提供 modelId,讓 IoT 中樞可將裝置識別為 IoT 隨插即用裝置。

    • 使用 onDeviceMethod 函式開始接聽命令要求。 此函式會針對來自服務的命令要求設定接聽程式:

      • 裝置 DTDL 會定義 rebootgetMaxMinReport 命令。
      • commandHandler 函式會定義裝置如何回應命令。
    • 使用 setIntervalsendTelemetry 來開始傳送遙測。

    • 使用 helperCreateReportedPropertiesPatch 函式來建立屬性,使用 updateComponentReportedProperties 來更新屬性。

    • 使用 desiredPropertyPatchListener 來接聽屬性更新。

    • 在您按下 Qq 時停用所有接聽程式和工作,並結束迴圈。

設定您的環境中,您建立了四個環境變數,以將範例設定為使用裝置佈建服務 (DPS) 來連線到您的 IoT 中樞:

  • 值為 DPSIOTHUB_DEVICE_SECURITY_TYPE
  • 使用 DPS 識別碼範圍的 IOTHUB_DEVICE_DPS_ID_SCOPE
  • 使用值 my-pnp-deviceIOTHUB_DEVICE_DPS_DEVICE_ID
  • 使用註冊主要金鑰的 IOTHUB_DEVICE_DPS_DEVICE_KEY
  • 使用值 global.azure-devices-provisioning.netIOTHUB_DEVICE_DPS_ENDPOINT

若要深入了解範例設定,請參閱範例讀我檔案

現在您已看過程式碼,請使用下列命令來執行範例:

node pnp_temperature_controller.js

您會看到下列輸出,這表示裝置已開始將遙測資料傳送至中樞,且已可接收命令和屬性更新。

裝置確認訊息

完成後續步驟後,請讓範例保持執行狀態。

使用 Azure IoT 總管來驗證程式碼

當裝置用戶端範例啟動之後,請使用 Azure IoT 總管工具來驗證其是否正確運作。

  1. 開啟 Azure IoT 檔案總管。

  2. 在 [IoT 中樞] 頁面上,如果您尚未新增與 IoT 中樞的連線,請選取 [+ 新增連線]。 針對您先前建立的 IoT 中樞輸入連接字串,然後選取 [儲存]

  3. 在 [IoT 隨插即用設定] 頁面上,選取 [+ 新增] > [本機資料夾],然後選取您用來儲存模型檔案的本機 models 資料夾。

  4. 在 [IoT 中樞] 頁面上,按一下您想要使用的中樞名稱。 您將會看見已向 IoT 中樞註冊的裝置清單。

  5. 按一下您先前建立之裝置的裝置識別碼

  6. 左側功能表會顯示裝置可用的不同類型資訊。

  7. 選取 [IoT 隨插即用元件] 來檢視裝置的模型資訊。

  8. 您可以檢視裝置的不同元件。 預設元件和任何其他元件。 選取要使用的元件。

  9. 選取 [遙測] 頁面,然後選取 [啟動],以檢視裝置針對此元件傳送的遙測資料。

  10. 選取 [屬性 (唯讀)] 頁面,以檢視針對此元件回報的唯讀屬性。

  11. 選取 [屬性 (可寫入)] 頁面,檢視您可針對此元件更新的可寫入屬性。

  12. 名稱選取屬性、為其輸入新的值,然後選取 [更新需要的值]

  13. 若要看見新值顯示,請選取 [重新整理] 按鈕。

  14. 選取 [命令] 頁面,以檢視此元件的所有命令。

  15. 選取您想要測試的命令,並設定參數 (如果有的話)。 選取 [傳送命令],以便在裝置上呼叫命令。 在範例程式碼執行所在的命令提示字元視窗中,您可以看到您的裝置回應命令。

本教學課程說明如何建置具有元件的範例 IoT 隨插即用裝置應用程式、將其連線至您的 IoT 中樞,並使用 Azure IoT 總管工具來檢視其傳送至中樞的資訊。 範例應用程式是以 Python 撰寫的,並隨附於適用於 Python 的 Azure IoT 裝置 SDK 中。 解決方案建置人員可以使用 Azure IoT 總管工具來了解 IoT 隨插即用裝置的功能,而不需檢視任何裝置程式碼。

瀏覽程式碼

在本教學課程中,您已:

  • 下載範例程式碼。
  • 執行範例裝置應用程式,並驗證其是否連線到您的 IoT 中樞。
  • 檢閱原始程式碼。

必要條件

在繼續之前,請確定您已設定環境,包括您的 IoT 中樞。

您可以在 Linux 或 Windows 上執行本教學課程。 本教學課程中的殼層命令會遵循路徑分隔符號 '/' 的 Linux 慣例,如果您在 Windows 上遵循,請務必針對 '\' 交換這些分隔符號。

若要完成本教學課程,您必須在您的開發機器上安裝 Python。 如需目前的 Python 版本需求,請查看 Azure IoT Python SDK (英文)。 您可以使用下列命令來檢查 Python 版本:

python --version

您可以從 python.org \(英文\) 下載適用於多個平台的最新建議版本。

下載程式碼

azure-iot-device 套件會發佈為 PIP。

在您的本機 Python 環境中安裝套件,如下所示:

pip install azure-iot-device

如果您已完成教學課程:將在 Windows 上執行的範例 IoT 隨插即用裝置應用程式連線至 IoT 中樞 (Python),您已經複製了存放庫。

複製 Python SDK IoT 存放庫:

git clone --branch v2 https://github.com/Azure/azure-iot-sdk-python

檢閱程式碼

這個範例會實作 IoT 隨插即用的溫度控制器裝置。 這個範例所實作的模型會使用多個元件溫度裝置的數字對應項定義語言 (DTDL) 模型檔案會定義裝置所實作的遙測、屬性和命令。

azure-iot-sdk-python/samples/pnp 資料夾包含適用於 IoT 隨插即用裝置的範例程式碼。 適用於溫度控制器範例的檔案包括:

  • temp_controller_with_thermostats.py
  • pnp_helper.py

溫度控制器具有多個元件和一個預設元件,以溫度控制器 DTDL 模型為基礎。

在您選擇的編輯器中,開啟 temp_controller_with_thermostats.py 檔案。 此檔案中的程式碼:

  1. 匯入 pnp_helper.py 以取得協助程式方法的存取權。

  2. 定義兩個 Digital Twins 模型識別碼 (DTMI),其能唯一代表 DTDL 模型中所定義的兩個不同介面。 實際溫度控制器中的元件應該要實作這兩個介面。 這兩個介面已在中央存放庫中發佈。 使用者必須知道這些 DTMI,且這些介面也會取決於裝置實作的案例。 針對目前的範例,這兩個介面代表:

    • 控溫器
    • Azure 所開發的裝置資訊。
  3. 定義正在實作之裝置的 DTMI model_id。 DTMI 是使用者定義的,而且必須符合 DTDL 模型檔案中的 DTMI。

  4. 定義提供給 DTDL 檔案中元件的名稱。 DTDL 中有兩個控溫器和一個裝置資訊元件。 預設元件中也定義了名為 serial_number 的常數。 無法變更裝置的 serial_number

  5. 定義命令處理常式實作。 這些處理常式會定義裝置接收到命令要求時的行為。

  6. 定義函式以建立命令回應。 這些函式會定義裝置如何回應命令要求。 如果命令需要將自訂回應傳送回 IoT 中樞,您會建立命令回應函式。 如果未提供命令的回應函式,則會傳送一般回應。 在此範例中,只有 getMaxMinReport 命令具有自訂回應。

  7. 定義函式以從此裝置傳送遙測。 恒溫器和預設元件都會傳送遙測。 此函式具有選擇性元件名稱參數,讓其能夠識別傳送遙測的元件。

  8. 定義命令要求的接聽程式。

  9. 定義所需屬性更新的接聽程式。

  10. 具有 main 函式,其能夠:

    • 使用裝置 SDK 來建立裝置用戶端,並連線到您的 IoT 中樞。 裝置會傳送 model_id,讓 IoT 中樞可以將裝置識別為 IoT 隨插即用裝置。

    • 使用協助程式檔案中的 create_reported_properties 函式來建立屬性。 將元件名稱和屬性當作索引鍵值組傳遞至此函式。

    • 呼叫 patch_twin_reported_properties 來更新其元件的可讀取屬性。

    • 使用 execute_command_listener 函式開始接聽命令要求。 此函式會針對來自服務的命令要求設定接聽程式。 當您設定接聽程式時,您會提供 method_nameuser_command_handler 和選擇性的 create_user_response_handler 做為參數。

      • method_name 會定義命令要求。 在此範例中,模型會定義命令 rebootgetMaxMinReport
      • user_command_handler 函式會定義裝置收到命令時應執行的動作。
      • create_user_response_handler 函式會建立要在命令成功執行時傳送至 IoT 中樞的回應。 您可以在入口網站中檢視此回應。 如果未提供此函式,則會將一般回應傳送至服務。
    • 使用 execute_property_listener 來接聽屬性更新。

    • 使用 send_telemetry 開始傳送遙測。 範例程式碼會使用迴圈來呼叫三個遙測傳送函式。 每隔八秒便會呼叫一個

    • 在您按下 Qq 時停用所有接聽程式和工作,並結束迴圈。

設定您的環境中,您建立了四個環境變數,以將範例設定為使用裝置佈建服務 (DPS) 來連線到您的 IoT 中樞:

  • 值為 DPSIOTHUB_DEVICE_SECURITY_TYPE
  • 使用 DPS 識別碼範圍的 IOTHUB_DEVICE_DPS_ID_SCOPE
  • 使用值 my-pnp-deviceIOTHUB_DEVICE_DPS_DEVICE_ID
  • 使用註冊主要金鑰的 IOTHUB_DEVICE_DPS_DEVICE_KEY
  • 使用值 global.azure-devices-provisioning.netIOTHUB_DEVICE_DPS_ENDPOINT

若要深入了解範例設定,請參閱範例讀我檔案

請使用下列命令執行此範例:

python temp_controller_with_thermostats.py

範例裝置每隔幾秒就會將遙測訊息傳送到您的 IoT 中樞。

您會看到下列輸出,這表示裝置正在將遙測資料傳送至中樞,且現在已可接收命令和屬性更新。

裝置確認訊息

完成後續步驟後,請讓範例保持執行狀態。

使用 Azure IoT 總管來驗證程式碼

當裝置用戶端範例啟動之後,請使用 Azure IoT 總管工具來驗證其是否正確運作。

  1. 開啟 Azure IoT 檔案總管。

  2. 在 [IoT 中樞] 頁面上,如果您尚未新增與 IoT 中樞的連線,請選取 [+ 新增連線]。 針對您先前建立的 IoT 中樞輸入連接字串,然後選取 [儲存]

  3. 在 [IoT 隨插即用設定] 頁面上,選取 [+ 新增] > [本機資料夾],然後選取您用來儲存模型檔案的本機 models 資料夾。

  4. 在 [IoT 中樞] 頁面上,按一下您想要使用的中樞名稱。 您將會看見已向 IoT 中樞註冊的裝置清單。

  5. 按一下您先前建立之裝置的裝置識別碼

  6. 左側功能表會顯示裝置可用的不同類型資訊。

  7. 選取 [IoT 隨插即用元件] 來檢視裝置的模型資訊。

  8. 您可以檢視裝置的不同元件。 預設元件和任何其他元件。 選取要使用的元件。

  9. 選取 [遙測] 頁面,然後選取 [啟動],以檢視裝置針對此元件傳送的遙測資料。

  10. 選取 [屬性 (唯讀)] 頁面,以檢視針對此元件回報的唯讀屬性。

  11. 選取 [屬性 (可寫入)] 頁面,檢視您可針對此元件更新的可寫入屬性。

  12. 名稱選取屬性、為其輸入新的值,然後選取 [更新需要的值]

  13. 若要看見新值顯示,請選取 [重新整理] 按鈕。

  14. 選取 [命令] 頁面,以檢視此元件的所有命令。

  15. 選取您想要測試的命令,並設定參數 (如果有的話)。 選取 [傳送命令],以便在裝置上呼叫命令。 在範例程式碼執行所在的命令提示字元視窗中,您可以看到您的裝置回應命令。

清除資源

如果您打算繼續閱讀更多裝置開發人員文章,您可以保留並重複使用本文中所用的資源。 否則,您可以刪除在此文章中建立的資源,以避免產生更多費用。

您可以藉由使用下列 Azure CLI 命令刪除整個資源群組,同時刪除中樞和已註冊的裝置。 如果這些資源與您想要保留的其他資源共用同一個資源群組,請不要使用此命令。

az group delete --name <YourResourceGroupName>

若只要刪除 IoT 中樞,請使用 Azure CLI 執行下列命令:

az iot hub delete --name <YourIoTHubName>

若只要刪除您向 IoT 中樞註冊的裝置身分識別,請使用 Azure CLI 執行下列命令:

az iot hub device-identity delete --hub-name <YourIoTHubName> --device-id <YourDeviceID>

您也可以從開發電腦移除複製的範例檔案。

下一步

在此教學課程中,您已了解如何將具有元件的 IoT 隨插即用裝置連線至 IoT 中樞。 若要深入了解 IoT 隨插即用裝置模型,請參閱: