Dela via


Självstudie: Ansluta en IoT Plug and Play-enhet för flera komponenter som körs i Linux eller Windows till IoT Hub

Den här självstudien visar hur du skapar ett exempelprogram för IoT Plug and Play-enheter med komponenter, ansluter det till din IoT-hubb och använder verktyget Azure IoT Explorer för att visa den information som skickas till hubben. Exempelprogrammet är skrivet i C och ingår i Azure IoT-enhets-SDK för C. En lösningsbyggare kan använda Verktyget Azure IoT Explorer för att förstå funktionerna i en IoT Plug and Play-enhet utan att behöva visa någon enhetskod.

Sökkod

I den här kursen får du:

  • Ladda ned exempelkoden.
  • Skapa exempelkoden.
  • Kör exempelprogrammet för enheten och verifiera att det ansluter till din IoT-hubb.
  • Granska källkoden.

Förutsättningar

Innan du fortsätter kontrollerar du att du har konfigurerat din miljö, inklusive din IoT-hubb.

Du kan slutföra den här självstudien i Linux eller Windows. Shell-kommandona i den här självstudien följer Linux-konventionen för sökvägsavgränsare ,/ om du följer med i Windows måste du växla dessa avgränsare mot "\".

Förutsättningarna skiljer sig åt beroende på operativsystem:

Linux

Den här självstudien förutsätter att du använder Ubuntu Linux. Stegen i den här självstudien har testats med Ubuntu 18.04.

Slutför den här självstudien om Linux genom att installera följande programvara i din lokala Linux-miljö:

Installera GCC, Git, cmake och alla nödvändiga beroenden apt-get med kommandot :

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

Kontrollera att versionen av cmake är över 2.8.12 och att versionen av GCC är över 4.4.7.

cmake --version
gcc --version

Windows

Slutför den här självstudien i Windows genom att installera följande programvara i din lokala Windows-miljö:

Ladda ned koden

Om du har slutfört självstudien : Anslut ett exempelprogram för IoT Plug and Play-enheter som körs på Linux eller Windows till IoT Hub (C) har du redan laddat ned koden.

I den här självstudien förbereder du en utvecklingsmiljö som du kan använda för att klona och skapa Azure IoT Hub Device C SDK.

Öppna en kommandotolk i valfri mapp. Kör följande kommando för att klona GitHub-lagringsplatsen azure IoT C SDK:er och bibliotek till den här platsen:

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

Förvänta dig att den här åtgärden tar flera minuter att slutföra.

Skapa och kör koden

Du kan skapa och köra koden med hjälp av Visual Studio eller cmake på kommandoraden.

Använda Visual Studio

  1. Öppna rotmappen för den klonade lagringsplatsen. Efter ett par sekunder skapar CMake-stödet i Visual Studio allt du behöver för att köra och felsöka projektet.

  2. När Visual Studio är klart går du till Solution Explorer och går till exempel iothub_client/samples/pnp/pnp_temperature_controller/.

  3. Högerklicka på filen pnp_temperature_controller.c och välj Lägg till felsökningskonfiguration. Välj Standard.

  4. Visual Studio öppnar filen launch.vs.json . Redigera den här filen enligt följande kodfragment för att ange de miljövariabler som krävs. Du antecknade primärnyckeln för omfångs-ID och registrering när du slutförde konfigurationen av din miljö för snabbstarter och självstudier för IoT Plug and Play:

    {
      "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. Högerklicka på filen pnp_temperature_controller.c och välj Ange som startobjekt.

  6. Om du vill spåra kodkörningen i Visual Studio lägger du till main en brytpunkt i funktionen i filen pnp_temperature_controller.c .

  7. Nu kan du köra och felsöka exemplet från felsökningsmenyn.

Enheten är nu redo att ta emot kommandon och egenskapsuppdateringar och har börjat skicka telemetridata till hubben. Se till att exemplet körs när du slutför nästa steg.

Använd cmake på kommandoraden

Så här skapar du exemplet:

  1. Skapa en cmake-undermapp i rotmappen för den klonade enhets-SDK:n och navigera till den mappen:

    cd azure-iot-sdk-c
    mkdir cmake
    cd cmake
    
  2. Kör följande kommandon för att generera och skapa projektfilerna för SDK och exempel:

    cmake ..
    cmake --build .
    

I Konfigurera din miljö skapade du fyra miljövariabler för att konfigurera exemplet för att använda Device Provisioning Service (DPS) för att ansluta till din IoT-hubb:

  • IOTHUB_DEVICE_SECURITY_TYPE med värdetDPS
  • IOTHUB_DEVICE_DPS_ID_SCOPE med DPS-ID-omfånget.
  • IOTHUB_DEVICE_DPS_DEVICE_ID med värdet my-pnp-device.
  • IOTHUB_DEVICE_DPS_DEVICE_KEY med den primära registreringsnyckeln.
  • IOTHUB_DEVICE_DPS_ENDPOINT med värdet global.azure-devices-provisioning.net.

Mer information om exempelkonfigurationen finns i exempelläsningen.

Så här kör du exemplet:

  1. Från mappen cmake navigerar du till mappen som innehåller den körbara filen och kör den:

    # 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
    

Enheten är nu redo att ta emot kommandon och egenskapsuppdateringar och har börjat skicka telemetridata till hubben. Se till att exemplet körs när du slutför nästa steg.

Använd Azure IoT Explorer för att verifiera koden

När enhetsklientexemplet har startat använder du Azure IoT Explorer-verktyget för att kontrollera att det fungerar.

  1. Öppna Azure IoT Explorer.

  2. Om du inte redan har lagt till en anslutning till din IoT-hubb på sidan IoT-hubbar väljer du + Lägg till anslutning. Ange anslutningssträng för den IoT-hubb som du skapade tidigare och välj Spara.

  3. På sidan Inställningar för IoT Plug and Play väljer du + Lägg till > lokal mapp och väljer mappen lokala modeller där du sparade dina modellfiler.

  4. På sidan IoT-hubbar klickar du på namnet på den hubb som du vill arbeta med. Du ser en lista över enheter som är registrerade på IoT-hubben.

  5. Klicka på Enhets-ID för den enhet som du skapade tidigare.

  6. Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.

  7. Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.

  8. Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.

  9. Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.

  10. Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.

  11. Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.

  12. Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.

  13. Om du vill se det nya värdet väljer du knappen Uppdatera .

  14. Välj sidan Kommandon för att visa alla kommandon för den här komponenten.

  15. Välj det kommando som du vill testa för att ange parametern om det finns någon. Välj Skicka kommando för att anropa kommandot på enheten. Du kan se att enheten svarar på kommandot i kommandotolken där exempelkoden körs.

Granska koden

Det här exemplet implementerar en IoT Plug and Play-temperaturstyrenhet. Det här exemplet implementerar en modell med flera komponenter. DTDL-modellfilen (Digital Twins Definition Language) för temperaturenheten definierar telemetri, egenskaper och kommandon som enheten implementerar.

Hjälpfunktioner för IoT Plug and Play

I det här exemplet använder koden några hjälpfunktioner från mappen /common :

pnp_device_client_ll innehåller connect-metoden för IoT Plug and Play med den model-id inkluderade som parameter: PnP_CreateDeviceClientLLHandle.

pnp_protocol: innehåller hjälpfunktionerna IoT Plug and Play:

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

Dessa hjälpfunktioner är tillräckligt generiska för att användas i ditt eget projekt. Det här exemplet använder dem i de tre filer som motsvarar varje komponent i modellen:

  • pnp_deviceinfo_component
  • pnp_temperature_controller
  • pnp_thermostat_component

I filen pnp_deviceinfo_component SendReportedPropertyForDeviceInformation använder funktionen till exempel två av hjälpfunktionerna:

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);
    }
}

Varje komponent i exemplet följer det här mönstret.

Kodflöde

Funktionen main initierar anslutningen och skickar modell-ID:t:

deviceClient = CreateDeviceClientAndAllocateComponents();

Koden använder PnP_CreateDeviceClientLLHandle för att ansluta till IoT-hubben, ange modelId som ett alternativ och konfigurera enhetsmetoden och enhetstvillingens motringningshanterare för direktmetoder och uppdateringar av enhetstvillingar:

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

deviceClient = PnP_CreateDeviceClientLLHandle(&g_pnpDeviceConfiguration);

&g_pnpDeviceConfiguration innehåller också anslutningsinformationen. Miljövariabeln IOTHUB_DEVICE_SECURITY_TYPE avgör om exemplet använder en anslutningssträng eller enhetsetableringstjänsten för att ansluta till IoT-hubben.

När enheten skickar ett modell-ID blir det en IoT Plug and Play-enhet.

Med motringningshanterare på plats reagerar enheten på tvillinguppdateringar och direkta metodanrop:

  • För återanrop till enhetstvillingen PnP_TempControlComponent_DeviceTwinCallback anropas PnP_ProcessTwinData funktionen för att bearbeta data. PnP_ProcessTwinDataanvänder besöksmönstret för att parsa JSON och sedan besöka varje egenskap och anropa PnP_TempControlComponent_ApplicationPropertyCallback varje element.

  • För återanropet PnP_TempControlComponent_DeviceMethodCallback av kommandon använder funktionen hjälpfunktionen för att parsa kommando- och komponentnamnen:

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

    Funktionen PnP_TempControlComponent_DeviceMethodCallback anropar sedan kommandot på komponenten:

    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;
    }
    

Funktionen main initierar skrivskyddade egenskaper som skickas till IoT-hubben:

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);

Funktionen main anger en loop för att uppdatera händelse- och telemetridata för varje komponent:

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

Funktionen PnP_ThermostatComponent_SendTelemetry visar hur du använder structen PNP_THERMOSTAT_COMPONENT . Exemplet använder den här structen för att lagra information om de två termostaterna i temperaturstyrenheten. Koden använder PnP_CreateTelemetryMessageHandle funktionen för att förbereda meddelandet och skicka det:

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

Funktionen main förstör slutligen de olika komponenterna och stänger anslutningen till hubben.

Den här självstudien visar hur du skapar ett exempelprogram för IoT Plug and Play-enheter med komponenter, ansluter det till din IoT-hubb och använder verktyget Azure IoT Explorer för att visa den information som skickas till hubben. Exempelprogrammet är skrivet i C# och ingår i Azure IoT-enhetens SDK för C#. En lösningsbyggare kan använda Verktyget Azure IoT Explorer för att förstå funktionerna i en IoT Plug and Play-enhet utan att behöva visa någon enhetskod.

Sökkod

I den här kursen får du:

  • Ladda ned exempelkoden.
  • Skapa exempelkoden.
  • Kör exempelprogrammet för enheten och verifiera att det ansluter till din IoT-hubb.
  • Granska källkoden.

Förutsättningar

Innan du fortsätter kontrollerar du att du har konfigurerat din miljö, inklusive din IoT-hubb.

Du kan köra den här självstudien i Linux eller Windows. Shell-kommandona i den här självstudien följer Linux-konventionen för sökvägsavgränsare ,/ om du följer med i Windows måste du växla dessa avgränsare mot "\".

Klona SDK-lagringsplatsen med exempelkoden

Om du har slutfört Självstudie: Anslut ett exempelprogram för IoT Plug and Play-enheter som körs i Windows till IoT Hub (C#) har du redan klonat lagringsplatsen.

Klona exemplen från Azure IoT-exempel för C# GitHub-lagringsplatsen. Öppna en kommandotolk i valfri mapp. Kör följande kommando för att klona Microsoft Azure IoT SDK för .NET GitHub-lagringsplatsen:

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

Skapa koden

Nu kan du skapa exemplet och köra det. Kör följande kommandon för att skapa exemplet:

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

Kör enhetsexemplet

Kör följande kommando för att köra exemplet:

dotnet run

Enheten är nu redo att ta emot kommandon och egenskapsuppdateringar och har börjat skicka telemetridata till hubben. Se till att exemplet körs när du slutför nästa steg.

Använda Azure IoT Explorer för att verifiera koden

När enhetsklientexemplet har startat använder du Azure IoT Explorer-verktyget för att kontrollera att det fungerar.

  1. Öppna Azure IoT Explorer.

  2. Om du inte redan har lagt till en anslutning till din IoT-hubb på sidan IoT-hubbar väljer du + Lägg till anslutning. Ange anslutningssträng för den IoT-hubb som du skapade tidigare och välj Spara.

  3. På sidan Inställningar för IoT Plug and Play väljer du + Lägg till > lokal mapp och väljer mappen lokala modeller där du sparade dina modellfiler.

  4. På sidan IoT-hubbar klickar du på namnet på den hubb som du vill arbeta med. Du ser en lista över enheter som är registrerade på IoT-hubben.

  5. Klicka på Enhets-ID för den enhet som du skapade tidigare.

  6. Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.

  7. Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.

  8. Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.

  9. Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.

  10. Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.

  11. Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.

  12. Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.

  13. Om du vill se det nya värdet väljer du knappen Uppdatera .

  14. Välj sidan Kommandon för att visa alla kommandon för den här komponenten.

  15. Välj det kommando som du vill testa för att ange parametern om det finns någon. Välj Skicka kommando för att anropa kommandot på enheten. Du kan se att enheten svarar på kommandot i kommandotolken där exempelkoden körs.

Granska koden

Det här exemplet implementerar en IoT Plug and Play-temperaturstyrenhet. Modellen som det här exemplet implementerar använder flera komponenter. DTDL-modellfilen (Digital Twins Definition Language) för temperaturenheten definierar telemetri, egenskaper och kommandon som enheten implementerar.

Enhetskoden ansluter till din IoT-hubb med standardmetoden CreateFromConnectionString . Enheten skickar modell-ID:t för den DTDL-modell som den implementerar i anslutningsbegäran. En enhet som skickar ett modell-ID är en IoT Plug and Play-enhet:

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;
}

Modell-ID:t lagras i koden enligt följande kodfragment:

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

När enheten har anslutit till din IoT-hubb registrerar koden kommandohanterarna. Kommandot reboot definieras i standardkomponenten. Kommandot getMaxMinReport definieras i var och en av de två termostatkomponenterna:

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

Det finns separata hanterare för önskade egenskapsuppdateringar för de två termostatkomponenterna:

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

Exempelkoden skickar telemetri från varje termostatkomponent:

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

Metoden SendTemperatureTelemetryAsync använder PnpHhelper klassen för att skapa meddelanden för varje komponent:

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

Klassen PnpHelper innehåller andra exempelmetoder som du kan använda med en modell med flera komponenter.

Använd verktyget Azure IoT Explorer för att visa telemetrin och egenskaperna från de två termostatkomponenterna:

Flera komponentenheter i Azure IoT Explorer

Du kan också använda Azure IoT Explorer-verktyget för att anropa kommandon i någon av de två termostatkomponenterna eller i standardkomponenten.

Den här självstudien visar hur du skapar ett exempelprogram för IoT Plug and Play-enheter med komponenter, ansluter det till din IoT-hubb och använder verktyget Azure IoT Explorer för att visa den information som skickas till hubben. Exempelprogrammet är skrivet i Java och ingår i Azure IoT-enhetens SDK för Java. En lösningsbyggare kan använda Verktyget Azure IoT Explorer för att förstå funktionerna i en IoT Plug and Play-enhet utan att behöva visa någon enhetskod.

Sökkod

I den här kursen får du:

  • Ladda ned exempelkoden.
  • Skapa exempelkoden.
  • Kör exempelprogrammet för enheten och verifiera att det ansluter till din IoT-hubb.
  • Granska källkoden.

Förutsättningar

Innan du fortsätter kontrollerar du att du har konfigurerat din miljö, inklusive din IoT-hubb.

Du kan köra den här självstudien i Linux eller Windows. Shell-kommandona i den här självstudien följer Linux-konventionen för sökvägsavgränsare ,/ om du följer med i Windows måste du växla dessa avgränsare mot "\".

Slutför den här självstudien genom att installera följande programvara i din lokala utvecklingsmiljö:

Ladda ned koden

Om du har slutfört självstudien: Anslut ett exempelprogram för IoT Plug and Play-enheter till IoT Hub (Java) har du redan klonat lagringsplatsen.

Öppna en kommandotolk i valfri katalog. Kör följande kommando för att klona GitHub-lagringsplatsen Azure IoT Java SDK:er och bibliotek till den här platsen:

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

Förvänta dig att den här åtgärden tar flera minuter att slutföra.

Skapa koden

Gå till rotmappen för temperaturstyrenhetsexemplet i den klonade Java SDK-lagringsplatsen och skapa den:

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

Kör enhetsexemplet

I Konfigurera din miljö skapade du fyra miljövariabler för att konfigurera exemplet för att använda Device Provisioning Service (DPS) för att ansluta till din IoT-hubb:

  • IOTHUB_DEVICE_SECURITY_TYPE med värdetDPS
  • IOTHUB_DEVICE_DPS_ID_SCOPE med DPS-ID-omfånget.
  • IOTHUB_DEVICE_DPS_DEVICE_ID med värdet my-pnp-device.
  • IOTHUB_DEVICE_DPS_DEVICE_KEY med den primära registreringsnyckeln.
  • IOTHUB_DEVICE_DPS_ENDPOINT med värdet global.azure-devices-provisioning.net.

Om du vill köra exempelprogrammet går du till mappen /device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample och kör följande kommando:

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

Enheten är nu redo att ta emot kommandon och egenskapsuppdateringar och har börjat skicka telemetridata till hubben. Se till att exemplet körs när du slutför nästa steg.

Använda Azure IoT Explorer för att verifiera koden

När enhetsklientexemplet har startat använder du Azure IoT Explorer-verktyget för att kontrollera att det fungerar.

  1. Öppna Azure IoT Explorer.

  2. Om du inte redan har lagt till en anslutning till din IoT-hubb på sidan IoT-hubbar väljer du + Lägg till anslutning. Ange anslutningssträng för den IoT-hubb som du skapade tidigare och välj Spara.

  3. På sidan Inställningar för IoT Plug and Play väljer du + Lägg till > lokal mapp och väljer mappen lokala modeller där du sparade dina modellfiler.

  4. På sidan IoT-hubbar klickar du på namnet på den hubb som du vill arbeta med. Du ser en lista över enheter som är registrerade på IoT-hubben.

  5. Klicka på Enhets-ID för den enhet som du skapade tidigare.

  6. Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.

  7. Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.

  8. Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.

  9. Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.

  10. Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.

  11. Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.

  12. Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.

  13. Om du vill se det nya värdet väljer du knappen Uppdatera .

  14. Välj sidan Kommandon för att visa alla kommandon för den här komponenten.

  15. Välj det kommando som du vill testa för att ange parametern om det finns någon. Välj Skicka kommando för att anropa kommandot på enheten. Du kan se att enheten svarar på kommandot i kommandotolken där exempelkoden körs.

Granska koden

Det här exemplet implementerar en IoT Plug and Play-temperaturstyrenhet. Modellen som det här exemplet implementerar använder flera komponenter. DTDL-modellfilen (Digital Twins Definition Language) för temperaturenheten definierar telemetri, egenskaper och kommandon som enheten implementerar.

Enhetskoden använder standardklassen DeviceClient för att ansluta till din IoT-hubb. Enheten skickar modell-ID:t för den DTDL-modell som den implementerar i anslutningsbegäran. En enhet som skickar ett modell-ID är en IoT Plug and Play-enhet:

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();
}

Modell-ID:t lagras i koden enligt följande kodfragment:

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

När enheten har anslutit till din IoT-hubb registrerar koden kommandohanterarna.

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

Det finns separata hanterare för önskade egenskapsuppdateringar för de två termostatkomponenterna:

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);

Exempelkoden skickar telemetri från varje termostatkomponent:

sendTemperatureReading(THERMOSTAT_1);
sendTemperatureReading(THERMOSTAT_2);

Metoden sendTemperatureReading använder PnpHhelper klassen för att skapa meddelanden för varje komponent:

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

Klassen PnpHelper innehåller andra exempelmetoder som du kan använda med en modell med flera komponenter.

Använd verktyget Azure IoT Explorer för att visa telemetrin och egenskaperna från de två termostatkomponenterna:

Flera komponentenheter i Azure IoT Explorer

Du kan också använda Azure IoT Explorer-verktyget för att anropa kommandon i någon av de två termostatkomponenterna eller i standardkomponenten.

Den här självstudien visar hur du skapar ett exempelprogram för IoT Plug and Play-enheter med komponenter, ansluter det till din IoT-hubb och använder verktyget Azure IoT Explorer för att visa den information som skickas till hubben. Exempelprogrammet är skrivet för Node.js och ingår i Azure IoT Hub Device SDK för Node.js. En lösningsbyggare kan använda Verktyget Azure IoT Explorer för att förstå funktionerna i en IoT Plug and Play-enhet utan att behöva visa någon enhetskod.

Sökkod

I den här kursen får du:

  • Ladda ned exempelkoden.
  • Kör exempelprogrammet för enheten och verifiera att det ansluter till din IoT-hubb.
  • Granska källkoden.

Förutsättningar

Innan du fortsätter kontrollerar du att du har konfigurerat din miljö, inklusive din IoT-hubb.

För att slutföra den här självstudien behöver du Node.js på utvecklingsdatorn. Du kan ladda ned den senaste rekommenderade versionen för flera plattformar från nodejs.org.

Du kan kontrollera den aktuella versionen av Node.js på utvecklingsdatorn med följande kommando:

node --version

Ladda ned koden

Om du har slutfört Självstudie: Anslut ett exempelprogram för IoT Plug and Play-enheter som körs i Windows till IoT Hub (Node) har du redan klonat lagringsplatsen.

Öppna en kommandotolk i valfri katalog. Kör följande kommando för att klona Microsoft Azure IoT SDK för Node.js GitHub-lagringsplats till den här platsen:

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

Installera nödvändiga bibliotek

Du använder enhets-SDK:n för att skapa den inkluderade exempelkoden. Programmet du skapar simulerar en Plug and Play-enhet med flera komponenter som ansluter till en IoT-hubb. Programmet skickar telemetri och egenskaper och tar emot kommandon.

  1. I ett lokalt terminalfönster går du till mappen för den klonade lagringsplatsen och navigerar till mappen /azure-iot-sdk-node/device/samples/javascript . Kör sedan följande kommando för att installera de bibliotek som krävs:
npm install

Det här kommandot installerar relevanta npm-filer som krävs för att köra exemplen i mappen.

Granska koden

Gå till mappen azure-iot-sdk-node/device/samples/javascript .

Mappen azure-iot-sdk-node/device/samples/javascript innehåller exempelkoden för IoT Plug and Play-temperaturstyrenheten.

Koden i pnp_temperature_controller.js-filen implementerar en IoT Plug and Play-temperaturstyrenhetsenhet. Modellen som det här exemplet implementerar använder flera komponenter. DTDL-modellfilen (Digital Twins Definition Language) för temperaturenheten definierar telemetri, egenskaper och kommandon som enheten implementerar.

Öppna filen pnp_temperature_controller.js i valfri kodredigerare. Exempelkoden visar hur du:

  • modelId Definiera DTMI för den enhet som du implementerar. Denna DTMI är användardefinierad och måste matcha DTMI för temperaturstyrenhetens DTDL-modell.

  • Implementera komponenterna som definierats i temperaturstyrenhetens DTDL-modell. Komponenterna i en verklig temperaturkontrollant bör implementera dessa två gränssnitt. Dessa två gränssnitt har redan publicerats på en central lagringsplats. I det här exemplet är de två gränssnitten:

    • Termostat
    • Enhetsinformation som utvecklats av Azure
  • Definiera komponentnamn. Det här exemplet har två termostater och en komponent för enhetsinformation.

  • Definiera kommandonamn för de kommandon som enheten svarar på.

  • Definiera konstanten serialNumber . serialNumber Är fast alla givna enheter.

  • Definiera kommandohanterarna.

  • Definiera funktionerna för att skicka kommandosvar.

  • Definiera hjälpfunktioner för att logga kommandobegäranden.

  • Definiera en hjälpfunktion för att skapa egenskaperna.

  • Definiera en lyssnare för egenskapsuppdateringar.

  • Definiera en funktion för att skicka telemetri från den här enheten. Både termostater och standardkomponenten skickar telemetri. Den här funktionen tar emot komponentnamnet som parameter.

  • Definiera en main funktion som:

    • Använder enhetens SDK för att skapa en enhetsklient och ansluta till din IoT-hubb. Enheten tillhandahåller modelId så att IoT Hub kan identifiera enheten som en IoT Plug and Play-enhet.

    • Börjar lyssna efter kommandobegäranden med hjälp av onDeviceMethod funktionen. Funktionen konfigurerar en lyssnare för kommandobegäranden från tjänsten:

      • Enhetens DTDL definierar kommandona reboot och getMaxMinReport .
      • Funktionen commandHandler definierar hur enheten svarar på ett kommando.
    • Börjar skicka telemetri med hjälp setInterval av och sendTelemetry.

    • helperCreateReportedPropertiesPatch Använder funktionen för att skapa egenskaperna och updateComponentReportedProperties för att uppdatera egenskaperna.

    • Används desiredPropertyPatchListener för att lyssna efter egenskapsuppdateringar.

    • Inaktiverar alla lyssnare och uppgifter och avslutar loopen när du trycker på Q eller q.

I Konfigurera din miljö skapade du fyra miljövariabler för att konfigurera exemplet för att använda Device Provisioning Service (DPS) för att ansluta till din IoT-hubb:

  • IOTHUB_DEVICE_SECURITY_TYPE med värdetDPS
  • IOTHUB_DEVICE_DPS_ID_SCOPE med DPS-ID-omfånget.
  • IOTHUB_DEVICE_DPS_DEVICE_ID med värdet my-pnp-device.
  • IOTHUB_DEVICE_DPS_DEVICE_KEY med den primära registreringsnyckeln.
  • IOTHUB_DEVICE_DPS_ENDPOINT med värdet global.azure-devices-provisioning.net.

Mer information om exempelkonfigurationen finns i exempelläsningen.

Nu när du har sett koden använder du följande kommando för att köra exemplet:

node pnp_temperature_controller.js

Du ser följande utdata som anger att enheten har börjat skicka telemetridata till hubben och nu är redo att ta emot kommandon och egenskapsuppdateringar.

Enhetsbekräftelsemeddelanden

Se till att exemplet körs när du slutför nästa steg.

Använda Azure IoT Explorer för att verifiera koden

När enhetsklientexemplet har startat använder du Azure IoT Explorer-verktyget för att kontrollera att det fungerar.

  1. Öppna Azure IoT Explorer.

  2. Om du inte redan har lagt till en anslutning till din IoT-hubb på sidan IoT-hubbar väljer du + Lägg till anslutning. Ange anslutningssträng för den IoT-hubb som du skapade tidigare och välj Spara.

  3. På sidan Inställningar för IoT Plug and Play väljer du + Lägg till > lokal mapp och väljer mappen lokala modeller där du sparade dina modellfiler.

  4. På sidan IoT-hubbar klickar du på namnet på den hubb som du vill arbeta med. Du ser en lista över enheter som är registrerade på IoT-hubben.

  5. Klicka på Enhets-ID för den enhet som du skapade tidigare.

  6. Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.

  7. Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.

  8. Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.

  9. Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.

  10. Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.

  11. Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.

  12. Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.

  13. Om du vill se det nya värdet väljer du knappen Uppdatera .

  14. Välj sidan Kommandon för att visa alla kommandon för den här komponenten.

  15. Välj det kommando som du vill testa för att ange parametern om det finns någon. Välj Skicka kommando för att anropa kommandot på enheten. Du kan se att enheten svarar på kommandot i kommandotolken där exempelkoden körs.

Den här självstudien visar hur du skapar ett exempelprogram för IoT Plug and Play-enheter med komponenter, ansluter det till din IoT-hubb och använder verktyget Azure IoT Explorer för att visa den information som skickas till hubben. Exempelprogrammet är skrivet i Python och ingår i Azure IoT-enhetens SDK för Python. En lösningsbyggare kan använda Verktyget Azure IoT Explorer för att förstå funktionerna i en IoT Plug and Play-enhet utan att behöva visa någon enhetskod.

Sökkod

I den här kursen får du:

  • Ladda ned exempelkoden.
  • Kör exempelprogrammet för enheten och verifiera att det ansluter till din IoT-hubb.
  • Granska källkoden.

Förutsättningar

Innan du fortsätter kontrollerar du att du har konfigurerat din miljö, inklusive din IoT-hubb.

Du kan köra den här självstudien i Linux eller Windows. Shell-kommandona i den här självstudien följer Linux-konventionen för sökvägsavgränsare ,/ om du följer med i Windows måste du växla dessa avgränsare mot "\".

För att slutföra den här självstudien behöver du Python installerat på utvecklingsdatorn. Kontrollera Azure IoT Python SDK för aktuella versionskrav för Python. Du kan kontrollera Python-versionen med följande kommando:

python --version

Du kan ladda ned den senaste rekommenderade versionen för flera plattformar från python.org.

Ladda ned koden

Paketet azure-iot-device publiceras som en PIP.

Installera paketet på följande sätt i din lokala Python-miljö:

pip install azure-iot-device

Om du har slutfört Självstudie: Anslut ett exempelprogram för IoT Plug and Play-enheter som körs i Windows till IoT Hub (Python) har du redan klonat lagringsplatsen.

Klona Python SDK IoT-lagringsplatsen:

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

Granska koden

Det här exemplet implementerar en IoT Plug and Play-temperaturstyrenhet. Modellen som det här exemplet implementerar använder flera komponenter. DTDL-modellfilen (Digital Twins Definition Language) för temperaturenheten definierar telemetri, egenskaper och kommandon som enheten implementerar.

Mappen azure-iot-sdk-python/samples/pnp innehåller exempelkoden för IoT Plug and Play-enheten. Filerna för temperaturkontrollantexemplet är:

  • temp_controller_with_thermostats.py
  • pnp_helper.py

Temperaturstyrenheten har flera komponenter och en standardkomponent, baserat på temperaturstyrenhetens DTDL-modell.

Öppna filen temp_controller_with_thermostats.py i valfri redigerare. Koden i den här filen:

  1. Importerar pnp_helper.py för att få åtkomst till hjälpmetoder.

  2. Definierar två digitala tvillingmodellidentifierare (DTMIs) som unikt representerar två olika gränssnitt, definierade i DTDL-modellen. Komponenterna i en verklig temperaturkontrollant bör implementera dessa två gränssnitt. Dessa två gränssnitt har redan publicerats på en central lagringsplats. Dessa DTMIs måste vara kända för användaren och varierar beroende på scenariot med enhetsimplementering. För det aktuella exemplet representerar dessa två gränssnitt:

    • En termostat
    • Enhetsinformation som utvecklats av Azure.
  3. Definierar DTMI model_id för den enhet som implementeras. DTMI är användardefinierad och måste matcha DTMI i DTDL-modellfilen.

  4. Definierar de namn som ges till komponenterna i DTDL-filen. Det finns två termostater i DTDL och en komponent för enhetsinformation. En konstant med namnet serial_number definieras också i standardkomponenten. En serial_number kan inte ändras för en enhet.

  5. Definierar implementeringar av kommandohanterare. Dessa hanterare definierar vad enheten gör när den tar emot kommandobegäranden.

  6. Definierar funktioner för att skapa ett kommandosvar. Dessa funktioner definierar hur enheten svarar med kommandobegäranden. Du skapar kommandosvarsfunktioner om ett kommando behöver skicka ett anpassat svar tillbaka till IoT-hubben. Om en svarsfunktion för ett kommando inte tillhandahålls skickas ett allmänt svar. I det här exemplet har endast kommandot getMaxMinReport ett anpassat svar.

  7. Definierar en funktion för att skicka telemetri från den här enheten. Både termostaterna och standardkomponenten skickar telemetri. Den här funktionen har en valfri komponentnamnsparameter som gör att den kan identifiera vilken komponent som skickade telemetrin.

  8. Definierar en lyssnare för kommandobegäranden.

  9. Definierar en lyssnare för önskade egenskapsuppdateringar.

  10. Har en main funktion som:

    • Använder enhetens SDK för att skapa en enhetsklient och ansluta till din IoT-hubb. Enheten skickar model_id så att IoT-hubben kan identifiera enheten som en IoT Plug and Play-enhet.

    • create_reported_properties Använder funktionen i hjälpfilen för att skapa egenskaperna. Skicka komponentnamnet och egenskaperna som nyckelvärdepar till den här funktionen.

    • Uppdaterar de läsbara egenskaperna för dess komponenter genom att anropa patch_twin_reported_properties.

    • Börjar lyssna efter kommandobegäranden med hjälp av execute_command_listener funktionen. Funktionen konfigurerar en lyssnare för kommandobegäranden från tjänsten. När du konfigurerar lyssnaren anger du en method_name, user_command_handleroch en valfri create_user_response_handler som parametrar.

      • Definierar method_name kommandobegäran. I det här exemplet definierar modellen omstart av kommandon och getMaxMinReport.
      • Funktionen user_command_handler definierar vad enheten ska göra när den tar emot ett kommando.
      • Funktionen create_user_response_handler skapar ett svar som ska skickas till din IoT-hubb när ett kommando körs. Du kan visa det här svaret i portalen. Om den här funktionen inte tillhandahålls skickas ett allmänt svar till tjänsten.
    • Används execute_property_listener för att lyssna efter egenskapsuppdateringar.

    • Börjar skicka telemetri med .send_telemetry Exempelkoden använder en loop för att anropa tre telemetri-sändningsfunktioner. Var och en anropas var åttonde sekund

    • Inaktiverar alla lyssnare och uppgifter och avslutar loopen när du trycker på Q eller q.

