Comprender y resolver errores de Azure IoT Hub

En este artículo se describen las causas y las soluciones de los códigos de error comunes que puede encontrar al usar IoT Hub.

400027 ConnectionForcefullyClosedOnNewConnection

Es posible que vea el error 40027 si el dispositivo se desconecta e informa Communication_Error como ConnectionStatusChangeReason mediante el SDK de .NET y el tipo de transporte MQTT. O bien, la operación gemela del dispositivo a la nube (como las propiedades indicadas de lectura o revisión) o la invocación del método directo producen un error con el código 400027.

Este error se produce cuando otro cliente crea una conexión nueva para IoT Hub con la misma identidad, por lo que IoT Hub cierra la conexión anterior. IoT Hub no permite que más de un cliente se conecte con la misma identidad.

Para resolver este error, asegúrese de que cada cliente se conecta a IoT Hub mediante su propia identidad.

401003 IoTHubUnauthorized

En los registros, puede que vea un patrón de dispositivos que se están desconectando con el error 401003 IoTHubUnauthorized, seguido de 404104 DeviceConnectionClosedRemotely y que se conectan correctamente poco después.

O bien, las solicitudes a IoT Hub producen un error con uno de los siguientes mensajes de error:

  • Authorization header missing (Falta el encabezado de autorización)
  • IotHub '*' does not contain the specified device '*' ("*" en IotHub no contiene el dispositivo "*" especificado)
  • Authorization rule '*' does not allow access for '*' (La regla de autorización "*" no permite el acceso a "*")
  • Authentication failed for this device, renew token or certificate and reconnect (Error de autenticación para este dispositivo, renueve el token o el certificado y vuelva a realizar la conexión)
  • Thumbprint does not match configuration: Thumbprint: SHA1Hash=*, SHA2Hash=*; Configuration: PrimaryThumbprint=*, SecondaryThumbprint=* (La huella digital no coincide con la configuración: Thumbprint: SHA1Hash=*, SHA2Hash=*; Configuration: PrimaryThumbprint=*, SecondaryThumbprint=*)
  • La entidad de seguridad user@example.com no está autorizada para la operación GET en /exampleOperation debido a que no tiene permisos asignados

Este error se produce porque, con el protocolo MQTT, algunos SDK se basan en IoT Hub para emitir la desconexión cuando el token de SAS expira para saber cuándo actualizarlo. Por lo tanto,

  1. el token de SAS expira,
  2. IoT Hub lo reconoce y desconecta el dispositivo con 401003 IoTHubUnauthorized,
  3. el dispositivo completa la desconexión con 404104 DeviceConnectionClosedRemotely,
  4. el SDK de IoT genera un nuevo token de SAS y
  5. el dispositivo se vuelve a conectar con IoT Hub correctamente.

O bien, IoT Hub no ha podido autenticar el encabezado de autenticación, la regla o la clave. Esto puede deberse a cualquiera de los motivos citados en los síntomas.

Para resolver este error, si se usa el SDK de IoT para la conexión mediante la cadena de conexión del dispositivo, no es necesario realizar ninguna acción. El SDK de IoT regenera el token nuevo para volver a realizar la conexión tras la expiración del token de SAS.

La duración predeterminada del token es de 60 minutos en los SDK; sin embargo, para algunos SDK se puede configurar la duración y el umbral de renovación de los token. Además, los errores generados cuando un dispositivo se desconecta y se vuelve a conectar en la renovación de tokens difiere para cada SDK. Para más información, y para obtener información sobre cómo determinar qué SDK usa el dispositivo en los registros, consulte Comportamiento de desconexión de los dispositivos MQTT con los SDK de Azure IoT.

Para los desarrolladores de dispositivos, si el volumen de errores es un problema, cambie al SDK de C, que renueva el token de SAS antes de la expiración. Para AMQP, el token de SAS puede actualizarse sin desconexión.

En general, el mensaje de error presentado debe explicar cómo corregir el error. Si por alguna razón no tiene acceso a los detalles del mensaje de error, asegúrese de lo siguiente:

  • Que la firma de acceso compartido u otro token de seguridad que use no haya expirado.
  • En cuanto a la autenticación de certificados X.509, el certificado de dispositivo o el certificado de CA asociado al dispositivo no han expirado. Para obtener información sobre cómo registrar certificados de CA de X.509 con IoT Hub, consulte Configuración de la seguridad de X.509 en Azure IoT Hub.
  • Para realizar la autenticación de la huella digital del certificado X.509, la huella digital del certificado del dispositivo se registra con IoT Hub.
  • Que la credencial de autorización tiene el formato correcto para el protocolo utilizado. Para obtener más información, consulte Control del acceso a IoT Hub.
  • La regla de autorización empleada tiene permiso para la operación solicitada.
  • Para los últimos mensajes de error que comienzan por "entidad de seguridad...", este error se puede resolver asignando el nivel correcto de permiso de RBAC de Azure al usuario. Por ejemplo, un propietario de IoT Hub puede asignar el rol "Propietario de datos de IoT Hub", que proporciona todos los permisos. Pruebe este rol para resolver el problema de falta de permisos.

