Topik ini menjelaskan cara mengintegrasikan Link SDK ke dalam jaringan area luas (WAN) berbasis TCP.
Link SDK dari IoT Platform digunakan untuk menghubungkan perangkat ke IoT Platform, memverifikasi perangkat, dan mengaktifkan komunikasi data. Saat Anda mengintegrasikan Link SDK ke dalam modul komunikasi, Anda dapat memperoleh manfaat berikut:
- Produsen perangkat hanya perlu menjalankan perintah AT dari modul pada perangkat untuk menghubungkan perangkat ke IoT Platform tanpa perlu fokus pada bagaimana unit mikrokontroler (MCU) membentuk koneksi ke IoT Platform. Beban kerja MCU tetap tidak berubah.
- Halaman Alibaba Cloud Partner Network menampilkan model modul bersertifikat, tautan pembelian, dan panduan pengembangan. Jika Anda adalah produsen perangkat atau penyedia layanan, Anda dapat menggunakan modul komunikasi bersertifikat untuk menghubungkan perangkat Anda ke IoT Platform.

Berikut ini menjelaskan proses konfigurasi perangkat sebagai produsen perangkat.
- Beli modul dengan Link SDK terintegrasi.
- Jalankan perintah AT pada MCU untuk menghubungkan perangkat ke IoT Platform, serta kirim dan terima data dari IoT Platform.
- Terapkan layanan cloud di IoT Platform untuk mengelola perangkat.
Penyedia modul harus melakukan langkah-langkah berikut pada modul:
- Integrasikan Link SDK ke dalam modul sesuai harapan.
- Sediakan perintah AT yang dapat dijalankan oleh MCU untuk menghubungkan perangkat ke IoT Platform.
Berikut ini menjelaskan cara mengintegrasikan fitur MQTT dari Link SDK ke dalam modul. Jika penyedia modul mengintegrasikan lebih banyak fitur dari Link SDK, maka pabrikan perangkat mengembangkan lebih sedikit fitur. Kami merekomendasikan agar penyedia modul mengintegrasikan sebanyak mungkin fitur dari Link SDK, seperti fitur terkait over-the-air (OTA) dan fitur terkait model Thing Specification Language (TSL).
Operasi di konsol IoT Platform
Untuk memeriksa apakah Link SDK yang diintegrasikan ke dalam modul bekerja sesuai harapan, Anda harus menghubungkan perangkat uji ke IoT Platform. Anda harus membuat produk di konsol IoT Platform dan kemudian membuat perangkat dalam produk untuk mendapatkan informasi identitas tentang perangkat.
- Masuk ke konsol IoT Platform. Jika Anda masuk ke konsol sebagai penyedia modul, Anda harus membuat akun Alibaba Cloud. Anda dapat membuat akun Alibaba Cloud secara gratis.
- Setelah Anda masuk ke IoT Platform, ikuti langkah-langkah yang dijelaskan dalam topik Buat Produk untuk membuat produk. Di halaman detail produk, Anda bisa mendapatkan ProductKey dan ProductSecret dari produk.
- Buat perangkat uji. Di halaman detail perangkat, Anda bisa mendapatkan DeviceName dan DeviceSecret dari perangkat.
Proses integrasi Link SDK
Saat penyedia modul mengintegrasikan Link SDK ke dalam modul, proses tersebut mencakup beberapa tahap, seperti yang ditunjukkan pada gambar berikut.

Konfigurasikan Link SDK dan ekstrak kode
Konfigurasikan Link SDK
Link SDK menyediakan sejumlah besar fitur. Bagian berikut menjelaskan cara mengonfigurasi fitur yang diperlukan dalam contoh ini.
Jalankan perintah konfigurasi
- Linux
Pergi ke direktori root Link SDK dan jalankan perintah berikut:
make menuconfig - Windows
Pergi ke direktori root Link SDK dan jalankan perintah berikut:
config.bat
Gunakan salah satu metode di atas untuk memulai alat konfigurasi Link SDK. Gambar berikut menunjukkan GUI dari alat tersebut.

