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 MQTT messaggio che include il token di accesso client e avviare un proxy locale sul dispositivo remoto. È necessario installare ed eseguire l'agente IoT sul dispositivo remoto se si desidera utilizzare un tunneling sicuro per fornire il token di accesso al client. MQTT L'agente IoT deve sottoscrivere il seguente MQTT argomento IoT riservato:

Nota

Se desideri fornire il token di accesso al client di destinazione al dispositivo remoto tramite metodi diversi dalla sottoscrizione all'MQTTargomento riservato, potresti aver bisogno di un listener di accesso al client di destinazione (CAT) e di un proxy locale. Il CAT listener deve funzionare con il meccanismo di consegna del token di accesso al client scelto ed essere in grado di avviare un proxy locale in modalità di destinazione.

Snippet dell'agente IoT

L'agente IoT deve sottoscrivere il seguente MQTT argomento IoT riservato in modo da poter ricevere il MQTT messaggio 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 di MQTT messaggi:

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

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

Il seguente codice Java dimostra come utilizzare il AWS IoT dispositivo SDK e ProcessBuilderla libreria Java per creare un semplice agente IoT per lavorare 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); } } }