Nota

Algunos dispositivos pueden experimentar un problema de desfase de tiempo cuando el tiempo del dispositivo tiene una diferencia de más de cinco minutos respecto al servidor. Este error puede producirse cuando un dispositivo se ha estado conectando a un centro de IoT sin problemas durante semanas o incluso meses, pero después su conexión empieza a rechazarse continuamente. El error también puede ser específico de un subconjunto de dispositivos conectados al centro de IoT, ya que el desfase de tiempo puede producirse a diferentes velocidades en función de cuándo un dispositivo se active o se conecte por primera vez.

A menudo, el problema se corrige realizando una sincronización de tiempo mediante NTP o reiniciando el dispositivo (que puede realizar automáticamente una sincronización de hora durante la secuencia de arranque), lo que permite que el dispositivo se conecte de nuevo. Para evitar este error, configure el dispositivo para realizar una sincronización de hora periódica mediante NTP. Puede programar la sincronización para la sincronización diaria, semanal o mensual en función de la cantidad de desfase que sufra el dispositivo. Si no puede configurar una sincronización NTP periódica en el dispositivo, programe un reinicio periódico.

403002 IoTHubQuotaExceeded

Puede que vea que las solicitudes a IoT Hub produzcan el error 403002 IoTHubQuotaExceeded. Y en Azure Portal, la lista de dispositivos de IoT Hub no se carga.

Este error se suele producir cuando se supera la cuota de mensajes diaria de IoT Hub. Para resolver este error:

Un trabajo de importación en bloque también puede devolver este error cuando el número de dispositivos registrados en IoT Hub se aproxima o supera el límite de cuota de una instancia de IoT Hub. Para más información, vea Solución de problemas de trabajo de importación.

403004 DeviceMaximumQueueDepthExceeded

Al intentar enviar un mensaje de la nube al dispositivo, puede que vea que en la solicitud se produce un error 403004 o DeviceMaximumQueueDepthExceeded.

La causa subyacente de este error es que el número de mensajes puestos en cola para el dispositivo supera el límite de la cola.

La razón más probable de que se encuentre en este límite es que usa HTTPS para recibir el mensaje, lo que conduce al sondeo continuo mediante ReceiveAsync y ello da lugar a que IoT Hub limite la solicitud.

El patrón admitido para los mensajes de nube a dispositivo con HTTP es dispositivos conectados de forma intermitente que buscan mensajes con poca frecuencia (menos de cada 25 minutos). Para reducir la probabilidad de que se encuentre en el límite de la cola, cambie a AMQP o a MQTT para los mensajes de la nube al dispositivo.

O bien, mejore la lógica del lado del dispositivo para completar, rechazar o abandonar los mensajes en cola rápidamente o acortar el período de vida, o considere la posibilidad de enviar menos mensajes. Consulte Período de vida de un mensaje C2D.

Por último, considere el uso de la API para purgar la cola a fin de limpiar periódicamente los mensajes pendientes antes de que se alcance el límite.

403006 DeviceMaximumActiveFileUploadLimitExceeded

Puede que vea que se produce un error en la solicitud de carga del archivo con el código de error 403006 y un mensaje que indica que el número de solicitudes de carga de archivos activas no puede ser superior a 10.

Este error se produce porque cada cliente de dispositivo está limitado para cargas simultáneas de archivos. Puede superar fácilmente el límite si el dispositivo no notifica a IoT Hub cuando se completan las cargas de archivos. Este problema suele deberse a una red en el dispositivo no confiable.

Para resolver este error, asegúrese de que el dispositivo puede notificar rápidamente la finalización de la carga de archivos de IoT Hub. A continuación, intente reducir el TTL del token de SAS para la configuración de la carga de archivos.

404001 DeviceNotFound

Durante una comunicación de la nube al dispositivo (C2D), como el mensaje C2D, la actualización gemela o el método directo, puede que vea que la operación produce un error 404001 DeviceNotFound.