Aktifkan fitur yang diperlukan
Di GUI, tekan tombol Spasi untuk memilih atau menghapus fitur dan tekan tombol Panah Atas atau Panah Bawah pada keypad untuk beralih antar opsi yang berbeda. Jika Anda ingin mendapatkan informasi tentang suatu opsi, tekan tombol panah untuk memindahkan kursor ke opsi tersebut dan tekan tombol H. Dalam hal ini, informasi yang menunjukkan tujuan opsi dan tindakan sistem yang dilakukan setelah Anda memilih atau menghapus opsi akan ditampilkan.
- Jika lingkungan kompilasi mencakup file header stdint.h, pilih opsi berikut.
PLATFORM_HAS_STDINT
- Jika sistem operasi tertanam berjalan di lingkungan Anda, pilih opsi berikut.
PLATFORM_HAS_OS
- Jika modul mendukung TCP bukan Message Queuing Telemetry Transport (MQTT), Anda harus mengaktifkan opsi berikut:
- FEATURE_MQTT_COMM_ENABLED: menyediakan API MQTT dari Alibaba SDK untuk mengaktifkan komunikasi antara perangkat dan IoT Platform.
- FEATURE_MQTT_DEFAULT_IMPL: menyediakan implementasi MQTT Client yang telah ditentukan sebelumnya di Alibaba SDK. Anda harus menulis kode untuk membuat dan membangun koneksi TCP, dan mengirimkan data melalui koneksi TCP berdasarkan implementasi MQTT Client.
- FEATURE_MQTT_DIRECT: menyediakan titik akhir IoT Platform tempat perangkat dapat terhubung.
Kami merekomendasikan agar Anda memilih opsi FEATURE_SUPPORT_TLS. Anda dapat memilih opsi tersebut untuk mengenkripsi data yang dikirimkan antara perangkat dan IoT Platform. Dalam contoh ini, opsi ini tidak dipilih untuk mengurangi beban konfigurasi.
Anda tidak perlu mengaktifkan fitur lainnya.
Ekstrak kode sumber fitur yang dipilih

Integrasikan file kode Link SDK ke dalam lingkungan kompilasi
Salin file kode yang Anda peroleh pada langkah sebelumnya dari direktori output ke direktori proyek Anda. Kemudian, ubah lingkungan kompilasi atau alat pengembangan Anda untuk mengintegrasikan file kode ke dalam lingkungan kompilasi.

