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 agente de IoT é usado para receber a MQTT mensagem que inclui o token de acesso do cliente e iniciar um proxy local no dispositivo remoto. Você deve instalar e executar o agente de IoT no dispositivo remoto se quiser que o tunelamento seguro forneça o token de acesso do cliente usando. MQTT O agente de IoT deve se inscrever no seguinte tópico reservado de IoT: MQTT

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 MQTT tópico reservado, talvez seja necessário um ouvinte do token de acesso do cliente de destino (CAT) e um proxy local. O CAT ouvinte deve trabalhar com o mecanismo de entrega do token de acesso ao cliente escolhido e ser capaz de iniciar um proxy local no modo de destino.

Snippet de atendente de IoT

O agente de IoT deve se inscrever no seguinte MQTT tópico reservado de IoT para poder receber a MQTT mensagem 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 a seguir um exemplo de carga útil da MQTT mensagem:

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

Depois de receber uma MQTT mensagem, o agente de 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 dispositivo 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); } } }