Gunakan Paho Android Service untuk menghubungkan aplikasi Android ke IoT Platform serta mengirim dan menerima pesan.
Prasyarat
Di Konsol IoT Platform , untuk instans yang sesuai, buat produk dan perangkat, lalu peroleh nama domain akses MQTT dan informasi sertifikat perangkat (ProductKey, DeviceName, dan DeviceSecret). Untuk informasi selengkapnya, lihat:
Ikhtisar
Paho Android Service adalah layanan klien MQTT yang dibangun di atas library Eclipse Paho MQTT untuk Java.
Lingkungan pengembangan
Contoh ini menggunakan Android Studio 3.5.1 dengan Gradle 3.5.1.
Unduh Android Studio dari situs resmi Android Studio.
Instal client Paho Android
- Buat proyek Android baru.
Penting targetSdkVersion dalam file build.gradle aplikasi harus 30 atau lebih rendah. Jika nilainya lebih tinggi, Anda harus mengubahnya.
- Tambahkan dependensi Paho Android Client 1.1.1 ke file Gradle Anda:
- Dalam file build.gradle proyek, tambahkan URL repositori rilis Paho.
repositories { maven { url "https://repo.eclipse.org/content/repositories/paho-releases/" } } - Dalam file build.gradle aplikasi, tambahkan dependensi Paho Android Service (1.1.1) dan klien MQTT (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' }
- Dalam file build.gradle proyek, tambahkan URL repositori rilis Paho.
- Tambahkan entri berikut ke AndroidManifest.xml:
- Deklarasikan layanan MQTT:
<!-- Mqtt Service --> <service android:name="org.eclipse.paho.android.service.MqttService"> </service> - Tambahkan izin yang diperlukan.
<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" />
- Deklarasikan layanan MQTT:
Koneksi ke IoT Platform
- Unduh android_sample_code.zip dan ekstrak file AiotMqttOption.java, yang menghitung parameter koneksi MQTT.
File AiotMqttOption.java mendefinisikan kelas AiotMqttOption:
- Prototipe:
class AiotMqttOption Fungsi
Menghitung parameter username, password, dan clientid untuk koneksi MQTT ke IoT Platform.
- Anggota:
Definisi tipe Deskripsi metode public AiotMqttOption getMqttOption(String productKey, String deviceName, String deviceSecret)Menghitung username, password, dan clientid MQTT dari productKey, deviceName, dan deviceSecret perangkat.
public String getUsername()Mendapatkan username MQTT.
public String getPassword()Mendapatkan password MQTT.
public String getClientid()Mendapatkan clientid MQTT.
- Prototipe:
- Impor file AiotMqttOption.java ke proyek Android Anda.
- Tambahkan kode untuk menghubungkan perangkat ke IoT Platform.
Panggil kelas AiotMqttOption dalam file AiotMqttOption.java untuk menghitung parameter koneksi MQTT dan terhubung ke IoT Platform.
Instruksi pengembangan dan contoh kode:
- Hitung parameter koneksi MQTT clientId, username, dan password, lalu atur username dan password dalam objek MqttConnectOptions.
final private String PRODUCTKEY = "a11xsrW****"; final private String DEVICENAME = "paho_android"; final private String DEVICESECRET = "tLMT9QWD36U2SArglGqcHCDK9rK9****"; /* Dapatkan informasi koneksi MQTT: clientId, username, dan password. */ AiotMqttOption aiotMqttOption = new AiotMqttOption().getMqttOption(PRODUCTKEY, DEVICENAME, DEVICESECRET); if (aiotMqttOption == null) { Log.e(TAG, "device info error"); } else { clientId = aiotMqttOption.getClientId(); userName = aiotMqttOption.getUsername(); passWord = aiotMqttOption.getPassword(); } /* Buat objek MqttConnectOptions dan konfigurasikan username dan password. */ MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); mqttConnectOptions.setUserName(userName); mqttConnectOptions.setPassword(passWord.toCharArray()); - Hubungkan ke IoT Platform.
Buat objek MqttAndroidClient, atur callback, lalu panggil connect dengan MqttConnectOptions.
/* Buat objek MqttAndroidClient dan atur callback. */ mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), host, clientId); mqttAndroidClient.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { Log.i(TAG, "connection lost"); } @Override public void messageArrived(String topic, MqttMessage message) throws Exception { Log.i(TAG, "topic: " + topic + ", msg: " + new String(message.getPayload())); } @Override public void deliveryComplete(IMqttDeliveryToken token) { Log.i(TAG, "msg delivered"); } }); /* Bangun koneksi MQTT. */ try { mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { Log.i(TAG, "connect succeed"); subscribeTopic(SUB_TOPIC); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.i(TAG, "connect failed"); } }); } catch (MqttException e) { e.printStackTrace(); } - Publikasikan pesan. Panggil publish untuk mengirim muatan ke topik
/${productKey}/${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, "publish succeed!"); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.i(TAG, "publish failed!"); } }); } catch (MqttException e) { Log.e(TAG, e.toString()); e.printStackTrace(); } } - Panggil subscribe untuk berlangganan topik dan menerima 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, "subscribed succeed"); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { Log.i(TAG, "subscribed failed"); } }); } 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.
- Hitung parameter koneksi MQTT clientId, username, dan password, lalu atur username dan password dalam objek MqttConnectOptions.
- Kompilasi proyek.
Jalankan demo
Jalankan aplikasi demo untuk memverifikasi koneksi ke IoT Platform.
- Unduh paket kode demo dan ekstrak.
- Impor aiot-android-demo ke Android Studio.
- Dalam file MainActivity di app/src/main/java/com.linkkit.aiot_android_demo, ganti informasi perangkat placeholder dengan kredensial perangkat Anda.
- Atur PRODUCTKEY, DEVICENAME, dan DEVICESECRET ke nilai sertifikat perangkat Anda.
- Atur host ke titik akhir Anda:
final String host = "tcp://" + PRODUCTKEY + ".iot-as-mqtt.cn-shanghai.aliyuncs.com:443";- Untuk instans publik baru dan Instans Perusahaan, atur host ke titik akhir instans Anda:
final String host = "tcp://" + "{your-instance-endpoint}".Masuk ke konsol Platform IoT. Pada halaman Instance Overview, klik instans Anda. Di halaman Instance Details, klik View Development Configuration untuk mendapatkan titik akhir. Melihat dan mengonfigurasi titik akhir instans.
- Untuk instans publik lama:
Ganti kode wilayah (cn-shanghai) dengan wilayah tempat perangkat Anda berada. Wilayah yang didukung.
- Untuk instans publik baru dan Instans Perusahaan, atur host ke titik akhir instans Anda:
- Bangun dan jalankan aplikasi.
Setelah berhasil dijalankan, periksa log di Logcat.
2019-12-04 19:44:01.824 5952-5987/com.linkkit.aiot_android_demo W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 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 is not supported 2019-12-04 19:44:01.854 5952-5987/com.linkkit.aiot_android_demo D/HostConnection: createUnique: call ... ... 2019-12-04 19:44:01.860 5952-5987/com.linkkit.aiot_android_demo D/eglCodecCommon: allocate: Ask for block of size 0x1000 2019-12-04 19:44:01.861 5952-5987/com.linkkit.aiot_android_demo D/eglCodecCommon: allocate: ioctl allocate returned offset 0x3ff706000 size 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: Register alarmreceiver to 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: Schedule next alarm at 1575459902256 2019-12-04 19:44:02.256 5952-6023/com.linkkit.aiot_android_demo D/AlarmPingSender: Alarm scheule using setExactAndAllowWhileIdle, next: 60000 2019-12-04 19:44:02.272 5952-5952/com.linkkit.aiot_android_demo I/AiotMqtt: connect succeed 2019-12-04 19:44:02.301 5952-5952/com.linkkit.aiot_android_demo I/AiotMqtt: subscribed succeedLogin ke Konsol IoT Platform. Di instans yang sesuai, Anda dapat melihat status dan log perangkat.
Pilih . Status perangkat adalah Online.
Pilih . Anda dapat melihat IoT Platform logs dan on-premises device logs. Untuk informasi selengkapnya, lihat Log platform IoT dan Log perangkat lokal.
Kode kesalahan
Jika perangkat gagal terhubung ke IoT Platform melalui MQTT, gunakan kode kesalahan untuk menyelesaikan masalah tersebut. Untuk informasi selengkapnya tentang kode kesalahan sisi server, lihat Pemecahan Masalah.