Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Uso del SDK para dispositivos con AWS IoT para comunicarse con el núcleo de Greengrass, otros componentes y AWS IoT Core
Los componentes que se ejecutan en su dispositivo principal pueden utilizar la biblioteca de comunicación entre procesos (IPC) de AWS IoT Greengrass Core en el SDK para dispositivos con AWS IoT para comunicarse con el núcleo de AWS IoT Greengrass y otros componentes de Greengrass. Si desea desarrollar y ejecutar componentes personalizados que utilicen IPC, debe utilizar el SDK para dispositivos con AWS IoT para conectarse al servicio de IPC de AWS IoT Greengrass Core y realizar las operaciones de IPC.
La interfaz de IPC admite dos tipos de operaciones:
-
Solicitud/respuesta
Los componentes envían una solicitud al servicio de IPC y reciben una respuesta que contiene el resultado de la solicitud.
-
Suscripción
Los componentes envían una solicitud de suscripción al servicio de IPC y esperan recibir un flujo de mensajes de eventos como respuesta. Los componentes proporcionan un controlador de suscripciones que gestiona los mensajes de eventos, los errores y el cierre del flujo. El SDK para dispositivos con AWS IoT incluye una interfaz de controlador con la respuesta y los tipos de eventos correctos para cada operación de IPC. Para obtener más información, consulte Suscripción a los flujos de eventos de IPC.
Versiones de cliente de IPC
En versiones posteriores de los SDK de Java y Python, AWS IoT Greengrass ofrece una versión mejorada de cliente de IPC, denominada cliente de IPC V2. Cliente de IPC V2:
-
Reduce la cantidad de código que debe escribirse para utilizar las operaciones de IPC y ayuda a evitar errores habituales que pueden producirse con el cliente de IPC V1.
-
Realiza devoluciones de llamadas a los controladores de suscripciones en un subproceso independiente, por lo que ahora puede ejecutar código de bloqueo, incluidas las llamadas a funciones de IPC adicionales, en las devoluciones de llamadas a los controladores de suscripciones. El cliente de IPC V1 utiliza el mismo subproceso para comunicarse con el servidor de IPC y para llamar al controlador de suscripciones.
-
Permite llamar a las operaciones de suscripción mediante expresiones Lambda (Java) o funciones (Python). El cliente de IPC V1 requiere que defina las clases de controladores de suscripciones.
-
Proporciona versiones sincrónicas y asincrónicas de cada operación de IPC. El cliente de IPC V1 proporciona solo versiones asíncronas de cada operación.
Recomendamos utilizar el cliente de IPC V2 para aprovechar estas mejoras. Sin embargo, muchos ejemplos de esta documentación y de algunos contenidos en línea muestran únicamente cómo utilizar el cliente de IPC V1. Puede utilizar los siguientes ejemplos y tutoriales para ver ejemplos de componentes que utilizan el cliente de IPC V2:
Actualmente, la versión 2 de SDK para dispositivos con AWS IoT para C++ solo es compatible con el cliente de IPC V1.
SDK compatibles para la comunicación entre procesos
Las bibliotecas de IPC de AWS IoT Greengrass Core se incluyen en las siguientes versiones de SDK para dispositivos con AWS IoT.
| SDK | Versión mínima | Uso |
|---|---|---|
|
Versión 1.6.0 |
Consulte Uso de SDK para dispositivos con AWS IoT para Java v2 (cliente de IPC V2) |
|
|
Versión 1.9.0 |
Consulte Uso de SDK para dispositivos con AWS IoT para Python v2 (cliente de IPC V2) |
|
|
Versión 1.17.0 |
Consulte Uso de SDK para dispositivos con AWS IoT para C++ v2 |
|
|
Versión 1.12.0 |
Consulte Uso de SDK para dispositivos con AWS IoT para JavaScript v2 (cliente de IPC V1) |
Conexión al servicio de IPC de AWS IoT Greengrass Core
Para utilizar la comunicación entre procesos en su componente personalizado, debe crear una conexión a un socket del servidor de IPC que ejecute el software AWS IoT Greengrass Core. Complete las siguientes tareas para descargar y usar el SDK para dispositivos con AWS IoT en el lenguaje que prefiera.
Uso de SDK para dispositivos con AWS IoT para Java v2 (cliente de IPC V2)
-
Descargue el SDK para dispositivos con AWS IoT para Java v2
(versión 1.6.0 o posterior). -
Tome alguna de las siguientes medidas para ejecutar el código personalizado en su componente:
-
Cree el componente como un archivo JAR que incluya el SDK para dispositivos con AWS IoT y ejecute este archivo JAR en la receta del componente.
-
Defina el JAR del SDK para dispositivos con AWS IoT como un artefacto de componente y agregue ese artefacto a la ruta de clases cuando ejecute la aplicación en la receta de su componente.
-
-
Utilice el siguiente código para crear el cliente de 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); }
Uso de SDK para dispositivos con AWS IoT para Python v2 (cliente de IPC V2)
-
Descargue el SDK para dispositivos con AWS IoT para Python
(versión 1.9.0 o posterior). -
Agregue los pasos de instalación
del SDK al ciclo de vida de instalación en la receta de su componente. -
Cree una conexión con el servicio de IPC de AWS IoT Greengrass Core. Utilice el siguiente código para crear el cliente de IPC.
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)
Para compilar el SDK para dispositivos con AWS IoT versión 2 para C++, un dispositivo debe tener las siguientes herramientas:
-
C++ 11 o posterior
-
CMake 3.1 o posterior
-
Uno de los siguientes copiladores:
-
GCC 4.8 o posterior
-
Clang 3.9 o posterior
-
MSVC 2015 o posterior
-
Uso de SDK para dispositivos con AWS IoT para C++ v2
-
Descargue el SDK para dispositivos con AWS IoT para C++ v2
(versión 1.17.0 o posterior). -
Siga las instrucciones de instalación del archivo README
para compilar SDK para dispositivos con AWS IoT para C++ v2 a partir del código de origen. -
En la herramienta de compilación de C++, vincule la biblioteca de IPC de Greengrass,
AWS::GreengrassIpc-cpp, que creó en el paso anterior. En el siguiente ejemplo deCMakeLists.txt, se vincula la biblioteca de IPC de Greengrass a un proyecto que se crea con CMake.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) -
En el código de su componente, cree una conexión con el servicio de IPC de AWS IoT Greengrass Core para crear un cliente de IPC (
Aws::Greengrass::GreengrassCoreIpcClient). Debe definir un controlador del ciclo de vida de las conexiones de IPC que gestione los eventos de conexión, desconexión y error de IPC. El siguiente ejemplo crea un cliente de IPC y un controlador del ciclo de vida de las conexiones de IPC que se imprimen cuando el cliente de IPC se conecta, se desconecta y detecta errores.#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; } -
Para ejecutar el código personalizado en el componente, cree el código como un artefacto binario y ejecute el artefacto binario en la receta del componente. Establezca el permiso
Executedel artefacto enOWNERpara habilitar al software AWS IoT GreengrassCore a ejecutar el artefacto binario.La sección
Manifestsde la receta de su componente podría parecerse al siguiente ejemplo.
Para compilar el SDK para dispositivos con AWS IoT para JavaScript versión 2 para su uso con NodeJS, un dispositivo debe tener las siguientes herramientas:
-
Node.JS 10.0 o posterior
-
Ejecute
node -vpara comprobar la versión de Node.
-
-
CMake 3.1 o posterior
Uso de SDK para dispositivos con AWS IoT para Java v2 (cliente de IPC V1)
-
Descargue el SDK para dispositivos con AWS IoT para JavaScript v2
(versión 1.12.10 o posterior). -
Siga las instrucciones de instalación del archivo README
para compilar SDK para dispositivos con AWS IoT para JavaScript v2 a partir del código de origen. -
Cree una conexión con el servicio de IPC de AWS IoT Greengrass Core. Realice los siguientes pasos para crear el cliente de IPC y establecer una conexión.
-
Utilice el siguiente código para crear el cliente de IPC.
import * as greengrascoreipc from 'aws-iot-device-sdk-v2'; let client = greengrascoreipc.createClient(); -
Utilice el siguiente código para establecer una conexión entre el componente y el núcleo de Greengrass.
await client.connect();
Autorización de los componentes para realizar operaciones de IPC
Para permitir que sus componentes personalizados utilicen algunas operaciones de IPC, debe definir políticas de autorización que permitan al componente realizar la operación en determinados recursos. Cada política de autorización define una lista de operaciones y una lista de recursos que la política permite. Por ejemplo, el servicio de IPC de mensajería de publicación y suscripción define las operaciones de publicación y suscripción de los recursos de tema. Puede utilizar el comodín * para permitir el acceso a todas las operaciones o a todos los recursos.
Las políticas de autorización se definen con el parámetro de configuración accessControl, que se puede establecer en la receta del componente o al implementar el componente. El objeto accessControl asigna los identificadores del servicio de IPC a listas de políticas de autorización. Puede definir varias políticas de autorización para cada servicio de IPC a fin de controlar el acceso. Cada política de autorización tiene un identificador de política, que debe ser único entre todos los componentes.
sugerencia
Para crear identificadores de política únicos, puede combinar el nombre del componente, el nombre del servicio de IPC y un contador. Por ejemplo, un componente denominado com.example.HelloWorld podría definir dos políticas de autorización de publicación o suscripción con los siguientes identificadores:
-
com.example.HelloWorld:pubsub:1 -
com.example.HelloWorld:pubsub:2
Las políticas de autorización utilizan el siguiente formato. Este objeto es el parámetro de configuración accessControl.
Comodines en las políticas de autorización
Puede utilizar el comodín * en el elemento resources de las políticas de autorización del IPC para permitir el acceso a varios recursos en una única política de autorización.
-
En todas las versiones del núcleo de Greengrass, puede especificar un solo carácter
*como recurso para permitir el acceso a todos los recursos. -
En el núcleo de Greengrass versión 2.6.0 y versiones posteriores, puede especificar el carácter
*de un recurso para que coincida con cualquier combinación de caracteres. Por ejemplo, puede especificarfactory/1/devices/Thermostat*/statuspara permitir el acceso a un tema de estado para todos los dispositivos de termostato de una fábrica, donde el nombre de cada dispositivo comience conThermostat.
Al definir políticas de autorización para el servicio de IPC de AWS IoT Core MQTT, también puede utilizar los caracteres comodín (+ y #) de MQTT para hacer coincidir varios recursos. Para obtener más información, consulte Comodines MQTT en políticas de autorización de IPC de AWS IoT Core MQTT.
Variables de receta en las políticas de autorización
Si utiliza el núcleo de Greengrass versión 2.6.0 o posterior y establece la opción de configuración InterpolateComponentConfiguration del núcleo de Greengrass en true, puede usar la variable de receta {iot:thingName} en las políticas de autorización. Cuando necesite una política de autorización que incluya el nombre del dispositivo principal, como en el caso de temas de MQTT o sombras de dispositivo, puede utilizar esta variable de receta para configurar una política de autorización única para un grupo de dispositivos principales. Por ejemplo, puede permitir que un componente acceda al siguiente recurso para realizar operaciones de IPC de sombra.
$aws/things/{iot:thingName}/shadow/
Caracteres especiales en las políticas de autorización
Para especificar un literal * o un carácter ? en una política de autorización, debe utilizar una secuencia de escape. Las siguientes secuencias de escape indican al software AWS IoT Greengrass Core que utilice el valor literal en lugar del significado especial del carácter. Por ejemplo, el carácter * es un comodín que coincide con cualquier combinación de caracteres.
| Carácter literal | Secuencia de escape | Notas |
|---|---|---|
|
|
|
|
|
|
|
AWS IoT Greengrass actualmente no admite el comodín |
|
|
|
Use esta secuencia de escape para hacer coincidir un recurso que contenga |
Ejemplos de políticas de autorización
Puede consultar los siguientes ejemplos de políticas de autorización con el fin de configurar las políticas de autorización para sus componentes.
ejemplo Ejemplo de receta de componentes con una política de autorización
El siguiente ejemplo de receta de componentes incluye un objeto accessControl que define una política de autorización. Esta política autoriza al componente com.example.HelloWorld a publicar en el tema test/topic.
ejemplo Ejemplo de actualización de la configuración de un componente con una política de autorización
El siguiente ejemplo de actualización de configuración en una implementación especifica la configuración de un componente con un objeto accessControl que define una política de autorización. Esta política autoriza al componente com.example.HelloWorld a publicar en el tema test/topic.
Suscripción a los flujos de eventos de IPC
Puede utilizar las operaciones de IPC para suscribirse a los flujos de eventos en un dispositivo principal de Greengrass. Para utilizar una operación de suscripción, defina un controlador de suscripciones y cree una solicitud al servicio de IPC. A continuación, el cliente de IPC ejecuta las funciones del controlador de suscripciones cada vez que el dispositivo principal transmite un mensaje de evento a su componente.
Puede cerrar una suscripción para dejar de procesar los mensajes de eventos. Para ello, llame a closeStream() (Java), close() (Python) o Close() (C++) en el objeto de operación de suscripción que utilizó para abrir la suscripción.
El servicio de IPC de AWS IoT Greengrass Core admite las siguientes operaciones de suscripción:
Definición de controladores de suscripción
Para definir un controlador de suscripciones, defina las funciones de devolución de llamada que gestionen los mensajes de eventos, los errores y el cierre de flujos. Si utiliza el cliente de IPC V1, debe definir estas funciones en una clase. Si usa el cliente de IPC V2, que está disponible en versiones posteriores de los SDK de Java y Python, puede definir estas funciones sin crear una clase de controlador de suscripciones.
Ejemplos de controladores de suscripciones
En el siguiente ejemplo, se muestra cómo utilizar la operación SubscribeToTopic y un controlador de suscripciones para suscribirse a la mensajería de publicación y suscripción local.
Prácticas recomendadas de IPC
Las prácticas recomendadas para utilizar el IPC en los componentes personalizados difieren entre el cliente de IPC V1 y el cliente de IPC V2. Siga las prácticas recomendadas para la versión del cliente de IPC que se utilice.