Perangkat sub hanya dapat dihubungkan ke IoT Platform melalui gateway. Setelah terhubung ke gateway, gateway akan memeriksa hubungan topologi antara gateway dan perangkat sub. Jika hubungan tersebut ada, gateway akan melaporkan informasi perangkat sub ke IoT Platform dan menghubungkannya.
Prasyarat
Sebelum memulai, pastikan langkah-langkah berikut telah dilakukan:
Informasi latar belakang
Konfigurasi Perangkat Sub
Perangkat sub tidak dapat langsung terhubung ke IoT Platform. Oleh karena itu, Anda tidak perlu menginstal SDK perangkat yang disediakan oleh IoT Platform pada perangkat sub. SDK perangkat untuk perangkat sub harus dikembangkan oleh penyedia perangkat tersebut.
Paket SDK yang Disediakan oleh IoT Platform
File DeviceTopoManager dalam direktori java/src/main/java/com/aliyun/iot/api/common/deviceApi berisi kode yang digunakan oleh gateway untuk mengelola hubungan topologi, mendapatkan sertifikat perangkat sub, dan menghubungkan perangkat sub ke IoT Platform melalui gateway.
Langkah 1: Kelola hubungan topologi menggunakan gateway
Setelah gateway terhubung ke IoT Platform, gateway harus menyinkronkan hubungan topologinya dengan IoT Platform. Ini memungkinkan komunikasi antara perangkat sub dan IoT Platform. Anda dapat melihat dan menambahkan hubungan topologi di konsol IoT Platform atau menggunakan kode contoh.
Lihat dan tambahkan hubungan topologi antara gateway dan perangkat sub di konsol IoT Platform.
Di panel navigasi sebelah kiri, pilih . Di halaman Perangkat, temukan perangkat gateway.
Klik Sub-device di kolom Aksi. Di halaman yang muncul, lihat perangkat sub dari gateway.
Klik Add Sub-device. Tambahkan perangkat sub yang Anda buat di langkah Buat gateway dan perangkat sub.
Kueri dan tambahkan hubungan topologi menggunakan kode contoh berikut.
Kueri hubungan topologi menggunakan kode contoh berikut:
/** * Dapatkan hubungan topologi gateway dan periksa apakah ada hubungan topologi 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, "Hubungan topologi gateway diperoleh: " + JSONObject.toJSONString(aResponse)); // Dapatkan daftar perangkat sub. try { ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() { }.getType()); // Proses permintaan berdasarkan skenario aktual. } catch (Exception e) { e.printStackTrace(); } } @Override public void onFailure(ARequest request, AError error) { ALog.i(TAG, "Gagal mendapatkan hubungan topologi gateway: " + JSONObject.toJSONString(error)); } }); }Tambahkan hubungan topologi menggunakan kode contoh berikut:
nullUntuk informasi tentang cara mendapatkan informasi sertifikasi perangkat sub, lihat Langkah 2.
Setelah IoT Platform memvalidasi hubungan topologi antara gateway dan perangkat sub, perangkat sub dapat menggunakan saluran fisik gateway untuk berkomunikasi dengan IoT Platform.
/** * Tentukan informasi tentang perangkat sub yang ingin Anda tambahkan hubungan topologi. */ 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 tanda tangan yang Anda gunakan untuk menandatangani permintaan. return "hmacsha1"; } @Override public String getSignValue() { // Hasilkan tanda tangan berdasarkan DeviceSecret. 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() { // Atur parameter clientId sesuai kebutuhan. return "id"; } @Override public Map<String, Object> getSignExtraData() { return null; } @Override public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) { // Tangani hasil operasi untuk menambahkan hubungan topologi antara perangkat sub dan gateway. if (isSuccess) { // Setelah hubungan topologi ditambahkan, Anda dapat menggunakan gateway untuk menghubungkan perangkat sub ke IoT Platform. ALog.i(TAG, "Hubungan topologi ditambahkan: " + JSONObject.toJSONString(iSubDeviceChannel)); // Hubungkan perangkat sub ke IoT Platform menggunakan gateway. gatewaySubDeviceLogin(); } else { ALog.i(TAG, "Gagal menambahkan hubungan topologi: " + JSONObject.toJSONString(aError)); } } @Override public void onDataPush(String s, AMessage aMessage) { } }); }
Langkah 2: Dapatkan informasi sertifikat perangkat sub
Setelah perangkat sub dibuat, IoT Platform menerbitkan sertifikat ke perangkat sub. Gateway dapat memperoleh informasi sertifikat menggunakan salah satu metode berikut:
Satu-Sertifikat-per-Perangkat
Anda dapat memperoleh ProductKey, DeviceName, dan DeviceSecret perangkat sub di halaman detail perangkat sub di konsol IoT Platform.
Setelah gateway menemukan perangkat sub yang terhubung, gateway dapat memperoleh sertifikat perangkat sub berdasarkan protokol yang ditentukan antara gateway dan perangkat sub. Protokol ini ditentukan oleh penyedia gateway dan penyedia perangkat sub.
Penyedia gateway menyediakan metode konfigurasi yang memungkinkan gateway mengatur informasi sertifikat perangkat sub sebelumnya. Fitur ini diimplementasikan oleh penyedia gateway.
Pendaftaran Dinamis Perangkat Sub
Gateway melaporkan ProductKey dan DeviceName perangkat sub ke IoT Platform untuk mendaftarkan perangkat sub. Setelah IoT Platform memvalidasi ProductKey dan DeviceName perangkat sub, IoT Platform secara dinamis menetapkan DeviceSecret ke perangkat sub.
Saat membuat perangkat sub di IoT Platform, atur parameter deviceName ke nomor seri atau alamat MAC perangkat sub. Setelah perangkat sub dibuat, aktifkan pendaftaran dinamis untuk perangkat sub.

Saat mengonfigurasi gateway, pastikan bahwa gateway dapat memperoleh model dan pengenal unik, yaitu nomor seri atau alamat MAC, perangkat sub. Ini dimungkinkan oleh protokol yang ditentukan antara gateway dan perangkat sub. Selain itu, petakan model perangkat sub ke ProductKey di IoT Platform.
Dapatkan DeviceSecret untuk perangkat sub dari IoT Platform selama pendaftaran dinamis.
Kode contoh:
/** * Dapatkan DeviceSecret untuk perangkat sub selama pendaftaran dinamis. * Saat Anda membuat perangkat sub di IoT Platform, atur parameter deviceName ke nomor seri atau alamat MAC perangkat sub. */ 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 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 pendaftaran dinamis perangkat, lihat Ikhtisar.
Langkah 3: Hubungkan perangkat sub ke IoT Platform menggunakan gateway.
/**
* Sebelum Anda memanggil operasi API untuk menghubungkan perangkat sub ke IoT Platform, pastikan hubungan topologi telah ditambahkan antara perangkat sub dan gateway. Setelah gateway menemukan perangkat sub yang terhubung, gateway melaporkan informasi tentang perangkat sub ke IoT Platform.
* Setelah perangkat sub terhubung ke IoT Platform menggunakan gateway, gateway dapat berlangganan topik dan mempublikasikan pesan untuk perangkat sub.
*/
public void gatewaySubDeviceLogin(){
BaseInfo baseInfo1 = new BaseInfo();
baseInfo1.productKey = "a1j7SyR****";
baseInfo1.deviceName = "safasdf";
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(baseInfo1, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// Gateway menghubungkan perangkat sub ke IoT Platform.
// Gateway dapat berlangganan topik atau mempublikasikan pesan untuk perangkat sub. Gateway juga dapat menghapus atau menonaktifkan perangkat sub.
// subDevDisable(null);
// subDevDelete(null);
}
@Override
public void onFailed(AError aError) {
ALog.d(TAG, "onFailed() called with: aError = [" + aError + "]");
}
});
}
}Lampiran: Kode contoh
Gateway menemukan perangkat sub yang terhubung dan melaporkan informasi tentang perangkat sub ke IoT Platform. IoT Platform membentuk saluran logis antara perangkat sub dan IoT Platform. Perangkat sub menggunakan saluran fisik gateway untuk berkomunikasi dengan IoT Platform. Proses ini dapat diimplementasikan dalam kode contoh berikut:
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";
// Informasi tentang perangkat gateway.
private static String GWproductKey = "a1Bxp*********";
private static String GWdeviceName = "XMtrv3y*************";
private static String GWdeviceSecret = "19xJNybifnmgc*************";
public static void main(String[] args) {
/**
* Informasi tentang koneksi MQTT.
*/
DeviceTopoManager manager = new DeviceTopoManager();
/**
* Java HTTP client perangkat ini mendukung TSLv1.2.
*/
System.setProperty("https.protocols", "TLSv2");
manager.init();
}
public void init() {
LinkKitInitParams params = new LinkKitInitParams();
/**
* Tentukan parameter untuk 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";
/**
* Tentukan apakah akan menerima pesan offline.
* Bidang cleanSession yang sesuai dengan koneksi MQTT.
*/
config.receiveOfflineMsg = false;
params.mqttClientConfig = config;
ALog.setLevel(LEVEL_DEBUG);
ALog.i(TAG, "mqtt connetcion info=" + params);
/**
* Konfigurasikan inisialisasi dan masukkan informasi sertifikat tentang perangkat gateway.
*/
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = GWproductKey;
deviceInfo.deviceName = GWdeviceName;
deviceInfo.deviceSecret = GWdeviceSecret;
params.deviceInfo = deviceInfo;
/**Bentuk 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 topologi gateway dan periksa apakah ada hubungan topologi antara gateway dan perangkat sub.
// Jika ada hubungan topologi antara gateway dan perangkat sub, gateway menghubungkan perangkat sub ke IoT Platform.
getGWDeviceTopo();
// Daftarkan perangkat sub secara dinamis untuk mendapatkan DeviceSecret untuk perangkat sub. Jika gateway telah memperoleh sertifikat perangkat sub, lewati langkah ini.
// Saat Anda membuat perangkat sub di IoT Platform, atur parameter deviceName ke nomor seri atau alamat MAC perangkat sub.
gatewaySubDevicRegister();
//Tentukan informasi tentang perangkat sub yang ingin Anda tambahkan hubungan topologi.
gatewayAddSubDevice();
}
});
}
/**
* Dapatkan hubungan topologi gateway dan periksa apakah ada hubungan topologi 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, "Hubungan topologi gateway diperoleh: " + JSONObject.toJSONString(aResponse));
// Dapatkan daftar perangkat sub.
try {
ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
}.getType());
// TODO. Tulis kode berdasarkan skenario aplikasi aktual Anda.
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(ARequest request, AError error) {
ALog.i(TAG, "Gagal mendapatkan hubungan topologi gateway: " + JSONObject.toJSONString(error));
}
});
}
/**
* Daftarkan perangkat sub secara dinamis untuk mendapatkan DeviceSecret untuk perangkat sub. Jika gateway telah memperoleh sertifikat perangkat sub, lewati langkah ini.
* Saat Anda membuat perangkat sub di IoT Platform, atur parameter deviceName ke nomor seri atau alamat MAC perangkat sub.
*/
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 didaftarkan: " + JSONObject.toJSONString(response));
}
@Override
public void onFailure(ARequest request, AError error) {
ALog.i(TAG, "Gagal mendaftarkan perangkat sub: " + JSONObject.toJSONString(error));
}
});
}
/**
* Tentukan informasi tentang perangkat sub yang ingin Anda tambahkan hubungan topologi.
*/
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 tanda tangan yang Anda gunakan untuk menandatangani permintaan.
return "hmacsha1";
}
@Override
public String getSignValue() {
// Hasilkan tanda tangan berdasarkan DeviceSecret.
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() {
// Atur parameter clientId sesuai kebutuhan.
return "id";
}
@Override
public Map<String, Object> getSignExtraData() {
return null;
}
@Override
public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) {
// Tangani hasil operasi untuk menambahkan hubungan topologi antara perangkat sub dan gateway.
if (isSuccess) {
// Setelah hubungan topologi ditambahkan, Anda dapat menggunakan gateway untuk menghubungkan perangkat sub ke IoT Platform.
ALog.i(TAG, "Hubungan topologi ditambahkan: " + JSONObject.toJSONString(iSubDeviceChannel));
// Hubungkan perangkat sub ke IoT Platform menggunakan gateway.
gatewaySubDeviceLogin();
} else {
ALog.i(TAG, "Gagal menambahkan hubungan topologi: " + 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 onSuceess() {
// Perangkat sub dihapus. Anda dapat memutuskan perangkat sub sebelum menghapusnya.
}
@Override
public void onFailed(AError aError) {
// Perangkat sub gagal dihapus.
}
});
}
/**
* Sebelum Anda memanggil operasi API untuk menghubungkan perangkat sub ke IoT Platform, pastikan hubungan topologi telah ditambahkan antara perangkat sub dan gateway. Setelah gateway menemukan perangkat sub yang terhubung, gateway melaporkan informasi tentang perangkat sub ke IoT Platform.
* Setelah perangkat sub terhubung ke IoT Platform, gateway dapat berlangganan topik dan mempublikasikan pesan untuk perangkat sub.
*/
public void gatewaySubDeviceLogin(){
BaseInfo baseInfo1 = new BaseInfo();
baseInfo1.productKey = "a1j7SyR***********";
baseInfo1.deviceName = "safa*********";
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(baseInfo1, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// Gateway menghubungkan perangkat sub ke IoT Platform.
// Gateway dapat berlangganan topik atau mempublikasikan pesan untuk perangkat sub. Gateway juga dapat menghapus atau menonaktifkan perangkat sub.
// subDevDisable(null);
// subDevDelete(null);
}
@Override
public void onFailed(AError aError) {
ALog.d(TAG, "onFailed() called with: aError = [" + aError + "]");
}
});
}
}