Uso de sombras en aplicaciones y servicios
En esta sección se describe cómo interactúa una aplicación o un servicio con el servicio Device Shadow de AWS IoT. En este ejemplo se supone que la aplicación o el servicio solo interactúan con la sombra y, a través de la sombra, con el dispositivo. Este ejemplo no incluye ninguna acción de administración, como la creación o eliminación de sombras.
En este ejemplo se utiliza la API REST del servicio Device Shadow de AWS IoT para interactuar con las sombras. A diferencia del ejemplo utilizado en Uso de sombras en dispositivos, que utiliza un modelo de comunicaciones de publicación/suscripción, este ejemplo utiliza el modelo de comunicaciones de solicitud/respuesta de la API REST. Esto significa que la aplicación o el servicio deben realizar una solicitud antes de poder recibir una respuesta de AWS IoT. Una desventaja de este modelo, sin embargo, es que no admite notificaciones. Si su aplicación o servicio requiere notificaciones oportunas de cambios en el estado del dispositivo, tenga en cuenta los protocolos MQTT o MQTT sobre WSS, que admiten el modelo de comunicación de publicación/suscripción, tal como se describe en Uso de sombras en dispositivos.
importante
Asegúrese de que el uso de las sombras por parte de la aplicación o servicio sea coherente y compatible con las implementaciones correspondientes en los dispositivos. Tenga en cuenta, por ejemplo, cómo se crean, actualizan y eliminan las sombras, y cómo se tratan las actualizaciones en el dispositivo y en las aplicaciones o servicios que acceden a la sombra. El diseño debe especificar claramente cómo se actualiza y notifica el estado del dispositivo, y cómo interactúan las aplicaciones y los servicios con el dispositivo y sus sombras.
La URL de la API REST para sombras con nombre es:
https://
endpoint
/things/thingName
/shadow?name=shadowName
y para una sombra sin nombre:
https://
endpoint
/things/thingName
/shadow
donde:
- punto de conexión
-
El punto de enlace que devuelve el comando de la CLI:
aws iot describe-endpoint --endpoint-type IOT:Data-ATS
- thingName
-
El nombre del objeto al que pertenece la sombra
- shadowName
-
El nombre de la sombra con nombre. Este parámetro no se utiliza con sombras sin nombre.
Inicialización de la aplicación o el servicio al conectarse a AWS IoT
Cuando la aplicación se conecta por primera vez a AWS IoT, debe enviar una solicitud HTTP GET a las URL de las sombras que utiliza para obtener el estado actual de las sombras que está utilizando. Esto le permite sincronizar la aplicación o el servicio con la sombra.
Procesamiento de cambios de estado mientras la aplicación o el servicio está conectado a AWS IoT
Mientras la aplicación o el servicio está conectado a AWS IoT, puede consultar el estado actual periódicamente enviando una solicitud HTTP GET en las URL de las sombras que utiliza.
Cuando un usuario final interactúa con la aplicación o el servicio para cambiar el estado del dispositivo, la aplicación o el servicio pueden enviar una solicitud HTTP POST a las URL de las sombras que utiliza para actualizar el estado desired
de la sombra. Esta solicitud devuelve el cambio que se aceptó, pero es posible que tenga que sondear la sombra realizando solicitudes HTTP GET hasta que el dispositivo haya actualizado la sombra con su nuevo estado.
Detección de un dispositivo conectado
Para determinar si un dispositivo está conectado actualmente, incluya una propiedad connected
en el documento de sombra y use un mensaje MQTT Last Will and Testament (LWT) para establecer la propiedad connected
en false
si un dispositivo está desconectado debido a un error.
nota
Los mensajes MQTT LWT enviados a temas reservados de AWS IoT (temas que comienzan por $) son omitidos por el servicio Device Shadow de AWS IoT. Sin embargo, los procesan los clientes suscritos y el motor de reglas de AWS IoT, por lo que deberá crear un mensaje LWT que se envíe a un tema no reservado y una regla que vuelva a publicar el mensaje MQTT LWT como un mensaje de actualización de sombra en el tema de actualización reservado de la sombra
. ShadowTopicPrefix
/update
Para enviar al servicio Device Shadow un mensaje LWT
-
Cree una regla que vuelva a publicar el mensaje MQTT LWT en el tema reservado. El siguiente ejemplo es una regla que escucha mensajes sobre el tema
my/things/myLightBulb/update
y lo vuelve a publicar en$aws/things/myLightBulb/shadow/update
.{ "rule": { "ruleDisabled": false, "sql": "SELECT * FROM 'my/things/myLightBulb/update'", "description": "Turn my/things/ into $aws/things/", "actions": [ { "republish": { "topic": "$$aws/things/myLightBulb/shadow/update", "roleArn": "arn:aws:iam:123456789012:role/aws_iot_republish" } } ] } }
-
Cuando el dispositivo se conecta a AWS IoT, registra un mensaje LWT en un tema no reservado para que la regla de republicación lo reconozca. En este ejemplo, ese tema es
my/things/myLightBulb/update
y establece la propiedad conectada enfalse
.{ "state": { "reported": { "connected":"false" } } }
-
Después de conectarse, el dispositivo publica un mensaje en su tema de actualización de sombra
$aws/things/myLightBulb/shadow/update
, para notificar su estado actual, que incluye establecer su propiedadconnected
entrue
.{ "state": { "reported": { "connected":"true" } } }
-
Antes de que el dispositivo se desconecte correctamente, publica un mensaje en su tema de actualización de sombras
$aws/things/myLightBulb/shadow/update
, para notificar su estado más reciente, que incluye establecer su propiedadconnected
enfalse
.{ "state": { "reported": { "connected":"false" } } }
-
Si el dispositivo se desconecta debido a un error, el agente de mensajes de AWS IoT publica el mensaje LWT del dispositivo en nombre del dispositivo. La regla de republicación detecta este mensaje y publica el mensaje de actualización de sombra para actualizar la propiedad
connected
de la sombra del dispositivo.