Självstudie: Interagera med en IoT Plug and Play-enhet som är ansluten till din lösning
IoT Plug and Play förenklar IoT genom att du kan interagera med en enhets funktioner utan att känna till den underliggande enhetsimplementeringen. Den här självstudien visar hur du använder C# för att ansluta till och styra en IoT Plug and Play-enhet som är ansluten till din lösning.
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 SDK 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 enhetskoden
Nu kan du skapa enhetsexemplet och köra det. Kör följande kommandon för att skapa exemplet:
cd azure-iot-sdk-csharp/iothub/device/samples/solutions/PnpDeviceSamples/Thermostat
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.
Kör exempellösningen
I Konfigurera din miljö för snabbstarter och självstudier för IoT Plug and Play skapade du två miljövariabler för att konfigurera exemplet för att ansluta till din IoT-hubb:
- IOTHUB_CONNECTION_STRING: IoT-hubben anslutningssträng du antecknade tidigare.
- IOTHUB_DEVICE_ID:
"my-pnp-device"
.
I den här självstudien använder du en IoT-exempellösning skriven i C# för att interagera med den exempelenhet som du just har konfigurerat och kört.
I ett annat terminalfönster går du till mappen azure-iot-sdk-csharp/iothub/service/samples/solutions/PnpServiceSamples/Thermostat .
Kör följande kommando för att skapa tjänstexemplet:
dotnet build
Kör följande kommando för att köra tjänstexemplet:
dotnet run
Hämta enhetstvilling
Följande kodfragment visar hur tjänstprogrammet hämtar enhetstvillingen:
// Get a Twin and retrieves model Id set by Device client
Twin twin = await s_registryManager.GetTwinAsync(s_deviceId);
s_logger.LogDebug($"Model Id of this Twin is: {twin.ModelId}");
Kommentar
Det här exemplet använder namnområdet Microsoft.Azure.Devices.Client från IoT Hub-tjänstklienten. Mer information om API:erna, inklusive API:et för digitala tvillingar, finns i guiden för tjänstutvecklare.
Den här koden genererar följande utdata:
[09/21/2020 11:26:04]dbug: Thermostat.Program[0]
Model Id of this Twin is: dtmi:com:example:Thermostat;1
Följande kodfragment visar hur du använder en korrigering för att uppdatera egenskaper via enhetstvillingen:
// Update the twin
var twinPatch = new Twin();
twinPatch.Properties.Desired[PropertyName] = PropertyValue;
await s_registryManager.UpdateTwinAsync(s_deviceId, twinPatch, twin.ETag);
Den här koden genererar följande utdata från enheten när tjänsten uppdaterar targetTemperature
egenskapen:
[09/21/2020 11:26:05]dbug: Thermostat.ThermostatSample[0]
Property: Received - { "targetTemperature": 60°C }.
[09/21/2020 11:26:05]dbug: Thermostat.ThermostatSample[0]
Property: Update - {"targetTemperature": 60°C } is InProgress.
...
[09/21/2020 11:26:17]dbug: Thermostat.ThermostatSample[0]
Property: Update - {"targetTemperature": 60°C } is Completed.
Anropa ett kommando
Följande kodfragment visar hur du anropar ett kommando:
private static async Task InvokeCommandAsync()
{
var commandInvocation = new CloudToDeviceMethod(CommandName) { ResponseTimeout = TimeSpan.FromSeconds(30) };
// Set command payload
string componentCommandPayload = JsonConvert.SerializeObject(s_dateTime);
commandInvocation.SetPayloadJson(componentCommandPayload);
CloudToDeviceMethodResult result = await s_serviceClient.InvokeDeviceMethodAsync(s_deviceId, commandInvocation);
if (result == null)
{
throw new Exception($"Command {CommandName} invocation returned null");
}
s_logger.LogDebug($"Command {CommandName} invocation result status is: {result.Status}");
}
Den här koden genererar följande utdata från enheten när tjänsten anropar getMaxMinReport
kommandot:
[09/21/2020 11:26:05]dbug: Thermostat.ThermostatSample[0]
Command: Received - Generating max, min and avg temperature report since 21/09/2020 11:25:58.
[09/21/2020 11:26:05]dbug: Thermostat.ThermostatSample[0]
Command: MaxMinReport since 21/09/2020 11:25:58: maxTemp=32, minTemp=32, avgTemp=32, startTime=21/09/2020 11:25:59, endTime=21/09/2020 11:26:04
IoT Plug and Play förenklar IoT genom att du kan interagera med en enhets funktioner utan att känna till den underliggande enhetsimplementeringen. Den här självstudien visar hur du använder Java för att ansluta till och styra en IoT Plug and Play-enhet som är ansluten till din lösning.
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ö:
Klona SDK-lagringsplatsen med exempelkoden
Om du har slutfört självstudien: Anslut ett exempelprogram för IoT Plug and Play-enheter som körs i Windows till IoT Hub (Java) har du redan klonat lagringsplatsen.
Öppna en kommandotolk i valfri katalog. Kör följande kommando för att klona Microsoft Azure IoT SDK:er för Java GitHub-lagringsplatsen till den här platsen:
git clone https://github.com/Azure/azure-iot-sdk-java.git
Skapa och kör exempelenheten
Gå till rotmappen för termostatexemplet i den klonade Java SDK-lagringsplatsen och skapa den:
cd azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/thermostat-device-sample
mvn clean package
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 programmet från mappen /device/iot-device-samples/pnp-device-sample/thermostat-device-sample:
mvn exec:java -Dexec.mainClass="samples.com.microsoft.azure.sdk.iot.device.Thermostat"
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.
Kör exempellösningen
I Konfigurera din miljö för snabbstarter och självstudier för IoT Plug and Play skapade du två miljövariabler för att konfigurera exemplet för att ansluta till din IoT-hubb:
- IOTHUB_CONNECTION_STRING: IoT-hubben anslutningssträng du antecknade tidigare.
- IOTHUB_DEVICE_ID:
"my-pnp-device"
.
I den här självstudien använder du en IoT-exempellösning som skrivits i Java för att interagera med den exempelenhet som du just har konfigurerat.
Kommentar
Det här exemplet använder namnområdet com.microsoft.azure.sdk.iot.service från IoT Hub-tjänstklienten. Mer information om API:erna, inklusive API:et för digitala tvillingar, finns i guiden för tjänstutvecklare.
Öppna ett annat terminalfönster som ska användas som tjänstterminal .
I den klonade Java SDK-lagringsplatsen går du till mappen service/iot-service-samples/pnp-service-sample/thermostat-service-sample .
Kör följande kommandon för att skapa och köra exempeltjänstprogrammet:
mvn clean package mvn exec:java -Dexec.mainClass="samples.com.microsoft.azure.sdk.iot.service.Thermostat"
Hämta enhetstvilling
Följande kodfragment visar hur du hämtar enhetstvillingen i tjänsten:
// Get the twin and retrieve model Id set by Device client.
DeviceTwinDevice twin = new DeviceTwinDevice(deviceId);
twinClient.getTwin(twin);
System.out.println("Model Id of this Twin is: " + twin.getModelId());
Uppdatera en enhetstvilling
Följande kodfragment visar hur du använder en korrigering för att uppdatera egenskaper via enhetstvillingen:
String propertyName = "targetTemperature";
double propertyValue = 60.2;
twin.setDesiredProperties(Collections.singleton(new Pair(propertyName, propertyValue)));
twinClient.updateTwin(twin);
Enhetens utdata visar hur enheten svarar på den här egenskapsuppdateringen.
Anropa ett kommando
Följande kodfragment visar hur du anropar ett kommando på enheten:
// The method to invoke for a device without components should be "methodName" as defined in the DTDL.
String methodToInvoke = "getMaxMinReport";
System.out.println("Invoking method: " + methodToInvoke);
Long responseTimeout = TimeUnit.SECONDS.toSeconds(200);
Long connectTimeout = TimeUnit.SECONDS.toSeconds(5);
// Invoke the command.
String commandInput = ZonedDateTime.now(ZoneOffset.UTC).minusMinutes(5).format(DateTimeFormatter.ISO_DATE_TIME);
MethodResult result = methodClient.invoke(deviceId, methodToInvoke, responseTimeout, connectTimeout, commandInput);
if(result == null)
{
throw new IOException("Method result is null");
}
System.out.println("Method result status is: " + result.getStatus());
Enhetens utdata visar hur enheten svarar på det här kommandot.
IoT Plug and Play förenklar IoT genom att du kan interagera med en enhets funktioner utan att känna till den underliggande enhetsimplementeringen. Den här självstudien visar hur du använder Node.js för att ansluta till och styra en IoT Plug and Play-enhet som är ansluten till din lösning.
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
Klona SDK-lagringsplatsen med exempelkoden
Klona exemplen från en Node SDK-lagringsplats. Öppna ett terminalfönster i valfri mapp. Kör följande kommando för att klona Microsoft Azure IoT SDK för Node.js GitHub-lagringsplats:
git clone https://github.com/Azure/azure-iot-sdk-node
Kör exempelenheten
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.
I den här självstudien använder du en termostatexempelenhet som är skriven i Node.js som IoT Plug and Play-enhet. Så här kör du exempelenheten:
Öppna ett terminalfönster och navigera till den lokala mappen som innehåller Microsoft Azure IoT SDK för Node.js lagringsplats som du klonade från GitHub.
Det här terminalfönstret används som enhetsterminal . Gå till mappen för den klonade lagringsplatsen och gå till mappen /azure-iot-sdk-node/device/samples/javascript . Installera alla beroenden genom att köra följande kommando:
npm install
Kör exempeltermostatenheten med följande kommando:
node pnp_simple_thermostat.js
Du ser meddelanden som säger att enheten har skickat viss information och rapporterat sig själv online. Dessa meddelanden anger att enheten har börjat skicka telemetridata till hubben och nu är redo att ta emot kommandon och egenskapsuppdateringar. Stäng inte den här terminalen. Du behöver den för att bekräfta att tjänstexemplet fungerar.
Kör exempellösningen
I Konfigurera din miljö för snabbstarter och självstudier för IoT Plug and Play skapade du två miljövariabler för att konfigurera exemplet för att ansluta till din IoT-hubb:
- IOTHUB_CONNECTION_STRING: IoT-hubben anslutningssträng du antecknade tidigare.
- IOTHUB_DEVICE_ID:
"my-pnp-device"
.
I den här självstudien använder du ett exempel Node.js IoT-lösning för att interagera med exempelenheten som du precis har konfigurerat och kört.
Öppna ett annat terminalfönster som ska användas som tjänstterminal .
I den klonade Node SDK-lagringsplatsen går du till mappen azure-iot-sdk-node/service/samples/javascript . Installera alla beroenden genom att köra följande kommando:
npm install
Läsa en egenskap
När du körde termostatexemplet i enhetsterminalen såg du följande meddelanden som anger dess onlinestatus:
properties have been reported for component sending telemetry message 0...
Gå till tjänstterminalen och använd följande kommando för att köra exemplet för att läsa enhetsinformation:
node twin.js
Observera svaret från enhetstvillingen i tjänstterminalens utdata. Du ser enhetens modell-ID och associerade egenskaper rapporterade:
Model Id: dtmi:com:example:Thermostat;1 { "deviceId": "my-pnp-device", "etag": "AAAAAAAAAAE=", "deviceEtag": "Njc3MDMxNDcy", "status": "enabled", "statusUpdateTime": "0001-01-01T00:00:00Z", "connectionState": "Connected", "lastActivityTime": "0001-01-01T00:00:00Z", "cloudToDeviceMessageCount": 0, "authenticationType": "sas", "x509Thumbprint": { "primaryThumbprint": null, "secondaryThumbprint": null }, "modelId": "dtmi:com:example:Thermostat;1", "version": 4, "properties": { "desired": { "$metadata": { "$lastUpdated": "2020-10-05T11:35:19.4574755Z" }, "$version": 1 }, "reported": { "maxTempSinceLastReboot": 31.343640523762232, "serialNumber": "123abc", "$metadata": { "$lastUpdated": "2020-10-05T11:35:23.7339042Z", "maxTempSinceLastReboot": { "$lastUpdated": "2020-10-05T11:35:23.7339042Z" }, "serialNumber": { "$lastUpdated": "2020-10-05T11:35:23.7339042Z" } }, "$version": 3 } }, "capabilities": { "iotEdge": false }, "tags": {} }
Följande kodfragment visar koden i twin.js som hämtar enhetstvillingens modell-ID:
var registry = Registry.fromConnectionString(connectionString); registry.getTwin(deviceId, function(err, twin) { if (err) { console.error(err.message); } else { console.log('Model Id: ' + twin.modelId); //... } //... }
I det här scenariot matas Model Id: dtmi:com:example:Thermostat;1
ut .
Kommentar
Dessa tjänstexempel använder klassen Registry från IoT Hub-tjänstklienten. Mer information om API:erna, inklusive API:et för digitala tvillingar, finns i guiden för tjänstutvecklare.
Uppdatera en skrivbar egenskap
Öppna filen twin.js i en kodredigerare.
Granska exempelkoden. Den visar två sätt att uppdatera enhetstvillingen. Om du vill använda det första sättet ändrar du variabeln på
twinPatch
följande sätt:var twinPatch = { tags: { city: "Redmond" }, properties: { desired: { targetTemperature: 42 } } };
Egenskapen
targetTemperature
definieras som en skrivbar egenskap i termostatenhetsmodellen.I tjänstterminalen använder du följande kommando för att köra exemplet för att uppdatera egenskapen:
node twin.js
I enhetsterminalen ser du att enheten har tagit emot uppdateringen:
The following properties will be updated for the default component: { targetTemperature: { value: 42, ac: 200, ad: 'Successfully executed patch for targetTemperature', av: 2 } } updated the property
I tjänstterminalen kör du följande kommando för att bekräfta att egenskapen har uppdaterats:
node twin.js
I tjänstterminalens utdata ser du den uppdaterade måltemperaturen rapporterad i
reported
avsnittet Egenskaper. Det kan ta en stund för enheten att slutföra uppdateringen. Upprepa det här steget tills enheten har bearbetat egenskapsuppdateringen:"reported": { //... "targetTemperature": { "value": 42, "ac": 200, "ad": "Successfully executed patch for targetTemperature", "av": 4 }, //... }
Anropa ett kommando
Öppna filen device_method.js och granska koden.
Gå till tjänstterminalen. Använd följande kommando för att köra exemplet för att anropa kommandot:
set IOTHUB_METHOD_NAME=getMaxMinReport set IOTHUB_METHOD_PAYLOAD=commandpayload node device_method.js
Utdata i tjänstterminalen visar följande bekräftelse:
getMaxMinReport on my-pnp-device: { "status": 200, "payload": { "maxTemp": 23.460596940801928, "minTemp": 23.460596940801928, "avgTemp": 23.460596940801928, "endTime": "2020-10-05T12:48:08.562Z", "startTime": "2020-10-05T12:47:54.450Z" } }
I enhetsterminalen ser du att kommandot bekräftas:
MaxMinReport commandpayload Response to method 'getMaxMinReport' sent successfully.
IoT Plug and Play förenklar IoT genom att du kan interagera med en enhets modell utan att känna till den underliggande enhetsimplementeringen. Den här självstudien visar hur du använder Python för att ansluta till och styra en IoT Plug and Play-enhet som är ansluten till din lösning.
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 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.
Installera paketet azure-iot-device på följande sätt i din lokala Python-miljö:
pip install azure-iot-device
Installera paketet azure-iot-hub genom att köra följande kommando:
pip install azure-iot-hub
Kör exempelenheten
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.
I den här självstudien använder du en termostatexempelenhet, skriven i Python, som IoT Plug and Play-enhet. Så här kör du exempelenheten:
Öppna ett terminalfönster i valfri mapp. Kör följande kommando för att klona Azure IoT Device Python SDK GitHub-lagringsplatsen till den här platsen:
git clone --branch v2 https://github.com/Azure/azure-iot-sdk-python
Det här terminalfönstret används som enhetsterminal . Gå till mappen för den klonade lagringsplatsen och gå till mappen azure-iot-sdk-python/samples/pnp .
Kör exempeltermostatenheten med följande kommando:
python simple_thermostat.py
Du ser meddelanden som säger att enheten har skickat viss information och rapporterat sig själv online. Dessa meddelanden anger att enheten har börjat skicka telemetridata till hubben och nu är redo att ta emot kommandon och egenskapsuppdateringar. Stäng inte den här terminalen. Du behöver den för att bekräfta att tjänstexemplet fungerar.
Kör exempellösningen
I den här självstudien använder du en exempellösning för IoT i Python för att interagera med den exempelenhet som du just har konfigurerat.
Öppna ett annat terminalfönster som ska användas som tjänstterminal . Kör följande kommando för att klona Azure IoT Hub Python SDK GitHub-lagringsplatsen till den här platsen:
git clone https://github.com/Azure/azure-iot-hub-python
Installera
Gå till mappen /azure-iot-hub-python/samples på den klonade Python SDK-lagringsplatsen.
Öppna filen registry_manager_pnp_sample.py och granska koden. Det här exemplet visar hur du använder klassen IoTHubRegistryManager för att interagera med din IoT Plug and Play-enhet.
Kommentar
De här tjänstexemplen använder klassen IoTHubRegistryManager från IoT Hub-tjänstklienten. Mer information om API:erna, inklusive API:et för digitala tvillingar, finns i guiden för tjänstutvecklare.
Hämta enhetstvillingen
I Konfigurera din miljö för snabbstarter och självstudier för IoT Plug and Play skapade du två miljövariabler för att konfigurera exemplet för att ansluta till din IoT-hubb:
- IOTHUB_CONNECTION_STRING: IoT-hubben anslutningssträng du antecknade tidigare.
- IOTHUB_DEVICE_ID:
"my-pnp-device"
.
Använd följande kommando i tjänstterminalen för att köra det här exemplet:
set IOTHUB_METHOD_NAME="getMaxMinReport"
set IOTHUB_METHOD_PAYLOAD="hello world"
python registry_manager_pnp_sample.py
Kommentar
Om du kör det här exemplet på Linux använder du export
i stället för set
.
Utdata visar enhetstvillingen och skriver ut dess modell-ID:
The Model ID for this device is:
dtmi:com:example:Thermostat;1
Följande kodfragment visar exempelkoden från registry_manager_pnp_sample.py:
# Create IoTHubRegistryManager
iothub_registry_manager = IoTHubRegistryManager(iothub_connection_str)
# Get device twin
twin = iothub_registry_manager.get_twin(device_id)
print("The device twin is: ")
print("")
print(twin)
print("")
# Print the device's model ID
additional_props = twin.additional_properties
if "modelId" in additional_props:
print("The Model ID for this device is:")
print(additional_props["modelId"])
print("")
Uppdatera en enhetstvilling
Det här exemplet visar hur du uppdaterar den targetTemperature
skrivbara egenskapen på enheten:
# Update twin
twin_patch = Twin()
twin_patch.properties = TwinProperties(
desired={"targetTemperature": 42}
) # this is relevant for the thermostat device sample
updated_twin = iothub_registry_manager.update_twin(device_id, twin_patch, twin.etag)
print("The twin patch has been successfully applied")
print("")
Du kan kontrollera att uppdateringen tillämpas i enhetsterminalen som visar följande utdata:
the data in the desired properties patch was: {'targetTemperature': 42, '$version': 2}
Tjänstterminalen bekräftar att korrigeringen lyckades:
The twin patch has been successfully applied
Anropa ett kommando
Exemplet anropar sedan ett kommando:
Tjänstterminalen visar ett bekräftelsemeddelande från enheten:
The device method has been successfully invoked
I enhetsterminalen ser du att enheten tar emot kommandot:
Command request received with payload
hello world
Will return the max, min and average temperature from the specified time hello to the current time
Done generating
{"tempReport": {"avgTemp": 34.2, "endTime": "09/07/2020 09:58:11", "maxTemp": 49, "minTemp": 10, "startTime": "09/07/2020 09:56:51"}}
Rensa resurser
Om du är klar med snabbstarterna och självstudierna kan du läsa Rensa resurser.
Nästa steg
I den här självstudien har du lärt dig hur du ansluter en IoT Plug and Play-enhet till en IoT-lösning. Mer information om IoT Plug and Play-enhetsmodeller finns i: