Interagieren Sie mit der Komponentenkonfiguration - AWS IoT Greengrass

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.

Interagieren Sie mit der Komponentenkonfiguration

Mit dem IPC-Dienst für die Komponentenkonfiguration können Sie Folgendes tun:

  • Abrufen und Einstellen der Konfigurationsparameter für Komponenten.

  • Abonnieren Sie Updates zur Komponentenkonfiguration.

  • Validieren Sie Aktualisierungen der Komponentenkonfiguration, bevor der Nucleus sie einführt.

Minimale SDK-Versionen

In der folgenden Tabelle sind die Mindestversionen von aufgeführt AWS IoT Device SDK , die Sie für die Interaktion mit der Komponentenkonfiguration verwenden müssen.

GetConfiguration

Ruft einen Konfigurationswert für eine Komponente auf dem Kerngerät ab. Sie geben den Schlüsselpfad an, für den ein Konfigurationswert abgerufen werden soll.

Anforderung

Die Anforderung dieses Vorgangs hat die folgenden Parameter:

componentName(Python:component_name)

(Optional) Der Name der Komponente.

Standardmäßig wird der Name der Komponente verwendet, die die Anforderung stellt.

keyPath(Python:key_path)

Der Schlüsselpfad zum Konfigurationswert. Geben Sie eine Liste an, in der jeder Eintrag der Schlüssel für eine einzelne Ebene im Konfigurationsobjekt ist. Geben Sie beispielsweise ["mqtt", "port"] an, dass der Wert von port in der folgenden Konfiguration abgerufen werden soll.

{ "mqtt": { "port": 443 } }

Um die vollständige Konfiguration der Komponente abzurufen, geben Sie eine leere Liste an.

Antwort

Die Antwort dieses Vorgangs enthält die folgenden Informationen:

componentName(Python:component_name)

Der Name der Komponente.

value

Die angeforderte Konfiguration als Objekt.

Beispiele

Die folgenden Beispiele zeigen, wie dieser Vorgang in benutzerdefiniertem Komponentencode aufgerufen wird.

