IoT Platform memungkinkan Anda menentukan nilai yang diinginkan untuk properti perangkat. Dengan cara ini, Anda dapat menyimpan nilai tersebut di IoT Platform dan mengontrol perangkat secara remote menggunakan nilai tersebut. Topik ini menjelaskan cara menentukan nilai yang diinginkan untuk properti perangkat di Konsol IoT Platform guna mengontrol status lampu.
Informasi latar belakang
Setelah lampu terhubung ke IoT Platform, pastikan perangkat tetap online untuk mengontrol status lampu. Lampu di Konsol IoT Platform dapat berada dalam keadaan On (1) atau Off (0). Dalam skenario nyata, lampu mungkin gagal tetap online.
Anda dapat menentukan nilai yang diinginkan untuk lampu dan menyimpannya di IoT Platform. Setelah perangkat online, perangkat dapat membaca nilai properti yang diinginkan yang tersimpan di IoT Platform dan memperbarui nilai properti tersebut. Kemudian, nilai properti yang diperbarui dikirimkan ke IoT Platform dan ditampilkan di tab Status pada Konsol IoT Platform.
Buat produk dan tambahkan perangkat
- Masuk ke Konsol IoT Platform.
Di halaman Overview, klik All environment. Di tab All environment, temukan instance yang ingin Anda kelola dan klik ID instance atau nama instance.
- Di panel navigasi sisi kiri, pilih . Di halaman Products, klik Create Product untuk membuat produk lampu.

- Setelah membuat produk, klik Create TSL untuk menambahkan fitur Thing Specification Language (TSL) ke produk dan mempublikasikan model TSL. Untuk informasi lebih lanjut, lihat Tambahkan Fitur TSL.Dalam contoh ini, properti LightStatus

- Di panel navigasi sisi kiri, pilih , lalu klik Add Device untuk menambahkan perangkat Lamp ke produk.
Setelah menambahkan perangkat, peroleh informasi sertifikat tentang perangkat. Informasi sertifikat mencakup ProductKey, DeviceName, dan DeviceSecret.Di daftar perangkat, temukan perangkat Lamp dan klik View di kolom Actions untuk masuk ke halaman Device Details. Anda dapat melihat nilai properti perangkat dan nilai properti yang diinginkan di tab Status pada halaman Device Details. Dalam contoh ini, parameter kosong. Versi nilai properti yang diinginkan adalah 0.

