Como configurar um dispositivo remoto e usar o atendente de IoT - AWS IoT Core

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Como configurar um dispositivo remoto e usar o atendente de IoT

O atendente da IoT é usado para receber a mensagem MQTT que inclui o token de acesso do cliente e iniciar um proxy local no dispositivo remoto. Você deverá instalar e executar o atendente IoT no dispositivo remoto se desejar que o encapsulamento seguro entregue o token de acesso do cliente usando MQTT. O atendente da IoT deve assinar o seguinte tópico MQTT reservado da IoT:

nota

Se você quiser entregar o token de acesso do cliente de destino ao dispositivo remoto por meio de métodos diferentes da assinatura do tópico reservado do MQTT, talvez seja necessário um receptor do token de acesso do cliente (CAT) de destino e um proxy local. O receptor CAT deve funcionar com o mecanismo de entrega de token de acesso do cliente escolhido e ser capaz de iniciar um proxy local no modo de destino.

Snippet de atendente de IoT

O atendente de IoT deve se inscrever no seguinte tópico reservado do IoT MQTT para poder receber a mensagem do MQTT e iniciar o proxy local:

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

Onde thing-name está o nome da AWS IoT coisa associada ao dispositivo remoto.

Veja seguir um exemplo de carga da mensagem MQTT:

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

Depois de receber uma mensagem MQTT, o atendente da IoT deve iniciar um proxy local no dispositivo remoto com os parâmetros apropriados.

O código Java a seguir demonstra como usar o AWS IoT Device SDK e a biblioteca Java para criar um agente ProcessBuilderde IoT simples para trabalhar com tunelamento seguro.

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