Rust
Beispiel Beispiel: Konfiguration abrufen
use core::mem::MaybeUninit; use gg_sdk::{Sdk, UnpackedObject}; fn main() { let sdk = Sdk::init(); sdk.connect().expect("Failed to establish IPC connection"); // Get a configuration value at key path ["mqtt", "port"] let mut buf = [MaybeUninit::uninit(); 1024]; let value = sdk .get_config(&["mqtt", "port"], None, &mut buf) .expect("Failed to get configuration"); if let UnpackedObject::I64(port) = value.unpack() { println!("Configuration value: {port}"); } }
C
Beispiel Beispiel: Konfiguration abrufen
#include <gg/error.h> #include <gg/ipc/client.h> #include <gg/object.h> #include <gg/sdk.h> #include <inttypes.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); } // Get a configuration value at key path ["mqtt", "port"] uint8_t response_mem[1024]; GgObject value; err = ggipc_get_config( GG_BUF_LIST(GG_STR("mqtt"), GG_STR("port")), NULL, // component_name (NULL = current component) GG_BUF(response_mem), &value ); if (err != GG_ERR_OK) { fprintf(stderr, "Failed to get configuration.\n"); exit(-1); } if (gg_obj_type(value) == GG_TYPE_I64) { printf("Configuration value: %" PRId64 "\n", gg_obj_into_i64(value)); } else if (gg_obj_type(value) == GG_TYPE_BUF) { GgBuffer buf = gg_obj_into_buf(value); printf("Configuration value: %.*s\n", (int) buf.len, buf.data); } else { printf("Configuration value is of unexpected type.\n"); } }
C++ (Component SDK)
Beispiel Beispiel: Konfiguration abrufen
#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); } // Get a configuration value at key path ["mqtt", "port"] std::array key_path = { gg::Buffer { "mqtt" }, gg::Buffer { "port" } }; int64_t value = 0; error = client.get_config(key_path, std::nullopt, value); if (error) { std::cerr << "Failed to get configuration.\n"; exit(-1); } std::cout << "Configuration value: " << value << "\n"; }

UpdateConfiguration

Aktualisiert einen Konfigurationswert für diese Komponente auf dem Kerngerät.

Anforderung

Die Anforderung dieses Vorgangs hat die folgenden Parameter:

keyPath(Python:key_path)

(Optional) Der Schlüsselpfad zum Containerknoten (dem Objekt), der aktualisiert werden soll. Geben Sie eine Liste an, in der jeder Eintrag der Schlüssel für eine einzelne Ebene im Konfigurationsobjekt ist. Geben Sie beispielsweise den Schlüsselpfad ["mqtt"] und den Zusammenführungswert { "port": 443 } an, für den der Wert port in der folgenden Konfiguration festgelegt werden soll.

{ "mqtt": { "port": 443 } }

Der Schlüsselpfad muss einen Containerknoten (ein Objekt) in der Konfiguration angeben. Wenn der Knoten in der Konfiguration der Komponente nicht vorhanden ist, erstellt dieser Vorgang ihn und setzt seinen Wert auf das Objekt invalueToMerge.

Standardmäßig wird das Stammverzeichnis des Konfigurationsobjekts verwendet.

timestamp

Die aktuelle Zeit der Unix-Epoche in Millisekunden. Dieser Vorgang verwendet diesen Zeitstempel, um gleichzeitige Aktualisierungen des Schlüssels aufzulösen. Wenn der Schlüssel in der Komponentenkonfiguration einen größeren Zeitstempel als der Zeitstempel in der Anforderung hat, schlägt die Anforderung fehl.

valueToMerge(Python:value_to_merge)

Das Konfigurationsobjekt, das an der von Ihnen angegebenen Position zusammengeführt werden sollkeyPath. Weitere Informationen finden Sie unter Komponentenkonfigurationen aktualisieren.

Antwort

Dieser Vorgang liefert in seiner Antwort keine Informationen.

Beispiele

Die folgenden Beispiele zeigen, wie dieser Vorgang in benutzerdefiniertem Komponentencode aufgerufen wird.

Rust
Beispiel Beispiel: Konfiguration aktualisieren
use gg_sdk::Sdk; fn main() { let sdk = Sdk::init(); sdk.connect().expect("Failed to establish IPC connection"); // Update configuration value at key path ["mqtt", "port"] to 443 sdk.update_config(&["mqtt", "port"], None, 443) .expect("Failed to update configuration"); println!("Successfully updated configuration."); }
C
Beispiel Beispiel: Konfiguration aktualisieren
#include <gg/error.h> #include <gg/ipc/client.h> #include <gg/object.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); } // Update configuration value at key path ["mqtt", "port"] to 443 err = ggipc_update_config( GG_BUF_LIST(GG_STR("mqtt"), GG_STR("port")), NULL, // timestamp (NULL = current time) gg_obj_i64(443) ); if (err != GG_ERR_OK) { fprintf(stderr, "Failed to update configuration.\n"); exit(-1); } printf("Successfully updated configuration.\n"); }
C++ (Component SDK)
Beispiel Beispiel: Konfiguration aktualisieren
#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); } // Update configuration value at key path ["mqtt", "port"] to 443 std::array key_path = { gg::Buffer { "mqtt" }, gg::Buffer { "port" } }; error = client.update_config(key_path, 443); if (error) { std::cerr << "Failed to update configuration.\n"; exit(-1); } std::cout << "Successfully updated configuration.\n"; }

SubscribeToConfigurationUpdate

Abonnieren Sie, um Benachrichtigungen zu erhalten, wenn die Konfiguration einer Komponente aktualisiert wird. Wenn Sie einen Schlüssel abonnieren, erhalten Sie eine Benachrichtigung, wenn ein untergeordnetes Element dieses Schlüssels aktualisiert wird.

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: ConfigurationUpdateEvents

Anforderung

Die Anforderung dieses Vorgangs hat die folgenden Parameter:

componentName(Python:component_name)

(Optional) Der Name der Komponente.

Standardmäßig wird der Name der Komponente verwendet, die die Anforderung stellt.

keyPath(Python:key_path)

Der Schlüsselpfad zu dem Konfigurationswert, den Sie abonnieren möchten. Geben Sie eine Liste an, in der jeder Eintrag der Schlüssel für eine einzelne Ebene im Konfigurationsobjekt ist. Geben Sie beispielsweise ["mqtt", "port"] an, dass der Wert von port in der folgenden Konfiguration abgerufen werden soll.

{ "mqtt": { "port": 443 } }

Um Updates für alle Werte in der Konfiguration der Komponente zu abonnieren, geben Sie eine leere Liste an.

Antwort

Die Antwort dieses Vorgangs enthält die folgenden Informationen:

messages

Der Stream von Benachrichtigungsnachrichten. Dieses Objekt,ConfigurationUpdateEvents, enthält die folgenden Informationen:

configurationUpdateEvent(Python:configuration_update_event)

Das Ereignis zur Aktualisierung der Konfiguration. Dieses Objekt,ConfigurationUpdateEvent, enthält die folgenden Informationen:

componentName(Python:component_name)

Der Name der Komponente.

keyPath(Python:key_path)

Der Schlüsselpfad zu dem Konfigurationswert, der aktualisiert wurde.

Beispiele

Die folgenden Beispiele zeigen, wie dieser Vorgang in benutzerdefiniertem Komponentencode aufgerufen wird.

Rust
Beispiel Beispiel: Abonnieren Sie Konfigurationsupdates
use gg_sdk::Sdk; use std::{thread, time::Duration}; fn main() { let sdk = Sdk::init(); sdk.connect().expect("Failed to establish IPC connection"); // Subscribe to configuration updates for key path ["mqtt"] let callback = |component_name: &str, key_path: &[&str]| { println!( "Received configuration update for component: {component_name}" ); println!("Key path: {key_path:?}"); }; let _sub = sdk .subscribe_to_configuration_update(None, &["mqtt"], &callback) .expect("Failed to subscribe to configuration updates"); println!("Successfully subscribed to configuration updates."); // Keep the main thread alive, or the process will exit. loop { thread::sleep(Duration::from_secs(10)); } }
C
Beispiel Beispiel: Abonnieren Sie Konfigurationsupdates
#include <gg/error.h> #include <gg/ipc/client.h> #include <gg/object.h> #include <gg/sdk.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> static void on_subscription_response( void *ctx, GgBuffer component_name, GgList key_path, GgIpcSubscriptionHandle handle ) { (void) ctx; (void) handle; printf( "Received configuration update for component: %.*s\n", (int) component_name.len, component_name.data ); printf("Key path: ["); for (size_t i = 0; i < key_path.len; i++) { if (i > 0) { printf(", "); } GgObject *obj = &key_path.items[i]; if (gg_obj_type(*obj) == GG_TYPE_BUF) { GgBuffer key = gg_obj_into_buf(*obj); printf("\"%.*s\"", (int) key.len, key.data); } } printf("]\n"); } 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); } // Subscribe to configuration updates for key path ["mqtt"] GgIpcSubscriptionHandle handle; err = ggipc_subscribe_to_configuration_update( NULL, // component_name (NULL = current component) GG_BUF_LIST(GG_STR("mqtt")), on_subscription_response, NULL, &handle ); if (err != GG_ERR_OK) { fprintf(stderr, "Failed to subscribe to configuration updates.\n"); exit(-1); } printf("Successfully subscribed to configuration updates.\n"); // Keep the main thread alive, or the process will exit. while (1) { sleep(10); } // To stop subscribing, close the stream. ggipc_close_subscription(handle); }
C++ (Component SDK)
Beispiel Beispiel: Abonnieren Sie Konfigurationsupdates
#include <gg/ipc/client.hpp> #include <unistd.h> #include <iostream> class ResponseHandler : public gg::ipc::ConfigurationUpdateCallback { void operator()( std::string_view component_name, gg::List key_path, gg::ipc::Subscription &handle ) override { (void) handle; std::cout << "Received configuration update for component: " << component_name << "\n"; std::cout << "Key path: ["; for (size_t i = 0; i < key_path.size(); i++) { if (i > 0) { std::cout << ", "; } std::cout << "\"" << get<gg::Buffer>(key_path[i]) << "\""; } std::cout << "]\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); } // Subscribe to configuration updates for key path ["mqtt"] std::array key_path = { gg::Buffer { "mqtt" } }; static ResponseHandler handler; error = client.subscribe_to_configuration_update( key_path, std::nullopt, handler ); if (error) { std::cerr << "Failed to subscribe to configuration updates.\n"; exit(-1); } std::cout << "Successfully subscribed to configuration updates.\n"; // Keep the main thread alive, or the process will exit. while (1) { sleep(10); } }

SubscribeToValidateConfigurationUpdates

Abonnieren Sie, um Benachrichtigungen vor den Konfigurationsupdates dieser Komponente zu erhalten. Auf diese Weise können Komponenten Aktualisierungen ihrer eigenen Konfiguration validieren. Verwenden Sie die SendConfigurationValidityReport Operation, um dem Nucleus mitzuteilen, ob die Konfiguration gültig ist oder nicht.

Wichtig

Lokale Bereitstellungen benachrichtigen die Komponenten nicht über Updates.

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: ValidateConfigurationUpdateEvents

Anforderung

Die Anfrage dieses Vorgangs hat keine Parameter.

Antwort

Die Antwort dieser Operation enthält die folgenden Informationen:

messages

Der Stream von Benachrichtigungsnachrichten. Dieses Objekt,ValidateConfigurationUpdateEvents, enthält die folgenden Informationen:

validateConfigurationUpdateEvent(Python:validate_configuration_update_event)

Das Ereignis zur Aktualisierung der Konfiguration. Dieses Objekt,ValidateConfigurationUpdateEvent, enthält die folgenden Informationen:

deploymentId(Python:deployment_id)

Die ID der AWS IoT Greengrass Bereitstellung, die die Komponente aktualisiert.

configuration

Das Objekt, das die neue Konfiguration enthält.

SendConfigurationValidityReport

Teilen Sie dem Nucleus mit, ob ein Konfigurationsupdate für diese Komponente gültig ist oder nicht. Die Bereitstellung schlägt fehl, wenn Sie dem Nucleus mitteilen, dass die neue Konfiguration nicht gültig ist. Verwenden Sie den SubscribeToValidateConfigurationUpdates Vorgang, um die Konfigurationsupdates zu abonnieren und zu validieren.

Wenn eine Komponente nicht auf eine Benachrichtigung zur Überprüfung des Konfigurationsupdates reagiert, wartet der Nucleus so lange, wie Sie in der Konfigurationsvalidierungsrichtlinie für die Bereitstellung angegeben haben. Nach diesem Timeout fährt der Nucleus mit der Bereitstellung fort. Das Standard-Timeout für die Komponentenvalidierung beträgt 20 Sekunden. Weitere Informationen finden Sie unter Erstellen von Bereitstellungen und unter dem DeploymentConfigurationValidationPolicyObjekt, das Sie angeben können, wenn Sie den CreateDeploymentVorgang aufrufen.

Anforderung

Die Anforderung dieses Vorgangs hat die folgenden Parameter:

configurationValidityReport(Python:configuration_validity_report)

Der Bericht, der dem Nucleus mitteilt, ob das Konfigurationsupdate gültig ist oder nicht. Dieses Objekt,ConfigurationValidityReport, enthält die folgenden Informationen:

status

Der Gültigkeitsstatus. Diese Aufzählung,ConfigurationValidityStatus, hat die folgenden Werte:

  • ACCEPTED— Die Konfiguration ist gültig und der Nucleus kann sie auf diese Komponente anwenden.

  • REJECTED— Die Konfiguration ist nicht gültig und die Bereitstellung schlägt fehl.

deploymentId(Python:deployment_id)

Die ID der AWS IoT Greengrass Bereitstellung, die das Konfigurationsupdate angefordert hat.

message

(Optional) Eine Meldung, die angibt, warum die Konfiguration nicht gültig ist.

Antwort

Dieser Vorgang liefert in seiner Antwort keine Informationen.