Tutorial: Aprovisionamiento para la geolatencia

En este tutorial se muestra cómo aprovisionar de forma segura múltiples dispositivos simulados de clave simétrica para un grupo de varios IoT Hub mediante una directiva de asignación. IoT Hub Device Provisioning Service (DPS) admite varios escenarios de asignación mediante sus directivas de asignación integradas y su compatibilidad con directivas de asignación personalizadas.

El aprovisionamiento para Geolocalización o Geolatencia es un escenario de asignación común. Como un dispositivo se mueve entre ubicaciones, la latencia de red se mejora mediante su aprovisionamiento en el centro de IoT más cercano a cada ubicación. En este escenario, se selecciona un grupo de centros de IoT, que abarcan varias regiones, para las inscripciones. La directiva de asignación integrada Latencia más baja está seleccionada para estas inscripciones. Esta directiva hace que Device Provisioning Service evalúe la latencia del dispositivo y determine el centro de IoT más cercano del grupo de centros de IOT.

En este tutorial se usa un ejemplo de dispositivo simulado del SDK de C para Azure IoT para demostrar cómo aprovisionar dispositivos entre regiones. Realizará los pasos siguientes:

  • Usar la CLI de Azure para crear dos centros de IoT regionales (Oeste de EE. UU. 2 y Este de EE. UU. ).
  • Crear una inscripción que aprovisione dispositivos basados en la geolocalización (latencia más baja)
  • Usar la CLI de Azure para crear dos VM de Linux regionales para actuar como dispositivos en las mismas regiones (Oeste de EE. UU. 2 y Este de EE. UU. ).
  • Configurar el entorno de desarrollo para el SDK de C para Azure IoT en ambas máquinas virtuales de Linux.
  • Simular los dispositivos y comprobar que se aprovisionan en el centro de IoT en la región más cercana.

Importante

Algunas regiones pueden aplicar, de vez en cuando, restricciones en la creación de Virtual Machines. En el momento de escribir esta guía, las regiones westus2 y eastus permitían la creación de VM. Si no puede crearlas en ninguna de esas regiones, puede probar otra región. Para más información sobre cómo elegir regiones geográficas de Azure al crear VM, consulte Regiones para máquinas virtuales en Azure.

Prerrequisitos

Creación de dos centros de IoT regionales

En esta sección, creará un grupo de recursos de Azure y dos nuevos recursos regionales de centro de IoT. Un centro de IoT será para la región Oeste de EE. UU. 2 y el otro para la región Este de EE. UU.

Importante

Le recomendamos que use este mismo grupo de recursos para todos los recursos creados en este tutorial. De esta forma, será más fácil limpiar al finalizar.

  1. En Azure Cloud Shell, cree un grupo de recursos con el comando az group create siguiente:

    az group create --name contoso-us-resource-group --location eastus
    
  2. Cree un centro de IoT en la ubicación eastus y agréguelo al grupo de recursos que creó con el siguiente comando az iot hub create (reemplace {unique-hub-name} por su propio nombre único):

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location eastus --sku S1
    

    Este comando puede tardar varios minutos en completarse.

  3. Ahora, cree un centro de IoT en la ubicación westus2 y agréguelo al grupo de recursos que creó con el siguiente comando az iot hub create (reemplace {unique-hub-name} por su propio nombre único):

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location westus2 --sku S1
    

    Este comando puede tardar varios minutos en completarse.

Creación de una inscripción para la geolatencia

En esta sección, creará un grupo de inscripción para sus dispositivos.

Para que sea más sencillo, en este tutorial se usa la atestación de clave simétrica con la inscripción. Con el fin de obtener una solución más segura, considere la posibilidad de usar la atestación de certificado X.509 con una cadena de confianza.

  1. Inicie sesión en Azure Portal y vaya a la instancia de Device Provisioning Service.

  2. Seleccione Administrar inscripciones de la sección Configuración del menú de navegación.

  3. Seleccione Agregar grupo de inscripción.

  4. En la pestaña Registro y aprovisionamiento de la página Agregar grupo de inscripción, proporcione la siguiente información para configurar los detalles del grupo de inscripción:

    Campo Descripción
    Atestación Seleccione Clave simétrica como Mecanismo de atestación.
    Configuración de clave simétrica Active la casilla Generar claves simétricas automáticamente.
    Nombre de grupo Asigne un nombre al grupo contoso-us-devices o proporcione su propio nombre de grupo. El nombre del grupo de inscripción es una cadena que no distingue mayúsculas de minúsculas (de hasta 128 caracteres) de caracteres alfanuméricos más los caracteres especiales: '-', '.', '_', ':'. El último carácter debe ser alfanumérico o un guion ('-').
  5. Seleccione Siguiente: centros de IoT.

  6. Siga estos pasos para agregar los dos centros de IoT al grupo de inscripción:

    1. En la pestaña Centros de IoT de la página Agregar grupo de inscripción, seleccione Agregar vínculo al centro de IoT de la sección Centros de IoT de destino.

    2. En la página Agregar vínculo al centro de IoT, seleccione el centro de IoT que creó en la región eastus y asígnele el acceso iothubowner.

    3. Seleccione Guardar.

    4. Seleccione Agregar vínculo al centro de IoT de nuevo y siga los mismos pasos para agregar el centro de IoT que creó en la región westus2.

    5. En el menú desplegable Centros de IoT de destino, seleccione ambos centros de IoT.

  7. En cuanto a Directiva de asignación, seleccione Latencia más baja.

  8. Seleccione Revisar + crear.

  9. En la pestaña Revisar y crear, compruebe todos los valores y seleccione Crear.

  10. Una vez creado el grupo de inscripción, seleccione su nombre contoso-us-devices de la lista de grupos de inscripción.

  11. Copie el valor de Clave principal. Esta clave se usará más adelante para generar claves de dispositivo únicas para ambos dispositivos simulados.

Creación de máquinas virtuales regionales de Linux

En esta sección, creará dos máquinas virtuales (VM) Linux regionales, una en Oeste de EE. UU. 2 y otra en Este de EE. UU. 2. Estas máquinas virtuales ejecutarán un ejemplo de simulación de dispositivo de cada región para demostrar el aprovisionamiento de dispositivos desde ambas regiones.

Para que la limpieza sea más sencilla, agregue estas máquinas virtuales al mismo grupo de recursos que contenga los centros de IoT que se hayan creado: contoso-us-resource-group.

  1. En Azure Cloud Shell, ejecute el siguiente comando para crear una VM de la región Este de EE. UU. después de realizar los siguientes cambios de parámetro en el comando:

    --name: escriba un nombre único para su máquina virtual de dispositivo regional del Este de EE. UU.

    --admin-username: use su propio nombre de usuario administrador.

    --admin-password: use su propia contraseña de administrador.

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceEast \
    --location eastus \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    Este comando tardará varios minutos en completarse.

  2. Cuando se haya completado el comando, copie el valor de publicIpAddress de la VM de la región Este de EE. UU.

  3. En Azure Cloud Shell, ejecute el comando para crear una VM de la región Oeste de EE. UU. 2 después de realizar los siguientes cambios de parámetro en el comando:

    --name: escriba un nombre único para su VM de dispositivo regional de Oeste de EE. UU. 2.

    --admin-username: use su propio nombre de usuario administrador.

    --admin-password: use su propia contraseña de administrador.

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceWest2 \
    --location westus2 \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    Este comando tardará varios minutos en completarse.

  4. Cuando se haya completado el comando, copie el valor de publicIpAddress de la VM de la región Oeste de EE. UU. 2.

  5. Abra dos shells de línea de comandos.

  6. Conéctese a una de las máquinas virtuales regionales en cada shell mediante SSH.

    Pase su nombre de usuario administrador y la dirección IP pública que ha copiado como parámetros para conectarse mediante SSH. Escriba la contraseña de administrador cuando se le pida.

    ssh contosoadmin@1.2.3.4
    
    contosoadmin@ContosoSimDeviceEast:~$
    
    ssh contosoadmin@5.6.7.8
    
    contosoadmin@ContosoSimDeviceWest:~$
    

Preparación del entorno de desarrollo del SDK de C para Azure IoT