No se pudo realizar la operación porque IoT Hub no encuentra el dispositivo. El dispositivo no está registrado o está deshabilitado.

Para resolver este error, registre el identificador de dispositivo que usó y vuelva a intentarlo.

404103 DeviceNotOnline

Puede que vea que un método directo para un dispositivo produce un error 404103 DeviceNotOnline aunque este esté en línea.

Si está seguro de que el dispositivo está en línea y sigue apareciendo el error, es probable que el error se produjera porque la devolución de llamada del método directo no esté registrada en el dispositivo.

Para configurar el dispositivo correctamente para las devoluciones de llamada de método directo, consulte Control de un método directo en un dispositivo.

404104 DeviceConnectionClosedRemotely

Puede que vea que los dispositivos se desconectan a intervalos regulares (cada 65 minutos, por ejemplo) y aparece 404104 DeviceConnectionClosedRemotely en los registros de recursos de IoT Hub. A veces también aparece 401003 IoTHubUnauthorized y un evento de conexión correcta de dispositivo menos de un minuto después.

O bien, los dispositivos se desconectan de forma aleatoria y aparece 404104 DeviceConnectionClosedRemotely en los registros de recursos de IoT Hub.

O bien, muchos dispositivos se desconectan a la vez, se ve una interrupción en la métrica de dispositivos conectados (connectedDeviceCount) y hay más errores 404104 DeviceConnectionClosedRemotely y errores internos 500xxx en los registros de Azure Monitor de lo habitual.

Este error se puede producir porque el token de SAS para la conexión a IoT Hub ha expirado, lo que hace que IoT Hub desconecte el dispositivo. La conexión se restablece cuando el dispositivo actualiza el token. Por ejemplo, el token de SAS expira cada hora de forma predeterminada para el SDK de C, lo que puede provocar desconexiones periódicas. Para más información, consulte la 401003 IoTHubUnauthorized.

Estas son algunas posibilidades más:

  • El dispositivo perdió la conectividad de red durante más tiempo que la persistencia de MQTT, lo que produce un tiempo de espera de inactividad remoto. La configuración de la persistencia de MQTT puede ser diferente en cada dispositivo.
  • El dispositivo envió un restablecimiento en el nivel TCP/IP, pero no un paquete MQTT DISCONNECT en el nivel de la aplicación. Básicamente, el dispositivo cerró la conexión del socket subyacente de repente. A veces este problema se debe a errores en versiones anteriores del SDK de IoT de Azure.
  • La aplicación del dispositivo se ha bloqueado.

O bien, IoT Hub podría tener un problema transitorio. Consulte Error interno del servidor IoT Hub.

Para resolver este error:

Se recomienda el uso de los SDK de dispositivo IoT de Azure para administrar las conexiones de forma confiable. Para más información, consulte Administrar la conectividad y la mensajería confiable mediante los SDK de dispositivo de Azure IoT Hub.

409001 DeviceAlreadyExists

Al intentar registrar un dispositivo en IoT Hub, puede que vea que la solicitud genera un error 409001 DeviceAlreadyExists.

Este error se produce porque ya existe un dispositivo con el mismo identificador de dispositivo en el centro de IoT.

Para resolver este error, use otro identificador de dispositivo e inténtelo de nuevo.

409002 LinkCreationConflict

Puede que vea el error 409002 LinkCreationConflict en los registros junto con la desconexión del dispositivo o el error del mensaje de la nube al dispositivo.

Por lo general, este error se produce cuando IoT Hub detecta que un cliente tiene más de una conexión. De hecho, cuando llega una nueva solicitud de conexión para un dispositivo con una conexión existente, IoT Hub cierra la conexión existente con este error.

Lo más frecuentes es un problema independiente (como 404104 DeviceConnectionClosedRemotely) que hace que el dispositivo se desconecte. El dispositivo intenta restablecer la conexión inmediatamente, pero IoT Hub sigue teniendo en cuenta el dispositivo conectado. IoT Hub cierra la conexión anterior y registra el error.

O bien, la lógica del dispositivo defectuosa hace que el dispositivo establezca la conexión cuando ya hay una abierta.

Para resolver este error, busque otros errores en los registros que puede solucionar porque este error suele aparecer como un efecto secundario de un problema transitorio diferente. En caso contrario, asegúrese de emitir una nueva solicitud de conexión solo si la conexión se anula.

412002 DeviceMessageLockLost

Al intentar enviar un mensaje de la nube al dispositivo, puede que vea que en la solicitud se produce un error 412002 DeviceMessageLockLost.

Este error se produce porque cuando un dispositivo recibe un mensaje de la nube al dispositivo desde la cola (por ejemplo, con ReceiveAsync()), IoT Hub bloquea el mensaje durante un tiempo de expiración de bloqueo de un minuto. Si el dispositivo intenta completar el mensaje después de que expire el tiempo de expiración de bloqueo, IoT Hub genera esta excepción.

Si IoT Hub no recibe la notificación dentro de la duración del tiempo de expiración de bloqueo de un minuto, vuelve a establecer el mensaje en el estado En cola. El dispositivo puede intentar recibir el mensaje de nuevo. Para evitar que se produzca el error en el futuro, implemente la lógica del lado del dispositivo para completar el mensaje en un minuto tras recibirse. Este tiempo de espera de un minuto no se puede cambiar.

429001 ThrottlingException

Puede que vea que las solicitudes a IoT Hub producen el error 429001 ThrottlingException.

Este error se produce cuando los límites de ancho de banda de IoT Hub se han superado para la operación solicitada.

Para resolver este error, compruebe si está alcanzando el límite; para ello, compare la métrica Intentos de envío de mensajes de telemetría con los límites especificados antes. También puede comprobar la métrica Número de errores de limitación. Para obtener información sobre estas métricas, vea Métricas de telemetría de dispositivos. Para obtener información sobre cómo usar las métricas para facilitar la supervisión del centro de IoT, vea Supervisión de IoT Hub.

IoT Hub devuelve 429 ThrottlingException solo después de que se haya infringido el límite durante un período de tiempo demasiado largo. Esto es así para que los mensajes no se eliminen si el centro de IoT recibe ráfagas de tráfico. Mientras tanto, IoT Hub procesa los mensajes en la velocidad limitada de la operación, que podría ser lenta si hay mucho tráfico en el trabajo pendiente. Para más información, consulte Modelado del tráfico de IoT Hub.

Considere la posibilidad de escalar verticalmente la instancia de IoT Hub si alcanza los límites de cuota u otras limitaciones.

500xxx Errores internos

Puede que vea que la solicitud a IoT Hub produce un error que comienza con 500 y un tipo de "error de servidor". Las posibilidades son las siguientes:

  • 500001 ServerError: IoT Hub genera un error en el servidor.

  • 500008 GenericTimeout: IoT Hub no pudo completar la solicitud de conexión antes de agotar el tiempo de expiración.

  • ServiceUnavailable (sin código de error) : IoT Hub detectó un error interno.

  • InternalServerError (sin código de error) : IoT Hub detectó un error interno.

Puede haber varias causas para una respuesta de error 500xxx. En todos los casos, lo más probable es que el problema sea transitorio. Aunque el equipo de IoT Hub trabaja duro para mantener el SLA (Acuerdo de Nivel de Servicio), hay pequeños subconjuntos de nodos de IoT Hub que, en ocasiones, pueden experimentar errores transitorios. Cuando el dispositivo trata de conectarse a un nodo que está teniendo problemas, recibirá este error.

Para mitigar los errores 500xxx, ejecute un reintento desde el dispositivo. Para administrar automáticamente los reintentos, asegúrese de usar la versión más reciente de los SDK de Azure IoT. Consulte Control de errores transitorios para ver procedimientos recomendados sobre reintentos y cómo controlar errores transitorios.

Si el problema persiste, compruebe Resource Health y Estado de Azure para ver si IoT Hub tiene un problema conocido. También puede usar la característica de conmutación por error manual.

Si no hay ningún problema conocido y el problema continúa, póngase en contacto con el equipo de soporte técnico para que lo investigue.

503003 PartitionNotFound

Puede que vea que las solicitudes para IoT Hub producen el error 503003 PartitionNotFound.

Este error es interno a IoT Hub y es probable que sea transitorio. Consulte Error interno del servidor IoT Hub.

Para resolver este error, consulte Errores de servidor internos de IoT Hub.

504101 GatewayTimeout

Al intentar invocar un método directo desde IoT Hub para un dispositivo, puede que vea que se produce un error en la solicitud 504101 GatewayTimeout.

Este error se produce porque IoT Hub encontró un error y no pudo confirmar si el método directo se completó antes de que se agote el tiempo de espera. O bien, al usar una versión anterior del SDK de C# de Azure IoT (<1.19.0), el vínculo de AMQP entre el dispositivo e IoT Hub se puede anular silenciosamente debido a un error.

Para resolver este error, emita un reintento o actualice a la versión más reciente del SDK de C# de Azure IOT.