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.
Publicar/suscribir mensajes MQTT AWS IoT Core
El servicio IPC de mensajería AWS IoT Core MQTT le permite enviar y recibir mensajes MQTT de ida y vuelta. AWS IoT Core Los componentes pueden publicar mensajes en los temas AWS IoT Core y suscribirse a ellos para actuar en función de los mensajes 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 IPC de mensajería MQTT le permite intercambiar mensajes con. AWS IoT Core Para obtener más información sobre cómo intercambiar mensajes entre componentes, consulte Publicar/suscribir mensajes locales.
Versiones mínimas de SDK
En la siguiente tabla se enumeran las versiones mínimas de las SDK para dispositivos con AWS IoT que debe utilizar para publicar y recibir mensajes MQTT y suscribirse a ellos. AWS IoT Core
| SDK | Versión mínima |
|---|---|
|
Versión 1.2.10 |
|
|
Versión 1.5.3 |
|
|
Versión 1.17.0 |
|
|
Versión 1.12.0 |
Autorización
Para utilizar la mensajería AWS IoT Core MQTT en un componente personalizado, debe definir políticas de autorización que permitan a su 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 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 en los temas de MQTT que especifique. |
Una cadena de temas, por ejemplo, |
|
|
Permite que un componente se suscriba a los mensajes AWS IoT Core de los temas que especifique. |
Una cadena de temas, por ejemplo, |
|
|
Permite que un componente publique y se suscriba 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 las políticas de autorización de MQTT
Puede utilizar caracteres comodín de MQTT en AWS IoT Core las políticas de autorización de IPC de MQTT. 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 las políticas de autorización de MQTT AWS IoT Core
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 de MQTT AWS IoT Core sobre un tema.
Al publicar mensajes MQTT en 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 en toda la cuenta (2 000 en algunos casos). 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 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 UTF8 cadena de caracteres.
-
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 AWS IoT Core de un tema o 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 UTF8 cadena de caracteres.
-
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.
Ejemplos
Utilice los siguientes ejemplos para aprender a utilizar el servicio IPC de AWS IoT Core MQTT en sus componentes.
La siguiente receta de ejemplo permite que el componente publique en todos los temas.
El siguiente ejemplo de aplicación de C++ demuestra cómo utilizar el servicio IPC de AWS IoT Core MQTT para publicar mensajes en. 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 de C++ demuestra cómo utilizar el servicio IPC de AWS IoT Core MQTT para suscribirse a los mensajes de. 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 aplicación Rust demuestra cómo utilizar el servicio IPC de AWS IoT Core MQTT para publicar mensajes en. 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 aplicación Rust demuestra cómo utilizar el servicio IPC de AWS IoT Core MQTT para suscribirse a los mensajes de. 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 IPC de AWS IoT Core MQTT para publicar mensajes en. 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 muestra cómo utilizar el servicio IPC de AWS IoT Core MQTT para suscribirse a los mensajes de. 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 de C++ demuestra cómo utilizar el servicio AWS IoT Core MQTT IPC para publicar mensajes en. 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 de C++ demuestra cómo utilizar el servicio AWS IoT Core MQTT IPC para suscribirse a los mensajes de. 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); } }