IoT Platform memungkinkan Anda menetapkan nilai yang diinginkan untuk properti perangkat. Nilai tersebut disimpan dalam cache di IoT Platform sehingga Anda dapat mengontrol perangkat dari jarak jauh. Topik ini menjelaskan cara menetapkan nilai yang diinginkan untuk properti perangkat di Konsol IoT Platform guna mengontrol status bola lampu.
Informasi latar belakang
Setelah bola lampu terhubung ke IoT Platform, pastikan perangkat tetap online agar Anda dapat mengontrol statusnya. Di Konsol IoT Platform, bola lampu dapat berada dalam status On (1) atau Off (0). Namun, dalam skenario nyata, perangkat mungkin tidak selalu online.
Anda dapat menetapkan nilai yang diinginkan untuk bola lampu dan menyimpannya di IoT Platform. Ketika perangkat kembali online, perangkat tersebut membaca nilai properti yang diinginkan dari IoT Platform dan memperbarui nilai propertinya. Nilai properti yang diperbarui kemudian dikirim ke IoT Platform dan ditampilkan pada tab Status di Konsol IoT Platform.
Buat produk dan tambahkan perangkat
- Masuk ke Konsol IoT Platform.
Pada halaman Overview, temukan instans yang ingin Anda kelola, lalu klik ID instans atau nama instans tersebut.
- Di panel navigasi sebelah kiri, pilih . Pada halaman Products, klik Create Product untuk membuat produk bola lampu.

- Setelah produk dibuat, klik Define TSL Model untuk menambahkan model Thing Specification Language (TSL) ke produk tersebut, lalu publikasikan. Untuk informasi selengkapnya, lihat Tambahkan model TSL untuk satu produk.
Dalam contoh ini, tambahkan properti bernama Work Status (LightStatus). Tipe data untuk properti ini adalah
bool (Boolean), dengan0merepresentasikan Off dan1merepresentasikan On. - Di panel navigasi sebelah kiri, pilih , lalu klik Add Device untuk menambahkan perangkat Lamp ke produk tersebut.
Setelah perangkat dibuat, peroleh sertifikat perangkatnya, yang mencakup ProductKey, DeviceName, dan DeviceSecret.
Pada daftar perangkat, temukan perangkat
Lamp, lalu klik View untuk membuka halaman Device Details. Pada tab Running Status, Anda akan melihat bahwa nilai properti dan nilai properti yang diinginkan perangkat keduanya kosong. Awalnya, versi properti yang diinginkan adalah 0.
Tetapkan dan kueri nilai properti yang diinginkan
Anda dapat memanggil operasi API untuk menetapkan dan mengkueri nilai properti yang diinginkan terbaru untuk suatu perangkat.
Contoh dalam topik ini menggunakan Java SDK (untuk pengembangan sisi cloud). Untuk informasi selengkapnya, lihat Operasi API.
- Panggil operasi SetDeviceDesiredProperty untuk menetapkan nilai properti yang diinginkan.
DefaultProfile profile = DefaultProfile.getProfile( "<RegionId>", // ID wilayah. "<accessKey>", // ID AccessKey Akun Alibaba Cloud Anda. "<accessSecret>"); // Rahasia AccessKey Akun Alibaba Cloud Anda. IAcsClient client = new DefaultAcsClient(profile); // Buat permintaan API dan tetapkan parameter. SetDeviceDesiredPropertyRequest request = new SetDeviceDesiredPropertyRequest(); request.setIotInstanceId("iot-060***"); request.setDeviceName("Lamp"); request.setProductKey("g4r***"); // Identifier properti dan nilai yang diinginkan yang akan ditetapkan. request.setItems("{\"LightStatus\": 1}"); request.setVersions("{\"LightStatus\": 0}"); // Kirim permintaan dan tangani respons atau pengecualian. try { SetDeviceDesiredPropertyResponse response = client.getAcsResponse(request); System.out.println(new Gson().toJson(response)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } - Panggil operasi QueryDeviceDesiredProperty untuk melihat nilai properti yang diinginkan perangkat.
DefaultProfile profile = DefaultProfile.getProfile( "<RegionId>", // ID wilayah. "<accessKey>", // ID AccessKey Akun Alibaba Cloud Anda. "<accessSecret>"); // Rahasia AccessKey Akun Alibaba Cloud Anda. IAcsClient client = new DefaultAcsClient(profile); // Buat permintaan API dan tetapkan parameter. QueryDeviceDesiredPropertyRequest request = new QueryDeviceDesiredPropertyRequest(); request.setIotInstanceId("iot-06****"); request.setProductKey("g4r****"); request.setDeviceName("Lamp"); // Daftar identifier properti yang akan dikueri. Jika parameter ini diabaikan, nilai yang diinginkan semua properti yang dapat ditulis akan dikueri. List<String> identifierList = new ArrayList<String>(); identifierList.add("LightStatus"); request.setIdentifiers(identifierList); // Kirim permintaan dan tangani respons atau pengecualian. try { QueryDeviceDesiredPropertyResponse response = client.getAcsResponse(request); System.out.println(new Gson().toJson(response)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); }
Untuk informasi lebih lanjut tentang cara menetapkan parameter dalam kode, lihat Panduan penggunaan Java SDK.
Setelah Anda menetapkan nilai properti yang diinginkan di IoT Platform, nilai tersebut muncul dalam status berjalan perangkat. Pada halaman Device Details, klik TSL Data > Running Status. Anda dapat melihat bahwa nilai yang diinginkan properti tersebut ditampilkan sebagai 1 (On).
Pengembangan sisi perangkat
Bola lampu dapat memperoleh nilai properti yang diinginkan dalam skenario berikut:
- Jika bola lampu berpindah dari offline ke online, perangkat meminta nilai properti yang diinginkan yang di-cache di IoT Platform.
- Jika bola lampu sedang online, perangkat menerima nilai properti yang diinginkan yang didorong oleh IoT Platform secara real time.
Untuk informasi lebih lanjut tentang pengembangan sisi perangkat, lihat Gunakan SDK sisi perangkat untuk menghubungkan perangkat.
Topik ini menyediakan demo lengkap sisi perangkat . Untuk kode lengkapnya, lihat Lampiran: Kode demo sisi perangkat.
- Isi informasi sertifikat perangkat, wilayah, dan titik akhir MQTT.
/** * Informasi sertifikat perangkat. */ private static String productKey = "******"; private static String deviceName = "********"; private static String deviceSecret = "**************"; /** * Informasi koneksi MQTT. */ private static String regionId = "******"; ...... /** * Tetapkan parameter inisialisasi MQTT. */ config.channelHost = deviceInfo.productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";Catatan- Untuk informasi tentang sertifikat perangkat, lihat bagian Buat produk dan perangkat dalam topik ini.
- regionId adalah ID wilayah tempat instans Anda dideploy. Anda dapat menemukan wilayah tersebut di pojok kiri atas Konsol IoT Platform. Untuk daftar ID wilayah, lihat Wilayah yang didukung.
- Parameter channelHost menentukan titik akhir MQTT. Untuk informasi lebih lanjut tentang cara memperoleh titik akhir, lihat Lihat dan konfigurasi titik akhir instans.
- Tambahkan metode berikut untuk mengubah status fisik bola lampu dan melaporkan status baru ke cloud.
/** * Metode ini dipanggil ketika perangkat fisik perlu menangani perubahan properti. Hal ini terjadi dalam dua skenario: * Skenario 1: Setelah terhubung, perangkat secara aktif mengambil nilai properti yang diinginkan terbaru (model pull). * Skenario 2: Saat online, perangkat menerima nilai properti yang diinginkan yang didorong dari cloud melalui `property.set` (model push). * @param identifier Identifier properti. * @param value Nilai properti yang diinginkan. * @param needReport Menentukan apakah akan mengirim laporan status menggunakan `property.post`. * Pada Skenario 2, handler sudah mencakup pelaporan, sehingga parameter ini diatur ke false. * @return */ private boolean handlePropertySet(String identifier, ValueWrapper value, boolean needReport) { ALog.d(TAG, "Perangkat fisik menangani perubahan properti = [" + identifier + "], nilai = [" + value + "]"); // Dalam aplikasi nyata, Anda akan menentukan apakah operasi set berhasil. Di sini, kami mengasumsikan keberhasilan. boolean success = true; if (needReport) { reportProperty(identifier, value); } return success; } private void reportProperty(String identifier, ValueWrapper value){ if (StringUtils.isEmptyString(identifier) || value == null) { return; } ALog.d(TAG, "Melaporkan identitas properti=" + identifier); Map<String, ValueWrapper> reportData = new HashMap<>(); reportData.put(identifier, value); LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() { public void onSuccess(String s, Object o) { // Properti berhasil dilaporkan. ALog.d(TAG, "Laporan berhasil. onSuccess() dipanggil dengan: s = [" + s + "], o = [" + o + "]"); } public void onError(String s, AError aError) { // Gagal melaporkan properti. ALog.d(TAG, "Laporan gagal. onError() dipanggil dengan: s = [" + s + "], aError = [" + JSON.toJSONString(aError) + "]"); } }); } - Ketika bola lampu sedang online, jika nilai properti yang diinginkan ditetapkan di IoT Platform, nilai tersebut akan didorong ke perangkat. Perangkat memproses pesan tersebut dan mengubah statusnya.
Dalam kode berikut,
connectNotifyListenerdipanggil untuk memproses pesan tersebut. Untuk informasi lebih lanjut tentang Protokol Alink, lihat Perangkat melaporkan properti.Setelah data downstream asinkron diterima,
mCommonHandlerdipanggil, yang kemudian memanggilhandlePropertySetuntuk memperbarui properti fisik perangkat./** * Daftarkan fungsi respons untuk panggilan layanan dan pengaturan properti. * Ketika cloud memanggil layanan perangkat, perangkat harus merespons panggilan layanan tersebut. */ public void connectNotifyListener() { List<Service> serviceList = LinkKit.getInstance().getDeviceThing().getServices(); for (int i = 0; serviceList != null && i < serviceList.size(); i++) { Service service = serviceList.get(i); LinkKit.getInstance().getDeviceThing().setServiceHandler(service.getIdentifier(), mCommonHandler); } } private ITResRequestHandler mCommonHandler = new ITResRequestHandler() { public void onProcess(String serviceIdentifier, Object result, ITResResponseCallback itResResponseCallback) { ALog.d(TAG, "onProcess() dipanggil dengan: s = [" + serviceIdentifier + "]," + " o = [" + result + "], itResResponseCallback = [" + itResResponseCallback + "]"); ALog.d(TAG, "Menerima panggilan layanan asinkron dari cloud: " + serviceIdentifier); try { if (SERVICE_SET.equals(serviceIdentifier)) { Map<String, ValueWrapper> data = (Map<String, ValueWrapper>)((InputParams)result).getData(); ALog.d(TAG, "Menerima data downstream asinkron: " + data); // Tetapkan properti pada perangkat fisik lalu laporkan nilai yang diperbarui. boolean isSetPropertySuccess = handlePropertySet("LightStatus", data.get("LightStatus"), false); if (isSetPropertySuccess) { if (result instanceof InputParams) { // Beri respons ke cloud bahwa data telah diterima dengan sukses. itResResponseCallback.onComplete(serviceIdentifier, null, null); } else { itResResponseCallback.onComplete(serviceIdentifier, null, null); } } else { AError error = new AError(); error.setCode(100); error.setMsg("setPropertyFailed."); itResResponseCallback.onComplete(serviceIdentifier, new ErrorInfo(error), null); } } else if (SERVICE_GET.equals(serviceIdentifier)) { } else { // Tangani layanan lain berdasarkan kebutuhan spesifik. ALog.d(TAG, "Kembalikan nilai berdasarkan layanan aktual. Sebagai contoh, lihat implementasi 'set'."); OutputParams outputParams = new OutputParams(); // outputParams.put("op", new ValueWrapper.IntValueWrapper(20)); itResResponseCallback.onComplete(serviceIdentifier, null, outputParams); } } catch (Exception e) { e.printStackTrace(); ALog.d(TAG, "Format data yang dikembalikan dari cloud tidak valid."); } } public void onSuccess(Object o, OutputParams outputParams) { ALog.d(TAG, "onSuccess() dipanggil dengan: o = [" + o + "], outputParams = [" + outputParams + "]"); ALog.d(TAG, "Layanan berhasil didaftarkan."); } public void onFail(Object o, ErrorInfo errorInfo) { ALog.d(TAG, "onFail() dipanggil dengan: o = [" + o + "], errorInfo = [" + errorInfo + "]"); ALog.d(TAG, "Gagal mendaftarkan layanan."); } }; - Jika Anda menetapkan nilai properti yang diinginkan di IoT Platform saat bola lampu sedang offline, IoT Platform menyimpan nilai tersebut di cloud.
Ketika bola lampu kembali online, perangkat tersebut secara aktif mengambil nilai yang diinginkan lalu memanggil
handlePropertySetuntuk memperbarui status fisiknya.LinkKit.getInstance().init(params, new ILinkKitConnectListener() { public void onError(AError aError) { ALog.e(TAG, "Kesalahan Inisialisasi error=" + aError); } public void onInitDone(InitResult initResult) { ALog.i(TAG, "onInitDone result=" + initResult); connectNotifyListener(); // Dapatkan nilai properti yang diinginkan terbaru dari cloud. getDesiredProperty(deviceInfo, Arrays.asList("LightStatus"), new IConnectSendListener() { public void onResponse(ARequest aRequest, AResponse aResponse) { if(aRequest instanceof MqttPublishRequest && aResponse.data != null) { JSONObject jsonObject = JSONObject.parseObject(aResponse.data.toString()); ALog.i(TAG, "onResponse result=" + jsonObject); JSONObject dataObj = jsonObject.getJSONObject("data"); if (dataObj != null) { if (dataObj.getJSONObject("LightStatus") == null) { // Belum ada nilai yang diinginkan yang ditetapkan. } else { Integer value = dataObj.getJSONObject("LightStatus").getInteger("value"); handlePropertySet("LightStatus", new ValueWrapper.IntValueWrapper(value), true); } } } } public void onFailure(ARequest aRequest, AError aError) { ALog.d(TAG, "onFailure() dipanggil dengan: aRequest = [" + aRequest + "], aError = [" + aError + "]"); } }); } }); private void getDesiredProperty(BaseInfo info, List<String> properties, IConnectSendListener listener) { ALog.d(TAG, "getDesiredProperty() dipanggil dengan: info = [" + info + "], listener = [" + listener + "]"); if(info != null && !StringUtils.isEmptyString(info.productKey) && !StringUtils.isEmptyString(info.deviceName)) { MqttPublishRequest request = new MqttPublishRequest(); request.topic = DESIRED_PROPERTY_GET.replace("{productKey}", info.productKey).replace("{deviceName}", info.deviceName); request.replyTopic = DESIRED_PROPERTY_GET_REPLY.replace("{productKey}", info.productKey).replace("{deviceName}", info.deviceName); request.isRPC = true; RequestModel<List<String>> model = new RequestModel<>(); model.id = String.valueOf(IDGeneraterUtils.getId()); model.method = METHOD_GET_DESIRED_PROPERTY; model.params = properties; model.version = "1.0"; request.payloadObj = model.toString(); ALog.d(TAG, "getDesiredProperty: payloadObj=" + request.payloadObj); ConnectSDK.getInstance().send(request, listener); } else { ALog.w(TAG, "getDesiredProperty gagal, baseInfo kosong."); if(listener != null) { AError error = new AError(); error.setMsg("BaseInfoEmpty."); listener.onFailure(null, error); } } }
Verifikasi hasil migrasi
Jalankan kode contoh berdasarkan skenario berikut untuk memverifikasi status online atau offline bola lampu. Anda dapat mengubah nilai properti perangkat dengan menetapkan nilai properti yang diinginkan di IoT Platform.
- Ketika perangkat sedang online, mengubah status bola lampu di cloud memicu respons real time. Pada halaman Device Details, buka TSL Data > Running Status. Nilai properti untuk Work Status adalah 1 (On), dan nilai yang diinginkan juga 1 (On).
- Jika perangkat sedang offline dan Anda mengubah status bola lampu di cloud, nilai yang diinginkan akan berbeda dari nilai terakhir yang dilaporkan perangkat. Pada tab TSL Data > Running Status di halaman Device Details, nilai saat ini properti Work Status adalah 1 (On), sedangkan nilai yang diinginkan adalah 0 (Off).
- Setelah perangkat terhubung kembali, perangkat tersebut mengambil nilai properti yang diinginkan dan menyinkronkan statusnya. Pada tab TSL Data > Running Status, Anda dapat melihat bahwa nilai yang diinginkan dan nilai saat ini untuk properti Work Status keduanya
0 (Off). Hal ini mengonfirmasi bahwa properti perangkat telah disinkronkan dengan nilai yang diinginkan dari cloud.
Lampiran: Kode contoh untuk mengonfigurasi perangkat
package com.aliyun.alink.devicesdk.demo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.alink.apiclient.utils.StringUtils;
import com.aliyun.alink.dm.api.BaseInfo;
import com.aliyun.alink.dm.api.DeviceInfo;
import com.aliyun.alink.dm.api.InitResult;
import com.aliyun.alink.dm.model.RequestModel;
import com.aliyun.alink.dm.utils.IDGeneraterUtils;
import com.aliyun.alink.linkkit.api.ILinkKitConnectListener;
import com.aliyun.alink.linkkit.api.IoTMqttClientConfig;
import com.aliyun.alink.linkkit.api.LinkKit;
import com.aliyun.alink.linkkit.api.LinkKitInitParams;
import com.aliyun.alink.linksdk.cmp.api.ConnectSDK;
import com.aliyun.alink.linksdk.cmp.connect.channel.MqttPublishRequest;
import com.aliyun.alink.linksdk.cmp.core.base.ARequest;
import com.aliyun.alink.linksdk.cmp.core.base.AResponse;
import com.aliyun.alink.linksdk.cmp.core.listener.IConnectSendListener;
import com.aliyun.alink.linksdk.tmp.api.InputParams;
import com.aliyun.alink.linksdk.tmp.api.OutputParams;
import com.aliyun.alink.linksdk.tmp.device.payload.ValueWrapper;
import com.aliyun.alink.linksdk.tmp.devicemodel.Service;
import com.aliyun.alink.linksdk.tmp.listener.IPublishResourceListener;
import com.aliyun.alink.linksdk.tmp.listener.ITResRequestHandler;
import com.aliyun.alink.linksdk.tmp.listener.ITResResponseCallback;
import com.aliyun.alink.linksdk.tmp.utils.ErrorInfo;
import com.aliyun.alink.linksdk.tools.AError;
import com.aliyun.alink.linksdk.tools.ALog;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LampDemo {
private static final String TAG = "LampDemo";
private final static String SERVICE_SET = "set";
private final static String SERVICE_GET = "get";
public static String DESIRED_PROPERTY_GET = "/sys/${productKey}/${deviceName}/thing/property/desired/get";
public static String DESIRED_PROPERTY_GET_REPLY = "/sys/${productKey}/${deviceName}/thing/property/desired/get_reply";
public static String METHOD_GET_DESIRED_PROPERTY = "thing.property.desired.get";
public static void main(String[] args) {
/**
* Informasi sertifikat perangkat.
*/
String productKey = "****";
String deviceName = "Lamp";
String deviceSecret = "****";
/**
* Informasi koneksi MQTT.
*/
String regionId = "cn-shanghai";
LampDemo manager = new LampDemo();
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
manager.init(deviceInfo, regionId);
}
public void init(final DeviceInfo deviceInfo, String region) {
LinkKitInitParams params = new LinkKitInitParams();
/**
* Tetapkan parameter inisialisasi MQTT.
*/
IoTMqttClientConfig config = new IoTMqttClientConfig();
config.productKey = deviceInfo.productKey;
config.deviceName = deviceInfo.deviceName;
config.deviceSecret = deviceInfo.deviceSecret;
config.channelHost = deviceInfo.productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";
/**
* Menentukan apakah akan menerima pesan offline.
* Ini sesuai dengan bidang `cleanSession` dalam MQTT.
*/
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;
/**
* Tetapkan parameter inisialisasi dan masukkan informasi sertifikat perangkat.
*/
params.deviceInfo = deviceInfo;
LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
public void onError(AError aError) {
ALog.e(TAG, "Kesalahan Inisialisasi error=" + aError);
}
public void onInitDone(InitResult initResult) {
ALog.i(TAG, "onInitDone result=" + initResult);
connectNotifyListener();
// Dapatkan nilai properti yang diinginkan terbaru dari cloud.
getDesiredProperty(deviceInfo, Arrays.asList("LightStatus"), new IConnectSendListener() {
public void onResponse(ARequest aRequest, AResponse aResponse) {
if(aRequest instanceof MqttPublishRequest && aResponse.data != null) {
JSONObject jsonObject = JSONObject.parseObject(aResponse.data.toString());
ALog.i(TAG, "onResponse result=" + jsonObject);
JSONObject dataObj = jsonObject.getJSONObject("data");
if (dataObj != null) {
if (dataObj.getJSONObject("LightStatus") == null) {
// Belum ada nilai yang diinginkan yang ditetapkan.
} else {
Integer value = dataObj.getJSONObject("LightStatus").getInteger("value");
handlePropertySet("LightStatus", new ValueWrapper.IntValueWrapper(value), true);
}
}
}
}
public void onFailure(ARequest aRequest, AError aError) {
ALog.d(TAG, "onFailure() dipanggil dengan: aRequest = [" + aRequest + "], aError = [" + aError + "]");
}
});
}
});
}
/**
* Metode ini dipanggil ketika perangkat fisik perlu menangani perubahan properti. Hal ini terjadi dalam dua skenario:
* Skenario 1: Setelah terhubung, perangkat secara aktif mengambil nilai properti yang diinginkan terbaru (model pull).
* Skenario 2: Saat online, perangkat menerima nilai properti yang diinginkan yang didorong dari cloud melalui `property.set` (model push).
* @param identifier Identifier properti.
* @param value Nilai properti yang diinginkan.
* @param needReport Menentukan apakah akan mengirim laporan status menggunakan `property.post`.
* Pada Skenario 2, handler sudah mencakup pelaporan, sehingga parameter ini diatur ke false.
* @return
*/
private boolean handlePropertySet(String identifier, ValueWrapper value, boolean needReport) {
ALog.d(TAG, "Perangkat fisik menangani perubahan properti = [" + identifier + "], nilai = [" + value + "]");
// Dalam aplikasi nyata, Anda akan menentukan apakah operasi set berhasil. Di sini, kami mengasumsikan keberhasilan.
boolean success = true;
if (needReport) {
reportProperty(identifier, value);
}
return success;
}
private void reportProperty(String identifier, ValueWrapper value){
if (StringUtils.isEmptyString(identifier) || value == null) {
return;
}
ALog.d(TAG, "Melaporkan identitas properti=" + identifier);
Map<String, ValueWrapper> reportData = new HashMap<>();
reportData.put(identifier, value);
LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() {
public void onSuccess(String s, Object o) {
// Properti berhasil dilaporkan.
ALog.d(TAG, "Laporan berhasil. onSuccess() dipanggil dengan: s = [" + s + "], o = [" + o + "]");
}
public void onError(String s, AError aError) {
// Gagal melaporkan properti.
ALog.d(TAG, "Laporan gagal. onError() dipanggil dengan: s = [" + s + "], aError = [" + JSON.toJSONString(aError) + "]");
}
});
}
/**
* Daftarkan fungsi respons untuk panggilan layanan dan pengaturan properti.
* Ketika cloud memanggil layanan perangkat, perangkat harus merespons panggilan layanan tersebut.
*/
public void connectNotifyListener() {
List<Service> serviceList = LinkKit.getInstance().getDeviceThing().getServices();
for (int i = 0; serviceList != null && i < serviceList.size(); i++) {
Service service = serviceList.get(i);
LinkKit.getInstance().getDeviceThing().setServiceHandler(service.getIdentifier(), mCommonHandler);
}
}
private ITResRequestHandler mCommonHandler = new ITResRequestHandler() {
public void onProcess(String serviceIdentifier, Object result, ITResResponseCallback itResResponseCallback) {
ALog.d(TAG, "onProcess() dipanggil dengan: s = [" + serviceIdentifier + "]," +
" o = [" + result + "], itResResponseCallback = [" + itResResponseCallback + "]");
ALog.d(TAG, "Menerima panggilan layanan asinkron dari cloud: " + serviceIdentifier);
try {
if (SERVICE_SET.equals(serviceIdentifier)) {
Map<String, ValueWrapper> data = (Map<String, ValueWrapper>)((InputParams)result).getData();
ALog.d(TAG, "Menerima data downstream asinkron: " + data);
// Tetapkan properti pada perangkat fisik lalu laporkan nilai yang diperbarui.
boolean isSetPropertySuccess =
handlePropertySet("LightStatus", data.get("LightStatus"), false);
if (isSetPropertySuccess) {
if (result instanceof InputParams) {
// Beri respons ke cloud bahwa data telah diterima dengan sukses.
itResResponseCallback.onComplete(serviceIdentifier, null, null);
} else {
itResResponseCallback.onComplete(serviceIdentifier, null, null);
}
} else {
AError error = new AError();
error.setCode(100);
error.setMsg("setPropertyFailed.");
itResResponseCallback.onComplete(serviceIdentifier, new ErrorInfo(error), null);
}
} else if (SERVICE_GET.equals(serviceIdentifier)) {
} else {
// Tangani layanan lain berdasarkan kebutuhan spesifiknya.
ALog.d(TAG, "Kembalikan nilai berdasarkan layanan aktual. Sebagai contoh, lihat implementasi 'set'.");
OutputParams outputParams = new OutputParams();
// outputParams.put("op", new ValueWrapper.IntValueWrapper(20));
itResResponseCallback.onComplete(serviceIdentifier, null, outputParams);
}
} catch (Exception e) {
e.printStackTrace();
ALog.d(TAG, "Format data yang dikembalikan dari cloud tidak valid.");
}
}
public void onSuccess(Object o, OutputParams outputParams) {
ALog.d(TAG, "onSuccess() dipanggil dengan: o = [" + o + "], outputParams = [" + outputParams + "]");
ALog.d(TAG, "Layanan berhasil didaftarkan.");
}
public void onFail(Object o, ErrorInfo errorInfo) {
ALog.d(TAG, "onFail() dipanggil dengan: o = [" + o + "], errorInfo = [" + errorInfo + "]");
ALog.d(TAG, "Gagal mendaftarkan layanan.");
}
};
private void getDesiredProperty(BaseInfo info, List<String> properties, IConnectSendListener listener) {
ALog.d(TAG, "getDesiredProperty() dipanggil dengan: info = [" + info + "], listener = [" + listener + "]");
if(info != null && !StringUtils.isEmptyString(info.productKey) && !StringUtils.isEmptyString(info.deviceName)) {
MqttPublishRequest request = new MqttPublishRequest();
request.topic = DESIRED_PROPERTY_GET.replace("{productKey}", info.productKey).replace("{deviceName}", info.deviceName);
request.replyTopic = DESIRED_PROPERTY_GET_REPLY.replace("{productKey}", info.productKey).replace("{deviceName}", info.deviceName);
request.isRPC = true;
RequestModel<List<String>> model = new RequestModel<>();
model.id = String.valueOf(IDGeneraterUtils.getId());
model.method = METHOD_GET_DESIRED_PROPERTY;
model.params = properties;
model.version = "1.0";
request.payloadObj = model.toString();
ALog.d(TAG, "getDesiredProperty: payloadObj=" + request.payloadObj);
ConnectSDK.getInstance().send(request, listener);
} else {
ALog.w(TAG, "getDesiredProperty gagal, baseInfo kosong.");
if(listener != null) {
AError error = new AError();
error.setMsg("BaseInfoEmpty.");
listener.onFailure(null, error);
}
}
}
}