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 MQTT message 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 souhaitez utiliser un tunneling sécurisé pour délivrer le jeton d'accès client. MQTT L'agent IoT doit s'abonner à la MQTT rubrique 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 au MQTT sujet réservé, vous aurez peut-être besoin d'un écouteur de jeton d'accès client de destination (CAT) et d'un proxy local. L'CATécouteur 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 MQTT rubrique IoT réservée suivante afin de pouvoir recevoir le MQTT message 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 MQTT message :
{ "clientAccessToken": "
destination-client-access-token
", "clientMode": "destination", "region": "aws-region
", "services": ["destination-service
"] }
Après avoir reçu un MQTT message, 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 AWS IoT Device SDK
// 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); } } }