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.
Verwenden Sie den AWS IoT Device SDK , um mit dem Greengrass-Kern und anderen Komponenten zu kommunizieren und AWS IoT Core
Komponenten, die auf Ihrem Core-Gerät ausgeführt werden, können die AWS IoT Greengrass Core Interprocess Communication (IPC) -Bibliothek in der verwenden, AWS IoT Device SDK um mit dem AWS IoT Greengrass Nucleus und anderen Greengrass-Komponenten zu kommunizieren. Um benutzerdefinierte Komponenten zu entwickeln und auszuführen, die verwendenIPC, müssen Sie die verwenden, AWS IoT Device SDK um eine Verbindung zum AWS IoT Greengrass IPC Core-Dienst herzustellen und Operationen auszuführenIPC.
Die IPC Schnittstelle unterstützt zwei Arten von Vorgängen:
-
Anfrage/Antwort
Komponenten senden eine Anfrage an den IPC Dienst und erhalten eine Antwort, die das Ergebnis der Anfrage enthält.
-
Abonnement
Komponenten senden eine Abonnementanfrage an den IPC Dienst und erwarten als Antwort einen Strom von Ereignisnachrichten. Komponenten stellen einen Abonnement-Handler bereit, der Ereignismeldungen, Fehler und das Schließen von Streams verarbeitet. Das AWS IoT Device SDK beinhaltet eine Handler-Schnittstelle mit den richtigen Antwort- und Ereignistypen für jeden IPC Vorgang. Weitere Informationen finden Sie unter Abonnieren Sie IPC Event-Streams.
Themen
- IPCClient-Versionen
- Wird SDKs für die Kommunikation zwischen Prozessen unterstützt
- Connect zum AWS IoT Greengrass IPC Core-Dienst her
- Autorisieren Sie Komponenten zur Ausführung von Vorgängen IPC
- Abonnieren Sie IPC Event-Streams
- Bewährte Methoden für IPC
- Lokale Nachrichten veröffentlichen/abonnieren
- Nachrichten veröffentlichen/abonnieren AWS IoT Core MQTT
- Interagieren mit dem Komponentenlebenszyklus
- Interagieren mit der Komponentenkonfiguration
- Geheime Werte abrufen
- Interagieren mit lokalen Schatten
- Verwalten von lokalen Bereitstellungen und Komponenten
- Authentifizieren und Autorisieren von Client-Geräten
IPCClient-Versionen
In späteren Versionen von Java und Python SDKs wird eine verbesserte Version des Clients AWS IoT Greengrass bereitgestellt, die als IPC IPC Client V2 bezeichnet wird. IPCClient V2:
-
Reduziert die Menge an Code, die Sie schreiben müssen, um IPC Operationen zu verwenden, und hilft, häufige Fehler zu vermeiden, die bei IPC Client V1 auftreten können.
-
Ruft Abonnement-Handler-Callbacks in einem separaten Thread auf, sodass Sie jetzt Blockierungscode, einschließlich zusätzlicher IPC Funktionsaufrufen, in Abonnement-Handler-Callbacks ausführen können. IPCClient V1 verwendet denselben Thread, um mit dem IPC Server zu kommunizieren und Abonnement-Handler-Callbacks aufzurufen.
-
Ermöglicht das Aufrufen von Abonnementvorgängen mithilfe von Lambda-Ausdrücken (Java) oder Funktionen (Python). IPCFür Client V1 müssen Sie Abonnement-Handler-Klassen definieren.
-
Stellt synchrone und asynchrone Versionen der einzelnen IPC Operationen bereit. IPCClient V1 stellt nur asynchrone Versionen der einzelnen Operationen bereit.
Wir empfehlen, dass Sie IPC Client V2 verwenden, um diese Verbesserungen nutzen zu können. Viele Beispiele in dieser Dokumentation und in einigen Online-Inhalten zeigen jedoch nur, wie IPC Client V1 verwendet wird. Anhand der folgenden Beispiele und Tutorials können Sie sich mit Beispielkomponenten vertraut machen, die IPC Client V2 verwenden:
Derzeit unterstützt der AWS IoT Device SDK für C++ v2 nur den IPC Client V1.
Wird SDKs für die Kommunikation zwischen Prozessen unterstützt
Die AWS IoT Greengrass IPC Core-Bibliotheken sind in den folgenden AWS IoT Device SDK Versionen enthalten.
SDK | Mindestversion | Verwendung |
---|---|---|
v1.6.0 |
Siehe Verwenden Sie AWS IoT Device SDK für Java v2 (IPCClient V2) |
|
v1.9.0 |
Siehe Verwenden Sie AWS IoT Device SDK für Python v2 (IPCClient V2) |
|
v1.17.0 |
||
v1.12.0 |
Siehe Verwenden Sie AWS IoT Device SDK für JavaScript v2 (IPCClient V1) |
Connect zum AWS IoT Greengrass IPC Core-Dienst her
Um die Interprozesskommunikation in Ihrer benutzerdefinierten Komponente zu verwenden, müssen Sie eine Verbindung zu einem IPC Server-Socket herstellen, auf dem die AWS IoT Greengrass Core-Software ausgeführt wird. Führen Sie die folgenden Aufgaben aus, um die herunterzuladen und AWS IoT Device SDK in der Sprache Ihrer Wahl zu verwenden.
Um das AWS IoT Device SDK für Java v2 (IPCClient V2) zu verwenden
-
Laden Sie das AWS IoT Device SDK für Java v2
(v1.6.0 oder höher) herunter. -
Führen Sie einen der folgenden Schritte aus, um Ihren benutzerdefinierten Code in Ihrer Komponente auszuführen:
-
Erstellen Sie Ihre Komponente als JAR Datei, die die enthält AWS IoT Device SDK, und führen Sie diese JAR Datei in Ihrem Komponentenrezept aus.
-
Definieren Sie das AWS IoT Device SDK JAR als Komponentenartefakt und fügen Sie dieses Artefakt dem Klassenpfad hinzu, wenn Sie Ihre Anwendung in Ihrem Komponentenrezept ausführen.
-
-
Verwenden Sie den folgenden Code, um den Client zu erstellen. IPC
try (GreengrassCoreIPCClientV2 ipcClient = GreengrassCoreIPCClientV2.builder().build()) { // Use client. } catch (Exception e) { LOGGER.log(Level.SEVERE, "Exception occurred when using IPC.", e); System.exit(1); }
Um das AWS IoT Device SDK für Python v2 (IPCClient V2) zu verwenden
-
Laden Sie das AWS IoT Device SDK für Python
herunter (v1.9.0 oder höher). -
Fügen Sie SDK die Installationsschritte
zum Installationslebenszyklus im Rezept Ihrer Komponente hinzu. -
Stellen Sie eine Verbindung zum AWS IoT Greengrass IPC Core-Dienst her. Verwenden Sie den folgenden Code, um den IPC Client zu erstellen.
from awsiot.greengrasscoreipc.clientv2 import GreengrassCoreIPCClientV2 try: ipc_client = GreengrassCoreIPCClientV2() # Use IPC client. except Exception: print('Exception occurred when using IPC.', file=sys.stderr) traceback.print_exc() exit(1)
Um die AWS IoT Device SDK Version 2 für C++ zu erstellen, muss ein Gerät über die folgenden Tools verfügen:
-
C++ 11 oder höher
-
CMake3.1 oder später
-
Einer der folgenden Compiler:
-
GCC4.8 oder später
-
Clang 3.9 oder höher
-
MSVC2015 oder später
-
Um das AWS IoT Device SDK für C++ v2 zu verwenden
-
Laden Sie das AWS IoT Device SDK für C++ v2
(v1.17.0 oder höher) herunter. -
Folgen Sie den Installationsanweisungen inREADME, um das
AWS IoT Device SDK für C++ v2 aus dem Quellcode zu erstellen. -
Verlinken Sie in Ihrem C++-Build-Tool die IPC Greengrass-Bibliothek
AWS::GreengrassIpc-cpp
,, die Sie im vorherigen Schritt erstellt haben. Das folgendeCMakeLists.txt
Beispiel verknüpft die IPC Greengrass-Bibliothek mit einem Projekt, mit dem CMake Sie bauen.cmake_minimum_required(VERSION 3.1) project (greengrassv2_pubsub_subscriber) file(GLOB MAIN_SRC "*.h" "*.cpp" ) add_executable(${PROJECT_NAME} ${MAIN_SRC}) set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE CXX CXX_STANDARD 11) find_package(aws-crt-cpp PATHS ~/sdk-cpp-workspace/build) find_package(EventstreamRpc-cpp PATHS ~/sdk-cpp-workspace/build) find_package(GreengrassIpc-cpp PATHS ~/sdk-cpp-workspace/build) target_link_libraries(${PROJECT_NAME} AWS::GreengrassIpc-cpp)
-
Stellen Sie in Ihrem Komponentencode eine Verbindung zum AWS IoT Greengrass IPC Core-Dienst her, um einen IPC Client (
Aws::Greengrass::GreengrassCoreIpcClient
) zu erstellen. Sie müssen einen IPC Verbindungslebenszyklus-Handler definieren, der IPC Verbindungs-, Verbindungs- und Fehlerereignisse behandelt. Im folgenden Beispiel werden ein IPC Client und ein IPC Verbindungslebenszyklus-Handler erstellt, die drucken, wenn der IPC Client eine Verbindung herstellt oder die Verbindung trennt und auf Fehler stößt.#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() { // Create the IPC client. 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); } // Use the IPC client to create an operation request. // Activate the operation request. auto activate = operation.Activate(request, nullptr); activate.wait(); // Wait for Greengrass Core to respond to the request. 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); } // Check the result of the request. 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); } return 0; }
-
Um Ihren benutzerdefinierten Code in Ihrer Komponente auszuführen, erstellen Sie Ihren Code als binäres Artefakt und führen Sie das binäre Artefakt in Ihrem Komponentenrezept aus. Legen Sie die
Execute
Berechtigung des Artefakts auf fest,OWNER
damit die AWS IoT Greengrass Core-Software das binäre Artefakt ausführen kann.Der
Manifests
Abschnitt Ihres Komponentenrezepts könnte dem folgenden Beispiel ähneln.
Um das AWS IoT Device SDK für JavaScript v2 für die Verwendung mit NodeJS zu erstellen, muss ein Gerät über die folgenden Tools verfügen:
-
NodeJS 10.0 oder höher
-
Führen Sie aus
node -v
, um die Node-Version zu überprüfen.
-
-
CMake3.1 oder höher
Um das AWS IoT Device SDK für JavaScript v2 (IPCClient V1) zu verwenden
-
Laden Sie das AWS IoT Device SDK für JavaScript v2
herunter (v1.12.10 oder höher). -
Folgen Sie den Installationsanweisungen inREADME, um das
AWS IoT Device SDK für JavaScript Version 2 aus dem Quellcode zu erstellen. -
Stellen Sie eine Verbindung zum AWS IoT Greengrass IPC Core-Dienst her. Gehen Sie wie folgt vor, um den IPC Client zu erstellen und eine Verbindung herzustellen.
-
Verwenden Sie den folgenden Code, um den IPC Client zu erstellen.
import * as greengrascoreipc from 'aws-iot-device-sdk-v2'; let client = greengrascoreipc.createClient();
-
Verwenden Sie den folgenden Code, um eine Verbindung von Ihrer Komponente zum Greengrass-Kern herzustellen.
await client.connect();
Autorisieren Sie Komponenten zur Ausführung von Vorgängen IPC
Damit Ihre benutzerdefinierten Komponenten einige IPC Operationen verwenden können, müssen Sie Autorisierungsrichtlinien definieren, die es der Komponente ermöglichen, den Vorgang auf bestimmten Ressourcen auszuführen. Jede Autorisierungsrichtlinie definiert eine Liste von Vorgängen und eine Liste von Ressourcen, die die Richtlinie zulässt. Beispielsweise definiert der IPC Publish/Subscribe-Messaging-Dienst Veröffentlichungs- und Abonnementvorgänge für Themenressourcen. Sie können den *
Platzhalter verwenden, um den Zugriff auf alle Vorgänge oder alle Ressourcen zu ermöglichen.
Autorisierungsrichtlinien definieren Sie mit dem accessControl
Konfigurationsparameter, den Sie im Komponentenrezept oder bei der Bereitstellung der Komponente festlegen können. Das accessControl
Objekt ordnet IPC Dienstkennungen Listen von Autorisierungsrichtlinien zu. Sie können für jeden IPC Dienst mehrere Autorisierungsrichtlinien definieren, um den Zugriff zu kontrollieren. Jede Autorisierungsrichtlinie hat eine Richtlinien-ID, die für alle Komponenten eindeutig sein muss.
Tipp
Um eine eindeutige Richtlinie zu erstellenIDs, können Sie den Komponentennamen, den IPC Dienstnamen und einen Zähler kombinieren. Eine Komponente mit dem Namen com.example.HelloWorld
könnte beispielsweise zwei Autorisierungsrichtlinien für das Publizieren/Abonnieren wie folgt definieren: IDs
-
com.example.HelloWorld:pubsub:1
-
com.example.HelloWorld:pubsub:2
Autorisierungsrichtlinien verwenden das folgende Format. Dieses Objekt ist der accessControl
Konfigurationsparameter.
Platzhalter in Autorisierungsrichtlinien
Sie können den *
Platzhalter im resources
Element von IPC Autorisierungsrichtlinien verwenden, um den Zugriff auf mehrere Ressourcen in einer einzigen Autorisierungsrichtlinie zu ermöglichen.
-
In allen Versionen von Greengrass Nucleus können Sie ein einzelnes
*
Zeichen als Ressource angeben, um Zugriff auf alle Ressourcen zu gewähren. -
In Greengrass Nucleus v2.6.0 und höher können Sie den
*
Charakter in einer Ressource so angeben, dass er einer beliebigen Zeichenkombination entspricht. Sie können beispielsweise angeben, dass derfactory/1/devices/Thermostat*/status
Zugriff auf ein Statusthema für alle Thermostatgeräte in einer Fabrik gewährt werden soll, wobei der Name jedes Geräts mit beginnt.Thermostat
Wenn Sie Autorisierungsrichtlinien für den AWS IoT Core MQTT IPC Dienst definieren, können Sie auch MQTT Platzhalter (+
und#
) verwenden, um mehrere Ressourcen zuzuordnen. Weitere Informationen finden Sie unter MQTTPlatzhalter in AWS IoT Core MQTT IPC Autorisierungsrichtlinien.
Rezeptvariablen in Autorisierungsrichtlinien
Wenn Sie Greengrass Nucleus v2.6.0 oder höher verwenden und die interpolateComponentConfigurationKonfigurationsoption von Greengrass Nucleus auf einstellentrue
, können Sie die {iot:thingName}
Rezeptvariable in Autorisierungsrichtlinien verwenden. Wenn Sie eine Autorisierungsrichtlinie benötigen, die den Namen des Kerngeräts enthält, z. B. für MQTT Themen oder Geräteschatten, können Sie diese Rezeptvariable verwenden, um eine einzelne Autorisierungsrichtlinie für eine Gruppe von Kerngeräten zu konfigurieren. Beispielsweise können Sie einer Komponente den Zugriff auf die folgende Ressource für IPC Shadow-Operationen gewähren.
$aws/things/{iot:thingName}/shadow/
Sonderzeichen in Autorisierungsrichtlinien
Um ein Literal *
oder ein ?
Zeichen in einer Autorisierungsrichtlinie anzugeben, müssen Sie eine Escape-Sequenz verwenden. Die folgenden Escape-Sequenzen weisen die AWS IoT Greengrass Core-Software an, den Literalwert anstelle der speziellen Bedeutung des Zeichens zu verwenden. Das *
Zeichen ist beispielsweise ein Platzhalter, der einer beliebigen Kombination von Zeichen entspricht.
Wörtliches Zeichen | Escape-Sequenz | Hinweise |
---|---|---|
|
|
|
|
|
AWS IoT Greengrass unterstützt derzeit nicht den |
|
|
Verwenden Sie diese Escape-Sequenz, um nach einer Ressource zu suchen, die enthält |
Beispiele für Autorisierungsrichtlinien
Anhand der folgenden Beispiele für Autorisierungsrichtlinien können Sie Autorisierungsrichtlinien für Ihre Komponenten konfigurieren.
Beispiel für ein Komponentenrezept mit einer Autorisierungsrichtlinie
Das folgende Beispiel für ein Komponentenrezept enthält ein accessControl
Objekt, das eine Autorisierungsrichtlinie definiert. Diese Richtlinie autorisiert die com.example.HelloWorld
Komponente, unter dem test/topic
Thema zu veröffentlichen.
Beispiel für ein Update der Komponentenkonfiguration mit einer Autorisierungsrichtlinie
Das folgende Beispiel für ein Konfigurationsupdate in einer Bereitstellung gibt an, dass eine Komponente mit einem accessControl
Objekt konfiguriert werden soll, das eine Autorisierungsrichtlinie definiert. Diese Richtlinie autorisiert die com.example.HelloWorld
Komponente, unter dem test/topic
Thema zu veröffentlichen.
Abonnieren Sie IPC Event-Streams
Sie können IPC Operationen verwenden, um Streams von Ereignissen auf einem Greengrass-Core-Gerät zu abonnieren. Um einen Abonnement-Vorgang zu verwenden, definieren Sie einen Abonnement-Handler und erstellen Sie eine Anfrage an den IPC Service. Anschließend führt der IPC Client die Funktionen des Abonnement-Handlers jedes Mal aus, wenn das Kerngerät eine Ereignisnachricht an Ihre Komponente streamt.
Sie können ein Abonnement schließen, um die Verarbeitung von Ereignismeldungen zu beenden. Rufen Sie dazu closeStream()
(Java), (Python) oder close()
Close()
(C++) für das Objekt für den Abonnementvorgang auf, mit dem Sie das Abonnement geöffnet haben.
Der AWS IoT Greengrass IPC Core-Dienst unterstützt die folgenden Abonnementvorgänge:
Definieren Sie Abonnement-Handler
Um einen Abonnement-Handler zu definieren, definieren Sie Callback-Funktionen, die Ereignismeldungen, Fehler und das Schließen von Streams behandeln. Wenn Sie IPC Client V1 verwenden, müssen Sie diese Funktionen in einer Klasse definieren. Wenn Sie IPC Client V2 verwenden, der in späteren Versionen von Java und Python verfügbar istSDKs, können Sie diese Funktionen definieren, ohne eine Abonnement-Handler-Klasse zu erstellen.
Beispiel für Abonnement-Handler
Das folgende Beispiel zeigt, wie der SubscribeToTopic Vorgang und ein Abonnement-Handler verwendet werden, um lokale Veröffentlichungs-/Abonnementnachrichten zu abonnieren.
Bewährte Methoden für IPC
Die bewährten Methoden für die Verwendung IPC in benutzerdefinierten Komponenten unterscheiden sich zwischen IPC Client V1 und IPC Client V2. Folgen Sie den bewährten Methoden für die von Ihnen verwendete IPC Client-Version.