Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Publish/subscribe AWS IoT Core Messages MQTT
Le service IPC de messagerie AWS IoT Core MQTT vous permet d'envoyer et de recevoir des messages MQTT depuis et vers. AWS IoT Core Les composants peuvent publier des messages AWS IoT Core et s'abonner à des rubriques pour agir sur les messages MQTT provenant d'autres sources. Pour plus d'informations sur la AWS IoT Core mise en œuvre de MQTT, consultez MQTT dans le Guide du AWS IoT Core développeur.
Note
Ce service IPC de messagerie MQTT vous permet d'échanger des messages avec. AWS IoT Core Pour plus d'informations sur l'échange de messages entre les composants, consultezPublier/souscrire des messages locaux.
Rubriques
Versions minimales du SDK
Le tableau suivant répertorie les versions minimales des kits de développement logiciel que vous pouvez utiliser pour publier et vous abonner à des messages MQTT en provenance et à destination. AWS IoT Core
| Kit SDK | Version minimale |
|---|---|
|
AWS IoT Greengrass Kit de développement logiciel (C, C++, Rust) |
v1.0.0 |
|
V1.2.10 |
|
|
V1.5.3 |
|
|
V1.17,0 |
|
|
v1.12.0 |
Autorisation
Pour utiliser la messagerie AWS IoT Core MQTT dans un composant personnalisé, vous devez définir des politiques d'autorisation qui permettent à votre composant d'envoyer et de recevoir des messages sur des sujets. Pour plus d'informations sur la définition des politiques d'autorisation, consultezAutoriser les composants à effectuer des opérations IPC.
Les politiques d'autorisation pour AWS IoT Core la messagerie MQTT possèdent les propriétés suivantes.
Identifiant du service IPC : aws.greengrass.ipc.mqttproxy
| Opération | Description | Ressources |
|---|---|---|
|
|
Permet à un composant de publier des messages AWS IoT Core sur les sujets MQTT que vous spécifiez. |
Une chaîne de rubrique, telle que |
|
|
Permet à un composant de s'abonner à des messages provenant AWS IoT Core des sujets que vous spécifiez. |
Une chaîne de rubrique, telle que |
|
|
Permet à un composant de publier et de s'abonner à des messages AWS IoT Core MQTT pour les sujets que vous spécifiez. |
Une chaîne de rubrique, telle que |
jokers MQTT dans AWS IoT Core Politiques d'autorisation MQTT
Vous pouvez utiliser des caractères génériques MQTT dans les politiques d'autorisation AWS IoT Core MQTT IPC. Les composants peuvent publier des sujets et s'y abonner qui correspondent au filtre de sujets que vous autorisez dans une politique d'autorisation. Par exemple, si la politique d'autorisation d'un composant autorise l'accès àtest/topic/#, le composant peut s'y abonnertest/topic/#, publier et s'y abonnertest/topic/filter.
Variables de recette dans AWS IoT Core Politiques d'autorisation MQTT
Si vous utilisez la version 2.6.0 ou ultérieure du noyau Greengrass, vous pouvez utiliser la variable {iot:thingName} recipe dans les politiques d'autorisation. Cette fonctionnalité vous permet de configurer une politique d'autorisation unique pour un groupe d'appareils principaux, chaque appareil principal ne pouvant accéder qu'aux rubriques contenant son propre nom. Par exemple, vous pouvez autoriser un composant à accéder à la ressource thématique suivante.
devices/{iot:thingName}/messages
Pour plus d’informations, consultez Variables de recette et Utiliser des variables de recette dans les mises à jour de fusion.
Exemples de politiques d'autorisation
Vous pouvez consulter les exemples de politiques d'autorisation suivants pour vous aider à configurer les politiques d'autorisation pour vos composants.
Exemple Exemple de politique d'autorisation avec accès illimité
L'exemple de politique d'autorisation suivant permet à un composant de publier et de s'abonner à toutes les rubriques.
Exemple Exemple de politique d'autorisation avec accès limité
L'exemple de politique d'autorisation suivant permet à un composant de publier et de s'abonner à deux rubriques nommées factory/1/events etfactory/1/actions.
Exemple Exemple de politique d'autorisation pour un groupe d'appareils principaux
Important
Cet exemple utilise une fonctionnalité disponible pour les versions 2.6.0 et ultérieures du composant Greengrass nucleus. Greengrass Nucleus v2.6.0 ajoute la prise en charge de la plupart des variables de recette, par exemple dans les configurations de {iot:thingName} composants.
L'exemple de politique d'autorisation suivant permet à un composant de publier et de s'abonner à une rubrique contenant le nom du périphérique principal qui exécute le composant.
PublishToIoTCore
Publie un message MQTT AWS IoT Core sur un sujet.
Lorsque vous publiez des messages MQTT sur AWS IoT Core, il existe un quota de 100 transactions par seconde. Si vous dépassez ce quota, les messages sont mis en file d'attente pour être traités sur l'appareil Greengrass. Il existe également un quota de 512 Ko de données par seconde et un quota pour l'ensemble du compte de 20 000 publications par seconde (2 000 dans certains Régions AWS cas). Pour plus d'informations sur les limites des courtiers de messages MQTT AWS IoT Core, consultez la section Limites et quotas des courtiers de AWS IoT Core messages et des protocoles.
Si vous dépassez ces quotas, l'appareil Greengrass limite la publication de messages à AWS IoT Core. Les messages sont stockés dans un spouleur en mémoire. Par défaut, la mémoire allouée au spouleur est de 2,5 Mo. Si le spooler est plein, les nouveaux messages sont rejetés. Vous pouvez augmenter la taille du spouleur. Pour plus d'informations, consultez la section Configurationdans la documentation Noyau Greengrass. Pour éviter de remplir le spouleur et de devoir augmenter la mémoire allouée, limitez les demandes de publication à un maximum de 100 requêtes par seconde.
Lorsque votre application doit envoyer des messages à un débit plus élevé, ou des messages plus volumineux, pensez à utiliser le Gestionnaire de flux pour envoyer des messages à Kinesis Data Streams. Le composant du gestionnaire de flux est conçu pour transférer de gros volumes de données vers le AWS Cloud. Pour de plus amples informations, veuillez consulter Gérez les flux de données sur les appareils principaux de Greengrass.
Demande
La requête de cette opération comporte les paramètres suivants :
topicName(Python :topic_name)-
Rubrique dans laquelle publier le message.
qos-
Le QoS MQTT à utiliser. Cette énumération
QOS, possède les valeurs suivantes :-
AT_MOST_ONCE— QoS 0. Le message MQTT est délivré au plus une fois. -
AT_LEAST_ONCE— QoS 1. Le message MQTT est délivré au moins une fois.
-
payload-
(Facultatif) La charge utile du message sous forme de blob.
Les fonctionnalités suivantes sont disponibles pour la version 2.10.0 et les versions ultérieures Noyau Greengrass lors de l'utilisation de MQTT 5. Ces fonctionnalités sont ignorées lorsque vous utilisez MQTT 3.1.1. Le tableau suivant répertorie la version minimale du SDK de l' AWS IoT appareil que vous devez utiliser pour accéder à ces fonctionnalités.
| Kit SDK | Version minimale |
|---|---|
| Kit SDK des appareils AWS IoT pour Python |
V1.15.0 |
| Kit SDK des appareils AWS IoT pour Java |
V1.13.0 |
| Kit SDK des appareils AWS IoT pour C++ |
V1.24,0 |
| Kit SDK des appareils AWS IoT pour JavaScript |
V1.13.0 |
payloadFormat-
(Facultatif) Format de la charge utile du message. Si vous ne définissez pas le
payloadFormat, le type est supposé êtreBYTES. L'énumération possède les valeurs suivantes :-
BYTES— Le contenu de la charge utile est un blob binaire. -
UTF8— Le contenu de la charge utile est une chaîne de caractères UTF8.
-
retain-
(Facultatif) Indique si l'option de conservation MQTT doit être définie sur
truelors de la publication. userProperties-
(Facultatif) Liste des
UserPropertyobjets spécifiques à l'application à envoyer. L'UserPropertyobjet est défini comme suit :UserProperty: key: string value: string messageExpiryIntervalSeconds-
(Facultatif) Le nombre de secondes qui s'écoulent avant que le message n'expire et ne soit supprimé par le serveur. Si cette valeur n'est pas définie, le message n'expire pas.
correlationData-
(Facultatif) Informations ajoutées à la demande qui peuvent être utilisées pour associer une demande à une réponse.
responseTopic-
(Facultatif) Rubrique à utiliser pour le message de réponse.
contentType-
(Facultatif) Identifiant spécifique à l'application du type de contenu du message.
Réponse
Cette opération ne fournit aucune information dans sa réponse.
Exemples
Les exemples suivants montrent comment appeler cette opération dans un code de composant personnalisé.
SubscribeToIoTCore
Abonnez-vous aux messages MQTT à partir d'un AWS IoT Core sujet ou d'un filtre de sujet. Le logiciel AWS IoT Greengrass Core supprime les abonnements lorsque le composant atteint la fin de son cycle de vie.
Cette opération est une opération d'abonnement au cours de laquelle vous vous abonnez à un flux de messages d'événements. Pour utiliser cette opération, définissez un gestionnaire de réponse de flux avec des fonctions qui gèrent les messages d'événements, les erreurs et la fermeture de flux. Pour de plus amples informations, veuillez consulter Abonnez-vous aux diffusions d'événements IPC.
Type de message d'événement : IoTCoreMessage
Demande
La requête de cette opération comporte les paramètres suivants :
topicName(Python :topic_name)-
Rubrique à laquelle s'abonner. Vous pouvez utiliser les caractères génériques de rubrique MQTT (
#et+) pour vous abonner à plusieurs rubriques. qos-
Le QoS MQTT à utiliser. Cette énumération
QOS, possède les valeurs suivantes :-
AT_MOST_ONCE— QoS 0. Le message MQTT est délivré au plus une fois. -
AT_LEAST_ONCE— QoS 1. Le message MQTT est délivré au moins une fois.
-
Réponse
La réponse de cette opération contient les informations suivantes :
messages-
Le flux de messages MQTT. Cet objet contient
IoTCoreMessageles informations suivantes :message-
Le message MQTT. Cet objet contient
MQTTMessageles informations suivantes :topicName(Python :topic_name)-
Rubrique sur laquelle le message a été publié.
payload-
(Facultatif) La charge utile du message sous forme de blob.
Les fonctionnalités suivantes sont disponibles pour la version 2.10.0 et les versions ultérieures Noyau Greengrass lors de l'utilisation de MQTT 5. Ces fonctionnalités sont ignorées lorsque vous utilisez MQTT 3.1.1. Le tableau suivant répertorie la version minimale du SDK de l' AWS IoT appareil que vous devez utiliser pour accéder à ces fonctionnalités.
Kit SDK Version minimale Kit SDK des appareils AWS IoT pour Python v2 V1.15.0 Kit SDK des appareils AWS IoT pour Java v2 V1.13.0 Kit SDK des appareils AWS IoT pour C++ v2 V1.24,0 Kit SDK des appareils AWS IoT pour JavaScript v2 V1.13.0 payloadFormat-
(Facultatif) Format de la charge utile du message. Si vous ne définissez pas le
payloadFormat, le type est supposé êtreBYTES. L'énumération possède les valeurs suivantes :-
BYTES— Le contenu de la charge utile est un blob binaire. -
UTF8— Le contenu de la charge utile est une chaîne de caractères UTF8.
-
retain-
(Facultatif) Indique si l'option de conservation MQTT doit être définie sur
truelors de la publication. userProperties-
(Facultatif) Liste des
UserPropertyobjets spécifiques à l'application à envoyer. L'UserPropertyobjet est défini comme suit :UserProperty: key: string value: string messageExpiryIntervalSeconds-
(Facultatif) Le nombre de secondes qui s'écoulent avant que le message n'expire et ne soit supprimé par le serveur. Si cette valeur n'est pas définie, le message n'expire pas.
correlationData-
(Facultatif) Informations ajoutées à la demande qui peuvent être utilisées pour associer une demande à une réponse.
responseTopic-
(Facultatif) Rubrique à utiliser pour le message de réponse.
contentType-
(Facultatif) Identifiant spécifique à l'application du type de contenu du message.
Exemples
Les exemples suivants montrent comment appeler cette opération dans un code de composant personnalisé.
SubscribeToIoTCoreConnectionStatus
Utilisez cette opération pour vous abonner à l'état de la connexion MQTT entre le périphérique principal et AWS IoT Core. Après votre inscription, vous recevez l'état actuel de la connexion lors du premier événement. Vous recevez ensuite un événement chaque fois que le périphérique principal se connecte ou se AWS IoT Core déconnecte.
Cette opération est une opération d'abonnement au cours de laquelle vous vous abonnez à un flux de messages d'événements. Pour utiliser cette opération, définissez un gestionnaire de réponse de flux avec des fonctions qui gèrent les messages d'événements, les erreurs et la fermeture de flux. Pour de plus amples informations, veuillez consulter Abonnez-vous aux diffusions d'événements IPC.
Type de message d'événement : IoTCoreConnectionStatusEvent
Note
Cette opération ne nécessite pas de politique d'autorisation, car il s'agit d'une opération d'information, uniquement locale, qui n'expose pas les données des sujets MQTT. Vous pouvez appeler cette opération dans vos composants sans aucune accessControl entrée dans la recette des composants.
Demande
La requête de cette opération ne comporte aucun paramètre.
Réponse
La réponse de cette opération contient les informations suivantes :
connectionStatusEvent(Python :connection_status_event)-
L'
ConnectionStatusEventobjet de chaque flux.IoTCoreConnectionStatusEventCet objet indique l'état de connexion MQTT du périphérique principal et contient les informations suivantes :status-
État de la connexion MQTT entre le périphérique principal et AWS IoT Core. Cette énumération
ConnectionStatus, possède les valeurs suivantes :-
CONNECTED— L'appareil principal est connecté à AWS IoT Core. -
DISCONNECTED— L'appareil principal est déconnecté de AWS IoT Core.
-
Exemples d’événements
Chaque événement du flux est la sérialisation JSON d'un IoTCoreConnectionStatusEvent objet. La connectionStatusEvent clé identifie le type d'événement dans le flux.
Après votre inscription, vous recevez l'exemple d'événement suivant lorsque l'appareil principal est connecté à AWS IoT Core. Vous recevez également cet événement lorsque la connexion reprend.
{ "connectionStatusEvent": { "status": "CONNECTED" } }
L'exemple d'événement suivant s'affiche lorsque le périphérique principal perd sa connexion MQTT.
{ "connectionStatusEvent": { "status": "DISCONNECTED" } }
Exemples
Utilisez les exemples suivants pour apprendre à utiliser le service AWS IoT Core MQTT IPC dans vos composants.
L'exemple de recette suivant permet au composant de publier sur toutes les rubriques.
L'exemple d'application C++ suivant montre comment utiliser le service AWS IoT Core MQTT IPC pour publier des messages. 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; }
L'exemple de recette suivant permet au composant de s'abonner à toutes les rubriques.
L'exemple d'application C++ suivant montre comment utiliser le service AWS IoT Core MQTT IPC pour s'abonner aux messages 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; }
L'exemple de recette suivant permet au composant de publier sur toutes les rubriques.
{ "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" } } ] } ] }
L'exemple d'application Rust suivant montre comment utiliser le service AWS IoT Core MQTT IPC pour publier des messages. 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}"); }
L'exemple de recette suivant permet au composant de s'abonner à toutes les rubriques.
{ "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" } } ] } ] }
L'exemple d'application Rust suivant montre comment utiliser le service AWS IoT Core MQTT IPC pour s'abonner aux messages 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)); } }
L'exemple de recette suivant permet au composant de publier sur toutes les rubriques.
{ "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" } } ] } ] }
L'exemple d'application C suivant montre comment utiliser le service AWS IoT Core MQTT IPC pour publier des messages. 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 ); }
L'exemple de recette suivant permet au composant de s'abonner à toutes les rubriques.
{ "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" } } ] } ] }
L'exemple d'application C suivant montre comment utiliser le service AWS IoT Core MQTT IPC pour s'abonner aux messages 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); }
L'exemple de recette suivant permet au composant de publier sur toutes les rubriques.
{ "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" } } ] } ] }
L'exemple d'application C++ suivant montre comment utiliser le service AWS IoT Core MQTT IPC pour publier des messages. 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"; }
L'exemple de recette suivant permet au composant de s'abonner à toutes les rubriques.
{ "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" } } ] } ] }
L'exemple d'application C++ suivant montre comment utiliser le service AWS IoT Core MQTT IPC pour s'abonner aux messages 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); } }