Tutorial: Conexión de aplicaciones de un dispositivo IoT Plug and Play de varios componentes que se ejecutan en Linux o Windows a IoT Hub
En este tutorial se muestra cómo compilar una aplicación de dispositivo IoT Plug and Play de ejemplo con componentes, cómo conectarla a un centro de IoT y cómo usar la herramienta Azure IoT Explorer para ver la información que envía al centro. La aplicación de ejemplo está escrita en C y se incluye en el SDK de dispositivo IoT de Azure para C. Un generador de soluciones puede usar la herramienta Azure IoT Explorer para comprender las funcionalidades de cualquier dispositivo IoT Plug and Play sin necesidad de ver nada de código del dispositivo.
En este tutorial, hizo lo siguiente:
- Descargue el código de ejemplo.
- Ha creado el código de ejemplo.
- Ha ejecutado la aplicación del dispositivo de ejemplo y confirmar que se conecta al centro de IoT.
- Ha revisado el código fuente.
Requisitos previos
Antes de continuar, asegúrese de que ha configurado el entorno, incluido el centro de IoT.
Para este tutorial se puede usar Linux o Windows. Los comandos de shell de este tutorial siguen la convención de Linux para los separadores de ruta de acceso "/
". Si utiliza Windows, asegúrese de cambiar estos separadores por "\
".
Los requisitos previos difieren en función del sistema operativo:
Linux
En este tutorial se da por supuesto que usa Ubuntu Linux. Los pasos de este tutorial se han probado con Ubuntu 18.04.
Para realizar este tutorial en Linux, instale el siguiente software en el entorno de Linux local:
Instale GCC, Git, cmake y todas las dependencias necesarias con el comando apt-get
:
sudo apt-get update
sudo apt-get install -y git cmake build-essential curl libcurl4-openssl-dev libssl-dev uuid-dev
Compruebe que la versión de cmake
es posterior a 2.8.12 y que la versión de GCC es posterior a 4.4.7.
cmake --version
gcc --version
Windows
Para completar este tutorial en Windows, instale el siguiente software en el entorno Windows local:
- Visual Studio (Community, Professional o Enterprise): asegúrese de incluir la carga de trabajo Desarrollo para el escritorio con C++ cuando instale Visual Studio.
- Git.
- CMake.
Descargar el código
Si ha completado el Tutorial: conexión a IoT Hub (C) de una aplicación de ejemplo del dispositivo IoT Plug and Play que se ejecuta en Linux o Windows, ya tendrá descargado el código.
En este tutorial, se prepara un entorno de desarrollo que se puede usar para clonar y compilar el SDK de dispositivos de Azure IoT Hub para C.
Abra un símbolo del sistema en la carpeta de su elección. Ejecute el siguiente comando para clonar el repositorio de GitHub de las bibliotecas y los SDK de C de Azure IoT en esta ubicación:
git clone https://github.com/Azure/azure-iot-sdk-c.git
cd azure-iot-sdk-c
git submodule update --init
Esta operación puede tardar varios minutos en completarse.
Compilación y ejecución del código
Puede compilar y ejecutar el código con Visual Studio o usar cmake
en la línea de comandos.
Usar Visual Studio
Abra la carpeta raíz del repositorio clonado. Al cabo de unos segundos, la compatibilidad de CMake en Visual Studio crea todo lo que necesita para ejecutar y depurar el proyecto.
Cuando Visual Studio esté listo, en el Explorador de soluciones, desplácese hasta el ejemplo iothub_client/samples/PNP/pnp_temperature_controller/ .
Haga clic con el botón derecho en el archivo pnp_temperature_controller.c y seleccione Add Debug Configuration (Agregar configuración de depuración). Seleccione Predeterminado.
Visual Studio abre el archivo launch.vs.json. Edite este archivo como se muestra en el siguiente fragmento de código para establecer las variables de entorno necesarias. Anotó el identificador de ámbito y la clave principal de inscripción cuando completó Configuración del entorno para las guías de inicio rápido y los tutoriales de 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>" } } ] }
Haga clic con el botón derecho en el archivo pnp_temperature_controller.c y seleccione Establecer como elemento de inicio.
Para realizar el seguimiento de la ejecución del código en Visual Studio, agregue un punto de interrupción a la función
main
en el archivomain
.Ahora puede ejecutar y depurar el ejemplo desde el menú Depurar.
El dispositivo ya está listo para recibir comandos y actualizaciones de propiedades, y ha empezado a enviar datos de telemetría al centro. Siga ejecutando el ejemplo a medida que complete los pasos siguientes.
En la línea de comandos, use cmake
.
Para compilar el ejemplo:
Cree una subcarpeta cmake en la carpeta raíz del SDK del dispositivo clonado y vaya a esa carpeta:
cd azure-iot-sdk-c mkdir cmake cd cmake
Ejecute los siguientes comandos para generar y compilar los archivos de proyecto del SDK y los ejemplos:
cmake .. cmake --build .
En Configuración del entorno, creó cuatro variables de entorno para configurar el ejemplo de modo que usara Device Provisioning Service (DPS) para conectarse a IoT Hub:
- IOTHUB_DEVICE_SECURITY_TYPE con el valor
DPS
- IOTHUB_DEVICE_DPS_ID_SCOPE con el ámbito del id. de DPS.
- IOTHUB_DEVICE_DPS_DEVICE_ID con el valor
my-pnp-device
. - IOTHUB_DEVICE_DPS_DEVICE_KEY con la clave principal de inscripción.
- IOTHUB_DEVICE_DPS_ENDPOINT con el valor
global.azure-devices-provisioning.net
.
Para más información sobre la configuración de ejemplo, consulte el archivo Léame de ejemplo.
Para ejecutar el ejemplo:
Desde la carpeta cmake, navegue hasta la carpeta que contiene el archivo ejecutable y ejecute lo siguiente:
# 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
El dispositivo ya está listo para recibir comandos y actualizaciones de propiedades, y ha empezado a enviar datos de telemetría al centro. Siga ejecutando el ejemplo a medida que complete los pasos siguientes.
Uso de Azure IoT Explorer para validar el código
Una vez iniciado el ejemplo de cliente de dispositivo, compruebe que funciona con la herramienta Azure IoT Explorer.
Abra el explorador Azure IoT.
En la página Centros de IoT, si aún no ha agregado una conexión al centro de IoT, seleccione + Agregar conexión. Escriba la cadena de conexión del centro de IoT que creó previamente y seleccione Guardar.
En la página IoT Plug and Play Settings (Configuración de IoT Plug and Play), seleccione + Agregar > Carpeta local y seleccione la carpeta local models donde guardó los archivos de modelo.
En la página Centros de IoT, haga clic en el nombre del centro con el que desea trabajar. Verá una lista de dispositivos registrados en el centro de IoT.
Haga clic en el Id. de dispositivo del dispositivo que creó anteriormente.
En el menú de la izquierda se muestran los diferentes tipos de información disponibles para el dispositivo.
Seleccione IoT Plug and Play components (Componentes de IoT Plug and Play) para ver la información del modelo del dispositivo.
Puede ver los distintos componentes del dispositivo. El componente predeterminado y los adicionales. Seleccione un componente con el que trabajar.
Seleccione la página Telemetría y haga clic en Iniciar para ver los datos de telemetría que envía el dispositivo para este componente.
Seleccione la página Propiedades (solo lectura) para ver las propiedades de solo lectura que se muestran para este componente.
Seleccione la página Properties (writable) (Propiedades [grabables]) para ver las propiedades grabables que puede actualizar para este componente.
Seleccione una propiedad por su nombre, escriba un nuevo valor para ella y seleccione Update desired value (Actualizar el valor deseado).
Para ver el nuevo valor, seleccione el botón Actualizar.
Seleccione la página Comandos para ver todos los comandos para este componente.
Seleccione el comando que desea probar para establecer el parámetro, si existe. Seleccione Enviar comando para llamar al comando en el dispositivo. Puede ver que el dispositivo responde al comando en la ventana del símbolo del sistema donde se está ejecutando el código de ejemplo.
Revisión del código
En este ejemplo se implementa un dispositivo controlador de temperatura IoT Plug and Play. En este ejemplo se implementa un modelo con varios componentes. El archivo de modelo del lenguaje de definición de gemelos digitales (DTDL) del dispositivo de temperatura define los datos de telemetría, las propiedades y los comandos que implementa el dispositivo.
Funciones auxiliares de IoT Plug and Play
En este ejemplo, el código usa algunas funciones auxiliares de la carpeta /common:
pnp_device_client_ll contiene el método de conexión para IoT Plug and Play con model-id
incluido como parámetro: PnP_CreateDeviceClientLLHandle
.
pnp_protocol: contiene las funciones auxiliares de IoT Plug and Play:
PnP_CreateReportedProperty
PnP_CreateReportedPropertyWithStatus
PnP_ParseCommandName
PnP_CreateTelemetryMessageHandle
PnP_ProcessTwinData
PnP_CopyPayloadToString
PnP_CreateDeviceClientLLHandle_ViaDps
Estas funciones auxiliares son lo suficientemente genéricas como para usarse en su propio proyecto. En este ejemplo se usan en los tres archivos correspondientes a cada componente del modelo:
- pnp_deviceinfo_component
- pnp_temperature_controller
- pnp_thermostat_component
Por ejemplo, en el archivo pnp_deviceinfo_component, la función SendReportedPropertyForDeviceInformation
usa dos de las funciones auxiliares:
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);
}
}
Cada componente del ejemplo sigue este patrón.
flujo de código
La función main
inicializa la conexión y envía el identificador del modelo:
deviceClient = CreateDeviceClientAndAllocateComponents();
El código usa PnP_CreateDeviceClientLLHandle
para conectarse al centro de IoT, establece modelId
como opción y configura el método de dispositivo y los controladores de devolución de llamada de dispositivos gemelos para métodos directos y actualizaciones de dispositivos gemelos:
g_pnpDeviceConfiguration.deviceMethodCallback = PnP_TempControlComponent_DeviceMethodCallback;
g_pnpDeviceConfiguration.deviceTwinCallback = PnP_TempControlComponent_DeviceTwinCallback;
g_pnpDeviceConfiguration.modelId = g_temperatureControllerModelId;
...
deviceClient = PnP_CreateDeviceClientLLHandle(&g_pnpDeviceConfiguration);
&g_pnpDeviceConfiguration
también contiene la información de conexión. La variable de entorno IOTHUB_DEVICE_SECURITY_TYPE determina si en el ejemplo se usa una cadena de conexión o el servicio de aprovisionamiento de dispositivos para conectarse a IoT Hub.
Cuando el dispositivo envía un identificador de modelo, se convierte en un dispositivo IoT Plug and Play.
Con los controladores de devolución de llamada colocados, el dispositivo reacciona a las actualizaciones de los dispositivos gemelos y a las llamadas a métodos directos:
En la devolución de llamada de dispositivos gemelos,
PnP_TempControlComponent_DeviceTwinCallback
llama a la funciónPnP_ProcessTwinData
para procesar los datos.PnP_ProcessTwinData
usa elPnP_ProcessTwinData
para analizar el archivo JSON y, luego, visita cada propiedad, mediante la llamada aPnP_TempControlComponent_ApplicationPropertyCallback
en cada elemento.En la devolución de llamada de los comandos, la función
PnP_TempControlComponent_DeviceMethodCallback
utiliza la función auxiliar para analizar los nombres de los comandos y componentes:PnP_ParseCommandName(methodName, &componentName, &componentNameSize, &pnpCommandName);
A continuación, la función
PnP_TempControlComponent_DeviceMethodCallback
llama al comando en el componente: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; }
La función main
inicializa las propiedades de solo lectura enviadas al centro de IoT:
PnP_TempControlComponent_ReportSerialNumber_Property(deviceClient);
PnP_DeviceInfoComponent_Report_All_Properties(g_deviceInfoComponentName, deviceClient);
PnP_TempControlComponent_Report_MaxTempSinceLastReboot_Property(g_thermostatHandle1, deviceClient);
PnP_TempControlComponent_Report_MaxTempSinceLastReboot_Property(g_thermostatHandle2, deviceClient);
La función main
entra en un bucle para actualizar los datos de eventos y telemetría de cada componente:
while (true)
{
PnP_TempControlComponent_SendWorkingSet(deviceClient);
PnP_ThermostatComponent_SendTelemetry(g_thermostatHandle1, deviceClient);
PnP_ThermostatComponent_SendTelemetry(g_thermostatHandle2, deviceClient);
}
La función PnP_ThermostatComponent_SendTelemetry
muestra cómo usar la estructura PNP_THERMOSTAT_COMPONENT
. En el ejemplo se usa esta estructura para almacenar información sobre los dos termostatos en el controlador de temperatura. El código usa la función PnP_CreateTelemetryMessageHandle
para preparar el mensaje y enviarlo:
messageHandle = PnP_CreateTelemetryMessageHandle(pnpThermostatComponent->componentName, temperatureStringBuffer);
...
iothubResult = IoTHubDeviceClient_LL_SendEventAsync(deviceClientLL, messageHandle, NULL, NULL);
Finalmente, la función main
destruye los distintos componentes y cierra la conexión al centro.
En este tutorial se muestra cómo compilar una aplicación de dispositivo IoT Plug and Play de ejemplo con componentes, cómo conectarla a un centro de IoT y cómo usar la herramienta Azure IoT Explorer para ver la información que envía al centro. La aplicación de ejemplo se escribe en C# y se incluye en el SDK de dispositivo IoT de Azure para C#. Un generador de soluciones puede usar la herramienta Azure IoT Explorer para comprender las funcionalidades de cualquier dispositivo IoT Plug and Play sin necesidad de ver nada de código del dispositivo.
En este tutorial, hizo lo siguiente:
- Descargue el código de ejemplo.
- Ha creado el código de ejemplo.
- Ha ejecutado la aplicación del dispositivo de ejemplo y confirmar que se conecta al centro de IoT.
- Ha revisado el código fuente.
Requisitos previos
Antes de continuar, asegúrese de que ha configurado el entorno, incluido el centro de IoT.
Para este tutorial se puede ejecutar Linux o Windows. Los comandos de shell de este tutorial siguen la convención de Linux para los separadores de ruta de acceso "/
". Si utiliza Windows, asegúrese de cambiar estos separadores por "\
".
- El SDK de .NET más reciente para su plataforma.
- Git.
Clonación del repositorio de SDK con el código de ejemplo
Si completó el Tutorial: Conexión a IoT Hub (C#) de una aplicación de ejemplo de dispositivo IoT Plug and Play que se ejecuta en Windows, ya ha clonado el repositorio.
Clone los ejemplos de Azure IoT del repositorio de GitHub para C#. Abra un símbolo del sistema en la carpeta de su elección. Ejecute el comando siguiente para clonar el repositorio de GitHub SDK de Microsoft Azure IoT para .NET:
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
Compilación del código
Ya puede compilar y ejecutar la muestra. Ejecute el siguiente comando para compilar la muestra:
cd azure-iot-sdk-csharp/iothub/device/samples/solutions/PnpDeviceSamples/TemperatureController
dotnet build
Ejecución del ejemplo de dispositivo
Para ejecutar el ejemplo, ejecute el siguiente comando:
dotnet run
El dispositivo ya está listo para recibir comandos y actualizaciones de propiedades, y ha empezado a enviar datos de telemetría al centro. Siga ejecutando el ejemplo a medida que complete los pasos siguientes.
Uso de Azure IoT Explorer para validar el código
Una vez iniciado el ejemplo de cliente de dispositivo, compruebe que funciona con la herramienta Azure IoT Explorer.
Abra el explorador Azure IoT.
En la página Centros de IoT, si aún no ha agregado una conexión al centro de IoT, seleccione + Agregar conexión. Escriba la cadena de conexión del centro de IoT que creó previamente y seleccione Guardar.
En la página IoT Plug and Play Settings (Configuración de IoT Plug and Play), seleccione + Agregar > Carpeta local y seleccione la carpeta local models donde guardó los archivos de modelo.
En la página Centros de IoT, haga clic en el nombre del centro con el que desea trabajar. Verá una lista de dispositivos registrados en el centro de IoT.
Haga clic en el Id. de dispositivo del dispositivo que creó anteriormente.
En el menú de la izquierda se muestran los diferentes tipos de información disponibles para el dispositivo.
Seleccione IoT Plug and Play components (Componentes de IoT Plug and Play) para ver la información del modelo del dispositivo.
Puede ver los distintos componentes del dispositivo. El componente predeterminado y los adicionales. Seleccione un componente con el que trabajar.
Seleccione la página Telemetría y haga clic en Iniciar para ver los datos de telemetría que envía el dispositivo para este componente.
Seleccione la página Propiedades (solo lectura) para ver las propiedades de solo lectura que se muestran para este componente.
Seleccione la página Properties (writable) (Propiedades [grabables]) para ver las propiedades grabables que puede actualizar para este componente.
Seleccione una propiedad por su nombre, escriba un nuevo valor para ella y seleccione Update desired value (Actualizar el valor deseado).
Para ver el nuevo valor, seleccione el botón Actualizar.
Seleccione la página Comandos para ver todos los comandos para este componente.
Seleccione el comando que desea probar para establecer el parámetro, si existe. Seleccione Enviar comando para llamar al comando en el dispositivo. Puede ver que el dispositivo responde al comando en la ventana del símbolo del sistema donde se está ejecutando el código de ejemplo.
Revisión del código
En este ejemplo se implementa un dispositivo controlador de temperatura IoT Plug and Play. El modelo que implementa este ejemplo usa varios componentes. El archivo de modelo del lenguaje de definición de gemelos digitales (DTDL) del dispositivo de temperatura define los datos de telemetría, las propiedades y los comandos que implementa el dispositivo.
El código del dispositivo se conecta al centro de IoT mediante el método CreateFromConnectionString
estándar. El dispositivo envía el identificador de modelo del modelo DTDL que implementa en la solicitud de conexión. Un dispositivo que envía un identificador de modelo es un dispositivo IoT Plug and Play:
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;
}
El identificador del modelo se almacena en el código tal y como se muestra en el siguiente fragmento de código:
private const string ModelId = "dtmi:com:example:TemperatureController;1";
Una vez que el dispositivo se conecta al centro de IoT, el código registra los controladores de comandos. El comando reboot
se define en el componente predeterminado. El comando getMaxMinReport
se define en cada uno de los dos componentes de termostato:
await _deviceClient.SetMethodHandlerAsync("reboot", HandleRebootCommandAsync, _deviceClient, cancellationToken);
await _deviceClient.SetMethodHandlerAsync("thermostat1*getMaxMinReport", HandleMaxMinReportCommandAsync, Thermostat1, cancellationToken);
await _deviceClient.SetMethodHandlerAsync("thermostat2*getMaxMinReport", HandleMaxMinReportCommandAsync, Thermostat2, cancellationToken);
Existen controladores independientes para las actualizaciones de propiedades deseadas en los dos componentes de termostato:
_desiredPropertyUpdateCallbacks.Add(Thermostat1, TargetTemperatureUpdateCallbackAsync);
_desiredPropertyUpdateCallbacks.Add(Thermostat2, TargetTemperatureUpdateCallbackAsync);
El código de ejemplo envía los datos de telemetría de cada componente de termostato:
await SendTemperatureAsync(Thermostat1, cancellationToken);
await SendTemperatureAsync(Thermostat2, cancellationToken);
El método SendTemperatureTelemetryAsync
usa la clase PnpHhelper
para crear mensajes para cada componente:
using Message msg = PnpHelper.CreateIothubMessageUtf8(telemetryName, JsonConvert.SerializeObject(currentTemperature), componentName);
La clase PnpHelper
contiene otros métodos de ejemplo que se pueden usar con un modelo de varios componentes.
Use la herramienta Azure IoT Explorer para ver los datos de telemetría y las propiedades de los dos componentes de termostato:
También puede usar la herramienta Azure IoT Explorer para llamar a comandos en cualquiera de los dos componentes de termostato o en el componente predeterminado.
En este tutorial se muestra cómo compilar una aplicación de dispositivo IoT Plug and Play de ejemplo con componentes, cómo conectarla a un centro de IoT y cómo usar la herramienta Azure IoT Explorer para ver la información que envía al centro. La aplicación de ejemplo se escribe en Java y se incluye en el SDK de dispositivo IoT de Azure para Java. Un generador de soluciones puede usar la herramienta Azure IoT Explorer para comprender las funcionalidades de cualquier dispositivo IoT Plug and Play sin necesidad de ver nada de código del dispositivo.
En este tutorial, hizo lo siguiente:
- Descargue el código de ejemplo.
- Ha creado el código de ejemplo.
- Ha ejecutado la aplicación del dispositivo de ejemplo y confirmar que se conecta al centro de IoT.
- Ha revisado el código fuente.
Requisitos previos
Antes de continuar, asegúrese de que ha configurado el entorno, incluido el centro de IoT.
Para este tutorial se puede ejecutar Linux o Windows. Los comandos de shell de este tutorial siguen la convención de Linux para los separadores de ruta de acceso "/
". Si utiliza Windows, asegúrese de cambiar estos separadores por "\
".
Para realizar este tutorial, instale el siguiente software en el entorno de desarrollo local:
Descargar el código
Si completó Tutorial: Conexión a IoT Hub (Java) de una aplicación de ejemplo del dispositivo IoT Plug and Play, ya ha clonado el repositorio.
Abra un símbolo del sistema en el directorio que prefiera. Ejecute el siguiente comando para clonar el repositorio de GitHub de las bibliotecas y los SDK de Azure IoT para Java en esta ubicación:
git clone https://github.com/Azure/azure-iot-sdk-java.git
Esta operación puede tardar varios minutos en completarse.
Compilación del código
Vaya a la carpeta raíz del ejemplo de controlador de temperatura en el repositorio del SDK de Java clonado y compílelo:
cd azure-iot-sdk-java/device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample
mvn clean package
Ejecución del ejemplo de dispositivo
En Configuración del entorno, creó cuatro variables de entorno para configurar el ejemplo de modo que usara Device Provisioning Service (DPS) para conectarse a IoT Hub:
- IOTHUB_DEVICE_SECURITY_TYPE con el valor
DPS
- IOTHUB_DEVICE_DPS_ID_SCOPE con el ámbito del id. de DPS.
- IOTHUB_DEVICE_DPS_DEVICE_ID con el valor
my-pnp-device
. - IOTHUB_DEVICE_DPS_DEVICE_KEY con la clave principal de inscripción.
- IOTHUB_DEVICE_DPS_ENDPOINT con el valor
global.azure-devices-provisioning.net
.
Para ejecutar la aplicación de ejemplo, vaya a la carpeta /device/iot-device-samples/pnp-device-sample/temperature-controller-device-sample y ejecute el siguiente comando:
mvn exec:java -Dexec.mainClass="samples.com.microsoft.azure.sdk.iot.device.TemperatureController"
El dispositivo ya está listo para recibir comandos y actualizaciones de propiedades, y ha empezado a enviar datos de telemetría al centro. Siga ejecutando el ejemplo a medida que complete los pasos siguientes.
Uso de Azure IoT Explorer para validar el código
Una vez iniciado el ejemplo de cliente de dispositivo, compruebe que funciona con la herramienta Azure IoT Explorer.
Abra el explorador Azure IoT.
En la página Centros de IoT, si aún no ha agregado una conexión al centro de IoT, seleccione + Agregar conexión. Escriba la cadena de conexión del centro de IoT que creó previamente y seleccione Guardar.
En la página IoT Plug and Play Settings (Configuración de IoT Plug and Play), seleccione + Agregar > Carpeta local y seleccione la carpeta local models donde guardó los archivos de modelo.
En la página Centros de IoT, haga clic en el nombre del centro con el que desea trabajar. Verá una lista de dispositivos registrados en el centro de IoT.
Haga clic en el Id. de dispositivo del dispositivo que creó anteriormente.
En el menú de la izquierda se muestran los diferentes tipos de información disponibles para el dispositivo.
Seleccione IoT Plug and Play components (Componentes de IoT Plug and Play) para ver la información del modelo del dispositivo.
Puede ver los distintos componentes del dispositivo. El componente predeterminado y los adicionales. Seleccione un componente con el que trabajar.
Seleccione la página Telemetría y haga clic en Iniciar para ver los datos de telemetría que envía el dispositivo para este componente.
Seleccione la página Propiedades (solo lectura) para ver las propiedades de solo lectura que se muestran para este componente.
Seleccione la página Properties (writable) (Propiedades [grabables]) para ver las propiedades grabables que puede actualizar para este componente.
Seleccione una propiedad por su nombre, escriba un nuevo valor para ella y seleccione Update desired value (Actualizar el valor deseado).
Para ver el nuevo valor, seleccione el botón Actualizar.
Seleccione la página Comandos para ver todos los comandos para este componente.
Seleccione el comando que desea probar para establecer el parámetro, si existe. Seleccione Enviar comando para llamar al comando en el dispositivo. Puede ver que el dispositivo responde al comando en la ventana del símbolo del sistema donde se está ejecutando el código de ejemplo.
Revisión del código
En este ejemplo se implementa un dispositivo controlador de temperatura IoT Plug and Play. El modelo que implementa este ejemplo usa varios componentes. El archivo de modelo del lenguaje de definición de gemelos digitales (DTDL) del dispositivo de temperatura define los datos de telemetría, las propiedades y los comandos que implementa el dispositivo.
El código del dispositivo usa la clase DeviceClient
estándar para conectarse al centro de IoT. El dispositivo envía el identificador de modelo del modelo DTDL que implementa en la solicitud de conexión. Un dispositivo que envía un identificador de modelo es un dispositivo IoT Plug and Play:
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();
}
El identificador del modelo se almacena en el código tal y como se muestra en el siguiente fragmento de código:
private static final String MODEL_ID = "dtmi:com:example:Thermostat;1";
Una vez que el dispositivo se conecta al centro de IoT, el código registra los controladores de comandos.
deviceClient.subscribeToDeviceMethod(new MethodCallback(), null, new MethodIotHubEventCallback(), null);
Existen controladores independientes para las actualizaciones de propiedades deseadas en los dos componentes de termostato:
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);
El código de ejemplo envía los datos de telemetría de cada componente de termostato:
sendTemperatureReading(THERMOSTAT_1);
sendTemperatureReading(THERMOSTAT_2);
El método sendTemperatureReading
usa la clase PnpHhelper
para crear mensajes para cada componente:
Message message = PnpHelper.createIotHubMessageUtf8(telemetryName, currentTemperature, componentName);
La clase PnpHelper
contiene otros métodos de ejemplo que se pueden usar con un modelo de varios componentes.
Use la herramienta Azure IoT Explorer para ver los datos de telemetría y las propiedades de los dos componentes de termostato:
También puede usar la herramienta Azure IoT Explorer para llamar a comandos en cualquiera de los dos componentes de termostato o en el componente predeterminado.
En este tutorial se muestra cómo compilar una aplicación de dispositivo IoT Plug and Play de ejemplo con componentes, cómo conectarla a un centro de IoT y cómo usar la herramienta Azure IoT Explorer para ver la información que envía al centro. La aplicación de ejemplo se escribe para Node.js y se incluye en el SDK de dispositivo de Azure IoT Hub para Node.js. Un generador de soluciones puede usar la herramienta Azure IoT Explorer para comprender las funcionalidades de cualquier dispositivo IoT Plug and Play sin necesidad de ver nada de código del dispositivo.
En este tutorial, hizo lo siguiente:
- Descargue el código de ejemplo.
- Ha ejecutado la aplicación del dispositivo de ejemplo y confirmar que se conecta al centro de IoT.
- Ha revisado el código fuente.
Requisitos previos
Antes de continuar, asegúrese de que ha configurado el entorno, incluido el centro de IoT.
Para completar este tutorial, necesita Node.js en la máquina de desarrollo. Puede descargar la última versión recomendada para varias plataformas desde nodejs.org.
Puede verificar la versión actual de Node.js en el equipo de desarrollo con el comando siguiente:
node --version
Descargar el código
Si ha terminado el Tutorial: Conexión a IoT Hub (Node) de una aplicación de ejemplo de dispositivo IoT Plug and Play que se ejecuta en Windows, ya ha clonado el repositorio.
Abra un símbolo del sistema en el directorio que prefiera. Ejecute el siguiente comando para clonar el repositorio de GitHub del SDK de IoT de Microsoft Azure para Node.js en esta ubicación:
git clone https://github.com/Azure/azure-iot-sdk-node
Instalación de bibliotecas necesarias
Para compilar el código de ejemplo incluido, se usa el SDK del dispositivo. La aplicación que compila simula un dispositivo Plug and Play con varios componentes que se conecta a un centro de IoT. La aplicación envía datos de telemetría y propiedades, y recibe comandos.
- En una ventana del terminal local, vaya a la carpeta del repositorio clonado y luego a la carpeta /azure-iot-sdk-node/device/samples/javascript. Después, ejecute el siguiente comando para instalar las bibliotecas necesarias:
npm install
Este comando instala los archivos NPM pertinentes necesarios para ejecutar los ejemplos de la carpeta.
Revisión del código
Vaya a la carpeta azure-iot-sdk-node/device/samples/javascript.
La carpeta azure-iot-sdk-node/device/samples/javascript contiene el código de ejemplo del dispositivo controlador de temperatura IoT Plug and Play.
El código del archivo pnp_temperature_controller.js implementa un dispositivo controlador de temperatura IoT Plug and Play. El modelo que implementa este ejemplo usa varios componentes. El archivo de modelo del lenguaje de definición de gemelos digitales (DTDL) del dispositivo de temperatura define los datos de telemetría, las propiedades y los comandos que implementa el dispositivo.
Abra el archivo pnp_temperature_controller.js en un editor de código de su elección. En el código de ejemplo se muestra cómo:
Defina
modelId
que es el DTMI para el dispositivo que va a implementar. Este DTMI está definido por el usuario y debe coincidir con el DTMI del modelo de DTDL del controlador de temperatura.Implementar los componentes definidos en el modelo de DTDL del controlador de temperatura. Los componentes de un controlador de temperatura real deben implementar estas dos interfaces. Estas dos interfaces ya están publicadas en un repositorio central. En este ejemplo, las dos interfaces son:
- Thermostat
- Información del dispositivo desarrollada por Azure
Definir los nombres de los componentes. Este ejemplo tiene dos termostatos y un componente de información del dispositivo.
Defina los nombres de comando para los comandos a los que responde el dispositivo.
Definir la constante
serialNumber
.serialNumber
es fijo para todo dispositivo dado.Definir los controladores de comandos.
Definir las funciones para enviar respuestas de comandos.
Definir las funciones auxiliares para registrar las solicitudes de comandos.
Definir una función auxiliar para crear las propiedades.
Definir un agente de escucha para las actualizaciones de propiedades.
Definir una función para enviar datos de telemetría desde este dispositivo. Tanto los termostatos como el componente predeterminado envían datos de telemetría. Esta función recibe el nombre del componente como parámetro.
Definir una función
main
que:Usa el SDK de dispositivo para crear un cliente de dispositivo y conectarse a su centro de IoT. El dispositivo proporciona el
modelId
para que IoT Hub pueda identificar el dispositivo como dispositivo IoT Plug and Play.Inicia la escucha para las solicitudes de comandos mediante la función
onDeviceMethod
. La función configura un agente de escucha para las solicitudes de comandos desde el servicio:- El DTDL del dispositivo define los comandos
reboot
ygetMaxMinReport
. - La función
commandHandler
define cómo responde el dispositivo a un comando.
- El DTDL del dispositivo define los comandos
Comienza el envío de datos de telemetría mediante
setInterval
ysendTelemetry
.Usa la función
helperCreateReportedPropertiesPatch
para crear las propiedades, yupdateComponentReportedProperties
para actualizar las propiedades.Usa
desiredPropertyPatchListener
para escuchar las actualizaciones de propiedades.Deshabilita todos los agentes de escucha y las tareas, y sale del bucle al presionar Q o q.
En Configuración del entorno, creó cuatro variables de entorno para configurar el ejemplo de modo que usara Device Provisioning Service (DPS) para conectarse a IoT Hub:
- IOTHUB_DEVICE_SECURITY_TYPE con el valor
DPS
- IOTHUB_DEVICE_DPS_ID_SCOPE con el ámbito del id. de DPS.
- IOTHUB_DEVICE_DPS_DEVICE_ID con el valor
my-pnp-device
. - IOTHUB_DEVICE_DPS_DEVICE_KEY con la clave principal de inscripción.
- IOTHUB_DEVICE_DPS_ENDPOINT con el valor
global.azure-devices-provisioning.net
.
Para más información sobre la configuración de ejemplo, consulte el archivo Léame de ejemplo.
Ahora que ha visto el código, use el siguiente comando para ejecutar el ejemplo:
node pnp_temperature_controller.js
Verá la salida siguiente, lo que significa que el dispositivo ha comenzado a enviar datos de telemetría al concentrador y que ya está listo para recibir comandos y actualizaciones de propiedades.
Siga ejecutando el ejemplo a medida que complete los pasos siguientes.
Uso de Azure IoT Explorer para validar el código
Una vez iniciado el ejemplo de cliente de dispositivo, compruebe que funciona con la herramienta Azure IoT Explorer.
Abra el explorador Azure IoT.
En la página Centros de IoT, si aún no ha agregado una conexión al centro de IoT, seleccione + Agregar conexión. Escriba la cadena de conexión del centro de IoT que creó previamente y seleccione Guardar.
En la página IoT Plug and Play Settings (Configuración de IoT Plug and Play), seleccione + Agregar > Carpeta local y seleccione la carpeta local models donde guardó los archivos de modelo.
En la página Centros de IoT, haga clic en el nombre del centro con el que desea trabajar. Verá una lista de dispositivos registrados en el centro de IoT.
Haga clic en el Id. de dispositivo del dispositivo que creó anteriormente.
En el menú de la izquierda se muestran los diferentes tipos de información disponibles para el dispositivo.
Seleccione IoT Plug and Play components (Componentes de IoT Plug and Play) para ver la información del modelo del dispositivo.
Puede ver los distintos componentes del dispositivo. El componente predeterminado y los adicionales. Seleccione un componente con el que trabajar.
Seleccione la página Telemetría y haga clic en Iniciar para ver los datos de telemetría que envía el dispositivo para este componente.
Seleccione la página Propiedades (solo lectura) para ver las propiedades de solo lectura que se muestran para este componente.
Seleccione la página Properties (writable) (Propiedades [grabables]) para ver las propiedades grabables que puede actualizar para este componente.
Seleccione una propiedad por su nombre, escriba un nuevo valor para ella y seleccione Update desired value (Actualizar el valor deseado).
Para ver el nuevo valor, seleccione el botón Actualizar.
Seleccione la página Comandos para ver todos los comandos para este componente.
Seleccione el comando que desea probar para establecer el parámetro, si existe. Seleccione Enviar comando para llamar al comando en el dispositivo. Puede ver que el dispositivo responde al comando en la ventana del símbolo del sistema donde se está ejecutando el código de ejemplo.
En este tutorial se muestra cómo compilar una aplicación de dispositivo IoT Plug and Play de ejemplo con componentes, cómo conectarla a un centro de IoT y cómo usar la herramienta Azure IoT Explorer para ver la información que envía al centro. La aplicación de ejemplo está escrita en Python y se incluye en el SDK de dispositivo IoT de Azure para Python. Un generador de soluciones puede usar la herramienta Azure IoT Explorer para comprender las funcionalidades de cualquier dispositivo IoT Plug and Play sin necesidad de ver nada de código del dispositivo.
En este tutorial, hizo lo siguiente:
- Descargue el código de ejemplo.
- Ha ejecutado la aplicación del dispositivo de ejemplo y confirmar que se conecta al centro de IoT.
- Ha revisado el código fuente.
Requisitos previos
Antes de continuar, asegúrese de que ha configurado el entorno, incluido el centro de IoT.
Para este tutorial se puede ejecutar Linux o Windows. Los comandos de shell de este tutorial siguen la convención de Linux para los separadores de ruta de acceso "/
". Si utiliza Windows, asegúrese de cambiar estos separadores por "\
".
Para completar este tutorial, se necesita tener Python instalado en la máquina de desarrollo. Compruebe el SDK de Python de Azure IoT para ver los requisitos actuales de la versión de Python. Puede comprobar la versión de Python con el siguiente comando:
python --version
Puede descargar la última versión recomendada para varias plataformas desde python.org.
Descargar el código
El paquete azure-iot-device se publica como un PIP.
En el entorno local de Python, instale el paquete como se indica a continuación:
pip install azure-iot-device
Si completó el Tutorial: Conexión a IoT Hub (Python) de una aplicación de ejemplo de dispositivo IoT Plug and Play que se ejecuta en Windows, ya ha clonado el repositorio.
Clone el repositorio IoT del SDK de Python:
git clone --branch v2 https://github.com/Azure/azure-iot-sdk-python
Revisión del código
En este ejemplo se implementa un dispositivo controlador de temperatura IoT Plug and Play. El modelo que implementa este ejemplo usa varios componentes. El archivo de modelo del lenguaje de definición de gemelos digitales (DTDL) del dispositivo de temperatura define los datos de telemetría, las propiedades y los comandos que implementa el dispositivo.
La carpeta azure-iot-sdk-python/samples/pnp contiene el código de ejemplo para el dispositivo de IoT Plug and Play. Los archivos del ejemplo de controlador de temperatura son:
- temp_controller_with_thermostats.py
- pnp_helper.py
El controlador de temperatura tiene varios componentes y un componente predeterminado, basados en el modelo de DTDL del controlador de temperatura.
Abra el archivo temp_controller_with_thermostats.py en el editor de su elección. El código de este archivo:
Importa
pnp_helper.py
para obtener acceso a los métodos auxiliares.Define dos identificadores del modelo de gemelos digitales (DTMI) que representan de manera exclusiva dos interfaces diferentes, definidas en el modelo DTDL. Los componentes de un controlador de temperatura real deben implementar estas dos interfaces. Estas dos interfaces ya están publicadas en un repositorio central. El usuario debe conocer estos DTMI, que varía en función del escenario de implementación del dispositivo. En el ejemplo actual, estas dos interfaces representan:
- Un termostato
- Información del dispositivo desarrollada por Azure
Define el
model_id
de DTMI para el dispositivo que se esté implementando. El DTMI está definido por el usuario y debe coincidir con el DTMI en el archivo del modelo DTDL.Define los nombres asignados a los componentes en el archivo DTDL. Hay dos termostatos en el DTDL y un componente de información del dispositivo. También se define una constante denominada
serial_number
en el componente predeterminado. No se puede cambiarserial_number
de un dispositivo.Define las implementaciones del controlador de comandos. Estos controladores definen lo que hace el dispositivo cuando recibe solicitudes de comandos.
Define las funciones para crear una respuesta de comandos. Estas funciones definen cómo responde el dispositivo a las solicitudes de comandos. Puede crear funciones de respuesta de comandos si un comando tiene que devolver una respuesta personalizada al centro de IoT. Si no se proporciona una función de respuesta para un comando, se envía una respuesta genérica. En este ejemplo, solo el comando getMaxMinReport tiene una respuesta personalizada.
Define una función para enviar datos de telemetría desde este dispositivo. Tanto los termostatos como el componente predeterminado envían datos de telemetría. Esta función tiene un parámetro de nombre de componente opcional para que pueda identificar qué componente envió los datos de telemetría.
Define un agente de escucha para las solicitudes de comandos.
Define un agente de escucha para las actualizaciones de propiedades deseadas.
Tiene una función
main
que:Usa el SDK de dispositivo para crear un cliente de dispositivo y conectarse a su centro de IoT. El dispositivo envía el
model_id
para que el centro de IoT pueda identificar el dispositivo como dispositivo IoT Plug and Play.Usa la función
create_reported_properties
en el archivo auxiliar para crear las propiedades. Pase el nombre del componente, y las propiedades, como pares clave-valor a esta función.Actualiza las propiedades legibles de sus componentes mediante una llamada a
patch_twin_reported_properties
.Inicia la escucha para las solicitudes de comandos mediante la función
execute_command_listener
. La función configura un agente de escucha para las solicitudes de comandos desde el servicio. Al configurar el agente de escucha, debe proporcionarmethod_name
,user_command_handler
y uncreate_user_response_handler
opcional como parámetros.method_name
define la solicitud del comando. En este ejemplo, el modelo define los comandos reboot y getMaxMinReport.- La función
user_command_handler
define lo que debe hacer el dispositivo cuando recibe un comando. - La función
create_user_response_handler
crea una respuesta para enviar al centro de IoT cuando un comando se ejecuta correctamente. Puede ver esta respuesta en el portal. Si no se proporciona esta función, se envía una respuesta genérica al servicio.
Usa
execute_property_listener
para escuchar las actualizaciones de propiedades.Empieza a enviar datos de telemetría mediante
send_telemetry
. El código de ejemplo usa un bucle para llamar a tres funciones de envío de datos de telemetría. Se llama a cada una de ellas cada ocho segundosDeshabilita todos los agentes de escucha y las tareas, y sale del bucle al presionar Q o q.
En Configuración del entorno, creó cuatro variables de entorno para configurar el ejemplo de modo que usara Device Provisioning Service (DPS) para conectarse a IoT Hub:
- IOTHUB_DEVICE_SECURITY_TYPE con el valor
DPS
- IOTHUB_DEVICE_DPS_ID_SCOPE con el ámbito del id. de DPS.
- IOTHUB_DEVICE_DPS_DEVICE_ID con el valor
my-pnp-device
. - IOTHUB_DEVICE_DPS_DEVICE_KEY con la clave principal de inscripción.
- IOTHUB_DEVICE_DPS_ENDPOINT con el valor
global.azure-devices-provisioning.net
.
Para más información sobre la configuración de ejemplo, consulte el archivo Léame de ejemplo.
Use el siguiente comando para ejecutar el ejemplo:
python temp_controller_with_thermostats.py
El dispositivo de ejemplo envía mensajes de telemetría cada pocos segundos al centro de IoT.
Verá la salida siguiente, que indica que el dispositivo está enviando datos de telemetría al centro, y que ya está listo para recibir comandos y actualizaciones de propiedades.
Siga ejecutando el ejemplo a medida que complete los pasos siguientes.
Uso de Azure IoT Explorer para validar el código
Una vez iniciado el ejemplo de cliente de dispositivo, compruebe que funciona con la herramienta Azure IoT Explorer.
Abra el explorador Azure IoT.
En la página Centros de IoT, si aún no ha agregado una conexión al centro de IoT, seleccione + Agregar conexión. Escriba la cadena de conexión del centro de IoT que creó previamente y seleccione Guardar.
En la página IoT Plug and Play Settings (Configuración de IoT Plug and Play), seleccione + Agregar > Carpeta local y seleccione la carpeta local models donde guardó los archivos de modelo.
En la página Centros de IoT, haga clic en el nombre del centro con el que desea trabajar. Verá una lista de dispositivos registrados en el centro de IoT.
Haga clic en el Id. de dispositivo del dispositivo que creó anteriormente.
En el menú de la izquierda se muestran los diferentes tipos de información disponibles para el dispositivo.
Seleccione IoT Plug and Play components (Componentes de IoT Plug and Play) para ver la información del modelo del dispositivo.
Puede ver los distintos componentes del dispositivo. El componente predeterminado y los adicionales. Seleccione un componente con el que trabajar.
Seleccione la página Telemetría y haga clic en Iniciar para ver los datos de telemetría que envía el dispositivo para este componente.
Seleccione la página Propiedades (solo lectura) para ver las propiedades de solo lectura que se muestran para este componente.
Seleccione la página Properties (writable) (Propiedades [grabables]) para ver las propiedades grabables que puede actualizar para este componente.
Seleccione una propiedad por su nombre, escriba un nuevo valor para ella y seleccione Update desired value (Actualizar el valor deseado).
Para ver el nuevo valor, seleccione el botón Actualizar.
Seleccione la página Comandos para ver todos los comandos para este componente.
Seleccione el comando que desea probar para establecer el parámetro, si existe. Seleccione Enviar comando para llamar al comando en el dispositivo. Puede ver que el dispositivo responde al comando en la ventana del símbolo del sistema donde se está ejecutando el código de ejemplo.
Limpieza de recursos
Si está pensando en leer más artículos de desarrolladores de dispositivos, puede conservar los recursos que usó en este artículo y reutilizarlos. De lo contrario, puede eliminar los recursos que creó para este artículo a fin de evitar cargos adicionales.
Puede eliminar el centro y el dispositivo registrado a la vez si elimina todo el grupo de recursos con el siguiente comando de la CLI de Azure. No use este comando si estos recursos comparten un grupo de recursos con otros recursos que desee conservar.
az group delete --name <YourResourceGroupName>
Para eliminar solo la instancia de IoT Hub, ejecute el siguiente comando con la CLI de Azure:
az iot hub delete --name <YourIoTHubName>
Para eliminar solo la identidad del dispositivo que registró en IoT Hub, ejecute el comando siguiente mediante la CLI de Azure:
az iot hub device-identity delete --hub-name <YourIoTHubName> --device-id <YourDeviceID>
También puede que quiera quitar los archivos de ejemplo clonados de la máquina de desarrollo.
Pasos siguientes
En este tutorial ha aprendido a conectar un dispositivo IoT Plug and Play con componentes a un centro de IoT. Para obtener más información sobre los modelos de dispositivo IoT Plug and Play, consulte: