Mengkonfigurasi perangkat jarak jauh dan menggunakan agen IoT - AWS IoT Core

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengkonfigurasi perangkat jarak jauh dan menggunakan agen IoT

Agen IoT digunakan untuk menerima pesan MQTT yang menyertakan token akses klien dan memulai proxy lokal pada perangkat jarak jauh. Anda harus menginstal dan menjalankan agen IoT pada perangkat jarak jauh jika Anda ingin tunneling aman untuk mengirimkan token akses klien menggunakan MQTT. Agen IoT harus berlangganan topik IoT MQTT yang dipesan berikut:

catatan

Jika Anda ingin mengirimkan token akses klien tujuan ke perangkat jarak jauh melalui metode selain berlangganan topik MQTT yang dicadangkan, Anda mungkin memerlukan pendengar token akses klien tujuan (CAT) dan proxy lokal. Pendengar CAT harus bekerja dengan mekanisme pengiriman token akses klien yang Anda pilih dan dapat memulai proxy lokal dalam mode tujuan.

Cuplikan agen IoT

Agen IoT harus berlangganan topik IoT MQTT yang dicadangkan berikut sehingga dapat menerima pesan MQTT dan memulai proxy lokal:

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

Di thing-name mana nama AWS IoT benda yang terkait dengan perangkat jarak jauh.

Berikut ini adalah contoh payload pesan MQTT:

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

Setelah menerima pesan MQTT, agen IoT harus memulai proxy lokal pada perangkat jarak jauh dengan parameter yang sesuai.

Kode Java berikut menunjukkan cara menggunakan AWS IoT Device SDK dan ProcessBuilderdari pustaka Java untuk membangun agen IoT sederhana untuk bekerja dengan tunneling aman.

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