Setelah memigrasikan data dari instance publik sumber ke instance Enterprise Edition tujuan, semua operasi API IoT Platform yang terkait dengan bisnis Anda harus dilakukan pada instance Enterprise Edition tujuan. Untuk itu, Anda perlu mengembangkan fungsi untuk memperbarui ID instance tempat perangkat dalam database bernaung. Selain itu, Anda juga perlu mengembangkan fungsi untuk menentukan ID instance Enterprise Edition saat memanggil operasi API IoT Platform untuk mengelola layanan perangkat tersebut. Topik ini menjelaskan cara mengonfigurasi server dalam sistem bisnis untuk migrasi instance. Contoh ini menggunakan lingkungan pengembangan Java.
Informasi latar belakang
Untuk informasi lebih lanjut tentang migrasi instance, lihat Catatan Penggunaan.
Untuk detail lebih lanjut tentang cara berlangganan pesan migrasi instance, lihat Konfigurasikan Aturan Penerusan Data.
Lingkungan pengembangan
Komponen berikut digunakan dalam lingkungan pengembangan Java:
Versi JDK: JDK 8 atau yang lebih baru.
Lingkungan Pengembangan Terintegrasi (IDE): IntelliJ IDEA Community Edition.
Contoh kode
Operasi | Deskripsi |
Perbarui data perangkat | Parsel pesan migrasi instance yang berlangganan oleh instance publik sumber menggunakan mesin aturan. Parsel pesan penerusan data dari perangkat yang dimigrasikan dan perbarui ID instance tempat perangkat dalam database bernaung. |
Kelola layanan perangkat | Konfigurasikan parameter permintaan untuk operasi API yang ingin Anda panggil untuk mengelola layanan perangkat. Saat Anda memanggil operasi API, Anda harus menanyakan ID instance tempat perangkat yang layanannya ingin Anda kelola dalam tabel database bernaung. Kemudian, tentukan ID untuk parameter permintaan IotInstanceId dari operasi API. |
Contoh kode untuk memperbarui data perangkat
Anda perlu mengembangkan fungsi untuk memperbarui data perangkat berdasarkan SDK yang digunakan untuk menghubungkan klien Advanced Message Queuing Protocol (AMQP) ke IoT Platform. Untuk informasi lebih lanjut tentang cara menghubungkan klien AMQP, lihat Hubungkan Klien ke IoT Platform Menggunakan SDK untuk Java.
Ganti definisi fungsi processMessage yang dipanggil untuk memproses pesan migrasi instance dengan kode berikut. Dalam kode tersebut, fungsi updateDeviceInstanceId(productKey, deviceName, targetInstanceId) dan recoverDeviceInstanceId(productKey, deviceName) dipanggil untuk memperbarui data database. Anda harus mengonfigurasi fungsi-fungsi tersebut sesuai dengan skenario bisnis Anda.
private static void processMessage(Message message) {
try {
byte[] body = message.getBody(byte[].class);
String content = new String(body);
String topic = message.getStringProperty("topic");
String messageId = message.getStringProperty("messageId");
logger.info("receive message"
+ ",\n topic = " + topic
+ ",\n messageId = " + messageId
+ ",\n content = " + content);
if (null == content) {
logger.error("content is null");
}
JSONObject object = JSON.parseObject(content);
String status = object.getString("status");
// Perbarui ID instance tempat perangkat yang dimigrasikan bernaung.
String targetInstanceId = object.getString("targetInstance");
// Ganti ID instance tempat perangkat yang dimigrasikan bernaung dengan ID instance Enterprise Edition tujuan.
if (StringUtils.equals(status, "GRAY_EXECUTING") || StringUtils.equals(status, "ALL_EXECUTING")) {
JSONArray successDevices = object.getJSONArray("successDevices");
if (successDevices == null) {
return;
}
for (int i = 0; i < successDevices.size(); i++) {
JSONObject device = successDevices.getJSONObject(i);
if (null == device) {
return;
}
String deviceName = device.getString("deviceName");
String productKey = device.getString("productKey");
// todo: Perbarui ID instance tempat perangkat yang dimigrasikan dalam database bernaung berdasarkan ProductKey, DeviceNames, dan ID instance tujuan yang ditentukan.
// updateDeviceInstanceId(productKey, deviceName, targetInstanceId)
}
}
// Kembalikan ID instance tempat perangkat yang dikembalikan bernaung ke ID instance asli.
if (StringUtils.equals("status", "ROLL_BACK_EXECUTING")) {
JSONArray successDevices = object.getJSONArray("successDevices");
if (successDevices == null) {
return;
}
for (int i = 0; i < successDevices.size(); i++) {
JSONObject device = successDevices.getJSONObject(i);
if (null == device) {
return;
}
String deviceName = device.getString("deviceName");
String productKey = device.getString("productKey");
// todo: Kembalikan ID instance dalam database berdasarkan ProductKey dan DeviceNames yang ditentukan. Anda harus mengonfigurasi kebijakan pemulihan berdasarkan skenario bisnis Anda.
// 1. Jika Anda tidak menentukan ID untuk panggilan API yang terkait dengan instance publik sumber, sistem akan menetapkan ID instance menjadi null.
// 2. Jika Anda menentukan ID untuk panggilan API yang terkait dengan instance publik sumber, sistem akan menetapkan ID instance menjadi nilai default asli.
// recoverDeviceInstanceId(productKey, deviceName)
}
}
} catch (Exception e) {
logger.error("processMessage occurs error ", e);
}
}Contoh kode untuk mengelola layanan perangkat
Anda perlu mengembangkan fungsi untuk memanggil operasi API terkait perangkat berdasarkan IoT Platform SDK untuk Java. Untuk informasi lebih lanjut tentang cara menggunakan IoT Platform SDK untuk Java, lihat Gunakan IoT Platform SDK untuk Java.
Kembangkan fungsi untuk memanggil operasi API yang diperlukan. Dalam contoh ini, operasi API Pub dipanggil. Kode berikut mendefinisikan fungsi pub(client, productKey, deviceName). Dalam kode tersebut, fungsi getInstanceId(productKey, deviceName) dipanggil untuk mengimplementasikan logika bisnis. Anda harus mengembangkan fungsi tersebut sesuai dengan skenario bisnis Anda.
public static void main(String[] args) {
String accessKey = "${accessKey}";
String accessSecret = "${accessSecret}";
String productKey = "${productKey}";
String deviceName = "${deviceName}";
IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, accessSecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
pub(client, productKey, deviceName);
}
private static void pub(DefaultAcsClient client, String productKey, String deviceName) {
PubRequest request = new PubRequest();
// Dapatkan ID instance dari database.
String instanceId = getInstanceId(productKey, deviceName);
// Jika ID instance diperoleh, Anda harus menentukan ID instance untuk parameter instanceId. Jika Anda menggunakan instance Enterprise Edition, Anda harus mengonfigurasi parameter ini. Jika Anda menggunakan instance publik, Anda tidak perlu mengonfigurasi parameter ini.
if (!StringUtils.isEmpty(instanceId)) {
request.setIotInstanceId(instanceId);
}
request.setProductKey("${productKey}");
request.setMessageContent(Base64.encodeBase64String("hello world".getBytes()));
request.setTopicFullName("/${productKey}/${deviceName}/user/get");
request.setQos(0); // QoS 0 dan QoS 1 didukung.
try {
PubResponse response = client.getAcsResponse(request);
System.out.println(response.getSuccess());
System.out.println(response.getCode());
System.out.println(response.getErrorMessage());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
e.printStackTrace();
}
}
/**
* Dapatkan ID instance dari database.
*
* @param productKey
* @param deviceName
* @return
*/
private static String getInstanceId(String productKey, String deviceName) {
String instanceId = "";
// todo: Tanyakan data dalam database menggunakan ProductKey dan DeviceName yang ditentukan.
// instanceId = query(productKey, deviceName);
return instanceId;
}