Topik ini menjelaskan cara menggunakan Paho Android Service untuk menghubungkan perangkat ke IoT Platform dan mengaktifkan pengiriman pesan.
Prasyarat
Sebuah produk dan perangkat telah dibuat dalam suatu instans di Konsol IoT Platform. Sertifikat perangkat dan Titik akhir MQTT telah diperoleh. Informasi sertifikat perangkat mencakup ProductKey, DeviceName, dan DeviceSecret. Untuk informasi lebih lanjut, lihat topik-topik berikut:
Informasi latar belakang
Paho Android Service adalah klien Message Queuing Telemetry Transport (MQTT) yang dikembangkan berdasarkan pustaka Paho MQTT untuk Java.
Siapkan lingkungan pengembangan
Contoh ini menggunakan Android Studio versi 3.5.1 dan Gradle versi 3.5.1.
Kunjungi situs resmi Android Studio untuk mengunduh Android Studio. Untuk informasi lebih lanjut tentang pengembangan Android, lihat dokumentasi resmi Android Studio.
Instal Klien Paho Android
Buat proyek Android.
PentingJika nilai parameter targetSdkVersion lebih besar dari 30 dalam file build.gradle, ubah nilainya menjadi nilai yang kurang dari atau sama dengan 30.
Dalam file Gradle, tambahkan dependensi Klien Paho Android. Contoh ini menggunakan Klien Paho Android 1.1.1. Tambahkan dependensi berikut:
Dalam file build.gradle, tambahkan alamat repositori Paho. Contoh ini menggunakan repositori rilis.
repositories { maven { url "https://repo.eclipse.org/content/repositories/paho-releases/" } }Dalam file build.gradle, tambahkan dependensi Layanan Paho Android. Contoh ini menggunakan Layanan Paho Android 1.1.1, yang didasarkan pada paho.client.mqttv3-1.1.0.
dependencies { implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' }
Untuk mengikat aplikasi ke Layanan Paho Android, tambahkan informasi berikut ke file AndroidManifest.xml.
Deklarasikan layanan berikut:
<!-- Mqtt Service --> <service android:name="org.eclipse.paho.android.service.MqttService"> </service>Tambahkan izin yang diperlukan oleh Layanan Paho MQTT.
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
Menghubungkan perangkat ke IoT Platform
Unduh paket android_sameple_code.zip dan ekstraknya untuk mendapatkan file AiotMqttOption.java yang disediakan oleh Alibaba Cloud. File ini digunakan untuk memperoleh parameter koneksi MQTT.
File AiotMqttOption.java mendefinisikan kelas AiotMqttOption.
Prototipe
class AiotMqttOptionDeskripsi
Gunakan kelas ini untuk memperoleh parameter koneksi MQTT berikut: username, password, dan clientid.
Anggota
Tipe
Metode
public AiotMqttOption
getMqttOption(String productKey, String deviceName, String deviceSecret)Menghitung nilai parameter username, password, dan clientid berdasarkan nilai parameter productKey, deviceName, dan deviceSecret.
public String
getUsername()Memperoleh parameter username.
public String
getPassword()Memperoleh parameter password.
public String
getClientid()Memperoleh parameter clientid.
Impor file AiotMqttOption.java ke dalam proyek Android.
Dalam proyek Android, tambahkan file program yang dapat menghubungkan perangkat ke IoT Platform.
Tulis program untuk menggunakan kelas AiotMqttOption dalam file AiotMqttOption.java guna menghitung nilai parameter yang diperlukan untuk menetapkan koneksi MQTT ke IoT Platform.
Berikut ini adalah instruksi pengembangan dan kode contoh:
Hitung nilai parameter koneksi MQTT clientId, username, dan password. Konfigurasikan parameter username dan password dalam objek MqttConnectOptions.
final private String PRODUCTKEY = "a11xsrW****"; final private String DEVICENAME = "paho_android"; final private String DEVICESECRET = "tLMT9QWD36U2SArglGqcHCDK9rK9****"; /* Memperoleh parameter koneksi MQTT clientId, username, dan password. */ AiotMqttOption aiotMqttOption = new AiotMqttOption().getMqttOption(PRODUCTKEY, DEVICENAME, DEVICESECRET); if (aiotMqttOption == null) { Log.e(TAG, "informasi perangkat salah"); } else { clientId = aiotMqttOption.getClientId(); userName = aiotMqttOption.getUsername(); passWord = aiotMqttOption.getPassword(); } /* Buat objek MqttConnectOptions dan konfigurasikan parameter username dan password. */ MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); mqttConnectOptions.setUserName(userName); mqttConnectOptions.setPassword(passWord.toCharArray());Hubungkan klien ke IoT Platform.
Buat objek MqttAndroidClient dan konfigurasikan callback. Gunakan objek mqttConnectOptions untuk memanggil metode connect() guna menetapkan koneksi.
/* Buat objek MqttAndroidClient dan konfigurasikan callback. */ mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), host, clientId); mqttAndroidClient.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { Log.i(TAG, "koneksi hilang"); } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { Log.i(TAG, "topik: " + topic + ", msg: " + new String(message.getPayload())); } @Override public void deliveryComplete(IMqttDeliveryToken token) { Log.i(TAG, "pesan terkirim"); } }); /* Tetapkan koneksi ke IoT Platform melalui MQTT. */ try { mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.i(TAG, "koneksi berhasil"); subscribeTopic(SUB_TOPIC); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.i(TAG, "koneksi gagal"); } }); } catch (MqttException e) { e.printStackTrace(); }Publikasikan pesan. Definisikan metode publishMessage() untuk mempublikasikan pesan dengan payload tertentu ke topik
/${prodcutKey}/${deviceName}/user/update.public void publishMessage(String payload) { try { if (mqttAndroidClient.isConnected() == false) { mqttAndroidClient.connect(); } MqttMessage message = new MqttMessage(); message.setPayload(payload.getBytes()); message.setQos(0); mqttAndroidClient.publish(PUB_TOPIC, message,null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.i(TAG, "publikasi berhasil!"); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.i(TAG, "publikasi gagal!"); } }); } catch (MqttException e) { Log.e(TAG, e.toString()); e.printStackTrace(); } }Untuk informasi lebih lanjut tentang topik, lihat Topik.
Definisikan metode subscribeTopic() untuk berlangganan topik tertentu dan memperoleh pesan dari IoT Platform.
public void subscribeTopic(String topic) { try { mqttAndroidClient.subscribe(topic, 0, null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.i(TAG, "berlangganan berhasil"); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.i(TAG, "berlangganan gagal"); } }); } catch (MqttException e) { e.printStackTrace(); } }
Untuk informasi tentang metode komunikasi antara perangkat, server, dan IoT Platform, lihat Ikhtisar Komunikasi Antara Perangkat, Platform IoT, dan Server.
Kompilasi proyek.
Kode contoh
Kode contoh berikut menunjukkan cara menghubungkan ke IoT Platform.
Unduh paket demo dan ekstraknya.
Impor aiot-android-demo ke Android Studio.
Dalam direktori app/src/main/java/com.linkkit.aiot_android_demo, ganti informasi perangkat dengan informasi perangkat Anda dalam file MainActivity.
Ganti PRODUCTKEY, DEVICENAME, dan DEVICESECRET dengan informasi sertifikat perangkat Anda.
Ganti .iot-as-mqtt.cn-shanghai.aliyuncs.com:443 dalam kode
final String host = "tcp://" + PRODUCTKEY + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:443";dengan titik akhir instans Anda.Jika Anda menggunakan instans Enterprise Edition atau instans publik dari versi baru, tentukan
final String host = "tcp://" + "${MQTT endpoint of your instance}".Untuk memperoleh titik akhir MQTT, lakukan langkah-langkah berikut: Masuk ke Konsol IoT Platform. Di halaman Overview, klik kartu instans yang ingin Anda kelola. Di sudut kanan atas halaman Instance Details, klik View Development Configurations. Untuk informasi lebih lanjut, lihat Lihat titik akhir dari sebuah instans.
Jika Anda menggunakan instans publik dari versi lama, lakukan langkah berikut:
Ganti cn-shanghai dalam kode dengan ID wilayah tempat perangkat Anda berada. Untuk informasi lebih lanjut tentang ID wilayah, lihat Wilayah yang Didukung.
Bangun dan jalankan demo.
Setelah demo dijalankan, Anda dapat melihat log lokal di Logcat.
2019-12-04 19:44:01.824 5952-5987/com.linkkit.aiot_android_demo W/OpenGLRenderer: Gagal memilih config dengan EGL_SWAP_BEHAVIOR_PRESERVED, mencoba lagi tanpa... 2019-12-04 19:44:01.829 5952-5987/com.linkkit.aiot_android_demo D/EGL_emulation: eglCreateContext: 0xec073240: maj 3 min 0 rcv 3 2019-12-04 19:44:01.830 5952-5987/com.linkkit.aiot_android_demo D/EGL_emulation: eglMakeCurrent: 0xec073240: ver 3 0 (tinfo 0xec09b470) 2019-12-04 19:44:01.852 5952-5987/com.linkkit.aiot_android_demo W/Gralloc3: mapper 3.x tidak didukung 2019-12-04 19:44:01.854 5952-5987/com.linkkit.aiot_android_demo D/HostConnection: createUnique: panggil ... ... 2019-12-04 19:44:01.860 5952-5987/com.linkkit.aiot_android_demo D/eglCodecCommon: allocate: Mintalah blok ukuran 0x1000 2019-12-04 19:44:01.861 5952-5987/com.linkkit.aiot_android_demo D/eglCodecCommon: allocate: ioctl allocate mengembalikan offset 0x3ff706000 ukuran 0x2000 2019-12-04 19:44:01.897 5952-5987/com.linkkit.aiot_android_demo D/EGL_emulation: eglMakeCurrent: 0xec073240: ver 3 0 (tinfo 0xec09b470) 2019-12-04 19:44:02.245 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: Daftarkan alarmreceiver ke MqttServiceMqttService.pingSender.a11xsrW****.paho_android|timestamp=1575459841629,_v=sdk-android-1.0.0,securemode=2,signmethod=hmacsha256| 2019-12-04 19:44:02.256 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: Jadwalkan alarm berikutnya pada 1575459902256 2019-12-04 19:44:02.256 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: Alarm jadwal menggunakan setExactAndAllowWhileIdle, berikutnya: 60000 2019-12-04 19:44:02.272 5952-5952/com.linkkit.aiot_android_demo I/AiotMqtt: koneksi berhasil 2019-12-04 19:44:02.301 5952-5952/com.linkkit.aiot_android_demo I/AiotMqtt: berlangganan berhasilDi Konsol IoT Platform, Anda dapat melihat status perangkat dan log.
Pilih . Halaman Perangkat menunjukkan bahwa perangkat dalam keadaan Online.
Pilih . Lalu, klik tab Cloud run log atau Device local log untuk melihat log. Untuk informasi lebih lanjut, lihat Log IoT Platform dan Log Lokal Perangkat.
Kode kesalahan
Jika perangkat gagal menetapkan koneksi MQTT ke IoT Platform, Anda dapat mendiagnosis masalah berdasarkan kode kesalahan. Untuk informasi lebih lanjut, lihat Pemecahan Masalah.