As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Publique/assine mensagens MQTT AWS IoT Core
O serviço IPC de mensagens AWS IoT Core MQTT permite que você envie e receba mensagens MQTT de e para. AWS IoT Core Os componentes podem publicar mensagens AWS IoT Core e assinar tópicos para atuar nas mensagens MQTT de outras fontes. Para obter mais informações sobre a AWS IoT Core implementação do MQTT, consulte MQTT no Guia do AWS IoT Core Desenvolvedor.
nota
Esse serviço IPC de mensagens MQTT permite que você troque mensagens com. AWS IoT Core Para obter mais informações sobre como trocar mensagens entre componentes, consulte Publicar/assinar mensagens locais.
Versões mínimas do SDK
A tabela a seguir lista as versões mínimas do AWS IoT Device SDK que você deve usar para publicar e assinar mensagens MQTT de AWS IoT Core e para.
| SDK | Versão mínima |
|---|---|
|
v1.2.10 |
|
|
v1.5.3 |
|
|
v1.17.0 |
|
|
v1.12.0 |
Autorização
Para usar mensagens AWS IoT Core MQTT em um componente personalizado, você deve definir políticas de autorização que permitam que seu componente envie e receba mensagens sobre tópicos. Para obter informações sobre a definição de políticas de autorização, consulte Autorizar componentes a realizar operações de IPC.
As políticas de autorização para mensagens AWS IoT Core MQTT têm as seguintes propriedades.
Identificador de serviço IPC: aws.greengrass.ipc.mqttproxy
| Operation | Description | Recursos |
|---|---|---|
|
|
Permite que um componente publique mensagens AWS IoT Core nos tópicos do MQTT que você especificar. |
Uma sequência de tópicos, como |
|
|
Permite que um componente assine mensagens dos AWS IoT Core tópicos que você especificar. |
Uma sequência de tópicos, como |
|
|
Permite que um componente publique e assine mensagens AWS IoT Core MQTT para os tópicos que você especificar. |
Uma sequência de tópicos, como |
Caracteres curingas do MQTT nas políticas de autorização do AWS IoT Core MQTT
Você pode usar curingas do MQTT nas políticas de autorização do AWS IoT Core MQTT IPC. Os componentes podem publicar e assinar tópicos que correspondam ao filtro de tópicos permitido em uma política de autorização. Por exemplo, se a política de autorização de um componente conceder acesso a test/topic/#, o componente pode se inscrever no test/topic/#, e publicar e se inscrever no test/topic/filter.
Variáveis de receita nas políticas de autorização do AWS IoT Core MQTT
Se você usa a versão 2.6.0 ou posterior do núcleo do Greengrass, pode usar a variável de fórmula {iot:thingName} nas políticas de autorização. Esse recurso permite que você configure uma única política de autorização para um grupo de dispositivos principais, em que cada dispositivo principal pode acessar somente tópicos que contenham seu próprio nome. Por exemplo, você pode permitir que um componente acesse o seguinte recurso do tópico.
devices/{iot:thingName}/messages
Para obter mais informações, consulte Variáveis da fórmula e Usar variáveis de fórmula em atualizações de mesclagem.
Exemplos de política de autorização
Consulte os exemplos de política de autorização a seguir para configurar políticas de autorização para seus componentes.
exemplo Exemplo de política de autorização com acesso irrestrito
O exemplo de política de autorização a seguir permite que um componente publique e assine em todos os tópicos.
exemplo Exemplo de política de autorização com acesso limitado
O exemplo de política de autorização a seguir permite que um componente publique e assine dois tópicos chamados factory/1/events e factory/1/actions.
exemplo Exemplo de política de autorização para um grupo de dispositivos principais
Importante
Este exemplo usa um recurso que está disponível para a versão 2.6.0 e posterior do componente de núcleo do Greengrass. O núcleo do Greengrass v2.6.0 adiciona suporte para a maioria das variáveis de fórmula, como {iot:thingName}, em configurações de componentes.
O exemplo de política de autorização a seguir permite que um componente publique e assine um tópico que contém o nome do dispositivo principal que executa o componente.
PublishToIoTCore
Publica uma mensagem MQTT AWS IoT Core em um tópico.
Quando você publica mensagens MQTT no AWS IoT Core, há uma cota de 100 transações por segundo. Se você exceder essa cota, as mensagens serão enfileiradas para processamento no dispositivo Greengrass. Há também uma cota de 512 Kb de dados por segundo e uma cota de 20.000 publicações por segundo em toda a conta (2.000 em algumas). Regiões da AWS Para obter mais informações sobre limites de agentes de mensagens do MQTT no AWS IoT Core, consulte Agente de mensagens e limites e cotas de protocolo do AWS IoT Core.
Se você exceder essas cotas, o dispositivo Greengrass limita a publicação de mensagens a. AWS IoT Core As mensagens são armazenadas em um spooler na memória. Por padrão, a memória alocada para o spooler é de 2,5 Mb. Se o spooler ficar cheio, novas mensagens serão rejeitadas. Você pode aumentar o tamanho do spooler. Para obter mais informações, consulte a Configuração documentação do Greengrass nucleus. Para evitar preencher o spooler e precisar aumentar a memória alocada, limite as solicitações de publicação a no máximo 100 solicitações por segundo.
Quando sua aplicação precisar enviar mensagens em uma taxa maior ou maiores, considere usar o Gerenciador de fluxos para enviar mensagens para o Kinesis Data Streams. O componente gerenciador de fluxos foi projetado para transferir dados de alto volume para a Nuvem AWS. Para obter mais informações, consulte Gerenciar fluxos de dados no nos dispositivos principais do Greengrass.
Solicitação
A solicitação dessa operação tem os seguintes parâmetros:
topicName(Python:topic_name)-
O tópico no qual publicar a mensagem.
qos-
O QoS do MQTT a ser usado. Esse enumerador,
QOS, tem os seguintes valores:-
AT_MOST_ONCE: QoS 0. A mensagem do MQTT é entregue no máximo uma vez. -
AT_LEAST_ONCE: QoS 1. A mensagem do MQTT é entregue pelo menos uma vez.
-
payload-
(Opcional) A carga útil da mensagem como um blob.
Os recursos a seguir estão disponíveis para a versão 2.10.0 e versões posteriores do Greengrass nucleus ao usar o MQTT 5. Esses recursos são ignoradas quando você usa o MQTT 3.1.1. A tabela a seguir lista a versão mínima do SDK do AWS IoT dispositivo que você deve usar para acessar esses recursos.
| SDK | Versão mínima |
|---|---|
| AWS IoT Device SDK for Python
v2 |
v1.15.0 |
| AWS IoT Device SDK for Java
v2 |
v1.13.0 |
| AWS IoT Device SDK for C++
v2 |
v1.24.0 |
| AWS IoT Device SDK for JavaScript v2 |
v1.13.0 |
payloadFormat-
(Opcional) O formato da carga útil da mensagem. Se você não definir o
payloadFormat, presume-se que o tipo sejaBYTES. O enumerador tem os seguintes valores:-
BYTES: o conteúdo da carga útil é um blob binário. -
UTF8— O conteúdo da carga é uma UTF8 sequência de caracteres.
-
retain-
(Opcional) Indica se a opção de retenção do MQTT deve ser definida como
trueao publicar. userProperties-
(Opcional) Uma lista de
UserPropertyobjetos específicos da aplicação a serem enviados. O objetoUserPropertyé definido da seguinte maneira:UserProperty: key: string value: string messageExpiryIntervalSeconds-
(Opcional) O número de segundos antes de a mensagem expirar e ser excluída pelo servidor. Se esse valor não for definido, a mensagem não expira.
correlationData-
(Opcional) Informações adicionadas à solicitação que podem ser usadas para associar uma solicitação a uma resposta.
responseTopic-
(Opcional) O tópico que deve ser usado para a mensagem de resposta.
contentType-
(Opcional) Um identificador específico da aplicação do tipo de conteúdo da mensagem.
Resposta
Essa operação não fornece nenhuma informação em sua resposta.
Exemplos
Os exemplos a seguir demonstram como chamar essa operação no código do componente personalizado.
SubscribeToIoTCore
Assine as mensagens do MQTT a partir AWS IoT Core de um tópico ou filtro de tópicos. O software AWS IoT Greengrass principal remove as assinaturas quando o componente chega ao fim de seu ciclo de vida.
Essa operação é uma operação de assinatura em que você assina um fluxo de mensagens de eventos. Para usar essa operação, defina um manipulador de resposta de fluxo com funções que manipulam mensagens de eventos, erros e encerramento de fluxo. Para obter mais informações, consulte Inscrever-se nos fluxos de eventos da IPC.
Tipo de mensagem do evento: IoTCoreMessage
Solicitação
A solicitação dessa operação tem os seguintes parâmetros:
topicName(Python:topic_name)-
O tópico a ser assinado. Você pode usar curingas de tópicos do MQTT (
#e+) para se inscrever em vários tópicos. qos-
O QoS do MQTT a ser usado. Esse enumerador,
QOS, tem os seguintes valores:-
AT_MOST_ONCE: QoS 0. A mensagem do MQTT é entregue no máximo uma vez. -
AT_LEAST_ONCE: QoS 1. A mensagem do MQTT é entregue pelo menos uma vez.
-
Resposta
A resposta dessa operação tem as seguintes informações:
messages-
O fluxo de mensagens do MQTT. Esse objeto,
IoTCoreMessage, contém as seguintes informações:message-
A mensagem do MQTT. Esse objeto,
MQTTMessage, contém as seguintes informações:topicName(Python:topic_name)-
O tópico em que a mensagem foi publicada.
payload-
(Opcional) A carga útil da mensagem como um blob.
Os recursos a seguir estão disponíveis para a versão 2.10.0 e versões posteriores do Greengrass nucleus ao usar o MQTT 5. Esses recursos são ignoradas quando você usa o MQTT 3.1.1. A tabela a seguir lista a versão mínima do SDK do AWS IoT dispositivo que você deve usar para acessar esses recursos.
SDK Versão mínima AWS IoT Device SDK for Python v2 v1.15.0 AWS IoT Device SDK for Java v2 v1.13.0 AWS IoT Device SDK for C++ v2 v1.24.0 AWS IoT Device SDK for JavaScript v2 v1.13.0 payloadFormat-
(Opcional) O formato da carga útil da mensagem. Se você não definir o
payloadFormat, presume-se que o tipo sejaBYTES. O enumerador tem os seguintes valores:-
BYTES: o conteúdo da carga útil é um blob binário. -
UTF8— O conteúdo da carga é uma UTF8 sequência de caracteres.
-
retain-
(Opcional) Indica se a opção de retenção do MQTT deve ser definida como
trueao publicar. userProperties-
(Opcional) Uma lista de
UserPropertyobjetos específicos da aplicação a serem enviados. O objetoUserPropertyé definido da seguinte maneira:UserProperty: key: string value: string messageExpiryIntervalSeconds-
(Opcional) O número de segundos antes de a mensagem expirar e ser excluída pelo servidor. Se esse valor não for definido, a mensagem não expira.
correlationData-
(Opcional) Informações adicionadas à solicitação que podem ser usadas para associar uma solicitação a uma resposta.
responseTopic-
(Opcional) O tópico que deve ser usado para a mensagem de resposta.
contentType-
(Opcional) Um identificador específico da aplicação do tipo de conteúdo da mensagem.
Exemplos
Os exemplos a seguir demonstram como chamar essa operação no código do componente personalizado.
Exemplos
Use os exemplos a seguir para aprender a usar o serviço AWS IoT Core MQTT IPC em seus componentes.
O exemplo de receita a seguir permite que o componente seja publicado em todos os tópicos.
O exemplo de aplicativo C++ a seguir demonstra como usar o serviço AWS IoT Core MQTT IPC para publicar mensagens no. 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; }
O exemplo de receita a seguir permite que o componente seja inscrito em todos os tópicos.
O exemplo de aplicativo C++ a seguir demonstra como usar o serviço AWS IoT Core MQTT IPC para assinar mensagens do. 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; }
O exemplo de receita a seguir permite que o componente seja publicado em todos os tópicos.
{ "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" } } ] } ] }
O exemplo a seguir do aplicativo Rust demonstra como usar o serviço AWS IoT Core MQTT IPC para publicar mensagens no. 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}"); }
O exemplo de receita a seguir permite que o componente seja inscrito em todos os tópicos.
{ "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" } } ] } ] }
O exemplo a seguir do aplicativo Rust demonstra como usar o serviço AWS IoT Core MQTT IPC para assinar mensagens do. 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)); } }
O exemplo de receita a seguir permite que o componente seja publicado em todos os tópicos.
{ "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" } } ] } ] }
O exemplo de aplicativo C a seguir demonstra como usar o serviço AWS IoT Core MQTT IPC para publicar mensagens no. 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 ); }
O exemplo de receita a seguir permite que o componente seja inscrito em todos os tópicos.
{ "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" } } ] } ] }
O exemplo de aplicativo C a seguir demonstra como usar o serviço AWS IoT Core MQTT IPC para assinar mensagens do. 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); }
O exemplo de receita a seguir permite que o componente seja publicado em todos os tópicos.
{ "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" } } ] } ] }
O exemplo de aplicativo C++ a seguir demonstra como usar o serviço AWS IoT Core MQTT IPC para publicar mensagens no. 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"; }
O exemplo de receita a seguir permite que o componente seja inscrito em todos os tópicos.
{ "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" } } ] } ] }
O exemplo de aplicativo C++ a seguir demonstra como usar o serviço AWS IoT Core MQTT IPC para assinar mensagens do. 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); } }