Tentukan dan kueri nilai properti yang diinginkan di IoT Platform
Anda dapat memanggil operasi API IoT Platform untuk menentukan nilai properti yang diinginkan untuk perangkat atau mendapatkan nilai properti yang diinginkan terbaru.
Untuk informasi lebih lanjut, lihat Operasi API. Dalam contoh ini, IoT Platform SDK for Java digunakan.
- Panggil operasi SetDeviceDesiredProperty untuk menentukan nilai yang diinginkan untuk properti perangkat.
DefaultProfile profile = DefaultProfile.getProfile( "<RegionId>", // ID wilayah. "<accessKey>", // ID AccessKey dari akun Alibaba Cloud. "<accessSecret>"); // Rahasia AccessKey dari akun Alibaba Cloud. IAcsClient client = new DefaultAcsClient(profile); // Buat permintaan API dan konfigurasikan parameter yang diperlukan. SetDeviceDesiredPropertyRequest request = new SetDeviceDesiredPropertyRequest(); request.setIotInstanceId("iot-060***"); request.setDeviceName("Lamp"); request.setProductKey("g4r***"); // Identifikasi dan nilai yang diinginkan yang ingin Anda tentukan untuk properti. 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 menanyakan nilai properti yang diinginkan dari perangkat.
DefaultProfile profile = DefaultProfile.getProfile( "<RegionId>", // ID wilayah. "<accessKey>", // ID AccessKey dari akun Alibaba Cloud. "<accessSecret>"); // Rahasia AccessKey dari akun Alibaba Cloud. IAcsClient client = new DefaultAcsClient(profile); // Buat permintaan API dan konfigurasikan parameter yang diperlukan. QueryDeviceDesiredPropertyRequest request = new QueryDeviceDesiredPropertyRequest(); request.setIotInstanceId("iot-06****"); request.setProductKey("g4rm****"); request.setDeviceName("Lamp"); // Identifikasi properti yang ingin Anda tanyakan. Jika Anda tidak menentukan pengenal properti, nilai yang diinginkan dari semua properti kecuali properti hanya-baca akan ditanyakan. 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 mengonfigurasi parameter dalam kode, lihat Gunakan IoT Platform SDK for Java.
Setelah nilai properti yang diinginkan ditentukan untuk perangkat Lamp, nilainya ditampilkan di tab Status.

Pengembangan sisi perangkat
Lampu dapat memperoleh nilai properti yang diinginkan dalam skenario berikut:
- Jika lampu beralih dari offline ke online, perangkat meminta nilai properti yang diinginkan yang tersimpan di IoT Platform.
- Jika lampu online, perangkat menerima nilai properti yang diinginkan yang didorong oleh IoT Platform secara real-time.
Untuk informasi lebih lanjut, lihat Gunakan SDK Perangkat untuk Menghubungkan Perangkat ke IoT Platform.
topik ini memberikan kode sampel lengkap sisi perangkat. Untuk informasi lebih lanjut, lihat Lampiran: Kode Sampel untuk Mengonfigurasi Perangkat.
- Tentukan sertifikat perangkat, wilayah, dan titik akhir MQTT.
/** * Informasi sertifikat tentang perangkat. */ private static String productKey = "******"; private static String deviceName = "********"; private static String deviceSecret = "**************"; /** * Informasi koneksi MQTT. */ private static String regionId = "******"; ...... /** * Konfigurasikan parameter untuk inisialisasi MQTT. */ config.channelHost = deviceInfo.productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";Catatan- Untuk informasi tentang cara memperoleh informasi sertifikat perangkat, lihat bagian "Buat Produk dan Tambahkan Perangkat" dari topik ini.
- regionId menentukan ID wilayah tempat layanan Anda berada. Anda dapat melihat wilayah di sudut kiri atas Konsol IoT Platform. Untuk informasi tentang format ID wilayah, lihat Wilayah yang Didukung.
- channelHost menentukan titik akhir yang ingin Anda gunakan untuk menghubungkan perangkat Anda ke IoT Platform melalui MQTT. Untuk informasi lebih lanjut tentang cara memperoleh ID wilayah, lihat Kelola Titik Akhir Suatu Instance.
- Tambahkan metode berikut. Metode ini dapat digunakan untuk mengubah nilai properti aktual dari lampu dan secara otomatis melaporkan perubahan ke IoT Platform.
/** * Saat perangkat menangani perubahan nilai properti, metode dipanggil dalam skenario berikut: * Skenario 1: Setelah perangkat terhubung ke IoT Platform, perangkat secara otomatis meminta untuk menarik nilai properti yang diinginkan terbaru dari IoT Platform. * Skenario 2: Saat perangkat online, perangkat menerima nilai properti yang diinginkan dari topik property.set yang didorong oleh IoT Platform. * @param identifier: pengenal properti. * @param value: nilai properti yang diinginkan. * @param needReport: menentukan apakah akan melaporkan nilai properti ke IoT Platform menggunakan topik property.post. * Dalam Skenario 2, kemampuan pelaporan properti diintegrasikan ke dalam fungsi pemrosesan dan parameter needReport diatur ke false. * @return */ private boolean handlePropertySet(String identifier, ValueWrapper value, boolean needReport) { ALog.d(TAG, "Perangkat menangani perubahan properti= [" + identifier + "], value = [" + value + "]"); // Periksa apakah pengaturan properti dikonfigurasi sesuai harapan berdasarkan respons. Dalam contoh ini, pesan sukses dikembalikan. 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, "Laporkan 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) { // Nilai properti dilaporkan. ALog.d(TAG, "Laporan sukses onSuccess() dipanggil dengan: s = [" + s + "], o = [" + o + "]"); } public void onError(String s, AError aError) { // Nilai properti gagal dilaporkan. ALog.d(TAG, "Laporan gagal onError() dipanggil dengan: s = [" + s + "], aError = [" + JSON.toJSONString(aError) + "]"); } }); } - Jika lampu online dan nilai properti yang diinginkan ditentukan untuk lampu di Konsol IoT Platform, IoT Platform mendorong nilai tersebut ke lampu. Lampu memproses pesan dan mengubah status.
Dalam kode berikut, metode
connectNotifyListener()dipanggil untuk memproses pesan. Untuk informasi tentang protokol Alink, lihat Perangkat Mengirimkan Data Properti ke IoT Platform.Setelah perangkat menerima pesan asinkron dari IoT Platform, perangkat memanggil metode
mCommonHandler()dan kemudian metodehandlePropertySetuntuk memperbarui nilai properti./** * Daftarkan fungsi untuk merespons panggilan layanan dan pengaturan properti. * Saat IoT Platform memanggil layanan dari perangkat, perangkat harus merespons panggilan dan mengembalikan respons. */ 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 IoT Platform " + 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); // Konfigurasikan properti perangkat dan kemudian laporkan nilai properti ke IoT Platform. boolean isSetPropertySuccess = handlePropertySet("LightStatus", data.get("LightStatus"), false); if (isSetPropertySuccess) { if (result instanceof InputParams) { // Kembalikan respons ke IoT Platform. Respons menunjukkan bahwa data diterima. 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 { // Operasi perangkat bervariasi berdasarkan layanan. ALog.d(TAG, "Kembalikan respons ke IoT Platform."); 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 tidak valid"); } } public void onSuccess(Object o, OutputParams outputParams) { ALog.d(TAG, "onSuccess() dipanggil dengan: o = [" + o + "], outputParams = [" + outputParams + "]"); ALog.d(TAG, "Layanan telah didaftarkan"); } public void onFail(Object o, ErrorInfo errorInfo) { ALog.d(TAG, "onFail() dipanggil dengan: o = [" + o + "], errorInfo = [" + errorInfo + "]"); ALog.d(TAG, "Pendaftaran layanan gagal."); } }; - Jika lampu offline dan nilai properti yang diinginkan ditentukan untuk lampu di Konsol IoT Platform, nilai tersebut disimpan di IoT Platform.
Setelah lampu online, lampu meminta nilai properti yang diinginkan dari IoT Platform dan memanggil metode
handlePropertySet()untuk memperbarui nilai properti.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); connectNotifyListener(); // Minta nilai properti yang diinginkan terbaru dari IoT Platform. 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) { // Tidak ada nilai yang diinginkan yang ditentukan. } 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 sampel berdasarkan skenario berikut untuk memverifikasi status online atau offline lampu. Anda dapat mengubah nilai properti perangkat dengan menentukan nilai properti yang diinginkan di IoT Platform.
- Jika bohlam menyala, Anda dapat mengubah statusnya di IoT Platform. Bohlam akan merespons perubahan tersebut secara real time.

