Compartir vía


Tutorial: Desarrollo de módulos de IoT Edge con contenedores de Linux mediante IoT Edge para Linux en Windows

Se aplica a:Marca de verificación de IoT Edge 1.5 IoT Edge 1.5 marca de verificación de IoT Edge 1.4 IoT Edge 1.4

Importante

IoT Edge 1.5 LTS e IoT Edge 1.4 LTS son versiones compatibles. IoT Edge 1.4 LTS finaliza el ciclo de vida el 12 de noviembre de 2024. Si está usando una versión anterior, consulte Actualización de IoT Edge.

En este tutorial se explica cómo desarrollar, depurar e implementar su propio código en un dispositivo Azure IoT Edge mediante IoT Edge para Linux en Windows y Visual Studio 2022. Conocerá el escenario de desarrollador más común para las soluciones de IoT Edge mediante la implementación de un módulo de C# en un dispositivo Linux. Implementará y depurará un módulo de IoT Edge personalizado que se ejecuta en un contenedor de Linux en Windows. Incluso si planea usar un lenguaje diferente o implementar un servicio de Azure, este tutorial sigue siendo útil para aprender sobre las herramientas y conceptos de desarrollo.

En este tutorial se incluyen los pasos para dos herramientas de desarrollo de IoT Edge:

  • La interfaz de la línea de comandos (CLI) de la CLI de Azure IoT Edge Dev Tool, que es la herramienta preferida para el desarrollo
  • La extensión Azure IoT Edge Tools para Visual Studio, que está en modo de mantenimiento

Use el botón selector al principio de este tutorial para seleccionar la versión de la herramienta.

En este tutorial, aprenderá a:

  • Configurar una máquina de desarrollo.
  • Use las herramientas de desarrollo de IoT Edge para crear un nuevo proyecto.
  • Compilar el proyecto como un contenedor y almacenarlo en un registro de contenedor de Azure.
  • Implementar el código en un dispositivo IoT Edge.

Prerrequisitos

En este tutorial se supone que usa una máquina que ejecuta Windows como máquina de desarrollo. En equipos Windows, puede desarrollar módulos de Windows o Linux. Este tutorial le guía por el desarrollo de contenedores de Linux mediante IoT Edge para Linux en Windows para compilar e implementar los módulos.

Antes de empezar:

  • Instale IoT Edge para Linux en Windows.

  • Lea el inicio rápido Implementación del primer módulo de IoT Edge en un dispositivo Windows.

  • Descargue el SDK de .NET Core.

  • Instalación o modificación de Visual Studio 2022 en la máquina de desarrollo. Elija las opciones de carga de trabajo Desarrollo de Azure y Desarrollo de escritorio con C++.

  • Una vez que la instalación de Visual Studio 2022 esté lista, descargue e instale Azure IoT Edge Tools desde Visual Studio Marketplace.

    Puede usar la extensión Azure IoT Edge Tools para crear y compilar la solución de IoT Edge. La herramienta de desarrollo preferida es la CLI de Azure IoT Edge Dev Tool. La extensión incluye las plantillas de proyecto de Azure IoT Edge que se usan para crear el proyecto de Visual Studio. Actualmente, debe instalar la extensión independientemente de la herramienta de desarrollo que use.

    Sugerencia

    Si usa Visual Studio 2019, descargue e instale Azure IoT Edge Tools para Visual Studio 2019 desde Visual Studio Marketplace.

  • Cree un centro de IoT gratis o de nivel estándar en Azure como un recurso en la nube.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Conceptos clave

En este tutorial se realiza un recorrido por el desarrollo de un módulo IoT Edge. Un módulo de IoT Edge es un contenedor que tiene código ejecutable. En un dispositivo IoT Edge se pueden implementar uno o varios módulos. Los módulos realizan tareas concretas, como la ingesta de datos de sensores, la limpieza y el análisis de datos, o el envío a un centro de IoT. Para más información, consulte Información sobre los módulos Azure IoT Edge.

Al desarrollar módulos de IoT Edge, es importante comprender la diferencia entre la máquina de desarrollo y el dispositivo IoT Edge de destino donde se implementará el módulo. El contenedor que cree para contener el código del módulo debe coincidir con el sistema operativo del dispositivo de destino.

Por ejemplo, el escenario más común es que alguien desarrolle un módulo en un equipo Windows que pretende tener como destino un dispositivo Linux que ejecute IoT Edge. En ese caso, el sistema operativo contenedor es Linux.

A medida que avance en este tutorial, tenga en cuenta la diferencia entre el sistema operativo de la máquina de desarrollo y el sistema operativo del contenedor. En este tutorial, usará el host de Windows para el desarrollo y IoT Edge para Linux en la máquina virtual (VM) Windows para compilar e implementar los módulos.

Este tutorial tiene como destino los dispositivos que ejecutan IoT Edge con contenedores de Linux. Puede usar el sistema operativo que prefiera, siempre que dicha máquina ejecute contenedores Linux. Se recomienda usar Visual Studio para el desarrollo con contenedores de Linux, así que es lo que se usa en este tutorial. También puede usar Visual Studio Code, aunque existen diferencias en la compatibilidad entre las dos herramientas. Para obtener más información, consulte Desarrollo de módulos de Azure IoT Edge mediante Visual Studio Code.

Configuración de la CLI de Docker y el motor de Docker para la conexión remota

Los módulos IoT Edge se empaquetan como contenedores, por lo que necesita un motor de contenedor en la máquina de desarrollo para crear y administrar los contenedores.

La máquina virtual de IoT Edge para Linux en Windows ya contiene una instancia del motor de Docker. En este tutorial se muestra cómo conectarse de forma remota desde la máquina para desarrolladores de Windows a la instancia de Docker de IoT Edge para Linux en la máquina virtual Windows. Con esta conexión remota, se quita la dependencia en el escritorio de Docker para Windows.

Configurar la CLI de Docker

El primer paso es configurar la CLI de Docker en la máquina de desarrollo de Windows para poder conectarse al motor remoto de Docker:

  1. Descargue la versión precompilada docker.exe de la CLI de Docker desde Chocolatey. También puede descargar el proyecto oficial de cli desde GitHub y compilarlo siguiendo las instrucciones del repositorio.

  2. Extraiga docker.exe en un directorio de la máquina de desarrollo; por ejemplo, C:\Docker\bin.

  3. Abra Acerca de su PC>Información del sistema>Configuración avanzada del sistema.

  4. Seleccione Avanzado>Variables de entorno. En Variables de usuario, seleccione Ruta de acceso.

  5. Edite la variable Ruta de acceso y agregue la ubicación de docker.exe.

  6. Abra una sesión de PowerShell con privilegios elevados.

  7. Compruebe que la CLI de Docker sea accesible mediante este comando:

    docker --version
    

    Si ha configurado correctamente todo, la salida del comando debe mostrar la versión de Docker. Debe tener un aspecto similar a Docker version 20.10.12, build e91ed57.

Configuración del motor de Docker

El segundo paso es configurar IoT Edge para Linux en el motor de Docker de máquina virtual Windows para aceptar conexiones externas y agregar las reglas de firewall adecuadas.

Advertencia

Exponer el motor de Docker a conexiones externas podría aumentar los riesgos de seguridad. Debe usar esta configuración solo con fines de desarrollo. Asegúrese de revertir la configuración a la configuración predeterminada una vez finalizado el desarrollo.

  1. Abra una sesión de PowerShell con privilegios elevados y ejecute los siguientes comandos:

    # Configure the IoT Edge for Linux on Windows VM Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the IoT Edge for Linux on Windows VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the IoT Edge for Linux on Windows VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    Esta es la salida de ejemplo:

    PS C:\> # Configure the IoT Edge for Linux on Windows virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the IoT Edge for Linux on Windows VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the IoT Edge for Linux on Windows VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    

Comprobación de la conexión

El último paso de configuración es probar la conexión de Docker al motor de Docker de IoT Edge para Linux en la máquina virtual Windows:

  1. Obtenga la dirección IP de IoT Edge para Linux en la máquina virtual Windows:

    Get-EflowVmAddr
    

    Sugerencia

    Si IoT Edge para Linux en la máquina virtual Windows se implementó sin una dirección IP estática, la dirección IP podría cambiar en los reinicios del sistema operativo host de Windows o los cambios de red. Asegúrese de que usa la dirección IP correcta para IoT Edge para Linux en la máquina virtual Windows cada vez que quiera establecer una conexión remota al motor de Docker.

    Esta es la salida de ejemplo:

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  2. Conéctese a IoT Edge para Linux en el motor de Docker de máquina virtual Windows y ejecute el contenedor de ejemplo de hello-world. Reemplace <EFLOW-VM-IP> por la dirección IP de la máquina virtual Windows de IoT Edge para Linux que obtuvo en el paso anterior.

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

    Cuando finalice la descarga del contenedor, el contenedor se ejecuta y genera esta salida:

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you're currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

Creación de un proyecto de Azure IoT Edge

La plantilla de proyecto de IoT Edge de Visual Studio crea una solución que puede implementar en dispositivos IoT Edge. Siga estos pasos para crear una solución de Azure IoT Edge y, a continuación, generar el primer módulo de esa solución. Cada solución de IoT Edge puede contener más de un módulo.

Importante

La estructura del proyecto de IoT Edge que crea Visual Studio no es la misma que la de Visual Studio Code.

Actualmente, la CLI de la herramienta de desarrollo de Azure IoT Edge no admite la creación del tipo de proyecto de Visual Studio. Debe usar la extensión Azure IoT Edge Tools para crear el proyecto de Visual Studio.

  1. En Visual Studio, cree un nuevo proyecto seleccionando Crear un nuevo proyecto en la página de inicio o seleccionando el botón Nuevo proyecto de la barra de herramientas.

  2. En la página Crear un proyecto, busque Azure IoT Edge. Seleccione el proyecto que coincida con la plataforma (módulo Linux IoT Edge) y la arquitectura del dispositivo IoT Edge y, a continuación, seleccione Siguiente.

  3. En la página Configurar el nuevo proyecto, escriba un nombre para el proyecto y especifique la ubicación y, luego, seleccione Crear.

  4. En el cuadro de diálogo Agregar módulo, seleccione el tipo de módulo que desea desarrollar. También puede seleccionar Existing module (Módulo existente) para agregar un módulo de IoT Edge ya existente a la implementación.

  5. En Nombre del módulo, especifique el nombre del módulo.

  6. En Url del repositorio, proporcione el nombre del repositorio de la imagen del módulo. Visual Studio rellena automáticamente el nombre del módulo con localhost:5000/<el nombre del módulo>. Reemplácelo por su propia información de registro.

    Utilice localhost si usa un registro de Docker local para realizar pruebas. Si va a usar Azure Container Registry, utilice el servidor de inicio de sesión de la configuración del registro. El servidor de inicio de sesión se parece a <nombre del registro>.azurecr.io. Reemplace solo la parte de la cadena localhost:5000, de modo que el resultado final sea similar a <nombre del Registro>.azurecr.io/<el nombre del módulo>.

  7. Seleccione Agregar para agregar el módulo al proyecto.

    Captura de pantalla de las selecciones para agregar una aplicación y un módulo a una solución de Visual Studio.

    Nota:

    Si tiene un proyecto de IoT Edge existente, puede cambiar la dirección URL del repositorio abriendo el archivo module.json. La dirección URL del repositorio se encuentra en la propiedad repository del archivo JSON.

Ahora tiene un proyecto y un módulo de IoT Edge en la solución Visual Studio.

Estructura de proyecto

La solución tiene dos carpetas de nivel de proyecto: una carpeta principal del proyecto y una carpeta de módulo. Por ejemplo, puede tener una carpeta de proyecto principal denominada AzureIotEdgeApp1 y una carpeta de módulo denominada IotEdgeModule1.

La carpeta principal del proyecto contiene el manifiesto de implementación. El manifiesto de implementación es un documento JSON que describe los módulos que se van a configurar en los dispositivos IoT Edge de destino.

La carpeta del módulo contiene un archivo para el código del módulo. Se denomina Program.cs o main.c, en función del idioma que elija. Esta carpeta también contiene un archivo denominado module.json que describe los metadatos del módulo. Varios archivos de Docker proporcionan la información necesaria para compilar el módulo como un contenedor de Windows o Linux.

Manifiesto de implementación del proyecto

El manifiesto de implementación que edita se denomina deployment.debug.template.json. Este archivo es una plantilla de un manifiesto de implementación de IoT Edge que define todos los módulos que se ejecutan en un dispositivo. El archivo también define cómo se comunican los módulos entre sí. Para más información sobre los manifiestos de implementación, consulte Obtenga información sobre cómo implementar módulos y establecer rutas.

La plantilla de implementación incluye:

  • Los dos módulos en tiempo de ejecución, edgeAgent y edgeHub.
  • Módulo personalizado que creó en este proyecto de Visual Studio.
  • Un módulo denominado SimulatedTemperatureSensor. Este módulo predeterminado genera datos simulados que puede usar para probar los módulos (o eliminar si no es necesario). Para ver cómo funciona el sensor de temperatura simulado, vea el código fuente de SimulatedTemperatureSensor.csproj.

Establecer la versión del entorno de ejecución de Azure IoT Edge

Actualmente, la versión del entorno de ejecución estable más reciente es la 1.4. Actualice la versión del entorno de ejecución de Azure IoT Edge a la versión estable más reciente o a la versión de destino para los dispositivos:

  1. En Explorador de soluciones, haga clic con el botón derecho en el nombre del proyecto principal y seleccione Establecer versión del entorno de ejecución de Azure IoT Edge.

    Captura de pantalla de las selecciones para establecer una versión del entorno de ejecución de Azure IoT Edge.

  2. Use el menú desplegable para elegir la versión en tiempo de ejecución que ejecutan los dispositivos IoT Edge. Después, seleccione Aceptar para guardar los cambios. Si no ha realizado ningún cambio, seleccione Cancelar.

    Actualmente, la extensión no incluye una selección para las versiones más recientes del entorno de ejecución. Si desea establecer la versión en tiempo de ejecución superior a la 1.2, abra el archivo de manifiesto de implementación de deployment.debug.template.json. Cambie la versión en tiempo de ejecución de las imágenes del módulo en tiempo de ejecución del sistema edgeAgent y edgeHub. Por ejemplo, si quiere usar la versión 1.4 del entorno de ejecución de IoT Edge, cambie las líneas siguientes en el archivo de manifiesto de implementación:

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       //...
    
  3. Si ha cambiado la versión, vuelva a generar el manifiesto de implementación haciendo clic con el botón derecho en el nombre del proyecto y seleccionando Generar implementación para IoT Edge. Este paso genera un manifiesto de implementación basado en la plantilla de implementación. El manifiesto aparece en la carpeta config del proyecto de Visual Studio.

  1. Abra el archivo de manifiesto de implementación deployment.debug.template.json.

  2. Cambie la versión en tiempo de ejecución de las imágenes del módulo en tiempo de ejecución del sistema edgeAgent y edgeHub. Por ejemplo, si desea usar la versión 1.4 del entorno de ejecución de IoT Edge, cambie las siguientes líneas en el archivo de manifiesto de implementación:

    "systemModules": {
        "edgeAgent": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
        //...
        "edgeHub": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
        //...
    

Configuración de la instancia remota del motor de Docker de Visual Studio 2022

Configure la extensión Azure IoT Edge Tools para usar el motor remoto de Docker que se ejecuta dentro de IoT Edge para Linux en la máquina virtual Windows:

  1. Seleccione Herramientas>Azure IoT Edge Tools>Configuración de Azure IoT Edge Tools.

  2. Reemplace el valor de localhost de DOCKER_HOST por la dirección IP de IoT Edge para Linux en la máquina virtual Windows. Si no recuerda la dirección IP, use el cmdlet IoT Edge para Linux en Windows PowerShell Get-EflowVmAddr para obtenerla. Por ejemplo, si la dirección IP de la máquina virtual Windows de IoT Edge para Linux es 172.20.1.100, el nuevo valor debe ser tcp://172.20.1.100:2375.

    Captura de pantalla de la configuración de las herramientas de IoT Edge

  3. Seleccione Aceptar.

Desarrollo de su módulo

Al agregar un nuevo módulo, este viene con un código predeterminado que está listo para crearse e implementarse en un dispositivo para que pueda empezar a realizar pruebas sin tener que modificar ningún código. El código del módulo se encuentra en la carpeta del módulo en un archivo denominado Program.cs (para C#) o main.c (para C).

En la solución predeterminada, los datos simulados del módulo SimulatedTemperatureSensor se enrutan al módulo. El módulo toma la entrada y la envía a Azure IoT Hub.

Cuando esté listo para personalizar la plantilla de módulo con su propio código, use los SDK de Azure IoT Hub para crear otros módulos que aborden las necesidades clave de las soluciones de IoT. Estas necesidades pueden incluir seguridad, administración de dispositivos y confiabilidad.

Compilación e inserción de un solo módulo

Normalmente, quiere probar y depurar cada módulo antes de ejecutarlo dentro de una solución completa con varios módulos. Dado que la solución compilará o depurará mediante el motor de Docker que se ejecuta dentro de la máquina virtual de IoT Edge para Linux en Windows, el primer paso consiste en compilar y publicar el módulo para habilitar la depuración remota:

  1. En Explorador de soluciones, seleccione la carpeta del proyecto del módulo (por ejemplo, myIotEdgeModule).

  2. Defina el módulo personalizado como el proyecto de inicio. En el menú, seleccione Proyecto>Establecer como proyecto de inicio.

  3. Para depurar el módulo de Linux de C#, debe actualizar el archivo Dockerfile.amd64.debug para habilitar el servicio SSH. Actualice el archivo Dockerfile.amd64.debug para usar la plantilla siguiente: Dockerfile para el módulo AMD64 de C# de Azure IoT Edge con compatibilidad con depuración remota.

    Nota:

    Al seleccionar Depurar, Visual Studio usa Dockerfile.(amd64|windows-amd64).debug para compilar imágenes de Docker. Este archivo incluye el depurador de línea de comandos de .NET Core VSDBG en la imagen de contenedor al compilarlo. Para los módulos de IoT Edge listos para producción, se recomienda usar la configuración de Versión que usa Dockerfile.(amd64|windows-amd64) sin VSDBG.

    Asegúrese de que en la última línea de la plantilla, ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"], el nombre del archivo DLL coincide con el nombre del proyecto de módulo de IoT Edge.

  4. Para establecer una conexión SSH con el módulo Linux, debe crear una clave RSA. Abra una sesión de PowerShell con privilegios elevados y ejecute los comandos siguientes para crear una nueva clave RSA. Guarde la clave RSA en la misma carpeta del módulo IoT Edge y asegúrese de que el nombre de la clave sea id_rsa.

    ssh-keygen -t RSA -b 4096 -m PEM
    

    Captura de pantalla del comando de PowerShell para crear una clave SSH.

  5. Si usa un registro privado como Azure Container Registry, use el siguiente comando de Docker para iniciar sesión en él. Puede obtener el nombre de usuario y la contraseña en la página Claves de acceso del registro en Azure Portal. Si usa un registro local, puede ejecutar un registro local.

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <Container Registry username> -p <Container Registry password> <Container Registry login server>
    
  1. En Explorador de soluciones, haga clic con el botón derecho en la carpeta del proyecto y seleccione Compilar e insertar módulos de IoT Edge. Este comando compila e inserta la imagen de Docker para cada módulo.

  2. Si usa un registro privado como Azure Container Registry, deberá agregar la información de inicio de sesión del registro a la configuración en tiempo de ejecución que se encuentra en el archivo deployment.template.json. Reemplace los marcadores de posición por el nombre de usuario, la contraseña y el nombre del registro reales del administrador de Container Registry.

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.io"
              }
            }
          }
    

    Nota:

    En este artículo se usan las credenciales de inicio de sesión de administrador para Azure Container Registry, que son convenientes para escenarios de desarrollo y prueba. Cuando esté listo para escenarios de producción, se recomienda una opción de autenticación con privilegios mínimos, como las entidades de servicio. Para obtener más información, vea Administración del acceso al registro de contenedor.

  3. Es necesario exponer el puerto 22 para acceder al servicio SSH del módulo. En este tutorial se usa 10022 como puerto host, pero puede especificar otro puerto. El puerto que especifique se usará como puerto SSH para conectarse al módulo de C# de Linux. Debe agregar la información del puerto SSH a createOptions para esta configuración de módulo de Linux en el archivo deployment.debug.template.json:

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. En Explorador de soluciones, haga clic con el botón derecho en la carpeta del proyecto y seleccione Generar implementación para IoT Edge para compilar el nuevo archivo JSON de implementación de IoT Edge.

  5. Seleccione Ver>Cloud Explorer. Asegúrese de que ha iniciado sesión en Visual Studio 2019.

  6. En Cloud Explorer, expanda la suscripción y busque Azure IoT Hub y el dispositivo Azure IoT Edge que quiera implementar.

  7. Haga clic con el botón derecho en el dispositivo IoT Edge y seleccione Crear implementación. Vaya al manifiesto de implementación de depuración configurado para la plataforma. Se encuentra en la carpeta config de la solución de Visual Studio, como deployment.amd64.json.

Compilación de la imagen de Docker del módulo

Después de desarrollar el módulo, puede compilar la imagen del módulo para almacenarla en un registro de contenedor para su implementación en el dispositivo IoT Edge.

Use el Dockerfile del módulo para compilar la imagen de Docker del módulo:

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

Por ejemplo, supongamos que el shell de comandos está en el directorio del proyecto y el nombre del módulo es IotEdgeModule1. Para compilar la imagen del registro local o un registro de contenedor de Azure, use los siguientes comandos:

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure container registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

Insertar la imagen de Docker del módulo

Inserte la imagen del módulo en el registro local o en un registro de contenedor:

docker push <ImageName>

Por ejemplo:

# Push the Docker image to the local registry

docker push localhost:5000/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure container registry
az acr login --name myacr
docker push myacr.azurecr.io/iotedgemodule1:0.0.1-amd64

Implementación del módulo en el dispositivo de IoT Edge

En Visual Studio, abra el archivo de manifiesto de implementación deployment.debug.template.json en el proyecto principal.

Antes de la implementación, debe actualizar las credenciales de Azure Container Registry, las imágenes del módulo y los valores de createOptions adecuados. Para obtener más información sobre los valores de createOption, consulte Configuración de opciones de creación de contenedores para módulos de IoT Edge.

  1. Si usa una instancia de Azure Container Registry para almacenar la imagen del módulo, agregue las credenciales a deployment.debug.template.json en la configuración de edgeAgent. Por ejemplo:

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    //...
    
  2. Reemplace el valor de la propiedad image por el nombre de la imagen del módulo que insertó en el registro. Por ejemplo, si ha insertado una imagen etiquetada con myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 para el módulo personalizado IotEdgeModule1, reemplace el valor de la propiedad image por el valor de etiqueta.

  3. Agregue o reemplace el valor de createOptions por contenido con cadenas para cada sistema y módulo personalizado en la plantilla de implementación.

    Por ejemplo, la configuración de image y createOptions para IotEdgeModule1 sería similar al ejemplo siguiente:

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    
  4. Use el comando IoT Edge Azure CLI set-modules para implementar los módulos en el centro Azure IoT. Por ejemplo, para implementar los módulos definidos en el archivo deployment.debug.amd64.json en el centro de IoT my-iot-hub para el dispositivo IoT Edge my-device, use el siguiente comando:

    az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"
    

    Sugerencia

    Puede encontrar la cadena de conexión de IoT Hub en Azure Portal en Azure IoT Hub>Configuración de seguridad>Directivas de acceso compartido.

  5. En Cloud Explorer, haga clic con el botón derecho en el dispositivo perimetral y actualice para confirmar que el nuevo módulo se está ejecutando, junto con los módulos $edgeAgent y $edgeHub.

Depuración de la solución

  1. En una sesión de PowerShell con privilegios elevados, ejecute los comandos siguientes:

    1. Obtenga el valor de moduleId, en función del nombre del módulo de C# de Linux. Reemplace el marcador de posición <iot-edge-module-name> por el nombre del módulo.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. Compruebe que $moduleId es correcto. Si la variable está vacía, asegúrese de que usa el nombre del módulo correcto.

    3. Inicio del servicio SSH dentro del contenedor de Linux:

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. Abra el puerto SSH del módulo en IoT Edge para Linux en la máquina virtual Windows. (En este tutorial se usa el puerto 10022).

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    Advertencia

    Por motivos de seguridad, cada vez que se reinicia IoT Edge para Linux en la máquina virtual Windows, se elimina la regla de tabla IP y vuelve a la configuración original. Además, debe volver a iniciar manualmente el servicio SSH del módulo.

  2. Después de iniciar correctamente el servicio SSH, seleccione Depurar>Asociar al proceso, establezca Tipo de conexión en SSH y establezca Destino de conexión en la dirección IP de IoT Edge para Linux en la máquina virtual Windows. Si no conoce la dirección IP de IoT Edge para Linux en la máquina virtual Windows, puede usar el cmdlet de PowerShell Get-EflowVmAddr.

    Escriba la dirección IP y, a continuación, seleccione la tecla Entrar. En la ventana emergente, escriba las siguientes configuraciones:

    Campo Value
    Nombre de host Dirección IP de IoT Edge para Linux en una máquina virtual Windows
    Puerto 10022 (o el que usó en la configuración de implementación)
    Nombre de usuario root
    Tipo de autenticación Clave privada
    Archivo de clave privada Ruta de acceso completa al valor de id_rsa que creó en un paso anterior
    Frase de contraseña Frase de contraseña usada para la clave que creó en un paso anterior
  3. Después de conectarse correctamente al módulo mediante SSH, puede elegir el proceso y seleccionar Asociar. Para el módulo de C#, debe elegir el proceso dotnet y Asociar a Administrado (CoreCLR). La primera vez puede tardar entre 10 y 20 segundos.

  4. Establezca un punto de interrupción para inspeccionar el módulo:

    • Si está desarrollando en C#, establezca un punto de interrupción en la función PipeMessage() en ModuleBackgroundService.cs.
    • Si usa C, establezca un punto de interrupción en la función InputQueue1Callback() en main.c.
  5. La salida de SimulatedTemperatureSensor debe redirigirse a input1 del módulo personalizado de C# de Linux. Debe desencadenarse el punto de interrupción. Puede inspeccionar las variables en la ventana Variables locales de Visual Studio.

    Captura de pantalla de cómo depurar un único módulo.

  6. Para detener la depuración, seleccione Ctrl+F5 o seleccione el botón Detener.

