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 locais
As mensagens de publicação/assinatura (pubsub) permitem que você envie e receba mensagens sobre tópicos. Os componentes podem publicar mensagens em tópicos para enviar mensagens para outros componentes. Em seguida, os componentes inscritos nesse tópico podem agir nas mensagens que recebem.
nota
Você não pode usar esse IPC serviço de publicação/assinatura para publicar ou assinar. AWS IoT Core MQTT Para obter mais informações sobre como trocar mensagens com AWS IoT Core MQTT, consultePublicar/assinar mensagens AWS IoT Core MQTT.
SDKVersões mínimas
A tabela a seguir lista as versões mínimas do AWS IoT Device SDK que você deve usar para publicar e assinar mensagens de e para tópicos locais.
SDK | Versão mínima |
---|---|
v1.2.10 |
|
v1.5.3 |
|
v1.17.0 |
|
v1.12.0 |
Autorização
Para usar mensagens locais de publicação/assinatura em um componente personalizado, você deve definir políticas de autorização que permitam que seu componente envie e receba mensagens para tópicos. Para obter informações sobre como definir políticas de autorização, consulteAutorize os componentes a realizar operações IPC.
As políticas de autorização para publicar/assinar mensagens têm as seguintes propriedades.
IPCidentificador de serviço: aws.greengrass.ipc.pubsub
Operation | Descrição | Recursos |
---|---|---|
|
Permite que um componente publique mensagens nos tópicos que você especificar. |
Uma sequência de tópicos, como Essa string de tópico não suporta curingas de MQTT tópico ( |
|
Permite que um componente assine mensagens para os tópicos que você especificar. |
Uma sequência de tópicos, como No Greengrass nucleus v2.6.0 e versões posteriores, você pode se inscrever em tópicos que contêm MQTT curingas de tópicos (e). |
|
Permite que um componente publique e assine mensagens para os tópicos que você especificar. |
Uma sequência de tópicos, como No Greengrass nucleus v2.6.0 e versões posteriores, você pode se inscrever em tópicos que contêm MQTT curingas de tópicos (e). |
Exemplos de políticas de autorização
Você pode consultar o exemplo de política de autorização a seguir para ajudá-lo a configurar políticas de autorização para seus componentes.
exemplo Exemplo de política de autorização
O exemplo de política de autorização a seguir permite que um componente publique e assine todos os tópicos.
{ "accessControl": { "aws.greengrass.ipc.pubsub": { "
com.example.MyLocalPubSubComponent
:pubsub:1": { "policyDescription": "Allows access to publish/subscribe to all topics.", "operations": [ "aws.greengrass#PublishToTopic", "aws.greengrass#SubscribeToTopic" ], "resources": [ "*" ] } } } }
PublishToTopic
Publique uma mensagem em um tópico.
Solicitação
A solicitação dessa operação tem os seguintes parâmetros:
topic
-
O tópico no qual publicar a mensagem.
publishMessage
(Python:)publish_message
-
A mensagem a ser publicada. Esse objeto,
PublishMessage
, contém as seguintes informações. Você deve especificar um dosjsonMessage
binaryMessage
e.jsonMessage
(Python:)json_message
-
(Opcional) Uma JSON mensagem. Esse objeto,
JsonMessage
, contém as seguintes informações:message
-
A JSON mensagem como um objeto.
context
-
O contexto da mensagem, como o tópico em que a mensagem foi publicada.
Esse recurso está disponível para a versão 2.6.0 e posterior do componente núcleo do Greengrass. A tabela a seguir lista as versões mínimas do AWS IoT Device SDK que você deve usar para acessar o contexto da mensagem.
SDK Versão mínima v1.9.3
v1.11.3
v1.18.4
v1.12.0
nota
O software AWS IoT Greengrass Core usa os mesmos objetos de mensagem nas
SubscribeToTopic
operaçõesPublishToTopic
e. O software AWS IoT Greengrass Core define esse objeto de contexto nas mensagens quando você se inscreve e ignora esse objeto de contexto nas mensagens que você publica.Esse objeto,
MessageContext
, contém as seguintes informações:topic
-
O tópico em que a mensagem foi publicada.
binaryMessage
(Python:)binary_message
-
(Opcional) Uma mensagem binária. Esse objeto,
BinaryMessage
, contém as seguintes informações:message
-
A mensagem binária como uma bolha.
context
-
O contexto da mensagem, como o tópico em que a mensagem foi publicada.
Esse recurso está disponível para a versão 2.6.0 e posterior do componente núcleo do Greengrass. A tabela a seguir lista as versões mínimas do AWS IoT Device SDK que você deve usar para acessar o contexto da mensagem.
SDK Versão mínima v1.9.3
v1.11.3
v1.18.4
v1.12.0
nota
O software AWS IoT Greengrass Core usa os mesmos objetos de mensagem nas
SubscribeToTopic
operaçõesPublishToTopic
e. O software AWS IoT Greengrass Core define esse objeto de contexto nas mensagens quando você se inscreve e ignora esse objeto de contexto nas mensagens que você publica.Esse objeto,
MessageContext
, contém as seguintes informações:topic
-
O tópico em que a mensagem foi publicada.
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 de componente personalizado.
SubscribeToTopic
Assine mensagens sobre um tópico.
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 Inscreva-se para receber transmissões de IPC eventos.
Tipo de mensagem do evento: SubscriptionResponseMessage
Solicitação
A solicitação dessa operação tem os seguintes parâmetros:
topic
-
O tópico no qual se inscrever.
nota
No Greengrass nucleus v2.6.0 e versões posteriores, este tópico suporta MQTT curingas de tópicos (e).
#
+
receiveMode
(Python:)receive_mode
-
(Opcional) O comportamento que especifica se o componente recebe mensagens de si mesmo. Você pode alterar esse comportamento para permitir que um componente atue em suas próprias mensagens. O comportamento padrão depende se o tópico contém um MQTT caractere curinga. Escolha uma das seguintes opções:
-
RECEIVE_ALL_MESSAGES
— Receba todas as mensagens que correspondam ao tópico, incluindo mensagens do componente que se inscreve.Esse modo é a opção padrão quando você assina um tópico que não contém um MQTT caractere curinga.
-
RECEIVE_MESSAGES_FROM_OTHERS
— Receba todas as mensagens que correspondam ao tópico, exceto as mensagens do componente que se inscreve.Esse modo é a opção padrão quando você assina um tópico que contém um MQTT caractere curinga.
Esse recurso está disponível para a versão 2.6.0 e posterior do componente núcleo do Greengrass. A tabela a seguir lista as versões mínimas do AWS IoT Device SDK que você deve usar para definir o modo de recepção.
SDK Versão mínima v1.9.3
v1.11.3
v1.18.4
v1.12.0
-
Resposta
A resposta dessa operação tem as seguintes informações:
messages
-
O fluxo de mensagens. Esse objeto,
SubscriptionResponseMessage
, contém as seguintes informações. Cada mensagem contémjsonMessage
oubinaryMessage
.jsonMessage
(Python:)json_message
-
(Opcional) Uma JSON mensagem. Esse objeto,
JsonMessage
, contém as seguintes informações:message
-
A JSON mensagem como um objeto.
context
-
O contexto da mensagem, como o tópico em que a mensagem foi publicada.
Esse recurso está disponível para a versão 2.6.0 e posterior do componente núcleo do Greengrass. A tabela a seguir lista as versões mínimas do AWS IoT Device SDK que você deve usar para acessar o contexto da mensagem.
SDK Versão mínima v1.9.3
v1.11.3
v1.18.4
v1.12.0
nota
O software AWS IoT Greengrass Core usa os mesmos objetos de mensagem nas
SubscribeToTopic
operaçõesPublishToTopic
e. O software AWS IoT Greengrass Core define esse objeto de contexto nas mensagens quando você se inscreve e ignora esse objeto de contexto nas mensagens que você publica.Esse objeto,
MessageContext
, contém as seguintes informações:topic
-
O tópico em que a mensagem foi publicada.
binaryMessage
(Python:)binary_message
-
(Opcional) Uma mensagem binária. Esse objeto,
BinaryMessage
, contém as seguintes informações:message
-
A mensagem binária como uma bolha.
context
-
O contexto da mensagem, como o tópico em que a mensagem foi publicada.
Esse recurso está disponível para a versão 2.6.0 e posterior do componente núcleo do Greengrass. A tabela a seguir lista as versões mínimas do AWS IoT Device SDK que você deve usar para acessar o contexto da mensagem.
SDK Versão mínima v1.9.3
v1.11.3
v1.18.4
v1.12.0
nota
O software AWS IoT Greengrass Core usa os mesmos objetos de mensagem nas
SubscribeToTopic
operaçõesPublishToTopic
e. O software AWS IoT Greengrass Core define esse objeto de contexto nas mensagens quando você se inscreve e ignora esse objeto de contexto nas mensagens que você publica.Esse objeto,
MessageContext
, contém as seguintes informações:topic
-
O tópico em que a mensagem foi publicada.
topicName
(Python:)topic_name
-
O tópico no qual a mensagem foi publicada.
nota
Essa propriedade não é usada atualmente. No Greengrass nucleus v2.6.0 e versões posteriores, você pode obter o
(jsonMessage|binaryMessage).context.topic
valor de a para obter o tópico emSubscriptionResponseMessage
que a mensagem foi publicada.
Exemplos
Os exemplos a seguir demonstram como chamar essa operação no código de componente personalizado.
Exemplos
Use os exemplos a seguir para aprender a usar o IPC serviço de publicação/assinatura em seus componentes.
O exemplo de receita a seguir permite que o componente seja publicado em todos os tópicos.
O exemplo de aplicativo Java a seguir demonstra como usar o IPC serviço de publicação/assinatura para publicar mensagens em outros componentes.
/* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.example.ipc.pubsub; import software.amazon.awssdk.aws.greengrass.GreengrassCoreIPCClient; import software.amazon.awssdk.aws.greengrass.model.*; import software.amazon.awssdk.eventstreamrpc.EventStreamRPCConnection; import java.nio.charset.StandardCharsets; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class PubSubPublisher { public static void main(String[] args) { String message = "Hello from the pub/sub publisher (Java)."; String topic = "test/topic/java"; try (EventStreamRPCConnection eventStreamRPCConnection = IPCUtils.getEventStreamRpcConnection()) { GreengrassCoreIPCClient ipcClient = new GreengrassCoreIPCClient(eventStreamRPCConnection); while (true) { PublishToTopicRequest publishRequest = new PublishToTopicRequest(); PublishMessage publishMessage = new PublishMessage(); BinaryMessage binaryMessage = new BinaryMessage(); binaryMessage.setMessage(message.getBytes(StandardCharsets.UTF_8)); publishMessage.setBinaryMessage(binaryMessage); publishRequest.setPublishMessage(publishMessage); publishRequest.setTopic(topic); CompletableFuture<PublishToTopicResponse> futureResponse = ipcClient .publishToTopic(publishRequest, Optional.empty()).getResponse(); try { futureResponse.get(10, TimeUnit.SECONDS); System.out.println("Successfully published to topic: " + topic); } catch (TimeoutException e) { System.err.println("Timeout occurred while publishing to topic: " + topic); } catch (ExecutionException e) { if (e.getCause() instanceof UnauthorizedError) { System.err.println("Unauthorized error while publishing to topic: " + topic); } else { System.err.println("Execution exception while publishing to topic: " + topic); } throw e; } Thread.sleep(5000); } } catch (InterruptedException e) { System.out.println("Publisher interrupted."); } catch (Exception e) { System.err.println("Exception occurred when using IPC."); e.printStackTrace(); System.exit(1); } } }
O exemplo de receita a seguir permite que o componente se inscreva em todos os tópicos.
O exemplo de aplicativo Java a seguir demonstra como usar o IPC serviço de publicação/assinatura para assinar mensagens em outros componentes.
/* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.example.ipc.pubsub; import software.amazon.awssdk.aws.greengrass.GreengrassCoreIPCClient; import software.amazon.awssdk.aws.greengrass.SubscribeToTopicResponseHandler; import software.amazon.awssdk.aws.greengrass.model.SubscribeToTopicRequest; import software.amazon.awssdk.aws.greengrass.model.SubscribeToTopicResponse; import software.amazon.awssdk.aws.greengrass.model.SubscriptionResponseMessage; import software.amazon.awssdk.aws.greengrass.model.UnauthorizedError; import software.amazon.awssdk.eventstreamrpc.EventStreamRPCConnection; import software.amazon.awssdk.eventstreamrpc.StreamResponseHandler; import java.nio.charset.StandardCharsets; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class PubSubSubscriber { public static void main(String[] args) { String topic = "test/topic/java"; try (EventStreamRPCConnection eventStreamRPCConnection = IPCUtils.getEventStreamRpcConnection()) { GreengrassCoreIPCClient ipcClient = new GreengrassCoreIPCClient(eventStreamRPCConnection); SubscribeToTopicRequest subscribeRequest = new SubscribeToTopicRequest(); subscribeRequest.setTopic(topic); SubscribeToTopicResponseHandler operationResponseHandler = ipcClient .subscribeToTopic(subscribeRequest, Optional.of(new SubscribeResponseHandler())); CompletableFuture<SubscribeToTopicResponse> futureResponse = operationResponseHandler.getResponse(); try { futureResponse.get(10, TimeUnit.SECONDS); System.out.println("Successfully subscribed to topic: " + topic); } catch (TimeoutException e) { System.err.println("Timeout occurred while subscribing to topic: " + topic); throw e; } catch (ExecutionException e) { if (e.getCause() instanceof UnauthorizedError) { System.err.println("Unauthorized error while subscribing to topic: " + topic); } else { System.err.println("Execution exception while subscribing to topic: " + topic); } throw e; } // Keep the main thread alive, or the process will exit. try { while (true) { Thread.sleep(10000); } } catch (InterruptedException e) { System.out.println("Subscribe interrupted."); } } catch (Exception e) { System.err.println("Exception occurred when using IPC."); e.printStackTrace(); System.exit(1); } } private static class SubscribeResponseHandler implements StreamResponseHandler<SubscriptionResponseMessage> { @Override public void onStreamEvent(SubscriptionResponseMessage subscriptionResponseMessage) { try { String message = new String(subscriptionResponseMessage.getBinaryMessage() .getMessage(), StandardCharsets.UTF_8); System.out.println("Received new message: " + message); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onStreamError(Throwable error) { System.err.println("Received a stream error."); error.printStackTrace(); return false; // Return true to close stream, false to keep stream open. } @Override public void onStreamClosed() { System.out.println("Subscribe to topic stream closed."); } } }
O exemplo de receita a seguir permite que o componente seja publicado em todos os tópicos.
O exemplo de aplicativo Python a seguir demonstra como usar o IPC serviço de publicação/assinatura para publicar mensagens em outros componentes.
import concurrent.futures import sys import time import traceback import awsiot.greengrasscoreipc from awsiot.greengrasscoreipc.model import ( PublishToTopicRequest, PublishMessage, BinaryMessage, UnauthorizedError ) topic = "test/topic/python" message = "Hello from the pub/sub publisher (Python)." TIMEOUT = 10 try: ipc_client = awsiot.greengrasscoreipc.connect() while True: request = PublishToTopicRequest() request.topic = topic publish_message = PublishMessage() publish_message.binary_message = BinaryMessage() publish_message.binary_message.message = bytes(message, "utf-8") request.publish_message = publish_message operation = ipc_client.new_publish_to_topic() operation.activate(request) future_response = operation.get_response() try: future_response.result(TIMEOUT) print('Successfully published to topic: ' + topic) except concurrent.futures.TimeoutError: print('Timeout occurred while publishing to topic: ' + topic, file=sys.stderr) except UnauthorizedError as e: print('Unauthorized error while publishing to topic: ' + topic, file=sys.stderr) raise e except Exception as e: print('Exception while publishing to topic: ' + topic, file=sys.stderr) raise e time.sleep(5) except InterruptedError: print('Publisher interrupted.') except Exception: print('Exception occurred when using IPC.', file=sys.stderr) traceback.print_exc() exit(1)
O exemplo de receita a seguir permite que o componente se inscreva em todos os tópicos.
O exemplo de aplicativo Python a seguir demonstra como usar o IPC serviço de publicação/assinatura para assinar mensagens em outros componentes.
import concurrent.futures import sys import time import traceback import awsiot.greengrasscoreipc import awsiot.greengrasscoreipc.client as client from awsiot.greengrasscoreipc.model import ( SubscribeToTopicRequest, SubscriptionResponseMessage, UnauthorizedError ) topic = "test/topic/python" TIMEOUT = 10 class StreamHandler(client.SubscribeToTopicStreamHandler): def __init__(self): super().__init__() def on_stream_event(self, event: SubscriptionResponseMessage) -> None: try: message = str(event.binary_message.message, "utf-8") print("Received new message: " + message) except: traceback.print_exc() def on_stream_error(self, error: Exception) -> bool: print("Received a stream error.", file=sys.stderr) traceback.print_exc() return False # Return True to close stream, False to keep stream open. def on_stream_closed(self) -> None: print('Subscribe to topic stream closed.') try: ipc_client = awsiot.greengrasscoreipc.connect() request = SubscribeToTopicRequest() request.topic = topic handler = StreamHandler() operation = ipc_client.new_subscribe_to_topic(handler) operation.activate(request) future_response = operation.get_response() try: future_response.result(TIMEOUT) print('Successfully subscribed to topic: ' + topic) except concurrent.futures.TimeoutError as e: print('Timeout occurred while subscribing to topic: ' + topic, file=sys.stderr) raise e except UnauthorizedError as e: print('Unauthorized error while subscribing to topic: ' + topic, file=sys.stderr) raise e except Exception as e: print('Exception while subscribing to topic: ' + topic, file=sys.stderr) raise e # Keep the main thread alive, or the process will exit. try: while True: time.sleep(10) except InterruptedError: print('Subscribe interrupted.') except Exception: print('Exception occurred when using IPC.', file=sys.stderr) traceback.print_exc() exit(1)
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 IPC serviço de publicação/assinatura para publicar mensagens em outros componentes.
#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 pub/sub publisher (C++)."); String topic("test/topic/cpp"); 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) { PublishToTopicRequest request; Vector<uint8_t> messageData({message.begin(), message.end()}); BinaryMessage binaryMessage; binaryMessage.SetMessage(messageData); PublishMessage publishMessage; publishMessage.SetBinaryMessage(binaryMessage); request.SetTopic(topic); request.SetPublishMessage(publishMessage); auto operation = ipcClient.NewPublishToTopic(); 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 se inscreva em todos os tópicos.
O exemplo de aplicativo C++ a seguir demonstra como usar o IPC serviço de publicação/assinatura para assinar mensagens em outros componentes.
#include <iostream> #include <aws/crt/Api.h> #include <aws/greengrass/GreengrassCoreIpcClient.h> using namespace Aws::Crt; using namespace Aws::Greengrass; class SubscribeResponseHandler : public SubscribeToTopicStreamHandler { public: virtual ~SubscribeResponseHandler() {} private: void OnStreamEvent(SubscriptionResponseMessage *response) override { auto jsonMessage = response->GetJsonMessage(); if (jsonMessage.has_value() && jsonMessage.value().GetMessage().has_value()) { auto messageString = jsonMessage.value().GetMessage().value().View().WriteReadable(); std::cout << "Received new message: " << messageString << std::endl; } else { auto binaryMessage = response->GetBinaryMessage(); if (binaryMessage.has_value() && binaryMessage.value().GetMessage().has_value()) { auto messageBytes = binaryMessage.value().GetMessage().value(); std::string messageString(messageBytes.begin(), messageBytes.end()); std::cout << "Received new 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 topic 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"); 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); } SubscribeToTopicRequest request; request.SetTopic(topic); auto streamHandler = MakeShared<SubscribeResponseHandler>(DefaultAllocator()); auto operation = ipcClient.NewSubscribeToTopic(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; }