Configuración de un dispositivo remoto y uso de un agente de IoT - AWS IoT Core

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.

Configuración de un dispositivo remoto y uso de un agente de IoT

El agente IoT se utiliza para recibir el mensaje MQTT que incluye el token de acceso de cliente e iniciar un proxy local en el dispositivo remoto. Debe instalar y ejecutar el agente IoT en el dispositivo remoto si desea un túnel seguro para entregar el token de acceso del cliente mediante MQTT. El agente de IoT debe suscribirse al siguiente tema reservado de MQTT de IoT:

nota

Si desea entregar el token de acceso del cliente de destino al dispositivo remoto mediante métodos distintos de la suscripción al tema MQTT reservado, es posible que necesite un oyente del token de acceso del cliente (CAT) de destino y un proxy local. El oyente CAT debe funcionar con el mecanismo de entrega de los tokens de acceso al cliente que haya elegido y poder iniciar un proxy local en el modo de destino.

Fragmento de agente de IoT

El agente de IoT debe suscribirse al siguiente tema reservado de MQTT sobre IoT para poder recibir el mensaje MQTT e iniciar el proxy local:

$aws/things/thing-name/tunnels/notify

¿Dónde thing-name está el nombre de la AWS IoT cosa asociada al dispositivo remoto?

A continuación, se muestra un ejemplo de una carga útil de mensaje MQTT:

{ "clientAccessToken": "destination-client-access-token", "clientMode": "destination", "region": "aws-region", "services": ["destination-service"] }

Después de recibir un mensaje MQTT, el agente IoT debe iniciar un proxy local en el dispositivo remoto con los parámetros apropiados.

El siguiente código de Java muestra cómo utilizar el SDK de AWS IoT dispositivos y la biblioteca ProcessBuilderde Java para crear un agente de IoT sencillo que funcione con túneles seguros.

// Find the IoT device endpoint for your Cuenta de AWS final String endpoint = iotClient.describeEndpoint(new DescribeEndpointRequest().withEndpointType("iot:Data-ATS")).getEndpointAddress(); // Instantiate the IoT Agent with your AWS credentials final String thingName = "RemoteDeviceA"; final String tunnelNotificationTopic = String.format("$aws/things/%s/tunnels/notify", thingName); final AWSIotMqttClient mqttClient = new AWSIotMqttClient(endpoint, thingName, "your_aws_access_key", "your_aws_secret_key"); try { mqttClient.connect(); final TunnelNotificationListener listener = new TunnelNotificationListener(tunnelNotificationTopic); mqttClient.subscribe(listener, true); } finally { mqttClient.disconnect(); } private static class TunnelNotificationListener extends AWSIotTopic { public TunnelNotificationListener(String topic) { super(topic); } @Override public void onMessage(AWSIotMessage message) { try { // Deserialize the MQTT message final JSONObject json = new JSONObject(message.getStringPayload()); final String accessToken = json.getString("clientAccessToken"); final String region = json.getString("region"); final String clientMode = json.getString("clientMode"); if (!clientMode.equals("destination")) { throw new RuntimeException("Client mode " + clientMode + " in the MQTT message is not expected"); } final JSONArray servicesArray = json.getJSONArray("services"); if (servicesArray.length() > 1) { throw new RuntimeException("Services in the MQTT message has more than 1 service"); } final String service = servicesArray.get(0).toString(); if (!service.equals("SSH")) { throw new RuntimeException("Service " + service + " is not supported"); } // Start the destination local proxy in a separate process to connect to the SSH Daemon listening port 22 final ProcessBuilder pb = new ProcessBuilder("localproxy", "-t", accessToken, "-r", region, "-d", "localhost:22"); pb.start(); } catch (Exception e) { log.error("Failed to start the local proxy", e); } } }