Limpieza de recursos

Si prevé seguir con el siguiente artículo recomendado, puede mantener los recursos y las configuraciones que ya ha creado y volverlos a utilizar. También puede seguir usando el mismo dispositivo de IoT Edge como dispositivo de prueba.

De lo contrario, elimine las configuraciones locales y los recursos de Azure que usó en este artículo para evitar cargos.

Eliminación de recursos de Azure

La eliminación de los recursos de Azure y de los grupos de recursos es un proceso irreversible. Asegúrese de no eliminar por accidente el grupo de recursos o los recursos equivocados. Si ha creado el centro de IoT en un grupo de recursos ya existente que tiene recursos que desea conservar, elimine solo el recurso del centro de IoT en sí en lugar de eliminar todo el grupo de recursos.

Para eliminar los recursos:

  1. Inicie sesión en Azure Portal y después seleccione Grupos de recursos.

  2. Seleccione el nombre del grupo de recursos que contiene los recursos de prueba de IoT Edge.

  3. Revise la lista de recursos que contiene el grupo de recursos. Si desea eliminar todos ellos, puede seleccionar Eliminar grupo de recursos. Si desea eliminar solo algunos de ellos, puede seleccionar cada recurso para eliminarlos individualmente.

Paso siguiente

En este tutorial, ha configurado Visual Studio en la máquina de desarrollo y ha implementado y depurado el primer módulo IoT Edge desde él. Ahora que conoce los conceptos básicos, intente agregar funcionalidad a un módulo para que pueda analizar los datos que pasan por él: