Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
El agente IoT se utiliza para recibir el mensaje MQTT que incluye el token de acceso de cliente e iniciar un proxy local en el dispositivo remoto. Debe instalar y ejecutar el agente IoT en el dispositivo remoto si desea un túnel seguro para entregar el token de acceso del cliente mediante MQTT. El agente de IoT debe suscribirse al siguiente tema reservado de MQTT de IoT:
nota
Si desea entregar el token de acceso del cliente de destino al dispositivo remoto mediante métodos distintos de la suscripción al tema MQTT reservado, es posible que necesite un oyente del token de acceso del cliente (CAT) de destino y un proxy local. El oyente CAT debe funcionar con el mecanismo de entrega de los tokens de acceso al cliente que haya elegido y poder iniciar un proxy local en el modo de destino.
Fragmento de agente de IoT
El agente de IoT debe suscribirse al siguiente tema reservado de MQTT sobre IoT para poder recibir el mensaje MQTT e iniciar el proxy local:
$aws/things/
thing-name
/tunnels/notify
donde thing-name
es el nombre de la cosa AWS IoT asociada con el dispositivo remoto.
A continuación, se muestra un ejemplo de una carga útil de mensaje MQTT:
{
"clientAccessToken": "destination-client-access-token
",
"clientMode": "destination",
"region": "aws-region
",
"services": ["destination-service
"]
}
Después de recibir un mensaje MQTT, el agente IoT debe iniciar un proxy local en el dispositivo remoto con los parámetros apropiados.
El siguiente código Java muestra cómo utilizar el SDK de dispositivo de AWS IoT
// Find the IoT device endpoint for your Cuenta de 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);
}
}
}