Configurazione di un dispositivo remoto e utilizzo dell'agente IoT - AWS IoT Core

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurazione di un dispositivo remoto e utilizzo dell'agente IoT

L'agente IoT viene utilizzato per ricevere il messaggio MQTT che include il token di accesso client e avviare un proxy locale sul dispositivo remoto. Se desideri che il tunneling sicuro fornisca il token di accesso client, devi installare ed eseguire l'agente IoT sul dispositivo remoto. L'agente IoT deve sottoscrivere l'argomento MQTT dell'IoT riservato riportato di seguito:

Nota

Se si desidera consegnare il token di accesso del client di destinazione al dispositivo remoto tramite metodi diversi dalla sottoscrizione all'argomento MQTT riservato, potrebbero essere necessari un listener CAT (Destination Client Access Token) e un proxy locale. Il listener CAT deve funzionare con il meccanismo di consegna del token di accesso client scelto ed essere in grado di avviare un proxy locale in modalità di destinazione.

Snippet dell'agente IoT

L'agente IoT deve iscriversi al seguente argomento IoT MQTT riservato in modo da poter ricevere il messaggio MQTT e avviare il proxy locale:

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

thing-nameDov'è il nome dell' AWS IoT oggetto associato al dispositivo remoto.

Di seguito è riportato un esempio di payload del messaggio MQTT:

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

Dopo aver ricevuto un messaggio MQTT, l'agente IoT deve avviare un proxy locale sul dispositivo remoto con i parametri appropriati.

Il seguente codice Java dimostra come utilizzare AWS IoT Device SDK e ProcessBuilderdalla libreria Java per creare un semplice agente IoT che funzioni con il tunneling sicuro.

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