物联网平台提供的文件上传功能,是将您上传的文件存储在物联网平台的OSS空间中,除此之外,还支持您通过MQTT方式将文件上传至您自己的OSS空间中。
说明
文件上传到您的OSS空间后,您只能在OSS空间对文件进行管理和操作,无法在物联网平台的设备详情 > 文件管理页面操作文件。
前提条件
操作步骤
初始化MQTT模块。
初始化MQTT 文件上传模块,在
mqtt_upload_user_oss_demo.c
文件中设置需要上传文件的信息。说明extra_params
仅支持JSON格式,具体说明,请参见:文件上传。extra_params
格式示例:{ "ossOwnerType":"device-user", "serviceId":"1234567890", "fileTag":{ "tagKey1":"tagValue1", "tagKey2":"tagValue2" } }
upload组件参数配置代码示例:
uint32_t rsp_timeout = 10000; 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 = 256; aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_DEFAULT_BLOCK_SIZE, &block_size); /* 配置MQTT需要上传的文件信息,未知文件大小,文件长度设置为-1,回调函数read_data_handler设置为NULL, 使用aiot_mqtt_upload_send_data接口进行数据发送 */ uint32_t file_size = -1; /* 如果需要上传文件到用户的OSS空间,则配置extra_params参数 如果不需要将文件上传到用户的OSS空间,extra_params配置为NULL, 可以在文件管理页面查看具体文件。 [extra_params参数配置必须使用JSON格式] */ char *extra_params = "{\"ossOwnerType\":\"device-user\",\"serviceId\":\"1234567890\",\"fileTag\":{\"tagKey1\":\"tagValue1\",\"tagKey2\":\"tagValue2\"}}"; aiot_mqtt_upload_file_opt_t file_option = { .file_name = MQTT_UPLOAD_SINGLE_FILE_NAME, .file_size = file_size, .mode = AIOT_MQTT_UPLOAD_FILE_MODE_OVERWRITE, .digest = NULL, .read_data_handler = NULL, .userdata = NULL, .extra_params = extra_params }; res = aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_FILE_OPTION, &file_option);
请求文件上传。
请求文件上传的
aiot_mqtt_upload_open_stream
是同步接口,您需要等待应答信息后才能开始进行上传。aiot_mqtt_upload_recv_t recv_packet = {0}; res = aiot_mqtt_upload_open_stream(up_handle, MQTT_UPLOAD_SINGLE_FILE_NAME, &recv_packet); if (res < STATE_SUCCESS) { goto exit; }
上传分片文件。
您主动调用
aiot_mqtt_upload_send_data
接口,进行分片数据的上传。说明is_commplete
是通知物联网平台是否为文件上传的最后一包数据,所以在上传的过程中该参数需要设置为0,上传最后一包数据时is_commplete
需设置为1。结束所有上传文件后,销毁会话句柄释放资源。
/* 等待所有文件上传完成后,才可销毁MQTT UPload 会话实例 */ aiot_mqtt_upload_deinit(&up_handle);
if ((upload_file_len + data_len) < MQTT_UPLOAD_SINGLE_FILE_SIZE) {
/* 发送分包数据 */
data_len = block_size;
is_commplete = 0;
} else {
/* 发送最后一包文件内容 */
data_len = MQTT_UPLOAD_SINGLE_FILE_SIZE - upload_file_len;
is_commplete = 1;
}
res = aiot_mqtt_upload_send_data(up_handle, MQTT_UPLOAD_SINGLE_FILE_NAME, &g_upload_single_file_buf[upload_file_len], data_len, is_commplete);
if (res == STATE_SUCCESS) {
upload_file_len += data_len;
printf("upload_file_len:%d\r\n", upload_file_len);
}
日志说明
MQTT连接成功。
[1645604145.783][LK-0313] MQTT user calls aiot_mqtt_connect api, connect [1645604145.783][LK-032A] mqtt host: a1******Dih.iot-as-mqtt.cn-shanghai.aliyuncs.com [1645604145.783][LK-0317] user name: mqttupload0002&a1******Dih [1645604145.783][LK-0318] password: 194163B399BA079B9BB6*******************F2D275A9D9ADFBA29 success to establish tcp, fd=5 local port: 51712 [1645604145.862][LK-1000] establish mbedtls connection with server(host='a1******Dih.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443]) [1645604145.889][LK-1000] success to establish mbedtls connection, (cost 45260 bytes in total, max used 47996 bytes) [1645604146.138][LK-0313] MQTT connect success in 355 ms AIOT_MQTTEVT_CONNECT
MQTT 文件上传创建会话并进行消息订阅。
[1645604146.138][LK-2113] aiot_mqtt_upload_init init [1645604146.138][LK-0309] sub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/init_reply [1645604146.138][LK-0309] sub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/send_reply [1645604146.138][LK-0309] sub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/cancel_reply
请求上传文档到用户的OSS空间。
[1645671153.383][LK-0309] pub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/init [LK-030A] > 7B 22 69 64 22 3A 22 31 22 2C 22 70 61 72 61 6D | {"id":"1","param [LK-030A] > 73 22 3A 7B 22 66 69 6C 65 4E 61 6D 65 22 3A 22 | s":{"fileName":" [LK-030A] > 6D 71 74 74 75 70 6C 6F 61 64 66 69 6C 65 2E 74 | mqttuploadfile.t [LK-030A] > 78 74 22 2C 22 66 69 6C 65 53 69 7A 65 22 3A 2D | xt","fileSize":- [LK-030A] > 31 2C 22 63 6F 6E 66 6C 69 63 74 53 74 72 61 74 | 1,"conflictStart [LK-030A] > 65 67 79 22 3A 22 6F 76 65 72 77 72 69 74 65 22 | egy":"overwrite" [LK-030A] > 2C 22 69 6E 69 74 55 69 64 22 3A 22 31 36 34 35 | ,"initUid":"1645 [LK-030A] > 36 ** ** *1 35 33 33 38 33 39 22 2C 22 65 78 74 | 671*****39","ext [LK-030A] > 72 61 50 61 72 61 6D 73 22 3A 7B 22 6F 73 73 4F | raParams":{"ossO [LK-030A] > 77 6E 65 72 54 79 70 65 22 3A 22 64 65 76 69 63 | wnerType":"devic [LK-030A] > 65 2D 75 73 65 72 22 2C 22 73 65 72 76 69 63 65 | e-user","service [LK-030A] > 49 64 22 3A 22 31 32 33 34 35 36 37 38 39 30 22 | Id":"1234567890" [LK-030A] > 2C 22 66 69 6C 65 74 61 67 22 3A 7B 22 74 61 67 | ,"fileTag":{"tag [LK-030A] > 4B 65 79 31 22 3A 22 74 61 67 56 61 6C 75 65 31 | Key1":"tagValue1 [LK-030A] > 22 2C 22 74 61 67 4B 65 79 32 22 3A 22 74 61 67 | ","tagKey2":"tag [LK-030A] > 56 61 6C 75 65 32 22 7D 7D 7D 7D | Value2"}
收到物联网平台应答消息。
[1645604146.391][LK-0309] pub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/init_reply [LK-030A] < 7B 22 63 6F 64 65 22 3A 32 30 30 2C 22 64 61 74 | {"code":200,"dat [LK-030A] < 61 22 3A 7B 22 66 69 6C 65 4E 61 6D 65 22 3A 22 | a":{"fileName":" [LK-030A] < 6D 71 74 74 75 70 6C 6F 61 64 66 69 6C 65 2E 74 | mqttuploadfile.t [LK-030A] < 78 74 22 2C 22 75 70 6C 6F 61 64 49 64 22 3A 22 | xt","uploadId":" [LK-030A] < 66 66 35 4B 49 38 ** ** ** ** ** 62 63 51 69 52 | ff5KI8*****bcQiR [LK-030A] < 75 43 35 36 30 31 30 32 30 30 22 2C 22 6F 66 66 | uC56010200","off [LK-030A] < 73 65 74 22 3A 30 2C 22 66 69 6C 65 53 69 7A 65 | set":0,"fileSize [LK-030A] < 22 3A 2D 31 2C 22 63 6F 6E 66 6C 69 63 74 53 74 | ":-1,"conflictSt [LK-030A] < 72 61 74 65 67 79 22 3A 22 6F 76 65 72 77 72 69 | rategy":"overwri [LK-030A] < 74 65 22 7D 2C 22 69 64 22 3A 22 31 22 2C 22 6D | te"},"id":"1","m [LK-030A] < 65 73 73 61 67 65 22 3A 22 73 75 63 63 65 73 73 | essage":"success [LK-030A] < 22 7D | "}
分送分片文件。
循环调用
aiot_mqtt_upload_send_data
函数进行数据上传,该函数是同步发送接口,等待应答STATE_SUCCESS
后才能发起上传新的一包数据。[1645604146.391][LK-210B] Recv file name:mqttuploadfile.txt [1645604146.401][LK-0309] pub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/send [LK-030A] > 00 67 7B 22 69 64 22 3A 22 32 22 2C 22 70 61 72 | .g{"id":"2","par [LK-030A] > 61 6D 73 22 3A 7B 22 75 70 6C 6F 61 64 49 64 22 | ams":{"uploadId" [LK-030A] > 3A 22 66 66 35 4B 49 ** ** ** ** ** ** ** 63 51 | :"ff5KI********Q [LK-030A] > 69 52 75 43 35 36 30 31 30 32 30 30 22 2C 22 6F | iRuC56010200","o [LK-030A] > 66 66 73 65 74 22 3A 30 2C 22 62 53 69 7A 65 22 | ffset":0,"bSize" [LK-030A] > 3A 32 35 36 2C 22 69 73 43 6F 6D 70 6C 65 74 65 | :256,"isComplete [LK-030A] > 22 3A 66 61 6C 73 65 7D 7D 00 00 00 00 00 00 00 | ":false}}....... [LK-030A] > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ [LK-030A] > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ [LK-030A] > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ [LK-030A] > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
结束文件上传。
上传最后一包数据时,您需要将
isComplete
设置为1,通知物联网平台这是最后一包上传数据,完成文件上传。[LK-030A] < 7B 22 63 6F 64 65 22 3A 32 30 30 2C 22 64 61 74 | {"code":200,"dat [LK-030A] < 61 22 3A 7B 22 66 69 63 4D 6F 64 65 22 3A 22 63 | a":{"ficMode":"c [LK-030A] < 72 63 36 34 22 2C 22 75 70 6C 6F 61 64 49 64 22 | rc64","uploadId" [LK-030A] < 3A 22 66 66 35 4B 49 ** ** ** ** ** ** ** ** 51 | :"ff5KI*******Q [LK-030A] < 69 52 75 43 35 36 30 31 30 32 30 30 22 2C 22 6F | iRuC56010200","o [LK-030A] < 66 66 73 65 74 22 3A 37 36 38 2C 22 63 6F 6D 70 | ffset":768,"comp [LK-030A] < 6C 65 74 65 22 3A 74 72 75 65 2C 22 66 69 63 56 | lete":true,"ficV [LK-030A] < 61 6C 75 65 53 65 72 76 65 72 22 3A 22 63 33 37 | alueServer":"c37 [LK-030A] < 38 36 33 39 37 32 30 36 39 32 37 30 63 22 2C 22 | 863********270c"," [LK-030A] < 62 53 69 7A 65 22 3A 32 35 36 7D 2C 22 69 64 22 | bSize":256},"id" [LK-030A] < 3A 22 35 22 2C 22 6D 65 73 73 61 67 65 22 3A 22 | :"5","message":" [LK-030A] < 73 75 63 63 65 73 73 22 7D | success"} [1645604147.904][LK-2125] Complete upload total size:1024 upload_file_len:1024 [1645604147.908][LK-2100] Finish upload,Deleted upload task. MQTT Upload file(mqttuploadfile.txt) uploadid(ff5KI*********RuC56010200) success.
上传完成后销毁句柄释放资源。
[1645604152.908][LK-210F] aiot_mqtt_upload_deinit [1645604152.908][LK-0309] unsub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/init_reply [1645604152.908][LK-0309] unsub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/send_reply [1645604152.908][LK-0309] unsub: /sys/a1******Dih/mqttupload****/thing/file/upload/mqtt/cancel_reply [1645604152.908][LK-1000] adapter_network_deinit
文档内容是否对您有帮助?