Topik ini menjelaskan cara memanggil operasi API dari Link SDK for C untuk mengirimkan permintaan Message Queuing Telemetry Transport (MQTT) ke IoT Platform, mendaftarkan perangkat secara dinamis, dan mendapatkan informasi verifikasi yang diperlukan untuk mengaktifkan perangkat. Dalam contoh ini, digunakan file kode sampel bernama ./demos/dynregmq_basic_demo.c.
Informasi latar belakang
Saat menyesuaikan SDK, atur Skema Otentikasi Perangkat ke Pendaftaran Dinamis pada halaman Penyesuaian SDK. Sebelum menggunakan file kode sampel dalam topik ini, pastikan Anda telah memahami isi dari topik Ikhtisar.
Langkah 1: Inisialisasi SDK
Tambahkan file header.
#include "aiot_state_api.h" #include "aiot_sysdep_api.h" #include "aiot_dynregmq_api.h"Tambahkan dependensi dasar dan konfigurasikan fitur output log.
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);Panggil operasi aiot_dynregmq_init untuk membuat instance klien bernama
dynregmqdan inisialisasi parameter default.dynregmq_handle = aiot_dynregmq_init(); if (dynregmq_handle == NULL) { printf("aiot_dynregmq_init gagal\n"); return -1; }
Langkah 2: Konfigurasikan fitur yang diperlukan
Panggil operasi aiot_dynregmq_setopt untuk mengonfigurasi item berikut:
Untuk informasi lebih lanjut, lihat Pendaftaran Dinamis Berbasis MQTT.
Konfigurasikan parameter koneksi.
Kode sampel:
char *product_key = "a18wP******"; char *product_secret = "CpIlPVCXI7******"; char *device_name = "LightSwitch"; char *mqtt_host = "iot-06******.mqtt.iothub.aliyuncs.com"; uint8_t skip_pre_regist =1; ... /* Tentukan titik akhir server. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_HOST, (void *)host); /* Tentukan port server. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PORT, (void *)&port); /* Tentukan ProductKey perangkat. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PRODUCT_KEY, (void *)product_key); /* Tentukan ProductSecret perangkat. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PRODUCT_SECRET, (void *)product_secret); /* Tentukan DeviceName perangkat. aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_DEVICE_NAME, (void *)device_name); /* Tentukan kredensial keamanan koneksi. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_NETWORK_CRED, (void *)&cred); /* Tentukan apakah akan menggunakan metode verifikasi tanpa pra-pendaftaran. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_NO_WHITELIST, (void *)&skip_pre_regist); ... ...Parameter:
Parameter
Contoh
Ikhtisar
mqtt_host
iot-06******.mqtt.iothub.aliyuncs.com
Titik akhir tempat Anda ingin menghubungkan perangkat.
Format:
${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com.skip_pre_regist
1
Menentukan apakah akan menggunakan metode verifikasi tanpa pra-pendaftaran.
0: tidak
1: ya
nullUntuk informasi lebih lanjut tentang pra-pendaftaran dan metode verifikasi unik-sertifikat-per-produk tanpa pra-pendaftaran, lihat Verifikasi unik-sertifikat-per-produk.
product_key
a18wP******
ProductKey dan ProductSecret yang Anda simpan saat membuat produk di konsol IoT Platform. Untuk informasi lebih lanjut, lihat Buat produk.
product_secret
CpIlPVCXI7******
device_name
LightSwitch
DeviceName perangkat.
IoT Platform memeriksa DeviceName saat perangkat mengajukan permintaan aktivasi. Kami sarankan Anda menggunakan pengenal yang dapat diperoleh dari perangkat sebagai DeviceName. Pengenal tersebut bisa berupa alamat MAC, Identitas Peralatan Bergerak Internasional (IMEI), atau nomor seri (SN) perangkat.
Konfigurasikan callback pesan.
Tentukan fungsi callback pesan.
Kode Sampel:
int main(int argc, char *argv[]) { ... Etc. aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_RECV_HANDLER, (void *)demo_dynregmq_recv_handler); aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_USERDATA, (void *)&demo_info); ... Etc. }Parameter:
Parameter
Contoh
Deskripsi
AIOT_DYNREGMQOPT_RECV_HANDLER
demo_dynregmq_recv_handler
Mengonfigurasi callback pesan. Saat pesan diterima, callback dipanggil untuk melakukan operasi yang diperlukan.
AIOT_DYNREGMQOPT_USERDATA
&demo_info
Konteks. Saat operasi
demo_dynregmq_recv_handlerdipanggil, nilai yang diperoleh dari operasi dikembalikan.
Definisikan fungsi callback untuk pesan.
void demo_dynregmq_recv_handler(void *handle, const aiot_dynregmq_recv_t *packet, void *userdata) { switch (packet->type) { /* TODO: Anda harus menyimpan ruang yang ditunjuk oleh parameter packet dalam callback. Setelah callback mengembalikan hasil, ruang tersebut dilepaskan. */ case AIOT_DYNREGMQRECV_DEVICEINFO_WL: { if (strlen(packet->data.deviceinfo_wl.device_secret) >= sizeof(demo_devinfo_wl.device_secret)) { break; } /* Jika Anda menggunakan metode verifikasi pra-pendaftaran, pastikan parameter device_secret disimpan secara persisten. */ memset(&demo_devinfo_wl, 0, sizeof(demo_devinfo_wl_t)); memcpy(demo_devinfo_wl.device_secret, packet->data.deviceinfo_wl.device_secret, strlen(packet->data.deviceinfo_wl.device_secret)); } break; /* TODO: Anda harus menyimpan ruang yang ditunjuk oleh parameter packet dalam callback. Setelah callback mengembalikan hasil, ruang tersebut dilepaskan. */ case AIOT_DYNREGMQRECV_DEVICEINFO_NWL: { if (strlen(packet->data.deviceinfo_nwl.clientid) >= sizeof(demo_devinfo_nwl.conn_clientid) || strlen(packet->data.deviceinfo_nwl.username) >= sizeof(demo_devinfo_nwl.conn_username) || strlen(packet->data.deviceinfo_nwl.password) >= sizeof(demo_devinfo_nwl.conn_password)) { break; } /* Jika Anda menggunakan metode verifikasi tanpa pra-pendaftaran, pastikan parameter clientid, username, dan password disimpan secara persisten. */ memset(&demo_devinfo_nwl, 0, sizeof(demo_devinfo_nwl_t)); memcpy(demo_devinfo_nwl.conn_clientid, packet->data.deviceinfo_nwl.clientid, strlen(packet->data.deviceinfo_nwl.clientid)); memcpy(demo_devinfo_nwl.conn_username, packet->data.deviceinfo_nwl.username, strlen(packet->data.deviceinfo_nwl.username)); memcpy(demo_devinfo_nwl.conn_password, packet->data.deviceinfo_nwl.password, strlen(packet->data.deviceinfo_nwl.password)); } break; default: { } break; } }
Langkah 3: Kirim permintaan
Panggil operasi aiot_dynregmq_send_request untuk mengirim permintaan pendaftaran dinamis ke server. Untuk detail konfigurasi parameter, lihat Konfigurasikan parameter koneksi.
res = aiot_dynregmq_send_request(dynregmq_handle);
if (res < STATE_SUCCESS) {
printf("aiot_dynregmq_send_request gagal: -0x%04X\n", -res);
return -1;
} Langkah 4: Terima respons
Setelah permintaan pendaftaran dikirim, IoT Platform mengembalikan respons. Perangkat memanggil operasi aiot_dynregmq_recv untuk menerima data respons dan memproses data tersebut menggunakan callback pesan.
res = aiot_dynregmq_recv(dynregmq_handle);
if (res < STATE_SUCCESS) {
printf("aiot_dynregmq_recv gagal: -0x%04X\n", -res);
return -1;
} Dalam contoh ini, data respons dicetak. Tentukan logika untuk menyimpan informasi verifikasi perangkat yang dikembalikan di lokasi setempat. Informasi verifikasi digunakan saat perangkat terhubung ke IoT Platform.
if (skip_pre_regist == 0) {
printf("device secret: %s\n", demo_devinfo_wl.device_secret);
} else {
printf("clientid: %s\n", demo_devinfo_nwl.conn_clientid);
printf("username: %s\n", demo_devinfo_nwl.conn_username);
printf("password: %s\n", demo_devinfo_nwl.conn_password);
}Langkah 5: Keluar dari program
Panggil operasi aiot_dynregmq_deinit untuk menghapus instance klien dynregmq dan melepaskan sumber daya terkait.
res = aiot_dynregmq_deinit(&dynregmq_handle); Apa yang harus dilakukan selanjutnya
Setelah mengonfigurasi file kode sampel, kompilasikan file tersebut untuk menghasilkan file yang dapat dieksekusi. Dalam contoh ini, file yang dihasilkan adalah
./output/dynregmq-basic-demo.Untuk informasi lebih lanjut, lihat Siapkan Lingkungan Pengembangan.
Untuk informasi lebih lanjut mengenai hasil eksekusi, lihat Lihat log.
Jika Anda menggunakan metode verifikasi unik-sertifikat-per-produk tanpa pra-pendaftaran untuk memverifikasi perangkat, IoT Platform mengeluarkan ClientId, UserName, dan Password bukan DeviceSecret ke perangkat setelah IoT Platform memverifikasi perangkat.
Anda dapat menentukan ClientId, UserName, dan Password untuk parameter
AIOT_MQTTOPT_USERNAME, AIOT_MQTTOPT_PASSWORD, dan AIOT_MQTTOPT_CLIENTIDdalam filemqtt_basic_demo.cdan memanggil operasiaiot_mqtt_connectuntuk menghubungkan perangkat ke IoT Platform. Kode sampel berikut memberikan contoh cara melakukan operasi sebelumnya:char *user_name = "demo_user_name"; char *password = "demo_passwd"; char *client_id = "demo_client_id"; aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_USERNAME, user_name); aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_PASSWORD, password); aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_CLIENTID, client_id); res = aiot_mqtt_connect(mqtt_handle);