Artikel ini menjelaskan cara memanggil operasi API dari Link SDK for C untuk mengunggah file perangkat ke IoT Platform melalui MQTT. Ini mengurangi overhead sumber daya perangkat keras dan biaya pengembangan. Dalam contoh ini, file kode contoh ./demos/mqtt_upload_basic_demo.c digunakan.
Konteks
Untuk informasi lebih lanjut tentang fitur pengunggahan file, lihat Ikhtisar.
Anda harus menggunakan protokol MQTT untuk mengunggah file.
Langkah 1: Inisialisasi klien
Tambahkan file header.
…… …… #include "aiot_mqtt_api.h" #include "aiot_mqtt_upload_api.h" #include "core_crc64.h" ……Tambahkan dependensi dasar serta konfigurasikan fitur output log.
/* Kumpulan fungsi terkait sistem yang disimpan di folder portfiles/aiot_port. */ extern aiot_sysdep_portfile_t g_aiot_sysdep_portfile; /* Sertifikat server yang terletak di external/ali_ca_cert.c. * / extern const char *ali_ca_cert; /* Callback untuk mencetak log SDK. */ static int32_t demo_state_logcb(int32_t code, char *message) { printf("%s", message); return 0; }Panggil operasi aiot_mqtt_upload_init untuk membuat instance klien dan menginisialisasi parameter default.
mqtt_handle = aiot_mqtt_upload_init();
Langkah 2: Konfigurasikan fitur yang diperlukan
Panggil operasi aiot_mqtt_upload_setopt untuk mengonfigurasi item berikut.
Hubungkan menggunakan handle koneksi MQTT.
nullSebelum menyetel parameter spesifik untuk pengunggahan file, pastikan informasi autentikasi perangkat telah ditentukan.
Anda harus membangun koneksi MQTT. Contoh kode berikut digunakan untuk menghubungkan dengan handle koneksi MQTT:
void *up_handle = aiot_mqtt_upload_init(); aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_MQTT_HANDLE, mqtt_handle);(Opsional)
Setel parameter spesifik pengunggahan file.
Contoh Kode
uint32_t rsp_timeout = 2000; aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_RSP_TIMEOUT_MS, &rsp_timeout); uint32_t rety_count = 5; aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_RETRY_COUNT, &rety_count); uint32_t block_size = 1024; aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_DEFAULT_BLOCK_SIZE, &block_size);Parameter:
Parameter
Deskripsi
rsp_timeout
Menentukan periode timeout retransmisi setiap paket data, dalam milidetik.
Jika Anda tidak menentukan parameter ini atau menyetelnya ke 0, periode timeout adalah 5 detik.
Dalam contoh ini, nilainya diatur ke 2000.
AIOT_MQTT_UPLOADOPT_RSP_TIMEOUT_MS
Memanggil operasi aiot_mqtt_upload_setopt untuk menyetel periode timeout retransmisi setiap paket data.
rety_count
Menentukan jumlah percobaan ulang jika terjadi kesalahan timeout.
Nilai default: 10.
Dalam contoh ini, nilainya diatur ke 5.
AIOT_MQTT_UPLOADOPT_RETRY_COUNT
Memanggil operasi aiot_mqtt_upload_setopt untuk menyetel jumlah percobaan ulang jika terjadi kesalahan timeout.
block_size
Menentukan ukuran maksimum setiap paket data, dalam byte.
Nilai valid: 256 hingga 131072. Nilai default: 2048.
Dalam contoh ini, nilainya diatur ke 1024.
AIOT_MQTT_UPLOADOPT_DEFAULT_BLOCK_SIZE
Memanggil operasi aiot_mqtt_upload_setopt untuk menyetel ukuran maksimum setiap paket data.
(Opsional) Langkah 3: Hitung checksum CRC64 file
Saat Anda mengunggah file, algoritma CRC16 digunakan secara default untuk menghitung checksum file. Anda dapat menentukan algoritma CRC64 berdasarkan kebutuhan bisnis Anda. Secara default, SDK menyediakan pustaka C spesifik CRC64.
Dalam contoh ini, algoritma CRC64 digunakan.
uint64_t crc = mqtt_upload_get_file_crc64(MQTT_UPLOAD_FILE_NAME);Langkah 4: Mulai permintaan untuk mengunggah file
Panggil operasi aiot_mqtt_upload_open_stream untuk memulai permintaan pengunggahan file ke IoT Platform.
nullJika Anda mengunggah file dengan nama yang sama, jangan panggil operasi aiot_mqtt_upload_open_stream untuk memulai beberapa permintaan. Setelah pengunggahan gagal, Anda dapat memulai kembali permintaan untuk mengunggah file.
Jika Anda mengunggah file dengan nama yang berbeda, Anda dapat memanggil operasi aiot_mqtt_upload_open_stream untuk memulai beberapa permintaan. Anda juga dapat memulai permintaan untuk mengunggah beberapa file.
Contoh kode:
Tentukan ukuran file dan nama file:
#define MQTT_UPLOAD_FILE_SIZE (2 * 1024) #define MQTT_UPLOAD_FILE_NAME ("mqttuploadfile001.txt") #define MQTT_UPLOAD_FILE_SIZE2 (1 * 1024 + 127) #define MQTT_UPLOAD_FILE_NAME2 ("mqttuploadfile002.txt")Mulai permintaan untuk mengunggah file:
uint32_t test_userdata = 100; aiot_mqtt_upload_open_stream(up_handle, MQTT_UPLOAD_FILE_NAME, MQTT_UPLOAD_FILE_SIZE, AIOT_MQTT_UPLOAD_FILE_MODE_OVERWRITE, &crc, mqtt_upload_read_data_handler, &test_userdata); mqtt_upload_create_upload_file(MQTT_UPLOAD_FILE_NAME2, MQTT_UPLOAD_FILE_SIZE2); aiot_mqtt_upload_open_stream(up_handle, MQTT_UPLOAD_FILE_NAME2, MQTT_UPLOAD_FILE_SIZE2, AIOT_MQTT_UPLOAD_FILE_MODE_OVERWRITE, NULL, mqtt_upload_read_data_handler, NULL);
Deskripsi contoh kode:
Dalam contoh ini, operasi dipanggil untuk mengunggah dua file berikut:
mqttuploadfile001.txtdanmqttuploadfile002.txt.nullPerhatikan konvensi penamaan berikut untuk file:
Setiap nama file dapat berisi angka, huruf, garis bawah (_), dan titik (.).
Setiap nama file harus dimulai dengan angka atau huruf.
Setiap nama file dapat memiliki panjang hingga 100 byte.
Ukuran satu file tunggal dapat mencapai hingga 16 MB.
File
mqttuploadfile001.txtmemiliki checksum CRC64 dan parameteruserdataditentukan.File
mqttuploadfile002.txttidak memiliki checksum CRC64 dan parameteruserdatatidak ditentukan.Dalam contoh ini, kebijakan pemrosesan diatur ke overwrite. Tabel berikut menjelaskan kebijakan pemrosesan yang tersedia.
Kebijakan pemrosesan (conflictStrategy)
Deskripsi
overwrite
Kebijakan ini digunakan secara default. Jika Anda menggunakan kebijakan ini, IoT Platform menghapus file yang ada dan hanya menyimpan file yang baru diunggah.
append
Setelah perangkat memulai permintaan pengunggahan file, IoT Platform mengembalikan informasi tentang file yang ada dengan nama yang sama. Dalam hal ini, Anda dapat melakukan operasi berikut pada perangkat:
Jika proses pengunggahan file di IoT Platform belum selesai, Anda dapat melanjutkan untuk mengunggah file lokal.
nullIoT Platform menyimpan file yang tidak sepenuhnya diunggah hanya selama 24 jam.
Jika proses pengunggahan file di IoT Platform selesai, Anda dapat mengubah kebijakan atau mengganti nama file lokal. Kemudian, unggah file lagi.
reject
IoT Platform mengembalikan kode kesalahan yang menunjukkan bahwa file sudah ada dan menolak permintaan untuk mengunggah file lokal.
Setelah IoT Platform menerima permintaan, IoT Platform mengembalikan respons ke perangkat. Setelah perangkat menerima pesan respons, callback dipicu untuk membaca file.
SDK membaca file atau data memori per segmen untuk mendapatkan parameter
data. Kemudian, algoritma CRC16 digunakan untuk menghitung checksum paket data yang ditunjukkan oleh parameterdata.nullSelama transmisi segmen file, ukuran maksimum setiap paket data tidak boleh melebihi nilai parameter
AIOT_MQTT_UPLOADOPT_DEFAULT_BLOCK_SIZE. Setiap paket data harus berukuran minimal 256 byte, kecuali untuk paket data terakhir.Callback
mqtt_upload_read_data_handlerditentukan dalam contoh kode berikut:int32_t mqtt_upload_read_data_handler(const aiot_mqtt_upload_recv_t *packet, uint8_t *data, uint32_t size, void *userdata) { int32_t read_len = 0; if (userdata != NULL) { uint32_t *test_userdata = (uint32_t *)userdata; printf("test_userdata:%d\r\n", *test_userdata); } if (packet == NULL) { return 0; } if (packet->desc.code == UPLOAD_FILE_OK) { if (data != NULL && size != 0) { uint32_t read_size = size; FILE *fp; char* file_name = packet->desc.file_name; fp = fopen(file_name, "r"); uint32_t offset = packet->desc.file_offset; fseek(fp, offset, SEEK_SET); printf("Open %s read at: %d\r\n", file_name, offset); read_len = fread(data, sizeof(uint8_t), read_size, fp); printf("Read_len: %d\r\n", read_len); fclose(fp); } } else { printf("Error code:%d, message:%s\r\n", packet->desc.code, packet->desc.message); } return read_len; }(Opsional)
Jika Anda ingin membatalkan pengunggahan file, panggil operasi aiot_mqtt_upload_cancel_stream.
Untuk informasi lebih lanjut, lihat aiot_mqtt_upload_cancel_stream.
Langkah 5: Periksa status pengunggahan file
Anda dapat memanggil operasi aiot_mqtt_upload_process untuk mendeteksi siklus status pengunggahan file. Contoh kode:
while(1) {
aiot_mqtt_upload_result_t result = aiot_mqtt_upload_process(up_handle);
if (result.code == STATE_MQTT_UPLOAD_FINISHED) {
/* Pengunggahan berhasil. */
printf("MQTT Upload file(%s) success\r\n", result.file_name);
uploaded_file++;
if (uploaded_file == 2) {
break;
}
} else if (result.code == STATE_MQTT_UPLOAD_FAILED ||
result.code == STATE_MQTT_UPLOAD_FAILED_TIMEOUT ||
result.code == STATE_MQTT_UPLOAD_CANCEL_FAILED ) {
/* Pengunggahan gagal. */
printf("MQTT Upload file(%s) failed,res:-0x%.4X\r\n", result.file_name, -result.code);
/* Hapus instance MQTT UPLOAD. */
} else if (result.code == STATE_MQTT_UPLOAD_CANCEL_SUCCESS) {
printf("MQTT Upload file(%s) cancel success,res:-0x%.4X\r\n", result.file_name, -result.code);
} else if (result.code == STATE_MQTT_UPLOAD_FAILED_WHOLE_CHECK) {
printf("MQTT Upload file(%s) whole file md5 failed,res:-0x%.4X\r\n", result.file_name, -result.code);
}
sleep(1);
}Langkah 6: Keluar dari program
Panggil operasi aiot_mqtt_upload_deinit untuk menghapus instance klien dan melepaskan sumber daya yang digunakan.
aiot_mqtt_upload_deinit(&up_handle);Apa selanjutnya
Setelah mengonfigurasi file kode contoh, kompilasikan file tersebut untuk menghasilkan file yang dapat dieksekusi. Dalam contoh ini, file yang dapat dieksekusi ./output/mqtt-upload-basic-demo dihasilkan.
Untuk informasi lebih lanjut, lihat Kompilasi dan Pelaksanaan.