- Jika bola lampu offline, Anda dapat mengubah statusnya di IoT Platform. Dalam situasi ini, nilai properti yang diinginkan di IoT Platform akan berbeda dari nilai properti perangkat terbaru.

- Jika bola lampu berubah dari status offline ke online, bola lampu akan meminta nilai properti yang diinginkan. Nilai properti terbaru kemudian segera disinkronkan dengan nilai yang diinginkan.

Lampiran: Kode sampel 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.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 tentang 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();
/**
* Konfigurasikan parameter untuk 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";
/**
* Tentukan apakah akan menerima pesan offline.
* Bidang cleanSession yang sesuai dengan koneksi MQTT.
*/
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;
/**
* Konfigurasikan inisialisasi dan masukkan informasi sertifikat tentang perangkat.
*/
params.deviceInfo = deviceInfo;
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);
connectNotifyListener();
// Minta nilai properti yang diinginkan terbaru dari IoT Platform.
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) {
// Tidak ada nilai yang diinginkan yang ditentukan.
} 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 + "]");
}
});
}
});
}
/**
* Saat perangkat menangani perubahan nilai properti, metode dipanggil dalam skenario berikut:
* Skenario 1: Setelah perangkat tersambung kembali ke IoT Platform, perangkat secara otomatis meminta untuk menarik nilai properti yang diinginkan terbaru dari IoT Platform.
* Skenario 2: Saat perangkat online, perangkat menerima nilai properti yang diinginkan dari topik property.set yang didorong oleh IoT Platform.
* @param identifier: pengenal properti.
* @param value: nilai properti yang diinginkan.
* @param needReport: menentukan apakah akan melaporkan nilai properti ke IoT Platform menggunakan topik property.post.
* Dalam Skenario 2, kemampuan pelaporan properti diintegrasikan ke dalam fungsi pemrosesan dan parameter needReport diatur ke false.
* @return
*/
private boolean handlePropertySet(String identifier, ValueWrapper value, boolean needReport) {
ALog.d(TAG, "Perangkat menangani perubahan properti= [" + identifier + "], value = [" + value + "]");
// Periksa apakah pengaturan properti dikonfigurasi sesuai harapan berdasarkan respons. Dalam contoh ini, pesan sukses dikembalikan.
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, "Laporkan 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) {
// Nilai properti dilaporkan.
ALog.d(TAG, "Laporan sukses onSuccess() dipanggil dengan: s = [" + s + "], o = [" + o + "]");
}
public void onError(String s, AError aError) {
// Nilai properti gagal dilaporkan.
ALog.d(TAG, "Laporan gagal onError() dipanggil dengan: s = [" + s + "], aError = [" + JSON.toJSONString(aError) + "]");
}
});
}
/**
* Daftarkan fungsi untuk merespons panggilan layanan dan pengaturan properti.
* Saat IoT Platform memanggil layanan dari perangkat, perangkat harus merespons panggilan dan mengembalikan respons.
*/
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 IoT Platform " + 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);
// Konfigurasikan properti perangkat dan kemudian laporkan nilai properti ke IoT Platform.
boolean isSetPropertySuccess =
handlePropertySet("LightStatus", data.get("LightStatus"), false);
if (isSetPropertySuccess) {
if (result instanceof InputParams) {
// Kembalikan respons ke IoT Platform.
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 {
// Operasi perangkat bervariasi berdasarkan layanan.
ALog.d(TAG, "Kembalikan nilai yang sesuai dengan layanan.");
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 tidak valid");
}
}
public void onSuccess(Object o, OutputParams outputParams) {
ALog.d(TAG, "onSuccess() dipanggil dengan: o = [" + o + "], outputParams = [" + outputParams + "]");
ALog.d(TAG, "Layanan telah didaftarkan");
}
public void onFail(Object o, ErrorInfo errorInfo) {
ALog.d(TAG, "onFail() dipanggil dengan: o = [" + o + "], errorInfo = [" + errorInfo + "]");
ALog.d(TAG, "Pendaftaran layanan gagal.");
}
};
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);
}
}
}
}