Implementasikan fungsi lapisan abstraksi perangkat keras (HAL)
Link SDK dirancang untuk berjalan di berbagai sistem operasi atau pada MCU yang tidak mendukung sistem operasi. Operasi yang terkait dengan sistem operasi didefinisikan sebagai fungsi HAL yang harus diimplementasikan. Sistem operasi bervariasi berdasarkan modul komunikasi. Operasi terkait TCP yang ingin Anda lakukan pada modul komunikasi juga didefinisikan sebagai fungsi HAL yang harus Anda implementasikan.
Semua fungsi HAL disimpan dalam file wrapper.c di direktori output/eng/wrappers/.
Fungsi HAL terkait OS
Tabel berikut menjelaskan fungsi HAL yang harus Anda implementasikan.
| ** ** | Fungsi | Deskripsi |
| 1 | HAL_Malloc | Mengalokasikan blok memori yang tersedia dan mengembalikan alamat awal blok berdasarkan panjang memori yang ditentukan. Fungsi ini sesuai dengan fungsi malloc() di pustaka standar C. |
| 2 | HAL_Free | Melepaskan blok ruang memori yang ditunjukkan oleh pointer tertentu. Fungsi ini sesuai dengan fungsi free() di pustaka standar C. |
| 3 | HAL_Printf | Mencetak teks ke terminal berdasarkan format string yang ditentukan. Fungsi ini sesuai dengan fungsi printf() di pustaka standar C. Jika metode debugging yang lebih baik tersedia di lingkungan debugging Anda, Anda tidak perlu mengimplementasikan fungsi ini. |
| 4 | HAL_Snprintf | Mencetak teks ke blok memori yang ditentukan di cache alih-alih ke terminal. Fungsi ini mirip dengan fungsi printf(). |
| 5 | HAL_UptimeMs | Mengembalikan nilai uint64_t. Nilai tersebut menunjukkan jumlah milidetik yang telah berlalu antara waktu saat ini dan waktu ketika perangkat dimulai. |
| 6 | HAL_SleepMs | Hibernasi selama periode waktu tertentu berdasarkan jumlah milidetik yang ditentukan. Misalnya, jika Anda menentukan 10, program terkait hibernasi selama 10 milidetik. |
Direktori wrappers/os dari paket SDK terkompresi mencakup contoh tentang cara mengimplementasikan fungsi HAL. Jika contoh tertentu memenuhi persyaratan sistem operasi Anda, Anda dapat menggunakan contoh tersebut. Jika tidak ada contoh yang memenuhi syarat, Anda harus mengimplementasikan fungsi HAL berdasarkan skenario bisnis Anda.
Fungsi HAL yang dapat Anda implementasikan
Jika tidak ada sistem operasi yang berjalan di modul atau API MQTT dari Link SDK tidak dipanggil oleh beberapa thread, Anda tidak perlu mengubah definisi fungsi berikut di file wrapper.c. Jika sistem operasi berjalan di modul dan API MQTT dari Link SDK dipanggil oleh beberapa thread, Anda harus mengimplementasikan fungsi berikut.
| ** ** | Fungsi | Deskripsi |
| 1 | HAL_MutexCreate | Membuat mutex. Nilai yang dikembalikan dapat dikirim ke HAL_MutexLock/Unlock. |
| 2 | HAL_MutexDestroy | Menghapus mutex. Mutex ditentukan oleh parameter permintaan. |
| 3 | HAL_MutexLock | Meminta mutex. Jika mutex sedang digunakan oleh sebuah thread, fungsi thread tetap dalam hibernasi. Jika tidak, proses aplikasi berlanjut. |
| 4 | HAL_MutexUnlock | Melepaskan mutex. Thread yang hibernasi untuk menunggu mutex mendapatkan mutex dan melanjutkan operasi berikutnya. |
| 5 | HAL_SemaphoreCreate | Membuat semaphore. Nilai yang dikembalikan dapat dikirim ke HAL_SemaphorePost/Wait. |
| 6 | HAL_SemaphoreDestroy | Menghapus semaphore. Semaphore ditentukan oleh parameter permintaan. |
| 7 | HAL_SemaphorePost | Menambahkan nilai semaphore yang ditentukan dan membatalkan operasi tunggu dari thread lain. |
| 8 | HAL_SemaphoreWait | Menambahkan nilai semaphore yang ditentukan dan melakukan operasi tunggu. |
| 9 | HAL_ThreadCreate | Membuat thread berdasarkan nilai yang Anda tentukan untuk parameter permintaan. |
Fungsi HAL terkait TCP
Koneksi MQTT dibentuk melalui TCP. Penyedia modul harus mengimplementasikan fungsi HAL terkait TCP berikut.
| Nomor urut | Fungsi | Deskripsi |
| 1 | HAL_TCP_Establish | Membentuk koneksi TCP. Parameter permintaan host menentukan nama domain. Anda harus mengonversi nama domain menjadi alamat IP. Nilai yang dikembalikan adalah nomor soket koneksi TCP. |
| 2 | HAL_TCP_Destroy | Menutup koneksi TCP. Anda harus menentukan nilai yang dikembalikan oleh fungsi HAL_TCP_Establish sebagai nilai parameter permintaan fungsi HAL_TCP_Destroy. Jika fungsi HAL_TCP_Destroy mengembalikan 0, panggilan berhasil. |
| 3 | HAL_TCP_Write | Mengirimkan data melalui koneksi TCP. Periode timeout ditentukan untuk fungsi ini. Fungsi mengembalikan nilai terlepas dari apakah data yang ditentukan sepenuhnya dikirimkan dalam periode timeout. Jika koneksi TCP ditutup saat data dikirimkan, fungsi mengembalikan angka negatif. |
| 4 | HAL_TCP_Read | Membaca data dalam periode waktu tertentu dan mengembalikan data. Anda dapat menentukan panjang maksimum data yang dapat dibaca fungsi dalam parameter permintaan. Jika panjang data yang dibaca fungsi melalui koneksi TCP mencapai panjang maksimum, fungsi mengembalikan data. |
Fungsi HAL terkait produk
Fungsi HAL berikut dipanggil untuk mendapatkan informasi verifikasi identitas tentang produk. Produsen perangkat harus memberikan instruksi tentang cara membakar informasi identitas perangkat ke perangkat, mendapatkan informasi tersebut dengan menggunakan fungsi HAL berikut, dan kemudian menentukannya di Link SDK.
| Nomor urut | Fungsi | Deskripsi |
| 1 | HAL_GetProductKey | Mendapatkan ProductKey perangkat. ProductKey digunakan untuk mengidentifikasi model produk perangkat. |
| 2 | HAL_GetDeviceName | Mendapatkan DeviceName perangkat. DeviceName digunakan untuk mengidentifikasi perangkat secara unik. |
| 3 | HAL_GetDeviceSecret | Mendapatkan DeviceSecret perangkat. DeviceSecret digunakan untuk mengidentifikasi kunci perangkat. |
Saat Anda mengonfigurasi produk dalam skenario bisnis aktual, item data di atas harus dikirimkan oleh perintah AT dari produsen perangkat ke modul. Saat penyedia modul men-debug perangkat uji, penyedia dapat memperoleh ProductKey, DeviceName, dan DeviceSecret perangkat uji dengan memanggil fungsi di atas.
Implementasikan fitur produk berdasarkan kode contoh
Penyedia modul dapat men-debug fitur berdasarkan file mqtt_example.c di direktori output. Produsen perangkat dapat menyalin file tersebut ke proyeknya sendiri dan memodifikasi file untuk menggunakan fitur tersebut.
Kode contoh dalam file digunakan untuk menghubungkan perangkat ke IoT Platform, berlangganan topik, dan kemudian mengirimkan data ke topik. Dalam hal ini, IoT Platform mengirimkan data yang dikirimkan oleh perangkat ke perangkat yang berlangganan topik. Gambar berikut menjelaskan cara kerja kode contoh.

Anda harus mengubah izin default pada topik dari Berlangganan menjadi Publikasi dan Berlangganan di konsol IoT Platform.

Kode contoh dimulai dari fungsi main(). Dalam definisi fungsi main(), fungsi HAL terkait produk dipanggil untuk mendapatkan informasi identitas tentang produk, seperti yang ditunjukkan dalam kode berikut.
int main(int argc, char *argv[])
{
void *pclient = NULL;
int res = 0;
int loop_cnt = 0;
iotx_mqtt_param_t mqtt_params;
HAL_GetProductKey(DEMO_PRODUCT_KEY);
HAL_GetDeviceName(DEMO_DEVICE_NAME);
HAL_GetDeviceSecret(DEMO_DEVICE_SECRET);
EXAMPLE_TRACE("mqtt example");
- Fungsi HAL di atas yang dimulai dengan HAL_Get dipanggil untuk mendapatkan informasi sertifikat tentang perangkat. Penyedia modul dapat menentukan informasi sertifikat tentang perangkat uji.
Kode berikut menunjukkan cara mengonfigurasi parameter koneksi MQTT berdasarkan kebutuhan bisnis Anda.
/* Inisialisasi parameter MQTT */
memset(&mqtt_params, 0x0, sizeof(mqtt_params));
mqtt_params.port = sign_mqtt.port;
mqtt_params.host = sign_mqtt.hostname;
mqtt_params.client_id = sign_mqtt.clientid;
mqtt_params.username = sign_mqtt.username;
mqtt_params.password = sign_mqtt.password;
mqtt_params.request_timeout_ms = 2000;
mqtt_params.clean_session = 0;
mqtt_params.keepalive_interval_ms = 60000;
mqtt_params.read_buf_size = 1024;
mqtt_params.write_buf_size = 1024;
mqtt_params.handle_event.h_fp = example_event_handle;
mqtt_params.handle_event.pcontext = NULL;
pclient = IOT_MQTT_Construct(&mqtt_params);
Panggil fungsi IOT_MQTT_Construct() dari Link SDK untuk menghubungkan perangkat ke IoT Platform. Jika fungsi mengembalikan nilai non-null, koneksi ke IoT Platform terbentuk. Kemudian, panggil fungsi example_subscribe untuk berlangganan topik.
res = example_subscribe(pclient);

- Produsen perangkat harus berlangganan topik dan mengimplementasikan fungsi pemrosesan berdasarkan desain produknya.
- Dalam kode contoh di atas, kode di kotak oranye pertama menentukan bahwa topik dalam format /$ProductKey/$DeviceName. Saat Anda membuat produk di konsol IoT Platform, sistem secara otomatis membuat topik dalam format tersebut.
- Kode di kotak oranye kedua menentukan informasi tentang topik.
- Kode di kotak oranye kedua menentukan cara berlangganan topik dan fungsi yang dipanggil untuk memproses data yang diterima dari topik.
Kode berikut menunjukkan cara menggunakan fitur publikasi MQTT untuk mengirimkan paket bisnis ke IoT Platform.
while (1) {
if (0 == loop_cnt % 20) {
example_publish(pclient);
}
IOT_MQTT_Yield(pclient, 200);
loop_cnt += 1;
}
- Kode contoh di atas mengirimkan pesan tetap ke IoT Platform secara berkala. Kami merekomendasikan agar produsen perangkat hanya mengirimkan data yang diperlukan ke IoT Platform berdasarkan fitur produknya sendiri.
- Untuk mencegah data tidak valid dikirimkan ke IoT Platform secara berkala, Anda dapat menghapus pernyataan example_publish(pclient) di fungsi main().
- Fungsi IOT_MQTT_Yield dari Link SDK dipanggil untuk menerima data dari broker MQTT. Nilai 200 menunjukkan bahwa fungsi harus menunggu selama 200 milidetik sebelum fungsi menerima data. Jika Anda memiliki banyak pesan atau persyaratan tinggi untuk latensi, Anda dapat menentukan nilai yang lebih kecil.

Dalam gambar di atas, kode di kotak oranye pertama menentukan isi pesan yang ingin Anda kirim. Kode di kotak oranye kedua memanggil fungsi dari Link SDK untuk mengirimkan pesan ke topik tertentu.
Unggah ID penyedia modul dan model modul
Jika penyedia modul ingin memverifikasi modul di IoT Platform, penyedia modul harus mengirimkan ID penyedia modul dan model modul. Dengan cara ini, IoT Platform dapat memperoleh jumlah perangkat yang terhubung ke IoT Platform berdasarkan ID penyedia modul atau model modul.
Sebelum Anda mengintegrasikan Link SDK, hubungi Alibaba Cloud untuk mendapatkan ID penyedia modul dan model modul dengan mengirimkan pesan berdasarkan template berikut. Untuk informasi lebih lanjut, kunjungi Hubungi Kami.
Subjek: Gunakan Link SDK untuk menghubungkan perangkat - Ajukan model modul atau chipSetelah modul terhubung ke IoT Platform, salin kode berikut ke lingkungan Anda dan jalankan fungsi dalam kode untuk mengirimkan informasi. Parameter pid menentukan ID penyedia modul dan parameter mid menentukan ID model modul.
#define PID_STRING_LEN_MAX 32 /* Panjang maksimum nilai parameter pid. Nilainya adalah string.*/
#define MID_STRING_LEN_MAX 32 /* Panjang maksimum nilai parameter mid. Nilainya adalah string.*/
int example_report_pid_mid(void *pclient, const char *product_key, const char *device_name, const char *pid, const char *mid)
{
int res = 0;
iotx_mqtt_topic_info_t topic_msg;
const char topic_frag1[] = "/sys/";
const char topic_frag2[] = "/thing/deviceinfo/update";
char topic[sizeof(topic_frag1) + sizeof(topic_frag2) + IOTX_PRODUCT_KEY_LEN + IOTX_DEVICE_NAME_LEN] = {0};
const char payload_frag1[] = "{\"id\":\"0\",\"version\":\"1.0\",\"params\":[{\"attrKey\":\"SYS_MODULE_ID\",\"attrValue\":\"";
const char payload_frag2[] = "\",\"domain\":\"SYSTEM\"},{\"attrKey\":\"SYS_PARTNER_ID\",\"attrValue\":\"";
const char payload_frag3[] = "\",\"domain\":\"SYSTEM\"}],\"method\": \"thing.deviceinfo.update\"}";
char payload[sizeof(payload_frag1) + sizeof(payload_frag2) + sizeof(payload_frag3) + PID_STRING_LEN_MAX + MID_STRING_LEN_MAX] = {0};
if (strlen(pid) > PID_STRING_LEN_MAX || strlen(mid) > MID_STRING_LEN_MAX) {
return -1;
}
/* Menggabungkan string untuk membuat topik MQTT. */
memcpy(topic, topic_frag1, strlen(topic_frag1));
memcpy(topic + strlen(topic), product_key, strlen(product_key));
memcpy(topic + strlen(topic), "/", 1);
memcpy(topic + strlen(topic), device_name, strlen(device_name));
memcpy(topic + strlen(topic), topic_frag2, strlen(topic_frag2));
/* Menggabungkan string untuk membuat payload topik MQTT. Payload mencakup nilai parameter pid dan mid. */
memcpy(payload, payload_frag1, strlen(payload_frag1));
memcpy(payload + strlen(payload), mid, strlen(mid));
memcpy(payload + strlen(payload), payload_frag2, strlen(payload_frag2));
memcpy(payload + strlen(payload), pid, strlen(pid));
memcpy(payload + strlen(payload), payload_frag3, strlen(payload_frag3));
topic_msg.qos = IOTX_MQTT_QOS0;
topic_msg.retain = 0;
topic_msg.dup = 0;
topic_msg.payload = (void *)payload;
topic_msg.payload_len = strlen(payload);
/* Panggil MQTT IOT_MQTT_Publish untuk mengirim pesan yang mencakup nilai parameter pid dan mid.*/
res = IOT_MQTT_Publish(pclient, topic, &topic_msg);
if (res < 0) {
return -1;
}
return 0;
}
Debug fitur
Tangkapan layar berikut disediakan berdasarkan hasil setelah Anda memodifikasi dan menjalankan file mqtt_example.c.
Periksa apakah perangkat terhubung ke IoT Platform
Secara default, perangkat diberikan izin Berlangganan pada topik /${productKey}/${deviceName}/get. Untuk mencegah pesan dijatuhkan setelah pesan dikirim ke IoT Platform, kami sarankan Anda mengubah izin pada topik menjadi Berlangganan dan Publikasi. Dengan cara ini, program contoh dapat berjalan sesuai harapan tanpa kegagalan.

Periksa apakah data dikirim oleh perangkat ke IoT Platform

Gambar di atas menunjukkan topik ke mana pesan dikirim. Konten pesan tidak ditampilkan.
Periksa apakah data diterima oleh perangkat dari IoT Platform


Implementasikan perintah AT
Penyedia modul tidak menyediakan lingkungan pengembangan yang dapat digunakan untuk melakukan pengembangan kustom pada modul. Sebagai gantinya, penyedia modul menghubungkan MCU eksternal dan logika bisnis produk berjalan di MCU. Dalam hal ini, penyedia modul harus menyediakan perintah AT yang dapat dipanggil oleh MCU. Dalam banyak kasus, modul hanya mendukung TCP. Operasi API yang dapat dilakukan mengonfigurasi koneksi MQTT, membentuk koneksi, menutup koneksi, berlangganan pesan, dan mempublikasikan pesan harus disediakan.
Tabel berikut menjelaskan perintah AT yang direkomendasikan. Penyedia modul dapat menggabungkan beberapa perintah AT menjadi satu perintah AT atau membagi satu perintah AT menjadi beberapa perintah AT. Penyedia modul dapat mendefinisikan format kustom untuk perintah AT.
| Perintah | Deskripsi |
| Tentukan informasi identitas untuk perangkat | Tentukan ProductKey, ProductSecret, DeviceName, dan DeviceSecret untuk perangkat. |
| Tentukan titik akhir IoT Platform | IoT Platform tersedia di beberapa wilayah, seperti daratan Tiongkok, AS, dan Jepang. Anda dapat menentukan informasi tentang titik akhir IoT Platform tempat MCU dapat terhubung. |
| Bentuk koneksi MQTT | Bentuk koneksi ke broker MQTT Alibaba Cloud. Anda dapat menjalankan perintah AT untuk menentukan sesi bersih MQTT, interval keepalive, dan periode timeout permintaan. |
| Tutup koneksi MQTT | Tutup koneksi MQTT ke IoT Platform. |
| Berlangganan topik | Berlangganan topik untuk menerima pesan |
| Berhenti berlangganan topik | Berhenti berlangganan topik untuk berhenti menerima pesan |
| Kirim data ke topik | Kirim data ke topik |
Saat MCU menjalankan perintah AT untuk mengirim informasi identitas perangkat ke modul, kami sarankan Anda menentukan informasi sebagai nilai variabel global. Dengan cara ini, HAL_GetProductKey, HAL_GetDeviceName, dan HAL_GetDeviceSecret dapat mengembalikan variabel global dan Anda tidak perlu memodifikasi kode contoh.