En esta sección, clonará el SDK de C para Azure IoT en cada VM. El SDK contiene un ejemplo que simula el aprovisionamiento de dispositivos desde cada región.

Para cada VM:

  1. Instale CMake, g++ , gcc y Git mediante los siguientes comandos:

    sudo apt-get update
    sudo apt-get install cmake build-essential libssl-dev libcurl4-openssl-dev uuid-dev git-all
    
  2. Busque y copie el nombre de etiqueta de la versión más reciente del SDK.

  3. Clone el SDK de dispositivo IoT de Azure para C en ambas máquinas virtuales. Use la etiqueta que encontró en el paso anterior como valor del parámetro -b, por ejemplo: lts_01_2023.

    git clone -b <release-tag> 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.

  4. Cree una carpeta cmake dentro del repositorio y cambie a esa carpeta.

    mkdir ~/azure-iot-sdk-c/cmake
    cd ~/azure-iot-sdk-c/cmake
    
  5. Ejecute el siguiente comando para compilar una versión del SDK específica para su plataforma de cliente de desarrollo:

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    
  6. Una vez realizada la compilación, las últimas líneas de salida tendrán un aspecto similar al siguiente:

    -- IoT Client SDK Version = 1.7.0
    -- Provisioning SDK Version = 1.7.0
    -- Looking for include file stdint.h
    -- Looking for include file stdint.h - found
    -- Looking for include file stdbool.h
    -- Looking for include file stdbool.h - found
    -- target architecture: x86_64
    -- Performing Test CXX_FLAG_CXX11
    -- Performing Test CXX_FLAG_CXX11 - Success
    -- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so (found version "7.58.0")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so
    -- target architecture: x86_64
    -- iothub architecture: x86_64
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/contosoadmin/azure-iot-sdk-c/azure-iot-sdk-c
    

Derivación de las claves de dispositivo únicas

Al usar la atestación de clave simétrica con las inscripciones de grupos, no se usan las claves de grupo de inscripción directamente. En su lugar, se deriva una clave única de la clave del grupo de inscripción para cada dispositivo.

En esta parte del tutorial, generará una clave de dispositivo a partir de la clave maestra del grupo a fin de calcular un HMAC-SHA256 del id. de registro único para el dispositivo. A continuación, el resultado se convertirá al formato Base64.

Importante

No incluya la clave maestra del grupo en el código del dispositivo.

Para ambos dispositivoseastus y westus 2:

  1. Genere la clave única mediante openssl. Usará el siguiente script de shell de Bash (reemplace {primary-key} por la clave principal del grupo de inscripción que copió anteriormente y reemplace {contoso-simdevice} por su propio identificador de registro único para cada dispositivo. El id. de registro es una cadena que no distingue mayúsculas de minúsculas (de hasta 128 caracteres) de caracteres alfanuméricos más los caracteres especiales: '-', '.', '_', ':'. El último carácter debe ser alfanumérico o un guion ('-').

    KEY={primary-key}
    REG_ID={contoso-simdevice}
    
    keybytes=$(echo $KEY | base64 --decode | xxd -p -u -c 1000)
    echo -n $REG_ID | openssl sha256 -mac HMAC -macopt hexkey:$keybytes -binary | base64
    
  2. El script generará una salida similar a la clave siguiente:

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    
  3. Ahora, cada dispositivo tiene su propia clave de dispositivo derivada y su identificador de registro único para realizar la atestación de claves simétricas con el grupo de inscripción durante el proceso de aprovisionamiento.

Simulación de los dispositivos desde cada región

En esta sección, actualizará un ejemplo de aprovisionamiento en el SDK de C para Azure IoT para ambas VM regionales.

El código de ejemplo simula una secuencia de arranque de dispositivo que envía la solicitud de aprovisionamiento a la instancia de Device Provisioning Service. La secuencia de arranque hace que se reconozca y se asigne el dispositivo al centro de IoT más cercano según la latencia.

  1. En Azure Portal, seleccione la pestaña Información general para la instancia de Device Provisioning Service y anote el valor de Ámbito de id.

    Extraer información del punto de conexión del servicio de aprovisionamiento de dispositivos desde la hoja del portal.

  2. En las dos VM, abra ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c para su edición.

    vi ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c
    
  3. En ambas VM, busque la constante id_scope y reemplace el valor por el de Ámbito de id. que copió anteriormente.

    static const char* id_scope = "0ne00002193";
    
  4. En ambas VM, busque la definición de la función main() en el mismo archivo. Asegúrese de que la variable hsm_type esté establecida en SECURE_DEVICE_TYPE_SYMMETRIC_KEY tal como se muestra a continuación para que coincida con el método de atestación del grupo de inscripción.

    Guarde los cambios de los archivos en ambas máquinas virtuales.

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    //hsm_type = SECURE_DEVICE_TYPE_X509;
    hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  5. En las dos máquinas virtuales, encuentre la llamada a prov_dev_set_symmetric_key_info() en prov_dev_client_sample.c que se ha convertido en comentario.

    // Set the symmetric key if using they auth type
    //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
    

    Quite la marca del comentario en las llamadas de función y reemplace los valores de marcador de posición (incluidos los corchetes angulares) por los identificadores de registro únicos y las claves de dispositivo derivadas para cada dispositivo que derivó en la sección anterior. Las claves que se muestran a continuación son ejemplos de esto. Use las claves que generó anteriormente.

    Este de EE. UU:

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-east", "p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=");
    

    Oeste de EE. UU.:

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-west", "J5n4NY2GiBYy7Mp4lDDa5CbEe6zDU/c62rhjCuFWxnc=");
    
  6. En ambas VM, guarde el archivo.

  7. En ambas máquinas virtuales, vaya a la carpeta de ejemplo que se muestra a continuación y compile el ejemplo.

    cd ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/
    cmake --build . --target prov_dev_client_sample --config Debug
    
  8. Una vez que la compilación se realice correctamente, ejecute prov_dev_client_sample.exe en las dos máquinas virtuales para simular un dispositivo de cada región. Tenga en cuenta que cada dispositivo se asigna al centro de IoT más cercano a la región del dispositivo simulado.

    Ejecución de la simulación:

    ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample
    

    Salida de ejemplo de la máquina virtual de Este de EE. UU.:

    contosoadmin@ContosoSimDeviceEast:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-east-hub.azure-devices.net, deviceId: contoso-simdevice-east
    Press enter key to exit:
    
    

    Salida de ejemplo de la máquina virtual de Oeste de EE. UU.:

    contosoadmin@ContosoSimDeviceWest:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-west-hub.azure-devices.net, deviceId: contoso-simdevice-west
    Press enter key to exit:
    

Limpieza de recursos

Si tiene previsto seguir trabajando con los recursos creados en este tutorial, puede dejarlos. De lo contrario, realice los pasos siguientes para eliminar todos los recursos creados en este tutorial para evitar cargos innecesarios.

En estos pasos se supone que ha creado todos los recursos de este tutorial como se ha indicado en el mismo grupo de recursos denominado contoso-us-resource-group.

Importante

La eliminación de un grupo de recursos es irreversible. El grupo de recursos y todos los recursos contenidos en él se eliminan permanentemente. Asegúrese de no eliminar por accidente el grupo de recursos o los recursos equivocados. Si ha creado una instancia de IoT Hub en un grupo de recursos ya existente que contiene recursos que desea conservar, puede eliminar solo esa instancia en lugar de eliminar todo el grupo de recursos.

Para eliminar el grupo de recursos por nombre:

  1. Inicie sesión en Azure Portal.

  2. Seleccione Grupos de recursos.

  3. En el cuadro de texto Filtrar por nombre..., escriba el nombre del grupo de recursos que contiene los recursos: contoso-us-resource-group.

  4. A la derecha del grupo de recursos de la lista de resultados, haga clic en ... y, a continuación, en Eliminar grupo de recursos.

  5. Se le pedirá que confirme la eliminación del grupo de recursos. Escriba de nuevo el nombre del grupo de recursos para confirmar y, después, seleccione Eliminar. Transcurridos unos instantes, el grupo de recursos y todos los recursos que contiene se eliminan.

Pasos siguientes

Para más información sobre las directivas de asignación personalizadas, consulte