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.
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ö:
- Visual Studio (Community, Professional eller Enterprise) – se till att du inkluderar skrivbordsutveckling med C++ -arbetsbelastning när du installerar Visual Studio.
- Git.
- CMake.
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
Ö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.
När Visual Studio är klart går du till Solution Explorer och går till exempel iothub_client/samples/pnp/pnp_temperature_controller/.
Högerklicka på filen pnp_temperature_controller.c och välj Lägg till felsökningskonfiguration. Välj Standard.
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>" } } ] }
Högerklicka på filen pnp_temperature_controller.c och välj Ange som startobjekt.
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 .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:
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
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ärdet
DPS
- 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:
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.
Öppna Azure IoT Explorer.
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.
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.
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.
Klicka på Enhets-ID för den enhet som du skapade tidigare.
Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.
Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.
Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.
Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.
Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.
Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.
Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.
Om du vill se det nya värdet väljer du knappen Uppdatera .
Välj sidan Kommandon för att visa alla kommandon för den här komponenten.
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
anropasPnP_ProcessTwinData
funktionen för att bearbeta data.PnP_ProcessTwinData
använder besöksmönstret för att parsa JSON och sedan besöka varje egenskap och anropaPnP_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.
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.
Öppna Azure IoT Explorer.
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.
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.
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.
Klicka på Enhets-ID för den enhet som du skapade tidigare.
Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.
Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.
Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.
Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.
Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.
Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.
Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.
Om du vill se det nya värdet väljer du knappen Uppdatera .
Välj sidan Kommandon för att visa alla kommandon för den här komponenten.
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:
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.
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ärdet
DPS
- 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.
Öppna Azure IoT Explorer.
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.
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.
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.
Klicka på Enhets-ID för den enhet som du skapade tidigare.
Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.
Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.
Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.
Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.
Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.
Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.
Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.
Om du vill se det nya värdet väljer du knappen Uppdatera .
Välj sidan Kommandon för att visa alla kommandon för den här komponenten.
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:
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.
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.
- 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
ochgetMaxMinReport
. - Funktionen
commandHandler
definierar hur enheten svarar på ett kommando.
- Enhetens DTDL definierar kommandona
Börjar skicka telemetri med hjälp
setInterval
av ochsendTelemetry
.helperCreateReportedPropertiesPatch
Använder funktionen för att skapa egenskaperna ochupdateComponentReportedProperties
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ärdet
DPS
- 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.
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.
Öppna Azure IoT Explorer.
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.
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.
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.
Klicka på Enhets-ID för den enhet som du skapade tidigare.
Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.
Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.
Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.
Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.
Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.
Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.
Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.
Om du vill se det nya värdet väljer du knappen Uppdatera .
Välj sidan Kommandon för att visa alla kommandon för den här komponenten.
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.
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:
Importerar
pnp_helper.py
för att få åtkomst till hjälpmetoder.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.
Definierar DTMI
model_id
för den enhet som implementeras. DTMI är användardefinierad och måste matcha DTMI i DTDL-modellfilen.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. Enserial_number
kan inte ändras för en enhet.Definierar implementeringar av kommandohanterare. Dessa hanterare definierar vad enheten gör när den tar emot kommandobegäranden.
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.
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.
Definierar en lyssnare för kommandobegäranden.
Definierar en lyssnare för önskade egenskapsuppdateringar.
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 enmethod_name
,user_command_handler
och en valfricreate_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.
- Definierar
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 sekundInaktiverar 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ärdet
DPS
- 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.
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.
Öppna Azure IoT Explorer.
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.
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.
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.
Klicka på Enhets-ID för den enhet som du skapade tidigare.
Menyn till vänster visar de olika typerna av information som är tillgängliga för enheten.
Välj IoT Plug and Play-komponenter för att visa modellinformationen för din enhet.
Du kan visa de olika komponenterna på enheten. Standardkomponenten och eventuella extra komponenter. Välj en komponent att arbeta med.
Välj sidan Telemetri och välj sedan Start för att visa telemetridata som enheten skickar för den här komponenten.
Välj sidan Egenskaper (skrivskyddad) för att visa de skrivskyddade egenskaper som rapporterats för den här komponenten.
Välj sidan Egenskaper (skrivbar) för att visa de skrivbara egenskaper som du kan uppdatera för den här komponenten.
Välj en egenskap efter dess namn, ange ett nytt värde för den och välj Uppdatera önskat värde.
Om du vill se det nya värdet väljer du knappen Uppdatera .
Välj sidan Kommandon för att visa alla kommandon för den här komponenten.
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: