ftp_demo.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. /*================================================================
  2. Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
  3. Quectel Wireless Solution Proprietary and Confidential.
  4. =================================================================*/
  5. /*=================================================================
  6. EDIT HISTORY FOR MODULE
  7. This section contains comments describing changes made to the module.
  8. Notice that changes are listed in reverse chronological order.
  9. WHEN WHO WHAT, WHERE, WHY
  10. ------------ ------- -------------------------------------------------------------------------------
  11. =================================================================*/
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. //#include "vfs.h"
  16. #include "ql_api_osi.h"
  17. #include "ql_api_nw.h"
  18. #include "ql_log.h"
  19. #include "ql_api_datacall.h"
  20. #include "ql_ftp_client.h"
  21. #include "ql_fs.h"
  22. #include "ql_ssl.h"
  23. #define QL_FTP_LOG_LEVEL QL_LOG_LEVEL_INFO
  24. #define QL_FTP_LOG(msg, ...) QL_LOG(QL_FTP_LOG_LEVEL, "ql_FTP", msg, ##__VA_ARGS__)
  25. #define QL_FTP_LOG_PUSH(msg, ...) QL_LOG_PUSH("ql_FTP", msg, ##__VA_ARGS__)
  26. static ql_task_t ftp_task = NULL;
  27. char data_tmp[]="hello\n";
  28. int read_data_count=0;
  29. #define PRINT_BUF_SIZE 65
  30. #define MAX_PATH_SIZE 256
  31. int dl_size;
  32. int upl_size;
  33. size_t read_data(void *ptr, size_t size, size_t nmemb, void *stream)
  34. {
  35. /*
  36. memcpy(ptr,data_tmp,sizeof(data_tmp));
  37. QL_FTP_LOG("ptr = %s", (char*)ptr);
  38. QL_FTP_LOG("size = %d,ret = %d",size*nmemb,sizeof(data_tmp));
  39. if(read_data_count++<30)
  40. return sizeof(data_tmp);
  41. else
  42. return 0;
  43. */
  44. int ret = 0;
  45. QFILE* fd;
  46. fd = (QFILE*)stream;
  47. if(upl_size >= ql_fsize(*fd))
  48. {
  49. return 0;
  50. }
  51. ret = ql_fread(ptr, size, nmemb, *fd);
  52. QL_FTP_LOG("ret=%d,size = %d", ret,size*nmemb);
  53. upl_size += ret;
  54. return ret;
  55. }
  56. size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
  57. {
  58. int ret = 0;
  59. QL_FTP_LOG("data_len = %d",size*nmemb);
  60. QFILE* fd;
  61. fd = (QFILE*)stream;
  62. ret = ql_fwrite(ptr,size,nmemb,*fd);
  63. if(ret != size*nmemb)
  64. {
  65. return 0;
  66. }
  67. dl_size += size*nmemb;
  68. return size*nmemb;
  69. }
  70. /*
  71. size_t file_list(void *ptr, size_t size, size_t nmemb, void *stream)
  72. {
  73. //第一次的时候收到数据后直接透传出去,
  74. QL_FTP_LOG("======> %s",ptr);
  75. QL_FTP_LOG("ret=%d", size*nmemb);
  76. return size*nmemb;
  77. }
  78. */
  79. static void ftp_app_thread(void * arg)
  80. {
  81. int ret = 0;
  82. int i = 0;
  83. //ql_nw_reg_status_info_s nw_info;
  84. int profile_idx = 1;
  85. int start_pos = 0;
  86. ql_data_call_info_s info;
  87. char ip4_addr_str[16] = {0};
  88. void * client = NULL;
  89. char buf[MAX_PATH_SIZE]={0};
  90. int run_num=1;
  91. char hostname[64]="220.180.239.212:8310";
  92. char username[]="test";
  93. char password[]="test";
  94. QL_FTP_CLIENT_FILE_INFO_T ql_list_file[5]={0};
  95. uint8_t nSim = 0;
  96. uint16_t sim_cid;
  97. //int fp = -1;
  98. int ciphersuites=0xFFFF;
  99. int ssl_ctx=2;
  100. char *chain_path="UFS:cacert.pem";
  101. char *owncert_path="UFS:user_cert.pem";
  102. char *key_path="UFS:user_key.pem";
  103. ql_rtos_task_sleep_s(10);
  104. QL_FTP_LOG("========== ftp demo start ==========");
  105. QL_FTP_LOG("wait for network register done");
  106. while((ret = ql_network_register_wait(nSim, 120)) != 0 && i < 10){
  107. i++;
  108. ql_rtos_task_sleep_s(1);
  109. }
  110. if(ret == 0){
  111. i = 0;
  112. QL_FTP_LOG("====network registered!!!!====");
  113. }else{
  114. QL_FTP_LOG("====network register failure!!!!!====");
  115. goto exit;
  116. }
  117. if(QL_DATACALL_SUCCESS != ql_bind_sim_and_profile(nSim, profile_idx, &sim_cid))
  118. {
  119. QL_FTP_LOG("nSim or profile_idx is invalid!!!!");
  120. ret = -1;
  121. goto exit;
  122. }
  123. ql_set_data_call_asyn_mode(nSim, profile_idx, 0);
  124. QL_FTP_LOG("===start data call====");
  125. ret=ql_start_data_call(nSim, profile_idx, QL_PDP_TYPE_IP, "uninet", NULL, NULL, 0);
  126. QL_FTP_LOG("===data call result:%d", ret);
  127. if(ret != 0){
  128. QL_FTP_LOG("====data call failure!!!!=====");
  129. }
  130. memset(&info, 0x00, sizeof(ql_data_call_info_s));
  131. ret = ql_get_data_call_info(nSim, profile_idx, &info);
  132. if(ret != 0){
  133. QL_FTP_LOG("ql_get_data_call_info ret: %d", ret);
  134. ql_stop_data_call(nSim, profile_idx);
  135. goto exit;
  136. }
  137. QL_FTP_LOG("info->profile_idx: %d", info.profile_idx);
  138. QL_FTP_LOG("info->ip_version: %d", info.ip_version);
  139. QL_FTP_LOG("info->v4.state: %d", info.v4.state);
  140. inet_ntop(AF_INET, &info.v4.addr.ip, ip4_addr_str, sizeof(ip4_addr_str));
  141. QL_FTP_LOG("info.v4.addr.ip: %s\r\n", ip4_addr_str);
  142. inet_ntop(AF_INET, &info.v4.addr.pri_dns, ip4_addr_str, sizeof(ip4_addr_str));
  143. QL_FTP_LOG("info.v4.addr.pri_dns: %s\r\n", ip4_addr_str);
  144. inet_ntop(AF_INET, &info.v4.addr.sec_dns, ip4_addr_str, sizeof(ip4_addr_str));
  145. QL_FTP_LOG("info.v4.addr.sec_dns: %s\r\n", ip4_addr_str);
  146. client = ql_ftp_client_new();
  147. QFILE fd = 0;
  148. run_num = 2;
  149. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SIM_CID, sim_cid); /*set PDP cid,if not set,using default PDP*/
  150. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SSL_CTX, ssl_ctx);
  151. ql_ftp_client_setopt(client, QL_FTP_CLIENT_OPT_START_POS, start_pos);
  152. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SSL_CIPHERSUITE, &ciphersuites);
  153. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SSL_VERIFY_LEVEL, QL_SSL_VERIFY_CLIENT_SERVER);
  154. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SSL_VERSION, QL_SSL_VERSION_ALL);
  155. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SSL_TRANSPORT, QL_SSL_TLS_PROTOCOL);
  156. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SSL_ENABLE, QL_FTP_CLIENT_SSL_TYPE_EXP);
  157. if(ql_file_exist(chain_path)==QL_FILE_OK)
  158. {
  159. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SSL_CACERT_PATH, chain_path);
  160. }
  161. else
  162. {
  163. QL_FTP_LOG("cacert not exist\r\n");
  164. ql_ftp_client_release(client);
  165. goto exit;
  166. }
  167. if((ql_file_exist(owncert_path)==QL_FILE_OK)&&(ql_file_exist(key_path)==QL_FILE_OK))
  168. {
  169. ql_ftp_client_setopt(client, QL_FTP_CLIENT_SSL_OWNCERT_PATH, owncert_path,key_path);
  170. }
  171. else
  172. {
  173. QL_FTP_LOG("user_cert or user_key not exist\r\n");
  174. ql_ftp_client_release(client);
  175. goto exit;
  176. }
  177. while (client && run_num<=100)
  178. {
  179. dl_size = 0;
  180. upl_size = 0;
  181. read_data_count=0;
  182. QL_FTP_LOG("==============ftp_client_test[%d]================\n",run_num);
  183. if(run_num == 2)
  184. fd = ql_fopen("UFS:20201210test.txt","w+");
  185. else
  186. fd = ql_fopen("UFS:20201210test.txt","r+");
  187. if(fd < 0)
  188. {
  189. QL_FTP_LOG("open file failed !");
  190. break;
  191. }
  192. else
  193. {
  194. QL_FTP_LOG("open file success %d !",fd);
  195. }
  196. ret=ql_ftp_client_open(client,hostname,username,password);
  197. QL_FTP_LOG("\nql_ftp_client_open[%s] ret=%d;\n",hostname,ret);
  198. if(ret!=0)
  199. {
  200. break;
  201. }
  202. #if 0
  203. ret=ql_ftp_client_lcwd(client,"B:/");
  204. QL_FTP_LOG("\nql_ftp_client_lcwd[B:/] ret=%d\n",ret);
  205. ret=ql_ftp_client_lpwd(client, buf, sizeof(buf));
  206. QL_FTP_LOG("\nql_ftp_client_lpwd ret=%d; localdir:%s\n",ret,buf);
  207. ret=ql_ftp_client_lcwd(client,"U:/");
  208. QL_FTP_LOG("\nql_ftp_client_lcwd[U:/] ret=%d\n",ret);
  209. ret=ql_ftp_client_lcwd(client,"test");
  210. QL_FTP_LOG("\nql_ftp_client_lcwd[test] ret=%d\n",ret);
  211. if(ret==-1)
  212. {
  213. QL_FTP_LOG("error_code=%d\n",ql_ftp_client_get_error_code(client));
  214. }
  215. ret=ql_ftp_client_lpwd(client, buf, sizeof(buf));
  216. QL_FTP_LOG("\nql_ftp_client_lpwd ret=%d; localdir:%s\n",ret,buf);
  217. #endif
  218. ret=ql_ftp_client_pwd(client, buf, sizeof(buf));
  219. QL_FTP_LOG("\nql_ftp_client_pwd ret=%d; remotedir:%s\n",ret,buf);
  220. if(run_num % 17== 0){
  221. ret=ql_ftp_client_mkdir(client, "ftptest");
  222. QL_FTP_LOG("\nql_ftp_client_mkdir[ftptest] ret=%d\n",ret);
  223. ret=ql_ftp_client_cwd(client, "ftptest");
  224. QL_FTP_LOG("\nql_ftp_client_cwd[ftptest] ret=%d\n",ret);
  225. ret=ql_ftp_client_pwd(client, buf, sizeof(buf));
  226. QL_FTP_LOG("\nql_ftp_client_pwd ret=%d; remotedir:%s\n",ret,buf);
  227. ret=ql_ftp_client_cwd(client, "/");
  228. QL_FTP_LOG("\nql_ftp_client_cwd[/] ret=%d\n",ret);
  229. ret=ql_ftp_client_rmdir(client, "ftptest");
  230. QL_FTP_LOG("\nql_ftp_client_rmdir[ftptest] ret=%d\n",ret);
  231. }else if(run_num % 15== 0){
  232. ret=ql_ftp_client_cwd(client, "/ftp");
  233. QL_FTP_LOG("\nql_ftp_client_cwd[ftptest] ret=%d\n",ret);
  234. ret=ql_ftp_client_pwd(client, buf, sizeof(buf));
  235. QL_FTP_LOG("\nql_ftp_client_pwd ret=%d; remotedir:%s\n",ret,buf);
  236. ret=ql_ftp_client_list(client, "/ftp",NULL,ql_list_file, 5);
  237. QL_FTP_LOG("\nql_ftp_client_list[/] ret=%d\n",ret);
  238. for(i=0;i<ret;i++)
  239. {
  240. QL_FTP_LOG("file%d:%s\n type:%d\n size:%d\n group:%s\n permissions:%d\n time:%04d-%02d-%02d %02d:%02d:%02d\n",i,
  241. ql_list_file[i].filename,
  242. ql_list_file[i].type,
  243. ql_list_file[i].size,
  244. ql_list_file[i].group,
  245. ql_list_file[i].permissions,
  246. ql_list_file[i].timestamp.tm_year+1900,
  247. ql_list_file[i].timestamp.tm_mon+1,
  248. ql_list_file[i].timestamp.tm_mday,
  249. ql_list_file[i].timestamp.tm_hour,
  250. ql_list_file[i].timestamp.tm_min,
  251. ql_list_file[i].timestamp.tm_sec
  252. );
  253. }
  254. run_num = 9;
  255. }else if(run_num % 13 == 0){
  256. /* ret=ql_ftp_client_list(client, "/","1.txt",file_list, 1);
  257. QL_FTP_LOG("\nql_ftp_client_list[/1.txt] ret=%d\n",ret);
  258. for(i=0;i<ret;i++)
  259. {
  260. QL_FTP_LOG("file%d:%s\n type:%d\n size:%d\n group:%s\n permissions:%d\n time:%04d-%02d-%02d %02d:%02d:%02d\n",i,
  261. file_list[i].filename,
  262. file_list[i].type,
  263. file_list[i].size,
  264. file_list[i].group,
  265. file_list[i].permissions,
  266. file_list[i].timestamp.tm_year+1900,
  267. file_list[i].timestamp.tm_mon+1,
  268. file_list[i].timestamp.tm_mday,
  269. file_list[i].timestamp.tm_hour,
  270. file_list[i].timestamp.tm_min,
  271. file_list[i].timestamp.tm_sec
  272. );
  273. }
  274. */
  275. }
  276. else if(run_num % 2 == 0){
  277. ret= ql_ftp_client_get_ex(client,"/ftp/10K.txt",NULL,write_data,(void*)&fd);
  278. QL_FTP_LOG("\nql_ftp_client_get[1M.txt->test.txt] ret=%d,dl_size = %d\n",ret,dl_size);
  279. run_num = 15;
  280. }
  281. else if(run_num % 9 ==0){
  282. ret=ql_ftp_client_delete(client,"/ftp/10K.txt");
  283. QL_FTP_LOG("\nql_ftp_client_delete[test_device.txt] ret=%d\n",ret);
  284. ql_rtos_task_sleep_s(25);
  285. ret= ql_ftp_client_put_ex(client,"UFS:20201210test.txt","/ftp/10K.txt",read_data,&fd);
  286. QL_FTP_LOG("\nql_ftp_client_put[test_device.txt->test_device.txt] ret=%d upl_size = %d\n",ret,upl_size);
  287. run_num = 2;
  288. }
  289. else if(run_num % 7 ==0){
  290. ret= ql_ftp_client_get_ex(client,"1","/user/test_device.txt",NULL,NULL);
  291. QL_FTP_LOG("\nql_ftp_client_get[1M.txt->test_device.txt] ret=%d\n",ret);
  292. #if 0
  293. fp = vfs_open("/usr/test_device.txt", O_RDONLY);
  294. if(fp >= 0)
  295. {
  296. QL_FTP_LOG("ql_fread start\n");
  297. while(1)
  298. {
  299. int n=vfs_read(fp,buf,65);
  300. if(n>0)
  301. {
  302. buf[n]=0;
  303. QL_FTP_LOG("%s",buf);
  304. }
  305. else
  306. {
  307. QL_FTP_LOG("\nql_fread end\n");
  308. break;
  309. }
  310. }
  311. vfs_close(fp);
  312. }
  313. else
  314. {
  315. QL_FTP_LOG("ql_fopen failed\n");
  316. }
  317. #endif
  318. }else if(run_num % 3 ==0){
  319. ret= ql_ftp_client_put_ex(client,"UFS:20201210test.txt","20201210test.txt",read_data,&fd);
  320. QL_FTP_LOG("\nql_ftp_client_put[20201210test.txt->20201210test.txt] ret=%d, upl_size = %d\n",ret,upl_size);
  321. run_num = 2;
  322. }else if(run_num % 5 == 0){
  323. ret=ql_ftp_client_delete(client,"test_device_create.txt");
  324. QL_FTP_LOG("\nql_ftp_client_delete[test_device_create.txt] ret=%d\n",ret);
  325. }
  326. ret=ql_ftp_client_close(client);
  327. QL_FTP_LOG("ql_ftp_client_close ret=%d\n",ret);
  328. QL_FTP_LOG("==============ftp_client_test[%d] end================\n",run_num);
  329. //run_num++;
  330. QL_FTP_LOG("file fd =%d size =%d\n",fd,ql_fsize(fd));
  331. ql_fclose(fd);
  332. ql_rtos_task_sleep_s(5);
  333. }
  334. if (fd > 0)
  335. {
  336. ql_fclose(fd);
  337. }
  338. ql_ftp_client_release(client); /*release http resources*/
  339. exit:
  340. ql_rtos_task_delete(ftp_task);
  341. return;
  342. }
  343. int ql_ftp_app_init(void)
  344. {
  345. QlOSStatus err = QL_OSI_SUCCESS;
  346. err = ql_rtos_task_create(&ftp_task, 16*1024, APP_PRIORITY_ABOVE_NORMAL, "QftpApp", ftp_app_thread, NULL, 5);
  347. if(err != QL_OSI_SUCCESS)
  348. {
  349. QL_FTP_LOG("ftp_app init failed");
  350. }
  351. return err;
  352. }