全部产品
Search
文档中心

IoT Platform:Kontrol Jarak Jauh Server Raspberry Pi

更新时间:Jul 06, 2025

IoT Platform memungkinkan Anda menerapkan penetrasi pseudo-Intranet untuk mengontrol jarak jauh server Raspberry Pi yang tidak memiliki alamat IP publik. Topik ini menjelaskan cara menggunakan IoT Platform untuk mengontrol jarak jauh server Raspberry Pi dan menyediakan contoh kode.

Informasi latar belakang

Sebagai contoh, Anda menggunakan Raspberry Pi untuk membangun server di perusahaan atau di rumah guna menjalankan tugas sederhana seperti memulai skrip atau mengunduh file. Jika server Raspberry Pi tidak memiliki alamat IP publik dan Anda tidak berada di kantor atau di rumah, Anda tidak dapat mengelola server tersebut. Jika Anda menggunakan alat penetrasi Intranet lainnya, pemutusan koneksi sering terjadi. Untuk menyelesaikan masalah ini, Anda dapat menggunakan fitur RRPC dari IoT Platform bersama dengan pustaka JSch untuk mengontrol jarak jauh server Raspberry Pi.

Catatan Dalam contoh ini, produk dan perangkat dalam instance publik digunakan.

Proses

Connect a Raspberry Pi server to IoT Platform

Berikut adalah proses penggunaan IoT Platform untuk mengontrol jarak jauh server Raspberry Pi:

  1. Panggil operasi RRPC operation IoT Platform pada komputer Anda untuk mengirim perintah Secure Shell (SSH).
  2. Setelah IoT Platform menerima perintah SSH, platform tersebut mengirim perintah SSH ke server Raspberry Pi melalui Message Queuing Telemetry Transport (MQTT).
  3. Sistem menjalankan perintah SSH pada server.
  4. Sistem membungkus hasil dari perintah SSH sebagai respons RRPC pada server dan mengirim respons tersebut ke IoT Platform melalui MQTT.
  5. IoT Platform mengirim respons RRPC ke komputer Anda.
Catatan Periode timeout RRPC adalah 5 detik. Jika IoT Platform tidak menerima respons dari server Raspberry Pi dalam waktu 5 detik, kesalahan timeout akan terjadi. Jika Anda mengirim perintah yang memerlukan waktu lama untuk diproses, abaikan pesan kesalahan timeout.

Unduh SDK dan Contoh Kode

Sebelum mengontrol jarak jauh server Raspberry Pi, kembangkan SDK IoT Platform dan Link SDK.

Berikut adalah contoh kode yang menunjukkan cara mengembangkan SDK IoT Platform dan Link SDK.

Catatan Contoh kode hanya mendukung perintah Linux sederhana, seperti uname, touch, dan mv. Perintah kompleks, seperti perintah yang digunakan untuk memodifikasi file, tidak didukung. Untuk menggunakan perintah kompleks, tulis kode sesuai dengan kebutuhan bisnis Anda.

Mengembangkan Link SDK

Setelah menginstal Link SDK dan mengunduh contoh kode, tambahkan dependensi proyek dan file Java yang diperlukan.

