Ein Remote-Gerät konfigurieren und IoT-Agent verwenden - AWS IoT Core

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Ein Remote-Gerät konfigurieren und IoT-Agent verwenden

Der IoT-Agent wird verwendet, um die MQTT-Nachricht zu empfangen, die das Clientzugriffstoken enthält, und einen lokalen Proxy auf dem Remote-Gerät zu starten. Sie müssen den IoT-Agenten auf dem entfernten Gerät installieren und ausführen, wenn Sie das Client-Zugriffstoken über MQTT durch einen sicheren Tunnel übermitteln möchten. Der IoT-Agent muss das folgende reservierte IoT-MQTT-Thema abonnieren:

Anmerkung

Wenn Sie dem Remote-Gerät das Ziel-Client-Zugriffstoken über andere Methoden als durch das Abonnieren des reservierten MQTT-Topics zukommen lassen möchten, benötigen Sie möglicherweise einen Ziel-Client-Zugriffstoken-Listener (CAT) und einen lokalen Proxy. Der CAT-Listener muss mit dem von Ihnen gewählten Zustellungsmechanismus für Client-Zugangstoken arbeiten und in einen lokalen Proxy im Zielmodus starten können.

IoT-Agent-Snippet

Der IoT-Agent muss das folgende reservierte IoT-MQTT-Topic abonnieren, damit er die MQTT-Nachricht empfangen und den lokalen Proxy starten kann:

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

Wo thing-name ist der Name der AWS IoT Sache, die dem Remote-Gerät zugeordnet ist?

Im Folgenden finden Sie ein Beispiel für eine MQTT-Nachrichtennutzlast:

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

Nach dem Empfang einer MQTT-Nachricht muss der IoT-Agent einen lokalen Proxy auf dem Remote-Gerät mit den entsprechenden Parametern starten.

Der folgende Java-Code zeigt, wie Sie mit dem AWS IoT Device SDK und ProcessBuilderder Java-Bibliothek einen einfachen IoT-Agenten für sicheres Tunneling erstellen.

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