Perangkat sub tidak terhubung langsung ke IoT Platform. Perangkat tersebut terhubung melalui gateway. Setelah terhubung ke gateway, gateway melakukan kueri terhadap hubungan topologis, melaporkan informasi perangkat sub ke IoT Platform, lalu mewakili koneksi perangkat sub tersebut ke IoT Platform.
Prasyarat
Pastikan Anda telah menyelesaikan hal-hal berikut:
Latar Belakang
- Kembangkan perangkat sub
Karena perangkat sub tidak terhubung langsung ke IoT Platform, Anda tidak perlu menginstal device SDK IoT Platform di dalamnya. Perangkat lunak sisi perangkat dikembangkan oleh produsen perangkat sub tersebut.
- Demo ini
File DeviceTopoManager dalam direktori java/src/main/java/com/aliyun/iot/api/common/deviceApi berisi kode untuk mengelola hubungan topologis, mengambil sertifikat perangkat sub, dan melakukan login perangkat sub.
Langkah 1: Kelola hubungan topologis
Setelah gateway terhubung ke IoT Platform, gateway harus menyinkronkan hubungan topologis dengan IoT Platform agar dapat mewakili komunikasi antara perangkat sub dan IoT Platform. Anda dapat melihat serta menambahkan hubungan topologis melalui Konsol atau menggunakan kode contoh.
- Di IoT Platform console, di bawah yang sesuai, lihat dan tambahkan hubungan topologis antara gateway dan perangkat sub.
- Di panel navigasi sebelah kiri, pilih , lalu temukan perangkat gateway dalam daftar.
- Klik Sub-device pada baris gateway untuk membuka halaman pengelolaan perangkat sub. Lihat informasi mengenai perangkat sub yang terhubung ke gateway tersebut.
- Klik Add Sub-device untuk menambahkan perangkat sub yang telah Anda buat pada langkah Buat gateway dan perangkat sub.
- Gunakan kode contoh berikut untuk melakukan kueri dan menambahkan hubungan topologis.
-
Lakukan kueri terhadap hubungan topologis:
/** * Dapatkan hubungan topologis untuk gateway guna memeriksa apakah sudah ada hubungan antara gateway dan perangkat sub. */ private void getGWDeviceTopo() { LinkKit.getInstance().getGateway().gatewayGetSubDevices(new IConnectSendListener() { @Override public void onResponse(ARequest request, AResponse aResponse) { ALog.i(TAG, "Berhasil mengambil hubungan topologis untuk gateway: " + JSONObject.toJSONString(aResponse)); // Dapatkan daftar perangkat sub. try { ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() { }.getType()); // TODO: Proses data berdasarkan skenario bisnis Anda. } catch (Exception e) { e.printStackTrace(); } } @Override public void onFailure(ARequest request, AError error) { ALog.i(TAG, "Gagal mengambil hubungan topologis untuk gateway: " + JSONObject.toJSONString(error)); } }); } -
Tambahkan hubungan topologis:Catatan
- Langkah berikutnya menjelaskan cara mendapatkan sertifikat perangkat untuk perangkat sub.
- Setelah IoT Platform mengonfirmasi hubungan topologis antara perangkat sub dan gateway, perangkat sub dapat online dan menggunakan kembali channel fisik gateway untuk berkomunikasi dengan IoT Platform.
/** * Informasi perangkat sub yang akan ditambahkan hubungan topologisnya. */ private void gatewayAddSubDevice() { BaseInfo baseInfo1 = new BaseInfo(); baseInfo1.productKey = "a1j7SyR****"; baseInfo1.deviceName = "safa***"; String deviceSecret = "7lzCJIWHmGFpZpDKbJdVucDHUz6C****"; LinkKit.getInstance().getGateway().gatewayAddSubDevice(baseInfo1, new ISubDeviceConnectListener() { @Override public String getSignMethod() { // Metode penandatanganan yang digunakan. return "hmacsha1"; } @Override public String getSignValue() { // Dapatkan signature. Pengguna menggunakan deviceSecret untuk menghasilkan signature. Map<String, String> signMap = new HashMap<>(); signMap.put("productKey", baseInfo1.productKey); signMap.put("deviceName", baseInfo1.deviceName); //signMap.put("timestamp", String.valueOf(System.currentTimeMillis())); signMap.put("clientId", getClientId()); return SignUtils.hmacSign(signMap, deviceSecret); } @Override public String getClientId() { // clientId dapat berupa string apa pun. return "id"; } @Override public Map<String, Object> getSignExtraData() { return null; } @Override public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) { // Hasil operasi penambahan. if (isSuccess) { // Perangkat sub berhasil ditambahkan. Anda sekarang dapat melanjutkan untuk login perangkat sub. ALog.i(TAG, "Berhasil menambahkan hubungan topologis: " + JSONObject.toJSONString(iSubDeviceChannel)); //Login perangkat sub. gatewaySubDeviceLogin(); } else { ALog.i(TAG, "Gagal menambahkan hubungan topologis: " + JSONObject.toJSONString(aError)); } } @Override public void onDataPush(String s, AMessage aMessage) { } }); }
-
Langkah 2: Dapatkan sertifikat perangkat sub
- Gunakan autentikasi sertifikat unik per perangkat.
Setelah perangkat sub dibuat, ambil ProductKey, DeviceName, dan DeviceSecret-nya dari halaman detail perangkat di Konsol.
- Tentukan protokol antara gateway dan perangkat sub yang memungkinkan gateway menemukan perangkat sub dan memperoleh sertifikat perangkatnya. Protokol ini ditentukan bersama oleh produsen gateway dan perangkat sub.
- Atau, produsen gateway dapat menyediakan metode untuk mengonfigurasi informasi sertifikat perangkat sub secara prakonfigurasi pada gateway.
- Gunakan registrasi dinamis untuk perangkat sub.
Gateway mendaftarkan perangkat sub dengan melaporkan ProductKey dan DeviceName-nya ke IoT Platform. Setelah IoT Platform memvalidasi ProductKey dan DeviceName tersebut, platform akan menerbitkan DeviceSecret secara dinamis untuk perangkat sub.
- Saat membuat perangkat sub, gunakan nomor seri (SN) atau alamat MAC sebagai DeviceName. Setelah perangkat sub dibuat, aktifkan registrasi dinamis untuk produk tersebut.Di Konsol IoT Platform, buka halaman Detail Produk yang sesuai dan aktifkan Dynamic Registration.
- Saat mengembangkan gateway, implementasikan protokol yang memungkinkan gateway menemukan perangkat sub serta mengambil model dan pengenal uniknya (SN atau alamat MAC). Anda juga harus memetakan model perangkat sub ke ProductKey di Alibaba Cloud IoT Platform.
- Gunakan fitur registrasi dinamis IoT Platform untuk mendapatkan DeviceSecret perangkat sub.
Kode contoh:
/** * Gunakan registrasi dinamis untuk mendapatkan deviceSecret perangkat sub. * Saat Anda membuat perangkat sub di IoT Platform sebelumnya, Anda dapat menggunakan alamat MAC atau nomor seri (SN) sebagai DeviceName. */ private void gatewaySubDevicRegister() { List<BaseInfo> subDevices = new ArrayList<>(); BaseInfo baseInfo1 = new BaseInfo(); baseInfo1.productKey = "a1j7SyR***"; baseInfo1.deviceName = "safasdf"; subDevices.add(baseInfo1); LinkKit.getInstance().getGateway().gatewaySubDevicRegister(subDevices, new IConnectSendListener() { @Override public void onResponse(ARequest request, AResponse response) { ALog.i(TAG, "Perangkat sub berhasil didaftarkan: " + JSONObject.toJSONString(response)); } @Override public void onFailure(ARequest request, AError error) { ALog.i(TAG, "Gagal mendaftarkan perangkat sub: " + JSONObject.toJSONString(error)); } }); }Untuk informasi lebih lanjut tentang registrasi perangkat dinamis, lihat Registrasi dinamis perangkat sub.
- Saat membuat perangkat sub, gunakan nomor seri (SN) atau alamat MAC sebagai DeviceName. Setelah perangkat sub dibuat, aktifkan registrasi dinamis untuk produk tersebut.
Langkah 3: Login perangkat sub
/**
* Sebelum memanggil API untuk login perangkat sub, pastikan hubungan topologis telah dibentuk. Setelah gateway menemukan perangkat sub yang terhubung, gateway harus memberi tahu IoT Platform bahwa perangkat sub tersebut sedang online.
* Setelah perangkat sub online, Anda dapat melakukan operasi seperti berlangganan topik dan menerbitkan pesan.
*/
public void gatewaySubDeviceLogin(){
BaseInfo baseInfo1 = new BaseInfo();
baseInfo1.productKey = "a1j7SyR****";
baseInfo1.deviceName = "safasdf";
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(baseInfo1, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// Perangkat sub berhasil dilogin melalui proxy.
// Setelah perangkat sub online, Anda dapat berlangganan topik, menerbitkan pesan, serta menghapus atau menonaktifkan perangkat sub.
// subDevDisable(null);
// subDevDelete(null);
}
@Override
public void onFailed(AError aError) {
ALog.d(TAG, "onFailed() dipanggil dengan: aError = [" + aError + "]");
}
});
}
}
Lampiran: Demo kode
Kode berikut menunjukkan bagaimana gateway menemukan dan melaporkan informasi perangkat sub, membangun channel logis antara perangkat sub dan IoT Platform, serta memungkinkan perangkat sub menggunakan kembali channel fisik gateway untuk terhubung ke IoT Platform:
package com.aliyun.iot.api.common.deviceApi;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
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.api.SignUtils;
import com.aliyun.alink.dm.model.ResponseModel;
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.channel.gateway.api.subdevice.ISubDeviceActionListener;
import com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceChannel;
import com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceConnectListener;
import com.aliyun.alink.linksdk.channel.gateway.api.subdevice.ISubDeviceRemoveListener;
import com.aliyun.alink.linksdk.cmp.core.base.AMessage;
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.tools.AError;
import com.aliyun.alink.linksdk.tools.ALog;
import java.util.*;
import static com.aliyun.alink.linksdk.tools.ALog.LEVEL_DEBUG;
public class DeviceTopoManager {
private static String regionId = "cn-shanghai";
private static final String TAG = "TOPO";
// Perangkat gateway
private static String GWproductKey = "a1Bxp*********";
private static String GWdeviceName = "XMtrv3y*************";
private static String GWdeviceSecret = "19xJNybifnmgc*************";
public static void main(String[] args) {
/**
* Informasi koneksi MQTT.
*/
DeviceTopoManager manager = new DeviceTopoManager();
/**
* Klien HTTP Java sisi server menggunakan TLSv1.2.
*/
System.setProperty("https.protocols", "TLSv1.2");
manager.init();
}
public void init() {
LinkKitInitParams params = new LinkKitInitParams();
/**
* Atur parameter inisialisasi MQTT.
*/
IoTMqttClientConfig config = new IoTMqttClientConfig();
config.productKey = GWproductKey;
config.deviceName = GWdeviceName;
config.deviceSecret = GWdeviceSecret;
config.channelHost = GWproductKey + ".iot-as-mqtt." + regionId + ".aliyuncs.com:1883";
/**
* Menentukan apakah akan menerima pesan offline.
* Ini sesuai dengan field cleanSession dalam MQTT.
*/
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;
ALog.setLevel(LEVEL_DEBUG);
ALog.i(TAG, "mqtt connection info=" + params);
/**
* Atur parameter inisialisasi dan masukkan sertifikat perangkat gateway.
*/
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = GWproductKey;
deviceInfo.deviceName = GWdeviceName;
deviceInfo.deviceSecret = GWdeviceSecret;
params.deviceInfo = deviceInfo;
/**Inisialisasi instans LinkKit dan bangun koneksi.**/
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);
// Dapatkan hubungan topologis untuk gateway guna memeriksa apakah sudah ada hubungan antara gateway dan perangkat sub.
// Jika hubungan sudah ada, login perangkat sub secara langsung.
getGWDeviceTopo();
// Gunakan registrasi dinamis untuk mendapatkan DeviceSecret perangkat sub. Jika sertifikat perangkat sudah diketahui, lewati langkah ini dan tambahkan hubungan topologis secara langsung.
// Saat Anda membuat perangkat di IoT Platform sebelumnya, Anda dapat menggunakan alamat MAC atau nomor seri (SN) sebagai DeviceName.
gatewaySubDevicRegister();
// Informasi perangkat sub yang akan ditambahkan hubungan topologisnya.
gatewayAddSubDevice();
}
});
}
/**
* Dapatkan hubungan topologis untuk gateway guna memeriksa apakah sudah ada hubungan antara gateway dan perangkat sub.
*/
private void getGWDeviceTopo() {
LinkKit.getInstance().getGateway().gatewayGetSubDevices(new IConnectSendListener() {
@Override
public void onResponse(ARequest request, AResponse aResponse) {
ALog.i(TAG, "Berhasil mengambil hubungan topologis untuk gateway: " + JSONObject.toJSONString(aResponse));
// Dapatkan daftar perangkat sub.
try {
ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
}.getType());
// TODO: Proses data berdasarkan skenario bisnis Anda.
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(ARequest request, AError error) {
ALog.i(TAG, "Gagal mengambil hubungan topologis untuk gateway: " + JSONObject.toJSONString(error));
}
});
}
/**
* Gunakan registrasi dinamis untuk mendapatkan deviceSecret perangkat sub. Jika gateway telah memperoleh sertifikat perangkat sub, lewati langkah ini.
* Saat Anda membuat perangkat di IoT Platform sebelumnya, Anda dapat menggunakan alamat MAC atau nomor seri (SN) sebagai DeviceName.
*/
private void gatewaySubDevicRegister() {
List<BaseInfo> subDevices = new ArrayList<>();
BaseInfo baseInfo1 = new BaseInfo();
baseInfo1.productKey = "a1j7SyR**********";
baseInfo1.deviceName = "test123*********";
subDevices.add(baseInfo1);
LinkKit.getInstance().getGateway().gatewaySubDevicRegister(subDevices, new IConnectSendListener() {
@Override
public void onResponse(ARequest request, AResponse response) {
ALog.i(TAG, "Perangkat sub berhasil didaftarkan: " + JSONObject.toJSONString(response));
}
@Override
public void onFailure(ARequest request, AError error) {
ALog.i(TAG, "Gagal mendaftarkan perangkat sub: " + JSONObject.toJSONString(error));
}
});
}
/**
* Tambahkan hubungan topologis untuk perangkat sub.
*/
private void gatewayAddSubDevice() {
BaseInfo baseInfo1 = new BaseInfo();
baseInfo1.productKey = "a1j7Sy*************";
baseInfo1.deviceName = "safasd********";
String deviceSecret = "7lzCJIWHmGF**************";
LinkKit.getInstance().getGateway().gatewayAddSubDevice(baseInfo1, new ISubDeviceConnectListener() {
@Override
public String getSignMethod() {
// Metode penandatanganan yang digunakan.
return "hmacsha1";
}
@Override
public String getSignValue() {
// Dapatkan signature. Pengguna menggunakan DeviceSecret untuk menghasilkan signature.
Map<String, String> signMap = new HashMap<>();
signMap.put("productKey", baseInfo1.productKey);
signMap.put("deviceName", baseInfo1.deviceName);
// signMap.put("timestamp", String.valueOf(System.currentTimeMillis()));
signMap.put("clientId", getClientId());
return SignUtils.hmacSign(signMap, deviceSecret);
}
@Override
public String getClientId() {
// clientId dapat berupa string apa pun.
return "id";
}
@Override
public Map<String, Object> getSignExtraData() {
return null;
}
@Override
public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) {
// Hasil operasi penambahan.
if (isSuccess) {
// Perangkat sub berhasil ditambahkan. Anda sekarang dapat melanjutkan untuk login perangkat sub.
ALog.i(TAG, "Berhasil menambahkan hubungan topologis: " + JSONObject.toJSONString(iSubDeviceChannel));
//Login perangkat sub.
gatewaySubDeviceLogin();
} else {
ALog.i(TAG, "Gagal menambahkan hubungan topologis: " + JSONObject.toJSONString(aError));
}
}
@Override
public void onDataPush(String s, AMessage aMessage) {
}
});
}
public void gatewayDeleteSubDevice(){
BaseInfo baseInfo1 = new BaseInfo();
baseInfo1.productKey = "a1j7S**************";
baseInfo1.deviceName = "saf*********";
LinkKit.getInstance().getGateway().gatewayDeleteSubDevice(baseInfo1, new ISubDeviceRemoveListener() {
@Override
public void onSuccess() {
// Pendengar dipanggil saat perangkat sub berhasil dihapus. Anda dapat mengambil perangkat sub offline sebelum menghapusnya.
}
@Override
public void onFailed(AError aError) {
// Gagal menghapus perangkat sub.
}
});
}
/**
* Sebelum memanggil API untuk login perangkat sub, pastikan hubungan topologis telah dibentuk. Setelah gateway menemukan perangkat sub yang terhubung, gateway harus memberi tahu IoT Platform bahwa perangkat sub tersebut sedang online.
* Setelah perangkat sub online, Anda dapat melakukan operasi seperti berlangganan topik dan menerbitkan pesan.
*/
public void gatewaySubDeviceLogin(){
BaseInfo baseInfo1 = new BaseInfo();
baseInfo1.productKey = "a1j7SyR***********";
baseInfo1.deviceName = "safa*********";
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(baseInfo1, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// Perangkat sub berhasil dilogin melalui proxy.
// Setelah perangkat sub online, Anda dapat berlangganan topik, menerbitkan pesan, serta menghapus atau menonaktifkan perangkat sub.
// subDevDisable(null);
// subDevDelete(null);
}
@Override
public void onFailed(AError aError) {
ALog.d(TAG, "onFailed() dipanggil dengan: aError = [" + aError + "]");
}
});
}
}