Topik ini menjelaskan cara menginisialisasi Link SDK untuk Java guna menyambungkan perangkat ke IoT Platform.
Prasyarat
Produk dan perangkat telah dibuat. Untuk informasi lebih lanjut, lihat Buat Produk dan Perangkat.
Informasi verifikasi perangkat dan titik akhir tempat Anda ingin menyambungkan perangkat diperoleh.
Informasi latar belakang
Link SDK untuk Java memungkinkan Anda menggunakan hanya DeviceSecrets untuk memverifikasi identitas perangkat. Tabel berikut menjelaskan metode verifikasi yang didukung oleh SDK.
Metode verifikasi
Metode pendaftaran
Deskripsi
Tidak tersedia
Sertifikat perangkat yang mencakup ProductKey, DeviceName, dan DeviceSecret diinstal pada setiap perangkat.
Pra-pendaftaran
Sertifikat produk yang mencakup ProductKey dan ProductSecret diinstal pada semua perangkat dari suatu produk.
Anda harus mengaktifkan fitur dynamic registration untuk produk tersebut.
Pendaftaran dinamis memungkinkan perangkat mendapatkan DeviceSecret.
Tanpa pra-pendaftaran
Sertifikat produk yang mencakup ProductKey dan ProductSecret diinstal pada semua perangkat dari suatu produk.
Anda harus mengaktifkan fitur dynamic registration untuk produk tersebut.
Pendaftaran dinamis memungkinkan perangkat mendapatkan kombinasi ClientID dan DeviceToken.
CatatanUntuk informasi tentang perbedaan antara verifikasi satu-sertifikat-per-produk dengan pra-pendaftaran dan tanpa pra-pendaftaran, lihat Perbedaan antara metode verifikasi.
Untuk informasi tentang parameter Link SDK untuk Java, lihat LinkKitInitParams.
Verifikasi satu-sertifikat-per-perangkat
Kode contoh untuk verifikasi satu-sertifikat-per-perangkat:
String productKey = "${YourProductKey}";
String deviceName = "${YourDeviceName}";
String deviceSecret = "${YourDeviceSecret}";
LinkKitInitParams params = new LinkKitInitParams();
/**
* Langkah 1: Konfigurasikan parameter yang diperlukan untuk inisialisasi Message Queuing Telemetry Transport (MQTT).
*/
IoTMqttClientConfig config = new IoTMqttClientConfig();
MqttConfigure.mqttHost = "{YourInstanceId}.mqtt.iothub.aliyuncs.com:8883";
/*
* Tentukan apakah akan menerima pesan offline.
* Parameter ini sesuai dengan parameter cleanSession dari koneksi MQTT.
*/
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;
/**
* Langkah 2: Tentukan informasi verifikasi yang diperlukan untuk menginisialisasi perangkat.
*/
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
params.deviceInfo = deviceInfo;
/**
* Langkah 3: Tentukan nama pengguna, token, dan clientId perangkat.
* Langkah ini hanya diperlukan jika Anda menggunakan metode verifikasi satu-sertifikat-per-produk tanpa pra-pendaftaran untuk memverifikasi perangkat.
* Secara default, langkah ini dilewati.
*/
// MqttConfigure.deviceToken="${YourDeviceToken}";
// MqttConfigure.clientId="${YourClientId}";
LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
public void onError(AError aError) {
ALog.e(TAG, "Init Error error= "+aError);
}
public void onInitDone(InitResult initResult) {
ALog.i(TAG, "onInitDone result=" + initResult);
}
});Jika
onInitDonedikembalikan setelah Anda mengirim permintaan inisialisasi, inisialisasi berhasil. JikaonErrordikembalikan, inisialisasi gagal.Jika inisialisasi gagal, Anda dapat mengonfigurasi parameter yang diperlukan untuk menginisialisasi ulang perangkat sesuai dengan kebutuhan bisnis Anda. Link SDK untuk Java tidak secara otomatis menyambungkan ulang perangkat ke IoT Platform.
Jika inisialisasi berhasil dan perangkat terputus dari IoT Platform, Link SDK untuk Java secara otomatis menyambungkan ulang perangkat ke IoT Platform.
Pendaftaran dinamis
Verifikasi satu-sertifikat-per-produk juga dikenal sebagai pendaftaran dinamis. Fitur ini digunakan untuk meminta DeviceSecrets dari IoT Platform. Metode verifikasi satu-sertifikat-per-produk diklasifikasikan menjadi jenis-jenis berikut: tanpa pra-pendaftaran dan pra-pendaftaran. Sebelum menggunakan fitur ini, pastikan prasyarat berikut terpenuhi:
Pendaftaran dinamis diaktifkan untuk produk yang Anda buat di konsol IoT Platform.
Dalam file
deviceinfodari paket demo, parameter deviceSecret dibiarkan kosong dan nilai ditentukan untuk parameter productSecret.Pastikan Langkah 1, Langkah 2, dan Langkah 3 dalam kode contoh berikut dilakukan.
Setelah pendaftaran dinamis selesai, Anda harus menutup koneksi persisten untuk pendaftaran dinamis. Untuk informasi lebih lanjut, lihat kode contoh di Langkah 4.
Kode contoh menunjukkan cara melakukan verifikasi satu-sertifikat-per-produk dengan pra-pendaftaran. Anda dapat merujuk catatan penggunaan di Langkah 1 dari kode contoh untuk melakukan verifikasi satu-sertifikat-per-produk tanpa pra-pendaftaran.
Untuk memastikan keamanan perangkat, bakar DeviceSecret ke perangkat setelah Anda mendapatkan DeviceSecret dengan menggunakan metode verifikasi satu-sertifikat-per-produk. Jika Anda ingin menyambungkan perangkat Anda ke IoT Platform, lihat bagian "Verifikasi satu-sertifikat-per-perangkat" dari topik ini.
Tabel berikut menjelaskan perbedaan antara metode verifikasi satu-sertifikat-per-produk tanpa pra-pendaftaran dan pra-pendaftaran.
Item | Pra-pendaftaran | Tanpa pra-pendaftaran |
Protokol | Message Queuing Telemetry Transport (MQTT) dan HTTPS | MQTT |
Wilayah |
| China (Shanghai) dan China (Beijing) |
DeviceSecrets yang dikembalikan | Untuk informasi lebih lanjut tentang cara menggunakan DeviceSecret, lihat Langkah 1 dalam kode contoh untuk verifikasi satu-sertifikat-per-perangkat. | Bakar ClientID dan DeviceToken perangkat ke perangkat. Dengan cara ini, informasi tersebut dapat digunakan saat Anda menggunakan fitur tertentu, seperti menyambungkan perangkat ke IoT Platform. Untuk informasi lebih lanjut, lihat Langkah 3 dalam kode contoh untuk verifikasi satu-sertifikat-per-perangkat. |
Pendaftaran perangkat | Anda harus mendaftarkan DeviceName perangkat terlebih dahulu di konsol IoT Platform. | Anda tidak perlu mendaftarkan DeviceName perangkat terlebih dahulu di konsol IoT Platform. |
Jumlah penggunaan |
| Anda dapat mengaktifkan hingga lima perangkat fisik menggunakan ProductKey, ProductSecret, dan DeviceName yang sama di konsol IoT Platform pada saat bersamaan. IoT Platform menghasilkan ClientID dan DeviceToken unik untuk setiap perangkat. |
Kode contoh untuk pendaftaran dinamis:
String deviceName = "${YourDeviceName}";
String productKey = "${YourProductKey}";
String productSecret = "${YourProductSecret}";
// Langkah 1: Periksa apakah metode verifikasi satu-sertifikat-per-produk adalah tanpa pra-pendaftaran atau pra-pendaftaran.
// Kasus 1: Jika Anda mengatur parameter registerType ke regnwl, metode verifikasi satu-sertifikat-per-produk tanpa pra-pendaftaran digunakan dan Anda tidak perlu membuat perangkat.
// Kasus 2: Jika Anda membiarkan parameter registerType kosong atau mengatur parameter registerType ke register, metode verifikasi satu-sertifikat-per-produk pra-pendaftaran digunakan dan Anda harus membuat perangkat.
String registerType = "register";
// Langkah 2: Tentukan titik akhir untuk pendaftaran dinamis.
MqttConfigure.mqttHost = "ssl://${YourMqttHostUrl}:8883";
MqttInitParams initParams = new MqttInitParams(productKey, productSecret, deviceName, "",registerType);
// Langkah 3: Jika Anda menggunakan instance publik versi baru atau instance Enterprise Edition, tentukan ID instance yang Anda peroleh dari halaman Detail Instance di konsol IoT Platform untuk pendaftaran dinamis.
initParams.instanceId = "${YourInstanceId}";
final Object lock = new Object();
LinkKit.getInstance().deviceDynamicRegister(initParams, new IOnCallListener() {
@Override
public void onSuccess(com.aliyun.alink.linksdk.channel.core.base.ARequest request, com.aliyun.alink.linksdk.channel.core.base.AResponse response) {
try {
String responseData = new String((byte[]) response.data);
JSONObject jsonObject = JSONObject.parseObject(responseData);
// Output yang dikembalikan jika metode verifikasi satu-sertifikat-per-produk pra-pendaftaran digunakan.
String deviceSecret = jsonObject.getString("deviceSecret");
// Output yang dikembalikan jika metode verifikasi satu-sertifikat-per-produk tanpa pra-pendaftaran digunakan.
String clientId = jsonObject.getString("clientId");
String deviceToken = jsonObject.getString("deviceToken");
// Simpan kredensial yang dikembalikan dan lanjutkan ke Langkah 4. Setelah Anda menyelesaikan Langkah 4, Anda dapat menggunakan metode onSuccess untuk menyambungkan perangkat ke IoT Platform.
// Panggil operasi API yang menunggu thread.
synchronized (lock){
lock.notify();
}
} catch (Exception e) {
}
}
@Override
public void onFailed(ARequest aRequest, com.aliyun.alink.linksdk.channel.core.base.AError aError) {
System.out.println("mqtt dynamic registration failed");
// Panggil operasi API yang menunggu thread.
synchronized (lock){
lock.notify();
}
}
@Override
public boolean needUISafety() {
return false;
}
});
try {
// Tunggu pesan downstream. Dalam kebanyakan kasus, pesan downstream dikembalikan dalam waktu 1 detik.
synchronized (lock){
lock.wait(3000);
}
// Langkah 4: Nonaktifkan instance pendaftaran dinamis.
// Jangan jalankan fungsi berikut di callback LinkKit.getInstance().deviceDynamicRegister. Jika tidak, kesalahan mungkin terjadi.
LinkKit.getInstance().stopDeviceDynamicRegister(2000, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken iMqttToken) {
System.out.println("mqtt dynamic registration success");
// Sambungkan perangkat ke IoT Platform dan inisialisasi koneksi. Untuk informasi lebih lanjut, lihat bagian "Verifikasi satu-sertifikat-per-perangkat" dari topik ini.
}
@Override
public void onFailure(IMqttToken iMqttToken, Throwable throwable) {
System.out.println("mqtt dynamic registration failed");
}
});
} catch (Exception e) {
}Tentukan titik akhir
Kode contoh:
// Tentukan titik akhir untuk parameter LinkKitInitParams dalam permintaan MQTT.
IoTMqttClientConfig clientConfig = new IoTMqttClientConfig();
clientConfig.channelHost = "a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883";
linkKitInitParams.mqttClientConfig = clientConfig; Parameter:
Parameter | Contoh | Deskripsi |
channelHost | a18wP******.iot-as-mqtt.cn-shanghai.aliyuncs.com:8883 | Tentukan titik akhir tempat Anda ingin menyambungkan perangkat dalam format
Untuk informasi tentang instance publik versi baru dan sebelumnya, instance Enterprise Edition, dan titik akhir, lihat Lihat titik akhir instance. |
Pengaturan lainnya
Anda dapat mengonfigurasi parameter berikut untuk mengatur pengaturan tambahan yang terkait dengan koneksi perangkat.
Koneksi MQTT
Item
Deskripsi
Kode contoh
Interval keepalive
Tentukan interval keepalive untuk perangkat. Parameter ini menentukan periode waktu selama koneksi persisten dapat dipertahankan antara perangkat dan IoT Platform.
MqttConfigure.setKeepAliveInterval(int interval);Tingkat QoS
Tentukan tingkat Quality of Service (QoS). Tingkat QoS adalah perjanjian yang mendefinisikan tingkat kualitas pengiriman pesan antara perangkat dan IoT Platform. Nilai valid:
0: Setiap pesan dikirim paling banyak sekali.1: Setiap pesan dikirim setidaknya sekali.
- Parameter qos. MqttPublishRequest request = new MqttPublishRequest(); // Nilai valid: 0 dan 1. Nilai default: 0. request.qos = 0; request.isRPC = false; request.topic = topic.replace("request", "response"); String resId = topic.substring(topic.indexOf("rrpc/request/")+13); request.msgId = resId; // Konfigurasikan parameter di atas berdasarkan kebutuhan bisnis Anda. Informasi di atas disediakan hanya untuk referensi. request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";Pesan offline
Parameter cleanSession menentukan apakah akan menerima pesan offline.
/** * Konfigurasikan parameter yang diperlukan untuk inisialisasi MQTT. */ IoTMqttClientConfig config = new IoTMqttClientConfig(); config.productKey = deviceInfoData.productKey; config.deviceName = deviceInfoData.deviceName; config.deviceSecret = deviceInfoData.deviceSecret; config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883"; /** * Tentukan apakah akan menerima pesan offline. * Definisi berikut sesuai dengan kode berikut: receiveOfflineMsg = !cleanSession. Secara default, pesan offline tidak dapat diterima. */ config.receiveOfflineMsg = false; params.mqttClientConfig = config;Dukungan untuk Logging dan Log4j
Anda dapat menjalankan perintah berikut untuk mendapatkan log debugging:
ALog.setLevel(ALog.LEVEL_DEBUG); MqttLogger.isLoggable = true;Di Link SDK untuk Java V1.2.3.1 dan versi lebih baru, Anda dapat mengonfigurasi fungsi
loginterceptor global untuk memproses log berdasarkan kebutuhan bisnis Anda. Misalnya, Anda dapat menggunakan Log4j untuk menyimpan log di penyimpanan persisten seperti file.Kode contoh:
ALog.setLogDispatcher(new ILogDispatcher() { @Override public void log(int level, String prefix, String msg) { switch (level){ case LEVEL_DEBUG: System.out.println("debug:"+ prefix + msg); break; case LEVEL_INFO: System.out.println("info:" + prefix + msg); break; case LEVEL_ERROR: System.out.println("error:" + prefix + msg); break; case LEVEL_WARNING: System.out.println("warnings:" + prefix + msg); break; default: System.out.println("other:" + prefix + msg); } } });Status Koneksi dan Pendengar Pesan Downstream
Untuk mendengarkan pesan koneksi dan pemutusan perangkat serta data yang dikirim dari IoT Platform, konfigurasikan pendengar berikut:
IConnectNotifyListener notifyListener = new IConnectNotifyListener() { @Override public void onNotify(String connectId, String topic, AMessage aMessage) { // Callback untuk data downstream dari IoT Platform, seperti connectId, tipe koneksi, topik downstream dari IoT Platform, dan parameter aMessage yang menentukan isi pesan yang dikirim dari IoT Platform. //String pushData = new String((byte[]) aMessage.data); // Contoh pushData: {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"} // Parameter method menentukan tipe layanan. Parameter params menentukan konten data yang ingin Anda dorong. } @Override public boolean shouldHandle(String connectId, String topic) { // Tentukan apakah akan memproses data downstream dari topik IoT Platform. // Jika topik tidak diproses, pendengar onNotify tidak dapat menerima data downstream dari topik IoT Platform. return true; // Tentukan logika pemrosesan data yang diperlukan untuk pendengar berdasarkan skenario bisnis Anda. } @Override public void onConnectStateChange(String connectId, ConnectState connectState) { // Callback untuk perubahan status koneksi tipe koneksi yang sesuai. Untuk informasi tentang status koneksi, lihat ConnectState di SDK. // Jika SDK mendeteksi bahwa perangkat terputus dari IoT Platform karena fluktuasi jaringan, SDK secara otomatis menyambungkan ulang perangkat pada interval 1 detik, 2 detik, 4 detik, 8 detik, dan 128 detik. Setelah interval percobaan ulang mencapai 128 detik, SDK mencoba lagi pada interval 128 detik sampai perangkat tersambung kembali ke IoT Platform. } } // Daftarkan pendengar untuk mendengarkan data downstream, termasuk status koneksi persisten dan data downstream dari IoT Platform. LinkKit.getInstance().registerOnNotifyListener(notifyListener);Deinitialisasi
Kode berikut menunjukkan cara melakukan deinitialisasi:
// Hapus pendaftaran pendengar notifyListener. Pastikan Anda menghapus pendaftaran pendengar yang Anda daftarkan. LinkKit.getInstance().unRegisterOnNotifyListener(notifyListener); LinkKit.getInstance().deinit();