Konfigurasi perangkat dari jarak jauh dilakukan menggunakan file kode contoh ./demos/cota_basic_demo.c.
Informasi latar belakang
Langkah 1: Inisialisasi klien
Tambahkan file header.
... …… #include "aiot_ota_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_ota_init untuk membuat OTA.
ota_handle = aiot_ota_init(); if (NULL == ota_handle) { printf("aiot_ota_init gagal\r\n"); aiot_mqtt_deinit(&mqtt_handle); return -2; }
Langkah 2: Konfigurasikan fitur yang diperlukan
Panggil operasi aiot_ota_setopt untuk mengonfigurasi item berikut.
- Penting Pastikan informasi autentikasi perangkat telah ditentukan. Untuk informasi lebih lanjut, lihat Contoh.Sebelum menyetel parameter spesifik konfigurasi jarak jauh, pastikan informasi autentikasi perangkat telah ditentukan. Untuk informasi lebih lanjut, lihat .
aiot_ota_setopt(ota_handle, AIOT_OTAOPT_MQTT_HANDLE, mqtt_handle);Parameter Contoh Deskripsi AIOT_OTAOPT_MQTT_HANDLE mqtt_handle Anda harus membangun koneksi MQTT. Parameter ini digunakan untuk menghubungkan dengan handle koneksi MQTT.
- Tentukan callback untuk memproses perintah konfigurasi jarak jauh.
aiot_ota_setopt(ota_handle, AIOT_OTAOPT_RECV_HANDLER, demo_ota_recv_handler);Parameter Contoh Deskripsi AIOT_OTAOPT_MQTT_HANDLE demo_ota_recv_handler Callback ini dipanggil ketika perangkat menerima perintah konfigurasi jarak jauh dari IoT Platform.
Langkah 3: Meminta informasi konfigurasi
Jika perangkat offline ketika perintah konfigurasi jarak jauh dikirim dari IoT Platform, Anda dapat meminta perintah konfigurasi jarak jauh setelah perangkat online.
revice task get detail reply, task_id:[$next],status:[9].- Panggil operasi aiot_mqtt_pub untuk mendapatkan informasi konfigurasi jarak jauh dari IoT Platform.
{ char *topic_string = "/sys/a18wP******/LightSwitch/thing/config/get"; char *payload_string = "{\"id\":\"123\",\"params\":{\"configScope\":\"product\",\"getType\":\"file\"}}"; res = aiot_mqtt_pub(mqtt_handle, topic_string, (uint8_t *)payload_string, strlen(payload_string), 0); if (res < STATE_SUCCESS) { printf("aiot_mqtt_pub gagal: -0x%04X\r\n", -res); /* Lepaskan sumber daya instance MQTT jika koneksi MQTT gagal dibuat. */ goto exit; } }Parameter Contoh Deskripsi topic_string /sys/a18wP******5/LightSwitch/thing/config/get Topik yang digunakan untuk mendapatkan informasi konfigurasi jarak jauh. Untuk informasi lebih lanjut, lihat Topik.
a1oGs******adalah ProductKey perangkat.LightSwitchadalah DeviceName perangkat.
Untuk informasi lebih lanjut, lihat Dapatkan informasi verifikasi perangkat.
payload_string {\"id\":\"123\",\"params\":{\"configScope\":\"product\",\"getType\":\"file\"}} Konten pesan permintaan. Konten pesan dalam format JSON. Konten tersebut adalah nilai parameter params dalam data Alink. Untuk informasi lebih lanjut, lihat Perangkat meminta informasi konfigurasi dari IoT Platform.
- Setelah IoT Platform menerima permintaan, IoT Platform mengembalikan informasi konfigurasi ke perangkat.Di konsol IoT Platform, aktifkan fitur konfigurasi jarak jauh dan edit informasi konfigurasi. Untuk informasi lebih lanjut, lihat Konfigurasi Jarak Jauh.Catatan Ukuran maksimum informasi konfigurasi jarak jauh adalah 64 KB.
- Panggil operasi aiot_mqtt_recv untuk menerima informasi konfigurasi jarak jauh.
- Jika pointer
g_dl_handlebernilai null, klien mengirimkan permintaan untuk mendapatkan pesan MQTT secara berkala. - Jika pointer
g_dl_handletidak bernilai null, fungsiaiot_download_recvdipanggil.
while (1) { aiot_mqtt_process(mqtt_handle); res = aiot_mqtt_recv(mqtt_handle); if (res == STATE_SYS_DEPEND_NWK_CLOSED) { sleep(1); } if (NULL != g_dl_handle) { /* Sebelum informasi konfigurasi jarak jauh diterima, atur periode timeout penerimaan pesan MQTT menjadi 100 ms untuk mengurangi interval antara dua unduhan konfigurasi jarak jauh. */ int32_t ret = aiot_download_recv(g_dl_handle); timeout_ms = 100; if (STATE_DOWNLOAD_FINISHED == ret) { aiot_download_deinit(&g_dl_handle); /* Setelah informasi konfigurasi jarak jauh diterima, atur periode timeout penerimaan pesan MQTT menjadi 5.000 ms, yang merupakan nilai default. */ timeout_ms = 5000; } aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_RECV_TIMEOUT_MS, (void *)&timeout_ms); } } - Jika pointer
demo_ota_recv_handlerdipanggil.Saat menentukan logika pemrosesan callback, perhatikan hal-hal berikut:- IoT Platform mengirimkan informasi konfigurasi menggunakan topik
/sys/${ProductKey}/${DeviceName}/thing/config/push. - aiot_ota_recv_t menunjukkan format data. Link SDK secara otomatis mem-parsing informasi yang diterima.
- AIOT_OTARECV_COTA menunjukkan tipe pesan.
Callback digunakan untuk memulai Permintaan HTTPS dan mengunduh file konfigurasi jarak jauh. Untuk informasi lebih lanjut tentang cara menulis callback, lihat Langkah 5: Unduh File Konfigurasi Jarak Jauh.
- IoT Platform mengirimkan informasi konfigurasi menggunakan topik
Langkah 4: Terima informasi konfigurasi jarak jauh
Jika perangkat online, perangkat dapat menerima informasi konfigurasi jarak jauh yang dikirim dari IoT Platform. Kemudian, callback demo_ota_recv_handler dipanggil.
Untuk informasi lebih lanjut, lihat Tentukan Logika Callback.
Langkah 5: Unduh file konfigurasi jarak jauh
- Panggil operasi aiot_download_init untuk membuat
download.uint32_t res = 0; uint16_t port = 443; uint32_t max_buffer_len = 2048; aiot_sysdep_network_cred_t cred; void *dl_handle = aiot_download_init(); if (NULL == dl_handle || NULL == ota_msg->task_desc) { return; } printf("configId: %s, configSize: %u Bytes\r\n", ota_msg->task_desc->version, ota_msg->task_desc->size_total); memset(&cred, 0, sizeof(aiot_sysdep_network_cred_t)); cred.option = AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA; cred.max_tls_fragment = 16384; cred.x509_server_cert = ali_ca_cert; cred.x509_server_cert_len = strlen(ali_ca_cert); - Panggil operasi aiot_download_setopt untuk menyetel parameter yang terkait dengan tugas unduhan.
/* Atur protokol TLS untuk pengunduhan. */ if ((STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_NETWORK_CRED, (void *)(&cred))) || /* Atur nomor port server yang akan diakses. */ (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_NETWORK_PORT, (void *)(&port))) || /* Atur informasi tugas. Anda bisa mendapatkan informasi dari field task_desc di parameter input ota_msg. Informasi tersebut mencakup URL unduhan, serta ukuran dan versi file konfigurasi jarak jauh. */ (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_TASK_DESC, (void *)(ota_msg->task_desc))) || /* Atur callback yang dipanggil saat konten yang diunduh diterima. */ (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_RECV_HANDLER, (void *)(demo_download_recv_handler))) || /* Atur panjang buffer maksimum untuk satu unduhan. Pengguna akan diberitahu jika batas tercapai. */ (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_BODY_BUFFER_MAX_LEN, (void *)(&max_buffer_len))) || /* Kirim permintaan HTTP GET ke server HTTP. */ (STATE_SUCCESS != aiot_download_send_request(dl_handle))) { if (res != STATE_SUCCESS) { aiot_download_deinit(&dl_handle); break; } } - Setelah Anda memulai permintaan unduhan, IoT Platform mengembalikan pesan respons. Kemudian, callback
demo_download_recv_handlerdipanggil untuk mengunduh file konfigurasi jarak jauh.Saat menentukan logika pemrosesan callback, perhatikan hal-hal berikut:- aiot_download_recv_t adalah parameter input callback. Parameter ini menunjukkan format data.
- AIOT_DLRECV_HTTPBODY menunjukkan tipe pesan (
packet->type). - Dalam contoh ini, informasi dicetak. Anda dapat mengunduh file konfigurasi ke lokasi tertentu sesuai dengan kebutuhan bisnis Anda.
void demo_download_recv_handler(void *handle, const aiot_download_recv_t *packet, void *userdata) { /* Anda hanya dapat menyetel packet->type ke AIOT_DLRECV_HTTPBODY. */ if (!packet || AIOT_DLRECV_HTTPBODY != packet->type) { return; } int32_t percent = packet->data.percent; uint8_t *src_buffer = packet->data.buffer; uint32_t src_buffer_len = packet->data.len; /* Nilai persentase negatif menunjukkan bahwa terjadi pengecualian selama penerimaan data atau otentikasi digest gagal. */ if (percent < 0) { /* Terjadi pengecualian selama penerimaan data atau otentikasi digest gagal. */ printf("pengecualian terjadi, persentase adalah %d\r\n", percent); return; } …… ... } - Panggil operasi aiot_download_report_progress untuk mengirimkan kemajuan unduhan.
void demo_download_recv_handler(void *handle, const aiot_download_recv_t *packet, void *userdata) { /* Anda hanya dapat menyetel packet->type ke AIOT_DLRECV_HTTPBODY. */ if (!packet || AIOT_DLRECV_HTTPBODY != packet->type) { return; ... ... aiot_download_report_progress(handle, percent); printf("panjang konfigurasi adalah %d, isi konfigurasi adalah %.*s\r\n", src_buffer_len, src_buffer_len, (char *)src_buffer); } - Setelah Anda mengunduh file, panggil operasi aiot_download_deinit untuk membersihkan handle (
g_dl_handle).while (1) { aiot_mqtt_process(mqtt_handle); res = aiot_mqtt_recv(mqtt_handle); if (res == STATE_SYS_DEPEND_NWK_CLOSED) { sleep(1); } if (NULL != g_dl_handle) { /* Sebelum informasi konfigurasi jarak jauh diterima, atur periode timeout penerimaan pesan MQTT menjadi 100 ms untuk mengurangi interval antara dua unduhan konfigurasi jarak jauh. */ int32_t ret = aiot_download_recv(g_dl_handle); timeout_ms = 100; if (STATE_DOWNLOAD_FINISHED == ret) { aiot_download_deinit(&g_dl_handle); /* Setelah informasi konfigurasi jarak jauh diterima, atur periode timeout penerimaan pesan MQTT menjadi 5.000 ms, yang merupakan nilai default. */ timeout_ms = 5000; } aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_RECV_TIMEOUT_MS, (void *)&timeout_ms); } }
Langkah 6: Keluar dari program
Panggil operasi aiot_ota_deinit untuk menghapus OTA
aiot_ota_deinit(&ota_handle);Apa yang harus dilakukan selanjutnya
Dalam contoh ini, file executable ./output//cota-basic-demo telah dihasilkan.
Untuk informasi lebih lanjut, lihat Persiapkan Lingkungan.
- Lihat Log.