

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Eventos del ciclo de vida
<a name="life-cycle-events"></a>

AWS IoT puede publicar eventos del ciclo de vida sobre los temas de MQTT. Estos eventos están disponibles de forma predeterminada y no se pueden desactivar.

**nota**  
Es posible que los mensajes de ciclo de vida se envíen de forma desordenada. Puede que reciba mensajes duplicados.  
`thingName` solo se incluirá si el cliente se conecta mediante la característica [objeto exclusivo](exclusive-thing.md).

**Topics**
+ [Connect/Disconnect eventos](#connect-disconnect)
+ [Evento de error de intento de conexión](#connect-authfailure-event)
+ [Subscribe/Unsubscribe eventos](#subscribe-unsubscribe-events)

## Connect/Disconnect eventos
<a name="connect-disconnect"></a>

**nota**  
Con la indexación de flotas de AWS IoT Device Management, puede buscar cosas, ejecutar consultas agregadas y crear grupos dinámicos basados en Connect/Disconnect eventos de cosas. Para obtener más información, consulte [Indexación de flotas](https://docs.aws.amazon.com/iot/latest/developerguide/iot-indexing.html).

AWS IoT publica un mensaje sobre los siguientes temas de MQTT cuando un cliente se conecta o se desconecta:
+ `$aws/events/presence/connected/{{clientId}}`: un cliente se ha conectado al agente de mensajes.
+ `$aws/events/presence/disconnected/{{clientId}}`: un cliente se ha desconectado del agente de mensajes.

La siguiente es una lista de los elementos JSON incluidos en los connection/disconnection mensajes publicados en el `$aws/events/presence/connected/{{clientId}}` tema.

**clientId**  
El ID del cliente que se conecta o se desconecta.  
Los ID de cliente que contienen los símbolos \# o \+ no recibirán eventos del ciclo de vida.

**thingName**  
El nombre del objeto de IoT. `thingName` solo se incluirá si el cliente se conecta mediante la característica [objeto exclusivo](exclusive-thing.md).

**cliente InitiatedDisconnect**  
True si el cliente inició la desconexión. De lo contrario, devuelve false. Sólo se encuentra en mensajes de desconexión.

**disconnectReason**  
La razón por la que el cliente se está desconectando. Sólo se encuentra en mensajes de desconexión. La siguiente tabla contiene valores válidos e indica si el agente de mensajes enviará [mensajes Last Will and Testament (LWT)](mqtt.md#mqtt-lwt) cuando se produzca la desconexión.  


<table>
<thead>
  <tr><th>Motivo de desconexión</th><th>Description (Descripción)</th><th>El agente de mensajes enviará los mensajes LWT</th></tr>
</thead>
<tbody>
  <tr><td><code>AUTH_ERROR</code></td><td>El cliente no pudo autenticarse o la autorización devolvió un error.</td><td>Sí1</td></tr>
  <tr><td><code>CLIENT_INITIATED_DISCONNECT</code></td><td>El cliente indica que se desconectará. El cliente puede hacerlo enviando un paquete de <code>DISCONNECT</code> control MQTT o uno <code>Close frame</code> si el cliente está utilizando una WebSocket conexión.</td><td>No</td></tr>
  <tr><td><code>CLIENT_ERROR</code></td><td>El cliente hizo algo mal que provocó su desconexión. Por ejemplo, un cliente se desconectará por enviar más de un paquete <code>CONNECT</code> de MQTT en la misma conexión o si el cliente intenta publicar con una carga útil que supera el límite de carga útil.</td><td>Sí</td></tr>
  <tr><td><code>CONNECTION_LOST</code></td><td>La conexión cliente-servidor está cortada. Esto puede ocurrir durante un período de alta latencia de red o cuando se pierde la conexión a Internet.</td><td>Sí</td></tr>
  <tr><td><code>DUPLICATE_CLIENTID</code></td><td>El cliente está utilizando un ID de cliente que ya está en uso. En este caso, el cliente que ya está conectado se desconectará con esta razón de desconexión.</td><td>Sí</td></tr>
  <tr><td><code>FORBIDDEN_ACCESS</code></td><td>No se permite la conexión del cliente. Por ejemplo, un cliente con una dirección IP denegada no podrá conectarse.</td><td>Sí1</td></tr>
  <tr><td><code>MQTT_KEEP_ALIVE_TIMEOUT</code></td><td>Si no hay comunicación cliente-servidor para 1,5 veces el tiempo de mantenimiento del cliente, el cliente se desconecta.</td><td>Sí</td></tr>
  <tr><td><code>SERVER_ERROR</code></td><td>Desconectado debido a problemas inesperados del servidor.</td><td>Sí</td></tr>
  <tr><td><code>SERVER_INITIATED_DISCONNECT</code></td><td>El servidor desconecta de forma intencionada un cliente por razones operativas.</td><td>Sí</td></tr>
  <tr><td><code>API_INITIATED_DISCONNECT</code></td><td>El cliente se desconectó mediante la API <code>DeleteConnection</code>. </td><td>Sí2</td></tr>
  <tr><td><code>THROTTLED</code></td><td>El cliente se desconecta por exceder una limitación controlada.</td><td>Sí</td></tr>
  <tr><td><code>WEBSOCKET_TTL_EXPIRATION</code></td><td>El cliente está desconectado porque WebSocket ha estado conectado durante más tiempo que su valor de vida útil.</td><td>Sí</td></tr>
  <tr><td><code>CUSTOMAUTH_TTL_EXPIRATION</code></td><td>El cliente se desconecta porque se ha conectado más tiempo del valor de tiempo de vida de su autorizador personalizado.</td><td>Sí</td></tr>
</tbody>
</table>

1Si el dispositivo tiene una conexión activa antes de recibir este error.  
2Para evitar los mensajes de Last Will and Testament (LWT), establezca `preventWillMessage=true` para anular el comportamiento de envío de LWT predeterminado de la API `DeleteConnection`.

**eventType**  
El tipo de evento. Los valores válidos son `connected` o `disconnected`. 

**ipAddress**  
La dirección IP del cliente que se conecta. Puede estar en formato IPv4 o IPv6. Sólo se encuentra en los mensajes de conexión. 

**principalIdentifier**  
Las credenciales que se utilizan para la autenticación. En el caso de los certificados de autenticación mutua de TLS, se trata del ID de certificado. En cuanto a las demás conexiones, se trata de las credenciales de IAM.

**sessionIdentifier**  
Un identificador único a nivel mundial AWS IoT que existe durante toda la sesión.

**timestamp**  
Una aproximación de cuándo se produjo el evento.

**versionNumber**  
El número de versión del evento del ciclo de vida. Se trata de un valor entero largo que aumenta de forma monótona para cada conexión de un ID de cliente. El número de versión puede utilizarlo un suscriptor para deducir el orden de los eventos del ciclo de vida.  
Los mensajes de conexión y desconexión de una conexión de cliente tienen el mismo número de versión.  
El número de versión podría saltarse algunos valores y no se garantiza que se vaya a incrementar de forma coherente en 1 para cada evento.  
Si un cliente no se conecta durante aproximadamente una hora, el número de versión se restablece a 0. Para las sesiones persistentes, el número de versión se restablece a 0 después de que un cliente se haya desconectado durante un periodo mayor que el tiempo de vida (TTL) configurado para la sesión persistente.

Un mensaje de conexión tiene la siguiente estructura.

```
{
    "clientId": "186b5",
    "thingName": "exampleThing",
    "timestamp": 1573002230757,
    "eventType": "connected",
    "sessionIdentifier": "00000000-0000-0000-0000-000000000000",
    "principalIdentifier": "12345678901234567890123456789012",
    "ipAddress": "192.0.2.0",
    "versionNumber": 0
}
```

Un mensaje de desconexión tiene la siguiente estructura.

```
{
    "clientId": "186b5",
    "thingName": "exampleThing",
    "timestamp": 1573002340451,
    "eventType": "disconnected",
    "sessionIdentifier": "00000000-0000-0000-0000-000000000000",
    "principalIdentifier": "12345678901234567890123456789012",
    "clientInitiatedDisconnect": true,
    "disconnectReason": "CLIENT_INITIATED_DISCONNECT",
    "versionNumber": 0
}
```

### Gestión de desconexiones del cliente
<a name="reconnect"></a>

La práctica recomendada consiste siempre en tener implementado un estado de espera para los eventos del ciclo de vida, incluidos los mensajes [Last Will and Testament (LWT)](mqtt.md). Cuando se recibe un mensaje de desconexión, el código debe esperar un periodo de tiempo y verificar que un dispositivo sigue sin conexión antes de tomar cualquier medida. Una forma de hacerlo consiste en utilizar [colas con retraso de SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html). Cuando un cliente recibe un evento de ciclo de vida o un mensaje LWT, se puede poner en cola un mensaje (por ejemplo, durante 5 segundos). Cuando dicho mensaje está disponible y se procesa (por parte de Lambda u otro servicio), primero se puede comprobar si el dispositivo sigue sin conexión antes de tomar otras medidas.

## Evento de error de intento de conexión
<a name="connect-authfailure-event"></a>

AWS IoT publica un mensaje en el siguiente tema de MQTT cuando un cliente no está autorizado a conectarse o cuando se configura un testamento y testamento y el cliente no está autorizado a publicar en ese tema de última voluntad.

```
$aws/events/presence/connect_failed/{{clientId}}
```

A continuación, se muestra una lista de elementos JSON que se incluyen en los mensajes de autorización de conexión publicados en el tema de `$aws/events/presence/connect_failed/{{clientId}}`.

**clientId**  
El ID de cliente que intentó conectarse y que no pudo hacerlo.  
Los ID de cliente que contienen los símbolos \# o \+ no recibirán eventos del ciclo de vida.

**thingName**  
El nombre del objeto de IoT. `thingName` solo se incluirá si el cliente se conecta mediante la característica [objeto exclusivo](exclusive-thing.md).

**timestamp**  
Una aproximación de cuándo se produjo el evento.

**eventType**  
El tipo de evento. El valor válido es `connect_failed`.

**conectar FailureReason**  
El motivo por el que se produce un error en la conexión. El valor válido es `AUTHORIZATION_FAILED`.

**principalIdentifier**  
Las credenciales que se utilizan para la autenticación. En el caso de los certificados de autenticación mutua de TLS, se trata del ID de certificado. En cuanto a las demás conexiones, se trata de las credenciales de IAM.

**sessionIdentifier**  
Un identificador único a nivel mundial AWS IoT que existe durante toda la sesión.

**ipAddress**  
La dirección IP del cliente que se conecta. Puede estar en formato IPv4 o IPv6. Sólo se encuentra en los mensajes de conexión.

Un mensaje de error de conexión tiene la siguiente estructura.

```
{
    "clientId": "186b5",
    "thingName": "exampleThing",
    "timestamp": 1460065214626,
    "eventType": "connect_failed",
    "connectFailureReason": "AUTHORIZATION_FAILED",
    "principalIdentifier": "12345678901234567890123456789012",
    "sessionIdentifier": "00000000-0000-0000-0000-000000000000",
    "ipAddress" : "192.0.2.0"
}
```

## Subscribe/Unsubscribe eventos
<a name="subscribe-unsubscribe-events"></a>

AWS IoT publica un mensaje en el siguiente tema de MQTT cuando un cliente se suscribe o cancela la suscripción a un tema de MQTT:

```
$aws/events/subscriptions/subscribed/{{clientId}}
```

 o 

```
$aws/events/subscriptions/unsubscribed/{{clientId}}
```

Donde `clientId` es el ID de cliente MQTT que se conecta con el agente de mensajes de AWS IoT .

El mensaje publicado en este tema tiene la estructura siguiente:

```
{
    "clientId": "186b5",
    "thingName": "exampleThing",
    "timestamp": 1460065214626,
    "eventType": "subscribed" | "unsubscribed",
    "sessionIdentifier": "00000000-0000-0000-0000-000000000000",
    "principalIdentifier": "12345678901234567890123456789012",
    "topics" : ["foo/bar","device/data","dog/cat"]
}
```

A continuación, se ofrece una lista de elementos JSON que se encuentran en los mensajes suscritos y no suscritos publicados en los temas `$aws/events/subscriptions/subscribed/{{clientId}}` y `$aws/events/subscriptions/unsubscribed/{{clientId}}`.

clientId  
El ID del cliente que se suscribe o cancela su suscripción.  
Los ID de cliente que contienen los símbolos \# o \+ no recibirán eventos del ciclo de vida.

thingName  
El nombre del objeto de IoT. `thingName` solo se incluirá si el cliente se conecta mediante la característica [objeto exclusivo](exclusive-thing.md).

eventType  
El tipo de evento. Los valores válidos son `subscribed` o `unsubscribed`. 

principalIdentifier  
Las credenciales que se utilizan para la autenticación. En el caso de los certificados de autenticación mutua de TLS, se trata del ID de certificado. En cuanto a las demás conexiones, se trata de las credenciales de IAM.

sessionIdentifier  
Un identificador único a nivel mundial AWS IoT que existe durante toda la sesión.

timestamp  
Una aproximación de cuándo se produjo el evento.

temas  
Una matriz de los temas MQTT a los que se ha suscrito el cliente.

**nota**  
Es posible que los mensajes de ciclo de vida se envíen de forma desordenada. Puede que reciba mensajes duplicados.