Configuration d'un appareil distant et utilisation de l'agent IoT - AWS IoT Core

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.

Configuration d'un appareil distant et utilisation de l'agent IoT

L'agent IoT est utilisé pour recevoir le message MQTT qui inclut le jeton d'accès client et pour démarrer un proxy local sur l'appareil distant. Vous devez installer et exécuter l'agent IoT sur l'appareil distant si vous voulez que le tunnel sécurisé fournisse le jeton d'accès au client à l'aide de MQTT. L'agent IoT doit s'abonner à la rubrique MQTT IoT réservée suivante :

Note

Si vous souhaitez fournir le jeton d'accès au client de destination à l'appareil distant par des méthodes autres que l'abonnement à la rubrique MQTT réservée, vous aurez peut-être besoin d'un écouteur de jeton d'accès client (CAT) de destination et d'un proxy local. L'écouteur CAT doit fonctionner avec le mécanisme de délivrance de jetons d'accès client que vous avez choisi et être en mesure de démarrer un proxy local en mode destination.

Extrait de l'agent IoT

L'agent IoT doit s'abonner à la rubrique MQTT IoT réservée suivante afin de pouvoir recevoir le message MQTT et démarrer le proxy local :

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

Où se thing-name trouve le nom de l' AWS IoT objet associé à l'appareil distant.

Voici un exemple de charge utile de message MQTT :

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

Après avoir reçu un message MQTT, l'agent IoT doit démarrer un proxy local sur l'appareil distant avec les paramètres appropriés.

Le code Java suivant montre comment utiliser le SDK AWS IoT Device et ProcessBuilderla bibliothèque Java pour créer un agent IoT simple capable de fonctionner avec un tunneling sécurisé.

// Find the IoT device endpoint for your Compte 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); } } }