Proyek dapat diekspor sebagai paket JAR dan dijalankan di server Raspberry Pi.

  1. Tambahkan dependensi berikut ke file pom.xml:
    <! -- Link SDK -->
    <dependency>
        <groupId>com.aliyun.alink.linksdk</groupId>
        <artifactId>iot-linkkit-java</artifactId>
        <version>1.1.0</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.1</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.83</version>
        <scope>compile</scope>
    </dependency>
    
    <! -- SSH client -->
    <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.55</version>
    </dependency>
  2. Buat file bernama SSHShell.java untuk menjalankan perintah SSH.
    public class SSHShell {
    
        private String host;
    
        private String username;
    
        private String password;
    
        private int port;
    
        private Vector<String> stdout;
    
        public SSHShell(final String ipAddress, final String username, final String password, final int port) {
            this.host = ipAddress;
            this.username = username;
            this.password = password;
            this.port = port;
            this.stdout = new Vector<String>();
        }
    
        public int execute(final String command) {
    
            System.out.println("ssh command: " + command);
    
            int returnCode = 0;
            JSch jsch = new JSch();
            SSHUserInfo userInfo = new SSHUserInfo();
    
            try {
                Session session = jsch.getSession(username, host, port);
                session.setPassword(password);
                session.setUserInfo(userInfo);
                session.connect();
    
                Channel channel = session.openChannel("exec");
                ((ChannelExec) channel).setCommand(command);
    
                channel.setInputStream(null);
                BufferedReader input = new BufferedReader(new InputStreamReader(channel.getInputStream()));
    
                channel.connect();
    
                String line = null;
                while ((line = input.readLine()) != null) {
                    stdout.add(line);
                }
                input.close();
    
                if (channel.isClosed()) {
                    returnCode = channel.getExitStatus();
                }
    
                channel.disconnect();
                session.disconnect();
            } catch (JSchException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return returnCode;
        }
    
        public Vector<String> getStdout() {
            return stdout;
        }
    
    }
  3. Buat file bernama SSHUserInfo.java untuk memverifikasi nama pengguna dan kata sandi SSH.
    public class SSHUserInfo implements UserInfo {
    
        @Override
        public String getPassphrase() {
            return null;
        }
    
        @Override
        public String getPassword() {
            return null;
        }
    
        @Override
        public boolean promptPassphrase(final String arg0) {
            return false;
        }
    
        @Override
        public boolean promptPassword(final String arg0) {
            return false;
        }
    
        @Override
        public boolean promptYesNo(final String arg0) {
            if (arg0.contains("The authenticity of host")) {
                return true;
            }
            return false;
        }
    
        @Override
        public void showMessage(final String arg0) {
        }
    
    }
  4. Buat file bernama Device.java untuk menetapkan koneksi MQTT.
    public class Device {
    
        /**
         * Menetapkan koneksi.
         * 
         * @param productKey ProductKey dari produk.
         * @param deviceName DeviceName dari perangkat.
         * @param deviceSecret DeviceSecret dari perangkat.
         * @throws InterruptedException
         */
        public static void connect(String productKey, String deviceName, String deviceSecret) throws InterruptedException {
    
            // Inisialisasi parameter.
            LinkKitInitParams params = new LinkKitInitParams();
    
            // Konfigurasikan parameter yang diperlukan untuk menetapkan koneksi MQTT.
            IoTMqttClientConfig config = new IoTMqttClientConfig();
            config.productKey = productKey;
            config.deviceName = deviceName;
            config.deviceSecret = deviceSecret;
            params.mqttClientConfig = config;
    
            // Tentukan informasi sertifikat tentang perangkat.
            DeviceInfo deviceInfo = new DeviceInfo();
            deviceInfo.productKey = productKey;
            deviceInfo.deviceName = deviceName;
            deviceInfo.deviceSecret = deviceSecret;
            params.deviceInfo = deviceInfo;
    
            // Inisialisasi klien.
            LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
                public void onError(AError aError) {
                    System.out.println("init gagal !! code=" + aError.getCode() + ",msg=" + aError.getMsg() + ",subCode="
                            + aError.getSubCode() + ",subMsg=" + aError.getSubMsg());
                }
    
                public void onInitDone(InitResult initResult) {
                    System.out.println("init berhasil !!");
                }
            });
    
            // Sebelum Anda melakukan langkah-langkah berikut, pastikan inisialisasi selesai. Anda dapat menentukan nilai yang wajar berdasarkan skenario bisnis Anda.
            Thread.sleep(2000);
        }
    
        /**
         * Kirim pesan.
         * 
         @param topic Topik ke mana pesan dikirim.
         * @param payload Isi pesan.
         */
        public static void publish(String topic, String payload) {
            MqttPublishRequest request = new MqttPublishRequest();
            request.topic = topic;
            request.payloadObj = payload;
            request.qos = 0;
            LinkKit.getInstance().getMqttClient().publish(request, new IConnectSendListener() {
                @Override
                public void onResponse(ARequest aRequest, AResponse aResponse) {
                }
    
                @Override
                public void onFailure(ARequest aRequest, AError aError) {
                }
            });
        }
    
        /**
         * Berlangganan pesan.
         * 
         * @param topic Topik yang ingin Anda langgani pesannya.
         */
        public static void subscribe(String topic) {
            MqttSubscribeRequest request = new MqttSubscribeRequest();
            request.topic = topic;
            request.isSubscribe = true;
            LinkKit.getInstance().getMqttClient().subscribe(request, new IConnectSubscribeListener() {
                @Override
                public void onSuccess() {
                }
    
                @Override
                public void onFailure(AError aError) {
                }
            });
        }
    
        /**
         * Berhenti berlangganan pesan.
         * 
         * @param topic Topik yang ingin Anda hentikan langganannya.
         */
        public static void unsubscribe(String topic) {
            MqttSubscribeRequest request = new MqttSubscribeRequest();
            request.topic = topic;
            request.isSubscribe = false;
            LinkKit.getInstance().getMqttClient().unsubscribe(request, new IConnectUnscribeListener() {
                @Override
                public void onSuccess() {
                }
    
                @Override
                public void onFailure(AError aError) {
                }
            });
        }
    
        /**
         * Hentikan koneksi.
         */
        public static void disconnect() {
            // Deinisialisasi parameter.
            LinkKit.getInstance().deinit();
        }
    
    }
  5. Buat file bernama SSHDevice.java. File SSHDevice.java mencakup metode utama yang digunakan untuk menerima perintah RRPC. Anda juga dapat memanggil SSHShell untuk menjalankan perintah SSH dan mengembalikan respons RRPC. Dalam file SSHDevice.java, Anda harus memasukkan informasi sertifikat perangkat serta nama pengguna dan kata sandi SSH. Informasi sertifikat perangkat mencakup ProductKey, DeviceName, dan DeviceSecret.
    public class SSHDevice {
    
        // ===================Awal segmen tempat Anda mengonfigurasi parameter yang diperlukan.===========================
        // ProductKey dari produk.
        private static String productKey = "";
        // 
        private static String deviceName = "";
        // DeviceSecret dari perangkat.
        private static String deviceSecret = "";
        // Topik yang ingin Anda gunakan untuk pesan. Anda dapat menggunakan topik tanpa perlu membuat atau mendefinisikan topik.
        private static String rrpcTopic = "/sys/" + productKey + "/" + deviceName + "/rrpc/request/+";
        // Titik akhir atau alamat IP yang perlu diakses oleh klien SSH.
        private static String host = "127.0.0.1";
        // Nama pengguna yang digunakan untuk masuk ke klien SSH.
        private static String username = "";
        // Kata sandi untuk nama pengguna.
        private static String password = "";
        // Nomor port yang digunakan untuk masuk ke klien SSH.
        private static int port = 22;
        // ===================Akhir segmen tempat Anda mengonfigurasi parameter yang diperlukan.===========================
    
        public static void main(String[] args) throws InterruptedException {
    
            // Dengarkan data downstream.
            registerNotifyListener();
    
            // Tetapkan koneksi.
            Device.connect(productKey, deviceName, deviceSecret);
    
            // Berlangganan topik.
            Device.subscribe(rrpcTopic);
        }
    
        public static void registerNotifyListener() {
            LinkKit.getInstance().registerOnNotifyListener(new IConnectNotifyListener() {
                @Override
                public boolean shouldHandle(String connectId, String topic) {
                    // Proses pesan hanya dari topik tertentu.
                    if (topic.contains("/rrpc/request/")) {
                        return true;
                    } else {
                        return false;
                    }
                }
    
                @Override
                public void onNotify(String connectId, String topic, AMessage aMessage) {
                    // Terima permintaan RRPC dan kembalikan respons RRPC.
                    try {
                        // Jalankan perintah jarak jauh.
                        String payload = new String((byte[]) aMessage.getData(), "UTF-8");
                        SSHShell sshExecutor = new SSHShell(host, username, password, port);
                        sshExecutor.execute(payload);
    
                        // Dapatkan keluaran dari perintah.
                        StringBuffer sb = new StringBuffer();
                        Vector<String> stdout = sshExecutor.getStdout();
                        for (String str : stdout) {
                            sb.append(str);
                            sb.append("\n");
                        }
    
                        // Kembalikan keluaran ke server.
                        String response = topic.replace("/request/", "/response/");
                        Device.publish(response, sb.toString());
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
    
                @Override
                public void onConnectStateChange(String connectId, ConnectState connectState) {
                }
            });
        }
    
    }

Mengembangkan SDK IoT Platform

Setelah menginstal SDK IoT Platform dan mengunduh contoh kode, tambahkan dependensi proyek dan file Java yang diperlukan.

  1. Tambahkan dependensi berikut ke file pom.xml:
    Penting Untuk informasi lebih lanjut tentang versi terbaru SDK IoT Platform, lihat Gunakan SDK IoT Platform untuk Java.
    <! -- IoT Platform SDK -->
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-iot</artifactId>
        <version>7.38.0</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.5.6</version>
    </dependency>
    
    <!-- commons-codec -->
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.8</version>
    </dependency>
  2. Buat file bernama OpenApiClient.java untuk memanggil operasi API IoT Platform.
    public class OpenApiClient {
    
        private static DefaultAcsClient client = null;
    
        public static DefaultAcsClient getClient(String accessKeyID, String accessKeySecret) {
    
            if (client != null) {
                return client;
            }
    
            try {
                IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKeyID, accessKeySecret);
                DefaultProfile.addEndpoint("cn-shanghai", "cn-shanghai", "Iot", "iot.cn-shanghai.aliyuncs.com");
                client = new DefaultAcsClient(profile);
            } catch (Exception e) {
                System.out.println("create OpenAPI Client failed !! exception:" + e.getMessage());
            }
    
            return client;
        }
    
    }
  3. Buat file bernama SSHCommandSender.java. File SSHCommandSender.java mencakup metode utama yang digunakan untuk mengirim perintah SSH dan menerima respons terhadap perintah SSH. Dalam file SSHCommandSender.java, Anda harus menentukan informasi sertifikat perangkat, pasangan AccessKey akun Alibaba Cloud Anda, dan perintah SSH. Informasi sertifikat perangkat mencakup ProductKey, DeviceName, dan DeviceSecret.
    public class SSHCommandSender {
    
    
        // ===================The start of the segment in which you configure the required parameters.===========================
    
        // The AccessKey ID of your Alibaba Cloud account.
    
        private static String accessKeyID = "";
    
        // The AccessKey secret of your Alibaba Cloud account.
    
        private static String accessKeySecret = "";
    
        // The ProductKey of the product.
    
        private static String productKey = "";
    
        // The DeviceName of the device.
    
        private static String deviceName = "";
    
        // ===================The end of the segment in which you configure the required parameters.===========================
    
    
        public static void main(String[] args) throws ServerException, ClientException, UnsupportedEncodingException {
    
    
            // The remote Linux command.
    
            String payload = "uname -a";
    
    
            // Create an RRPC request.
    
            RRpcRequest request = new RRpcRequest();
    
            request.setProductKey(productKey);
    
            request.setDeviceName(deviceName);
    
            request.setRequestBase64Byte(Base64.encodeBase64String(payload.getBytes()));
    
            request.setTimeout(5000);
    
    
            // The client that is used to receive requests from the server.
    
            DefaultAcsClient client = OpenApiClient.getClient(accessKeyID, accessKeySecret);
    
    
            // Send an RRPC request.
    
            RRpcResponse response = (RRpcResponse) client.getAcsResponse(request);
    
    
            // Process RRPC responses.
    
            // The result that is returned after the execution of the response.getSuccess() function indicates only that the RRPC request is sent. The returned response does not indicate whether the request is received by the device or whether the device returned a response based on the result.
    
            // You must check the result based on the RRPC response code that is returned. For more information, see https://www.alibabacloud.com/help/doc-detail/69797.htm.
    
            if (response != null && "SUCCESS".equals(response.getRrpcCode())) {
    
                // The output.
    
                System.out.println(new String(Base64.decodeBase64(response.getPayloadBase64Byte()), "UTF-8"));
    
            } else {
    
                // Failed to obtain the output and print the related RRPC response code.
    
                System.out.println(response.getRrpcCode());
    
            }
    
        }
    
    
    }