I Konfigurera din miljö skapade du fyra miljövariabler för att konfigurera exemplet för att använda Device Provisioning Service (DPS) för att ansluta till din IoT-hubb:

  • IOTHUB_DEVICE_SECURITY_TYPE med värdetDPS
  • IOTHUB_DEVICE_DPS_ID_SCOPE med DPS-ID-omfånget.
  • IOTHUB_DEVICE_DPS_DEVICE_ID med värdet my-pnp-device.
  • IOTHUB_DEVICE_DPS_DEVICE_KEY med den primära registreringsnyckeln.
  • IOTHUB_DEVICE_DPS_ENDPOINT med värdet global.azure-devices-provisioning.net.

Mer information om exempelkonfigurationen finns i exempelläsningen.

Kör exemplet med följande kommando:

python temp_controller_with_thermostats.py

Exempelenheten skickar telemetrimeddelanden med några sekunders mellanrum till din IoT-hubb.

Du ser följande utdata som anger att enheten skickar telemetridata till hubben och nu är redo att ta emot kommandon och egenskapsuppdateringar.

Enhetsbekräftelsemeddelanden

Se till att exemplet körs när du slutför nästa steg.

Använda Azure IoT Explorer för att verifiera koden

När enhetsklientexemplet har startat använder du Azure IoT Explorer-verktyget för att kontrollera att det fungerar.

  1. Öppna Azure IoT Explorer.

  2. Om du inte redan har lagt till en anslutning till din IoT-hubb på sidan IoT-hubbar väljer du + Lägg till anslutning. Ange anslutningssträng för den IoT-hubb som du skapade tidigare och välj Spara.

  3. På sidan Inställningar för IoT Plug and Play väljer du + Lägg till > lokal mapp och väljer mappen lokala modeller där du sparade dina modellfiler.

  4. På sidan IoT-hubbar klickar du på namnet på den hubb som du vill arbeta med. Du ser en lista över enheter som är registrerade på IoT-hubben.

  5. Klicka på Enhets-ID för den enhet som du skapade tidigare.

  6. Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.

  7. Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.

  8. Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.

  9. Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.

  10. Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.

  11. Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.

  12. Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.

  13. Om du vill se det nya värdet väljer du knappen Uppdatera .

  14. Välj sidan Kommandon för att visa alla kommandon för den här komponenten.

  15. Välj det kommando som du vill testa för att ange parametern om det finns någon. Välj Skicka kommando för att anropa kommandot på enheten. Du kan se att enheten svarar på kommandot i kommandotolken där exempelkoden körs.

Rensa resurser

Om du planerar att fortsätta med fler artiklar för enhetsutvecklare kan du behålla och återanvända de resurser som du använde i den här artikeln. Annars kan du ta bort de resurser som du skapade i den här artikeln för att undvika fler avgifter.

Du kan ta bort både hubben och den registrerade enheten samtidigt genom att ta bort hela resursgruppen med följande Azure CLI-kommando. Använd inte det här kommandot om dessa resurser delar en resursgrupp med andra resurser som du vill behålla.

az group delete --name <YourResourceGroupName>

Om du bara vill ta bort IoT-hubben kör du följande kommando med Hjälp av Azure CLI:

az iot hub delete --name <YourIoTHubName>

Om du bara vill ta bort enhetsidentiteten som du registrerade med din IoT-hubb kör du följande kommando med Hjälp av Azure CLI:

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

Du kanske också vill ta bort de klonade exempelfilerna från utvecklingsdatorn.

Nästa steg

I den här självstudien har du lärt dig hur du ansluter en IoT Plug and Play-enhet med komponenter till en IoT-hubb. Mer information om IoT Plug and Play-enhetsmodeller finns i: