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.
Publish/subscribe AWS IoT Core Mensajes MQTT
El servicio IPC de mensajería AWS IoT Core MQTT le permite enviar y recibir mensajes MQTT desde y hacia. AWS IoT Core Los componentes pueden publicar mensajes en temas AWS IoT Core y suscribirse a ellos para actuar sobre los mensajes de MQTT de otras fuentes. Para obtener más información sobre la AWS IoT Core implementación de MQTT, consulte MQTT en la AWS IoT Core Guía para desarrolladores.
nota
Este servicio de mensajería IPC de MQTT le permite intercambiar mensajes con él. AWS IoT Core Para obtener más información sobre cómo intercambiar mensajes entre componentes, consulte Publicar/suscribir mensajes locales.
Temas
Versiones mínimas de SDK
En la siguiente tabla se enumeran las versiones mínimas de los SDK que puede usar para publicar y suscribirse a los mensajes de MQTT de origen y destino. AWS IoT Core
| SDK | Versión mínima |
|---|---|
|
v1.0.0 |
|
|
Versión 1.2.10 |
|
|
Versión 1.5.3 |
|
|
Versión 1.17.0 |
|
|
Versión 1.12.0 |
Autorización
Para usar la mensajería AWS IoT Core MQTT en un componente personalizado, debe definir políticas de autorización que permitan al componente enviar y recibir mensajes sobre temas. Para obtener información sobre cómo definir las políticas de autorización, consulte Autorización de los componentes para realizar operaciones de IPC.
Las políticas de autorización para la mensajería en AWS IoT Core MQTT tienen las siguientes propiedades.
Identificador de servicio IPC: aws.greengrass.ipc.mqttproxy
| Operación | Description (Descripción) | Recursos |
|---|---|---|
|
|
Permite que un componente publique mensajes AWS IoT Core sobre los temas de MQTT que especifique. |
Una cadena de temas, por ejemplo, |
|
|
Permite que un componente se suscriba a mensajes AWS IoT Core sobre los temas que especifique. |
Una cadena de temas, por ejemplo, |
|
|
Permite a un componente publicar y suscribirse a los mensajes de AWS IoT Core MQTT para los temas que especifique. |
Una cadena de temas, por ejemplo, |
Comodín de MQTT en AWS IoT Core Políticas de autorización de MQTT
Puede utilizar caracteres comodín de MQTT en las políticas de autorización de AWS IoT Core MQTT IPC. Los componentes pueden publicar y suscribirse a temas que coincidan con el filtro de temas que usted permita en una política de autorización. Por ejemplo, si la política de autorización de un componente concede acceso a test/topic/#, el componente puede suscribirse a test/topic/#, publicar y suscribirse a test/topic/filter.
Variables de receta en AWS IoT Core Políticas de autorización de MQTT
Si usa la versión 2.6.0 o posterior del núcleo de Greengrass, puede usar la variable de receta {iot:thingName} en las políticas de autorización. Esta característica le permite configurar una política de autorización única para un grupo de dispositivos principales, de forma que cada dispositivo principal solo pueda acceder a los temas que contengan su propio nombre. Por ejemplo, puede permitir que un componente acceda al siguiente recurso de tema.
devices/{iot:thingName}/messages
Para obtener más información, consulte Variables de receta y Uso de variables de receta en las actualizaciones de combinación.
Ejemplos de políticas de autorización
Puede consultar los siguientes ejemplos de políticas de autorización con el fin de configurar las políticas de autorización para sus componentes.
ejemplo Ejemplo de política de autorización con acceso ilimitado
El siguiente ejemplo de política de autorización permite a un componente publicar y suscribirse a todos los temas.
ejemplo Ejemplo de política de autorización con acceso limitado
El siguiente ejemplo de política de autorización permite a un componente publicar y suscribirse a dos temas denominados factory/1/events y factory/1/actions.
ejemplo Ejemplo de política de autorización para un grupo de dispositivos principales
importante
En este ejemplo, se utiliza una característica que está disponible para la versión 2.6.0 y versiones posteriores del componente núcleo de Greengrass. El núcleo de Greengrass versión 2.6.0 suma compatibilidad con la mayoría de las variables de receta, por ejemplo: {iot:thingName}, en las configuraciones de componentes.
El siguiente ejemplo de política de autorización permite a un componente publicar y suscribirse a un tema que contenga el nombre del dispositivo principal que ejecuta el componente.
PublishToIoTCore
Publica un mensaje en MQTT AWS IoT Core sobre un tema.
Cuando publicas mensajes en MQTT AWS IoT Core, hay una cuota de 100 transacciones por segundo. Si supera esta cuota, los mensajes se ponen en cola para su procesamiento en el dispositivo de Greengrass. También hay una cuota de 512 KB de datos por segundo y una cuota de 20 000 publicaciones por segundo para toda la cuenta (2000 en algunas). Regiones de AWS Para obtener más información sobre el límite del agente de mensajes MQTT en AWS IoT Core, consulte Límites de protocolo y cuotas del agente de mensajes de AWS IoT Core.
Si superas estas cuotas, el dispositivo de Greengrass limita la publicación de mensajes a. AWS IoT Core Los mensajes se almacenan en un spooler de memoria. De forma predeterminada, la memoria asignada al spooler es de 2,5 Mb. Si el spooler se llena, se rechazan los mensajes nuevos. Puede aumentar el tamaño del spooler. Para obtener más información, consulte Configuración en la documentación del Núcleo de Greengrass. Para evitar llenar el espacio y tener que aumentar la memoria asignada, limite las solicitudes de publicación a no más de 100 solicitudes por segundo.
Si su aplicación necesita enviar mensajes a una velocidad mayor o mensajes más grandes, considere utilizar el Administrador de flujos para enviar mensajes a Kinesis Data Streams. El componente administrador de flujos está diseñado para transferir grandes volúmenes de datos a la Nube de AWS. Para obtener más información, consulte Administración de flujos de datos en los dispositivos principales de Greengrass.
Solicitud
Esta solicitud de operación tiene los siguientes parámetros:
topicName(Python:topic_name)-
El tema en el que se va a publicar el mensaje.
qos-
La QoS de MQTT que se va a utilizar. Esta enumeración,
QOS, tiene los siguientes valores:-
AT_MOST_ONCE: QoS 0. El mensaje MQTT se entrega como máximo una vez. -
AT_LEAST_ONCE: QoS 1. El mensaje MQTT se entrega como máximo una vez.
-
payload-
(Opcional) El mensaje se carga como un blob.
Las siguientes características están disponibles para la versión 2.10.0 y versiones posteriores del Núcleo de Greengrass cuando se utiliza MQTT 5. Estas características no se tienen en cuenta al utilizar MQTT 3.1.1. La siguiente tabla muestra la versión mínima del SDK del AWS IoT dispositivo que debe usar para acceder a estas funciones.
| SDK | Versión mínima |
|---|---|
| AWS IoT Device SDK para Python
|
Versión 1.15.0 |
| AWS IoT Device SDK para Java
|
Versión 1.13.0 |
| AWS IoT Device SDK para C++
|
Versión 1.24.0 |
| SDK de AWS IoT Device para JavaScript |
Versión 1.13.0 |
payloadFormat-
(Opcional) El formato de la carga útil del mensaje. Si no establece el
payloadFormat, se supone que el tipo esBYTES. Esta enumeración tiene los siguientes valores:-
BYTES: el contenido de la carga útil es un blob binario. -
UTF8: el contenido de la carga útil es una cadena de caracteres UTF8.
-
retain-
(Opcional) Indica si se debe configurar la opción de retención de MQTT en
truedurante la publicación. userProperties-
(Opcional) Una lista de objetos
UserPropertyespecíficos de la aplicación para enviar. El objetoUserPropertyse define de la siguiente manera:UserProperty: key: string value: string messageExpiryIntervalSeconds-
(Opcional) La cantidad de segundos antes de que el mensaje venza y el servidor lo elimine. Si no se establece este valor, el mensaje no vence.
correlationData-
(Opcional) Información agregada a la solicitud que se puede usar para asociar una solicitud a una respuesta.
responseTopic-
(Opcional) El tema que debe usarse para el mensaje de respuesta.
contentType-
(Opcional) Un identificador específico de la aplicación del tipo de contenido del mensaje.
Respuesta
Esta operación no proporciona ninguna información en su respuesta.
Ejemplos
En los ejemplos siguientes, se muestra cómo llamar a esta operación en código de componente personalizado.
SubscribeToIoTCore
Suscríbase a los mensajes de MQTT desde un AWS IoT Core tema o un filtro de temas. El software AWS IoT Greengrass Core elimina las suscripciones cuando el componente llega al final de su ciclo de vida.
Esta es una operación de suscripción en la que se suscribe a un flujo de mensajes de eventos. Para usar esta operación, defina un identificador de respuesta de flujo con funciones que gestionen los mensajes de eventos, los errores y el cierre del flujo. Para obtener más información, consulte Suscripción a los flujos de eventos de IPC.
Tipo de mensaje del evento: IoTCoreMessage
Solicitud
Esta solicitud de operación tiene los siguientes parámetros:
topicName(Python:topic_name)-
El tema al que se suscribe. Puede utilizar los comodines (
#y+) de los temas de MQTT para suscribirse a varios temas. qos-
La QoS de MQTT que se va a utilizar. Esta enumeración,
QOS, tiene los siguientes valores:-
AT_MOST_ONCE: QoS 0. El mensaje MQTT se entrega como máximo una vez. -
AT_LEAST_ONCE: QoS 1. El mensaje MQTT se entrega como máximo una vez.
-
Respuesta
Esta respuesta de operación contiene la siguiente información:
messages-
El flujo de mensajes MQTT. Este objeto,
IoTCoreMessage, contiene la siguiente información:message-
El mensaje MQTT. Este objeto,
MQTTMessage, contiene la siguiente información:topicName(Python:topic_name)-
El tema en el que se publicó el mensaje.
payload-
(Opcional) El mensaje se carga como un blob.
Las siguientes características están disponibles para la versión 2.10.0 y versiones posteriores del Núcleo de Greengrass cuando se utiliza MQTT 5. Estas características no se tienen en cuenta al utilizar MQTT 3.1.1. En la siguiente tabla se muestra la versión mínima del SDK del AWS IoT dispositivo que debes usar para acceder a estas funciones.
SDK Versión mínima AWS IoT Device SDK para Python v2 Versión 1.15.0 AWS IoT Device SDK para Java v2 Versión 1.13.0 AWS IoT Device SDK para C++ v2 Versión 1.24.0 SDK de AWS IoT Device para JavaScript v2 Versión 1.13.0 payloadFormat-
(Opcional) El formato de la carga útil del mensaje. Si no establece el
payloadFormat, se supone que el tipo esBYTES. Esta enumeración tiene los siguientes valores:-
BYTES: el contenido de la carga útil es un blob binario. -
UTF8: el contenido de la carga útil es una cadena de caracteres UTF8.
-
retain-
(Opcional) Indica si se debe configurar la opción de retención de MQTT en
truedurante la publicación. userProperties-
(Opcional) Una lista de objetos
UserPropertyespecíficos de la aplicación para enviar. El objetoUserPropertyse define de la siguiente manera:UserProperty: key: string value: string messageExpiryIntervalSeconds-
(Opcional) La cantidad de segundos antes de que el mensaje venza y el servidor lo elimine. Si no se establece este valor, el mensaje no vence.
correlationData-
(Opcional) Información agregada a la solicitud que se puede usar para asociar una solicitud a una respuesta.
responseTopic-
(Opcional) El tema que debe usarse para el mensaje de respuesta.
contentType-
(Opcional) Un identificador específico de la aplicación del tipo de contenido del mensaje.
Ejemplos
En los ejemplos siguientes, se muestra cómo llamar a esta operación en código de componente personalizado.
SubscribeToIoTCoreConnectionStatus
Utilice esta operación para suscribirse al estado de la conexión MQTT entre el dispositivo principal y. AWS IoT Core Tras suscribirse, recibirá el estado de la conexión actual como primer evento. Luego, recibirás un evento cada vez que el dispositivo principal se conecte o se desconecte AWS IoT Core.
Esta es una operación de suscripción en la que se suscribe a un flujo de mensajes de eventos. Para usar esta operación, defina un identificador de respuesta de flujo con funciones que gestionen los mensajes de eventos, los errores y el cierre del flujo. Para obtener más información, consulte Suscripción a los flujos de eventos de IPC.
Tipo de mensaje del evento: IoTCoreConnectionStatusEvent
nota
Esta operación no requiere una política de autorización, ya que se trata de una operación informativa y exclusivamente local que no expone los datos de los temas de MQTT. Puede ejecutar esta operación en sus componentes sin necesidad de introducir ninguna accessControl entrada en la receta del componente.
Solicitud
Esta solicitud de la operación no tiene parámetros.
Respuesta
Esta respuesta de operación contiene la siguiente información:
connectionStatusEvent(Python:connection_status_event)-
El
ConnectionStatusEventobjeto de cada transmisión.IoTCoreConnectionStatusEventEste objeto informa del estado de la conexión MQTT del dispositivo principal y contiene la siguiente información:status-
El estado de la conexión MQTT entre el dispositivo principal y. AWS IoT Core Esta enumeración,
ConnectionStatus, tiene los siguientes valores:-
CONNECTED— El dispositivo principal está conectado a AWS IoT Core. -
DISCONNECTED— El dispositivo principal está desconectado de AWS IoT Core.
-
Eventos de ejemplo
Cada evento de la transmisión es la serialización JSON de un IoTCoreConnectionStatusEvent objeto. La connectionStatusEvent clave identifica el tipo de evento de la transmisión.
Tras suscribirte, recibirás el siguiente ejemplo de evento cuando el dispositivo principal esté conectado a él AWS IoT Core. También recibirás este evento cuando se reanude la conexión.
{ "connectionStatusEvent": { "status": "CONNECTED" } }
Cuando el dispositivo principal pierde la conexión MQTT, recibirá el siguiente ejemplo de evento.
{ "connectionStatusEvent": { "status": "DISCONNECTED" } }
Ejemplos
Utilice los siguientes ejemplos para aprender a utilizar el servicio AWS IoT Core MQTT IPC en sus componentes.
La siguiente receta de ejemplo permite que el componente publique en todos los temas.
El siguiente ejemplo de aplicación en C++ muestra cómo utilizar el servicio AWS IoT Core MQTT IPC para publicar mensajes en él. AWS IoT Core
#include <iostream> #include <aws/crt/Api.h> #include <aws/greengrass/GreengrassCoreIpcClient.h> using namespace Aws::Crt; using namespace Aws::Greengrass; class IpcClientLifecycleHandler : public ConnectionLifecycleHandler { void OnConnectCallback() override { std::cout << "OnConnectCallback" << std::endl; } void OnDisconnectCallback(RpcError error) override { std::cout << "OnDisconnectCallback: " << error.StatusToString() << std::endl; exit(-1); } bool OnErrorCallback(RpcError error) override { std::cout << "OnErrorCallback: " << error.StatusToString() << std::endl; return true; } }; int main() { String message("Hello from the Greengrass IPC MQTT publisher (C++)."); String topic("test/topic/cpp"); QOS qos = QOS_AT_LEAST_ONCE; int timeout = 10; ApiHandle apiHandle(g_allocator); Io::EventLoopGroup eventLoopGroup(1); Io::DefaultHostResolver socketResolver(eventLoopGroup, 64, 30); Io::ClientBootstrap bootstrap(eventLoopGroup, socketResolver); IpcClientLifecycleHandler ipcLifecycleHandler; GreengrassCoreIpcClient ipcClient(bootstrap); auto connectionStatus = ipcClient.Connect(ipcLifecycleHandler).get(); if (!connectionStatus) { std::cerr << "Failed to establish IPC connection: " << connectionStatus.StatusToString() << std::endl; exit(-1); } while (true) { PublishToIoTCoreRequest request; Vector<uint8_t> messageData({message.begin(), message.end()}); request.SetTopicName(topic); request.SetPayload(messageData); request.SetQos(qos); auto operation = ipcClient.NewPublishToIoTCore(); auto activate = operation->Activate(request, nullptr); activate.wait(); auto responseFuture = operation->GetResult(); if (responseFuture.wait_for(std::chrono::seconds(timeout)) == std::future_status::timeout) { std::cerr << "Operation timed out while waiting for response from Greengrass Core." << std::endl; exit(-1); } auto response = responseFuture.get(); if (response) { std::cout << "Successfully published to topic: " << topic << std::endl; } else { // An error occurred. std::cout << "Failed to publish to topic: " << topic << std::endl; auto errorType = response.GetResultType(); if (errorType == OPERATION_ERROR) { auto *error = response.GetOperationError(); std::cout << "Operation error: " << error->GetMessage().value() << std::endl; } else { std::cout << "RPC error: " << response.GetRpcError() << std::endl; } exit(-1); } std::this_thread::sleep_for(std::chrono::seconds(5)); } return 0; }
La siguiente receta de ejemplo permite que el componente se suscriba a todos los temas.
El siguiente ejemplo de aplicación para C++ demuestra cómo utilizar el servicio AWS IoT Core MQTT IPC para suscribirse a los mensajes desde. AWS IoT Core
#include <iostream> #include <aws/crt/Api.h> #include <aws/greengrass/GreengrassCoreIpcClient.h> using namespace Aws::Crt; using namespace Aws::Greengrass; class IoTCoreResponseHandler : public SubscribeToIoTCoreStreamHandler { public: virtual ~IoTCoreResponseHandler() {} private: void OnStreamEvent(IoTCoreMessage *response) override { auto message = response->GetMessage(); if (message.has_value() && message.value().GetPayload().has_value()) { auto messageBytes = message.value().GetPayload().value(); std::string messageString(messageBytes.begin(), messageBytes.end()); std::string messageTopic = message.value().GetTopicName().value().c_str(); std::cout << "Received new message on topic: " << messageTopic << std::endl; std::cout << "Message: " << messageString << std::endl; } } bool OnStreamError(OperationError *error) override { std::cout << "Received an operation error: "; if (error->GetMessage().has_value()) { std::cout << error->GetMessage().value(); } std::cout << std::endl; return false; // Return true to close stream, false to keep stream open. } void OnStreamClosed() override { std::cout << "Subscribe to IoT Core stream closed." << std::endl; } }; class IpcClientLifecycleHandler : public ConnectionLifecycleHandler { void OnConnectCallback() override { std::cout << "OnConnectCallback" << std::endl; } void OnDisconnectCallback(RpcError error) override { std::cout << "OnDisconnectCallback: " << error.StatusToString() << std::endl; exit(-1); } bool OnErrorCallback(RpcError error) override { std::cout << "OnErrorCallback: " << error.StatusToString() << std::endl; return true; } }; int main() { String topic("test/topic/cpp"); QOS qos = QOS_AT_LEAST_ONCE; int timeout = 10; ApiHandle apiHandle(g_allocator); Io::EventLoopGroup eventLoopGroup(1); Io::DefaultHostResolver socketResolver(eventLoopGroup, 64, 30); Io::ClientBootstrap bootstrap(eventLoopGroup, socketResolver); IpcClientLifecycleHandler ipcLifecycleHandler; GreengrassCoreIpcClient ipcClient(bootstrap); auto connectionStatus = ipcClient.Connect(ipcLifecycleHandler).get(); if (!connectionStatus) { std::cerr << "Failed to establish IPC connection: " << connectionStatus.StatusToString() << std::endl; exit(-1); } SubscribeToIoTCoreRequest request; request.SetTopicName(topic); request.SetQos(qos); auto streamHandler = MakeShared<IoTCoreResponseHandler>(DefaultAllocator()); auto operation = ipcClient.NewSubscribeToIoTCore(streamHandler); auto activate = operation->Activate(request, nullptr); activate.wait(); auto responseFuture = operation->GetResult(); if (responseFuture.wait_for(std::chrono::seconds(timeout)) == std::future_status::timeout) { std::cerr << "Operation timed out while waiting for response from Greengrass Core." << std::endl; exit(-1); } auto response = responseFuture.get(); if (response) { std::cout << "Successfully subscribed to topic: " << topic << std::endl; } else { // An error occurred. std::cout << "Failed to subscribe to topic: " << topic << std::endl; auto errorType = response.GetResultType(); if (errorType == OPERATION_ERROR) { auto *error = response.GetOperationError(); std::cout << "Operation error: " << error->GetMessage().value() << std::endl; } else { std::cout << "RPC error: " << response.GetRpcError() << std::endl; } exit(-1); } // Keep the main thread alive, or the process will exit. while (true) { std::this_thread::sleep_for(std::chrono::seconds(10)); } operation->Close(); return 0; }
La siguiente receta de ejemplo permite que el componente publique en todos los temas.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCorePublisherRust", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that publishes MQTT messages to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCorePublisherRust:mqttproxy:1": { "policyDescription": "Allows access to publish to all topics.", "operations": ["aws.greengrass#PublishToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/publish_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCorePublisherRust/1.0.0/publish_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
El siguiente ejemplo de la aplicación Rust muestra cómo utilizar el servicio AWS IoT Core MQTT IPC para publicar mensajes en él. AWS IoT Core
use gg_sdk::{Qos, Sdk}; fn main() { let sdk = Sdk::init(); sdk.connect().expect("Failed to establish IPC connection"); let message = b"Hello, World"; let topic = "my/topic"; let qos = Qos::AtLeastOnce; sdk.publish_to_iot_core(topic, message, qos) .expect("Failed to publish to topic"); println!("Successfully published to topic: {topic}"); }
La siguiente receta de ejemplo permite que el componente se suscriba a todos los temas.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCoreSubscriberRust", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that subscribes to MQTT messages from IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCoreSubscriberRust:mqttproxy:1": { "policyDescription": "Allows access to subscribe to all topics.", "operations": ["aws.greengrass#SubscribeToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/subscribe_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCoreSubscriberRust/1.0.0/subscribe_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
El siguiente ejemplo de la aplicación Rust muestra cómo usar el servicio AWS IoT Core MQTT IPC para suscribirse a los mensajes desde. AWS IoT Core
use gg_sdk::{Qos, Sdk}; use std::{thread, time::Duration}; fn main() { let sdk = Sdk::init(); sdk.connect().expect("Failed to establish IPC connection"); let topic = "my/topic"; let qos = Qos::AtLeastOnce; let callback = |topic: &str, payload: &[u8]| { let message = String::from_utf8_lossy(payload); println!("Received new message on topic {topic}: {message}"); }; let _sub = sdk .subscribe_to_iot_core(topic, qos, &callback) .expect("Failed to subscribe to topic"); println!("Successfully subscribed to topic: {topic}"); // Keep the main thread alive, or the process will exit. loop { thread::sleep(Duration::from_secs(10)); } }
La siguiente receta de ejemplo permite que el componente publique en todos los temas.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCorePublisherC", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that publishes MQTT messages to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCorePublisherC:mqttproxy:1": { "policyDescription": "Allows access to publish to all topics.", "operations": ["aws.greengrass#PublishToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/sample_publish_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCorePublisherC/1.0.0/sample_publish_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
El siguiente ejemplo de aplicación en C muestra cómo utilizar el servicio AWS IoT Core MQTT IPC para publicar mensajes en él. AWS IoT Core
#include <gg/error.h> #include <gg/ipc/client.h> #include <gg/sdk.h> #include <stdio.h> #include <stdlib.h> int main(void) { gg_sdk_init(); GgError err = ggipc_connect(); if (err != GG_ERR_OK) { fprintf(stderr, "Failed to establish IPC connection.\n"); exit(-1); } GgBuffer message = GG_STR("Hello, World"); GgBuffer topic = GG_STR("my/topic"); uint8_t qos = 1; err = ggipc_publish_to_iot_core(topic, message, qos); if (err != GG_ERR_OK) { fprintf( stderr, "Failed to publish to topic: %.*s\n", (int) topic.len, topic.data ); exit(-1); } printf( "Successfully published to topic: %.*s\n", (int) topic.len, topic.data ); }
La siguiente receta de ejemplo permite que el componente se suscriba a todos los temas.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCoreSubscriberC", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that subscribes to MQTT messages from IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCoreSubscriberC:mqttproxy:1": { "policyDescription": "Allows access to subscribe to all topics.", "operations": ["aws.greengrass#SubscribeToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/sample_subscribe_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCoreSubscriberC/1.0.0/sample_subscribe_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
El siguiente ejemplo de aplicación en C demuestra cómo utilizar el servicio AWS IoT Core MQTT IPC para suscribirse a los mensajes desde. AWS IoT Core
#include <gg/error.h> #include <gg/ipc/client.h> #include <gg/sdk.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> static void on_subscription_response( void *ctx, GgBuffer topic, GgBuffer payload, GgIpcSubscriptionHandle handle ) { (void) ctx; (void) handle; printf( "Received new message on topic %.*s: %.*s\n", (int) topic.len, topic.data, (int) payload.len, payload.data ); } int main(void) { gg_sdk_init(); GgError err = ggipc_connect(); if (err != GG_ERR_OK) { fprintf(stderr, "Failed to establish IPC connection.\n"); exit(-1); } GgBuffer topic = GG_STR("my/topic"); uint8_t qos = 1; GgIpcSubscriptionHandle handle; err = ggipc_subscribe_to_iot_core( topic, qos, on_subscription_response, NULL, &handle ); if (err != GG_ERR_OK) { fprintf( stderr, "Failed to subscribe to topic: %.*s\n", (int) topic.len, topic.data ); exit(-1); } printf( "Successfully subscribed to topic: %.*s\n", (int) topic.len, topic.data ); // Keep the main thread alive, or the process will exit. while (1) { sleep(10); } // To stop subscribing, close the subscription handle. ggipc_close_subscription(handle); }
La siguiente receta de ejemplo permite que el componente publique en todos los temas.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCorePublisherCpp", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that publishes MQTT messages to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCorePublisherCpp:mqttproxy:1": { "policyDescription": "Allows access to publish to all topics.", "operations": ["aws.greengrass#PublishToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/sample_cpp_publish_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCorePublisherCpp/1.0.0/sample_cpp_publish_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
El siguiente ejemplo de aplicación para C++ muestra cómo utilizar el servicio AWS IoT Core MQTT IPC para publicar mensajes en él. AWS IoT Core
#include <gg/ipc/client.hpp> #include <iostream> int main() { auto &client = gg::ipc::Client::get(); auto error = client.connect(); if (error) { std::cerr << "Failed to establish IPC connection.\n"; exit(-1); } std::string_view message = "Hello, World"; std::string_view topic = "my/topic"; uint8_t qos = 1; error = client.publish_to_iot_core(topic, message, qos); if (error) { std::cerr << "Failed to publish to topic: " << topic << "\n"; exit(-1); } std::cout << "Successfully published to topic: " << topic << "\n"; }
La siguiente receta de ejemplo permite que el componente se suscriba a todos los temas.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCoreSubscriberCpp", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that subscribes to MQTT messages from IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCoreSubscriberCpp:mqttproxy:1": { "policyDescription": "Allows access to subscribe to all topics.", "operations": ["aws.greengrass#SubscribeToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/sample_cpp_subscribe_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCoreSubscriberCpp/1.0.0/sample_cpp_subscribe_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
El siguiente ejemplo de aplicación para C++ demuestra cómo utilizar el servicio AWS IoT Core MQTT IPC para suscribirse a los mensajes desde. AWS IoT Core
#include <gg/ipc/client.hpp> #include <unistd.h> #include <iostream> class ResponseHandler : public gg::ipc::IotTopicCallback { void operator()( std::string_view topic, gg::Buffer payload, gg::ipc::Subscription &handle ) override { (void) handle; std::cout << "Received new message on topic " << topic << ": " << payload << "\n"; } }; int main() { auto &client = gg::ipc::Client::get(); auto error = client.connect(); if (error) { std::cerr << "Failed to establish IPC connection.\n"; exit(-1); } std::string_view topic = "my/topic"; uint8_t qos = 1; static ResponseHandler handler; error = client.subscribe_to_iot_core(topic, qos, handler); if (error) { std::cerr << "Failed to subscribe to topic: " << topic << "\n"; exit(-1); } std::cout << "Successfully subscribed to topic: " << topic << "\n"; // Keep the main thread alive, or the process will exit. while (1) { sleep(10); } }