Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
MQTT-Nachrichten veröffentlichen/abonnieren AWS IoT Core
Mit dem AWS IoT Core MQTT-Messaging-IPC-Dienst können Sie MQTT-Nachrichten an und von senden und empfangen. AWS IoT Core Komponenten können Nachrichten veröffentlichen AWS IoT Core und Themen abonnieren, um auf MQTT-Nachrichten aus anderen Quellen zu reagieren. Weitere Informationen zur AWS IoT Core Implementierung von MQTT finden Sie unter MQTT im AWS IoT Core Developer Guide.
Anmerkung
Mit diesem MQTT-Messaging-IPC-Dienst können Sie Nachrichten austauschen mit. AWS IoT Core Weitere Hinweise zum Austausch von Nachrichten zwischen Komponenten finden Sie unter. Lokale Nachrichten veröffentlichen/abonnieren
Minimale SDK-Versionen
In der folgenden Tabelle sind die Mindestversionen von aufgeführt AWS IoT Device SDK , die Sie zum Veröffentlichen und Abonnieren von AWS IoT Core MQTT-Nachrichten verwenden müssen.
| SDK | Mindestversion |
|---|---|
|
v1.2.10 |
|
|
v1.5.3 |
|
|
v1.17.0 |
|
|
v1.12.0 |
Autorisierung
Um AWS IoT Core MQTT-Messaging in einer benutzerdefinierten Komponente zu verwenden, müssen Sie Autorisierungsrichtlinien definieren, die es Ihrer Komponente ermöglichen, Nachrichten zu Themen zu senden und zu empfangen. Informationen zur Definition von Autorisierungsrichtlinien finden Sie unterAutorisieren Sie Komponenten zur Ausführung von IPC-Vorgängen.
Autorisierungsrichtlinien für AWS IoT Core MQTT-Messaging haben die folgenden Eigenschaften.
IPC-Dienst-ID: aws.greengrass.ipc.mqttproxy
| Operation | Description | Ressourcen |
|---|---|---|
|
|
Ermöglicht einer Komponente, Nachrichten zu den von Ihnen AWS IoT Core angegebenen MQTT-Themen zu veröffentlichen. |
Eine Themenzeichenfolge, z. B. oder |
|
|
Ermöglicht einer Komponente, Nachrichten zu den von Ihnen AWS IoT Core angegebenen Themen zu abonnieren. |
Eine Themenzeichenfolge, z. B. oder |
|
|
Ermöglicht einer Komponente, AWS IoT Core MQTT-Nachrichten für die von Ihnen angegebenen Themen zu veröffentlichen und zu abonnieren. |
Eine Themenzeichenfolge, z. B. oder |
MQTT-Platzhalter in MQTT-Autorisierungsrichtlinien AWS IoT Core
Sie können MQTT-Platzhalter in AWS IoT Core MQTT-IPC-Autorisierungsrichtlinien verwenden. Komponenten können Themen veröffentlichen und abonnieren, die dem Themenfilter entsprechen, den Sie in einer Autorisierungsrichtlinie zulassen. Wenn beispielsweise die Autorisierungsrichtlinie einer Komponente Zugriff auf gewährttest/topic/#, kann die Komponente diese abonnierentest/topic/#, veröffentlichen und abonnierentest/topic/filter.
Rezeptvariablen in AWS IoT Core MQTT-Autorisierungsrichtlinien
Wenn Sie Version 2.6.0 oder höher von Greengrass Nucleus verwenden, können Sie die {iot:thingName} Rezeptvariable in Autorisierungsrichtlinien verwenden. Mit dieser Funktion können Sie eine einzige Autorisierungsrichtlinie für eine Gruppe von Kerngeräten konfigurieren, sodass jedes Kerngerät nur auf Themen zugreifen kann, die seinen eigenen Namen enthalten. Sie können einer Komponente beispielsweise Zugriff auf die folgende Themenressource gewähren.
devices/{iot:thingName}/messages
Weitere Informationen erhalten Sie unter Rezeptvariablen und Verwenden Sie Rezeptvariablen bei Merge-Updates.
Beispiele für Autorisierungsrichtlinien
Anhand der folgenden Beispiele für Autorisierungsrichtlinien können Sie Autorisierungsrichtlinien für Ihre Komponenten konfigurieren.
Beispiel Beispiel für eine Autorisierungsrichtlinie mit uneingeschränktem Zugriff
Das folgende Beispiel für eine Autorisierungsrichtlinie ermöglicht es einer Komponente, alle Themen zu veröffentlichen und zu abonnieren.
Beispiel Beispiel für eine Autorisierungsrichtlinie mit eingeschränktem Zugriff
Das folgende Beispiel für eine Autorisierungsrichtlinie ermöglicht es einer Komponente, zwei Themen mit dem Namen und zu veröffentlichen factory/1/events und zu abonnierenfactory/1/actions.
Beispiel Beispiel für eine Autorisierungsrichtlinie für eine Gruppe von Kerngeräten
Wichtig
In diesem Beispiel wird eine Funktion verwendet, die für Version 2.6.0 und höher der Greengrass Nucleus-Komponente verfügbar ist. Greengrass Nucleus v2.6.0 bietet Unterstützung für die meisten Rezeptvariablen, z. B. in {iot:thingName} Komponentenkonfigurationen.
Das folgende Beispiel für eine Autorisierungsrichtlinie ermöglicht es einer Komponente, ein Thema zu veröffentlichen und zu abonnieren, das den Namen des Kerngeräts enthält, auf dem die Komponente ausgeführt wird.
PublishToIoTCore
Veröffentlicht eine MQTT-Nachricht zu einem AWS IoT Core Thema.
Wenn Sie MQTT-Nachrichten veröffentlichen AWS IoT Core, gilt ein Kontingent von 100 Transaktionen pro Sekunde. Wenn Sie dieses Kontingent überschreiten, werden Nachrichten auf dem Greengrass-Gerät zur Verarbeitung in die Warteschlange gestellt. Außerdem gibt es ein Kontingent von 512 KB an Daten pro Sekunde und ein kontoweites Kontingent von 20.000 Veröffentlichungen pro Sekunde (2.000 in einigen Fällen). AWS-Regionen Weitere Informationen zu den Grenzwerten für den MQTT-Nachrichtenbroker finden Sie unter Grenzwerte und Kontingente für AWS IoT Core Nachrichtenbroker und Protokolle. AWS IoT Core
Wenn Sie diese Kontingente überschreiten, beschränkt das Greengrass-Gerät die Veröffentlichung von Nachrichten auf AWS IoT Core. Nachrichten werden in einem Spooler im Arbeitsspeicher gespeichert. Standardmäßig beträgt der dem Spooler zugewiesene Speicher 2,5 MB. Wenn der Spooler voll ist, werden neue Nachrichten zurückgewiesen. Sie können den Spooler vergrößern. Weitere Informationen finden Sie unter Konfiguration in der Grüngraskern-Dokumentation. Um zu vermeiden, dass der Spooler voll wird und der zugewiesene Speicher vergrößert werden muss, beschränken Sie Veröffentlichungsanforderungen auf nicht mehr als 100 Anfragen pro Sekunde.
Wenn Ihre Anwendung Nachrichten mit einer höheren Geschwindigkeit oder größere Nachrichten senden muss, sollten Sie die Stream-Manager zum Senden von Nachrichten an Kinesis Data Streams verwenden. Die Stream Manager-Komponente ist für die Übertragung großer Datenmengen an den konzipiert. AWS Cloud Weitere Informationen finden Sie unter Datenströme auf Greengrass-Kerngeräten verwalten.
Anforderung
Die Anforderung dieses Vorgangs hat die folgenden Parameter:
topicName(Python:topic_name)-
Das Thema, zu dem die Nachricht veröffentlicht werden soll.
qos-
Die zu verwendende MQTT-QoS. Diese Aufzählung,
QOS, hat die folgenden Werte:-
AT_MOST_ONCE— QoS 0. Die MQTT-Nachricht wird höchstens einmal zugestellt. -
AT_LEAST_ONCE— QoS 1. Die MQTT-Nachricht wird mindestens einmal zugestellt.
-
payload-
(Optional) Die Nutzlast der Nachricht als Blob.
Die folgenden Funktionen sind für Version 2.10.0 und höher verfügbar, Grüngraskern wenn Sie MQTT 5 verwenden. Diese Funktionen werden ignoriert, wenn Sie MQTT 3.1.1 verwenden. In der folgenden Tabelle ist die Mindestversion des AWS IoT Geräte-SDK aufgeführt, die Sie für den Zugriff auf diese Funktionen verwenden müssen.
| SDK | Mindestversion |
|---|---|
| AWS IoT-Geräte-SDK for Python |
v1.15.0 |
| AWS IoT Device SDK for Java |
v1.13.0 |
| AWS IoT Device SDK for C++ |
v1.24,0 |
| AWS IoT Device SDK for JavaScript |
v1.13.0 |
payloadFormat-
(Optional) Das Format der Nachrichtennutzlast. Wenn Sie den nicht festlegen
payloadFormat, wird davon ausgegangen, dassBYTESder Typ Die Aufzählung hat die folgenden Werte:-
BYTES— Der Inhalt der Payload ist ein binärer Blob. -
UTF8— Der Inhalt der Payload besteht aus einer UTF8 Zeichenfolge.
-
retain-
(Optional) Gibt an, ob die MQTT-Aufbewahrungsoption
truebeim Veröffentlichen auf gesetzt werden soll. userProperties-
(Optional) Eine Liste von anwendungsspezifischen
UserPropertyObjekten, die gesendet werden sollen. DasUserPropertyObjekt ist wie folgt definiert:UserProperty: key: string value: string messageExpiryIntervalSeconds-
(Optional) Die Anzahl der Sekunden, bevor die Nachricht abläuft und vom Server gelöscht wird. Wenn dieser Wert nicht festgelegt ist, läuft die Nachricht nicht ab.
correlationData-
(Optional) Der Anfrage hinzugefügte Informationen, die verwendet werden können, um eine Anfrage mit einer Antwort zu verknüpfen.
responseTopic-
(Optional) Das Thema, das für die Antwortnachricht verwendet werden soll.
contentType-
(Optional) Eine anwendungsspezifische Kennung für den Inhaltstyp der Nachricht.
Antwort
Dieser Vorgang liefert in seiner Antwort keine Informationen.
Beispiele
Die folgenden Beispiele zeigen, wie dieser Vorgang in benutzerdefiniertem Komponentencode aufgerufen wird.
SubscribeToIoTCore
Abonnieren Sie MQTT-Nachrichten AWS IoT Core über ein Thema oder einen Themenfilter. Die AWS IoT Greengrass Core-Software entfernt Abonnements, wenn die Komponente das Ende ihres Lebenszyklus erreicht hat.
Bei diesem Vorgang handelt es sich um einen Abonnementvorgang, bei dem Sie einen Stream von Ereignisnachrichten abonnieren. Um diese Operation zu verwenden, definieren Sie einen Stream-Response-Handler mit Funktionen, die Ereignismeldungen, Fehler und das Schließen von Streams behandeln. Weitere Informationen finden Sie unter Abonnieren Sie IPC-Event-Streams.
Typ der Ereignisnachricht: IoTCoreMessage
Anforderung
Die Anforderung dieses Vorgangs hat die folgenden Parameter:
topicName(Python:topic_name)-
Das Thema, das abonniert werden soll. Sie können Platzhalter (
#und+) für MQTT-Themen verwenden, um mehrere Themen zu abonnieren. qos-
Die zu verwendende MQTT-QoS. Diese Aufzählung,
QOS, hat die folgenden Werte:-
AT_MOST_ONCE— QoS 0. Die MQTT-Nachricht wird höchstens einmal zugestellt. -
AT_LEAST_ONCE— QoS 1. Die MQTT-Nachricht wird mindestens einmal zugestellt.
-
Antwort
Die Antwort dieser Operation enthält die folgenden Informationen:
messages-
Der Stream von MQTT-Nachrichten. Dieses Objekt,
IoTCoreMessage, enthält die folgenden Informationen:message-
Die MQTT-Nachricht. Dieses Objekt,
MQTTMessage, enthält die folgenden Informationen:topicName(Python:topic_name)-
Das Thema, zu dem die Nachricht veröffentlicht wurde.
payload-
(Optional) Die Nachrichten-Payload als Blob.
Die folgenden Funktionen sind für Version 2.10.0 und höher verfügbar, Grüngraskern wenn Sie MQTT 5 verwenden. Diese Funktionen werden ignoriert, wenn Sie MQTT 3.1.1 verwenden. In der folgenden Tabelle ist die Mindestversion des AWS IoT Geräte-SDK aufgeführt, die Sie für den Zugriff auf diese Funktionen verwenden müssen.
SDK Mindestversion AWS IoT-Geräte-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-
(Optional) Das Format der Nachrichtennutzlast. Wenn Sie den nicht festlegen
payloadFormat, wird davon ausgegangen, dassBYTESder Typ Die Aufzählung hat die folgenden Werte:-
BYTES— Der Inhalt der Payload ist ein binärer Blob. -
UTF8— Der Inhalt der Payload besteht aus einer UTF8 Zeichenfolge.
-
retain-
(Optional) Gibt an, ob die MQTT-Aufbewahrungsoption
truebeim Veröffentlichen auf gesetzt werden soll. userProperties-
(Optional) Eine Liste von anwendungsspezifischen
UserPropertyObjekten, die gesendet werden sollen. DasUserPropertyObjekt ist wie folgt definiert:UserProperty: key: string value: string messageExpiryIntervalSeconds-
(Optional) Die Anzahl der Sekunden, bevor die Nachricht abläuft und vom Server gelöscht wird. Wenn dieser Wert nicht festgelegt ist, läuft die Nachricht nicht ab.
correlationData-
(Optional) Der Anfrage hinzugefügte Informationen, die verwendet werden können, um eine Anfrage mit einer Antwort zu verknüpfen.
responseTopic-
(Optional) Das Thema, das für die Antwortnachricht verwendet werden soll.
contentType-
(Optional) Eine anwendungsspezifische Kennung für den Inhaltstyp der Nachricht.
Beispiele
Die folgenden Beispiele zeigen, wie dieser Vorgang in benutzerdefiniertem Komponentencode aufgerufen wird.
Beispiele
Verwenden Sie die folgenden Beispiele, um zu erfahren, wie Sie den AWS IoT Core MQTT IPC-Service in Ihren Komponenten verwenden können.
Das folgende Beispielrezept ermöglicht es der Komponente, zu allen Themen zu veröffentlichen.
Die folgende C++-Beispielanwendung zeigt, wie der AWS IoT Core MQTT-IPC-Dienst verwendet wird, um Nachrichten zu veröffentlichen. 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; }
Das folgende Beispielrezept ermöglicht es der Komponente, alle Themen zu abonnieren.
Die folgende C++-Beispielanwendung zeigt, wie der AWS IoT Core MQTT-IPC-Dienst verwendet wird, um Nachrichten von zu abonnieren. 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; }
Das folgende Beispielrezept ermöglicht es der Komponente, in allen Themen zu veröffentlichen.
{ "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" } } ] } ] }
Die folgende Rust-Beispielanwendung zeigt, wie der AWS IoT Core MQTT-IPC-Dienst verwendet wird, um Nachrichten zu veröffentlichen. 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}"); }
Das folgende Beispielrezept ermöglicht es der Komponente, alle Themen zu abonnieren.
{ "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" } } ] } ] }
Die folgende Rust-Beispielanwendung zeigt, wie der AWS IoT Core MQTT-IPC-Dienst verwendet wird, um Nachrichten von zu abonnieren. 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)); } }
Das folgende Beispielrezept ermöglicht es der Komponente, in allen Themen zu veröffentlichen.
{ "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" } } ] } ] }
Die folgende C-Beispielanwendung zeigt, wie der AWS IoT Core MQTT-IPC-Dienst verwendet wird, um Nachrichten zu veröffentlichen. 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 ); }
Das folgende Beispielrezept ermöglicht es der Komponente, alle Themen zu abonnieren.
{ "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" } } ] } ] }
Die folgende C-Beispielanwendung zeigt, wie Sie den AWS IoT Core MQTT-IPC-Dienst verwenden, um Nachrichten von zu abonnieren. 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); }
Das folgende Beispielrezept ermöglicht es der Komponente, zu allen Themen zu veröffentlichen.
{ "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" } } ] } ] }
Die folgende C++-Beispielanwendung zeigt, wie der AWS IoT Core MQTT-IPC-Dienst verwendet wird, um Nachrichten zu veröffentlichen. 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"; }
Das folgende Beispielrezept ermöglicht es der Komponente, alle Themen zu abonnieren.
{ "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" } } ] } ] }
Die folgende C++-Beispielanwendung zeigt, wie der AWS IoT Core MQTT-IPC-Dienst verwendet wird, um Nachrichten von zu abonnieren. 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); } }