load_file.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #include "load_file.h"
  2. #include <stdlib.h>
  3. #include "ec800m.h"
  4. #include "usart.h"
  5. #include <string.h>
  6. #include "gd_ota_flash.h"
  7. #include "systick.h"
  8. #include "main.h"
  9. #define readHttpfile(cmd, filename, time_out) sprintf(cmd, "AT+QHTTPREADFILE=\"UFS:%s\",%d\r\n", filename, time_out)
  10. #define cmdHttpSetUrlLen(cmd,urlLen) sprintf(cmd,"AT+QHTTPURL=%d\r\n",urlLen)
  11. #define cmdHttpGET(cmd) sprintf(cmd,"AT+QHTTPGET=100\r\n")
  12. #define cmdReadFile(cmd,filename) sprintf(cmd,"AT+QFDWL=%s\r\n",filename)
  13. #define cmdOpenFile(cmd,filename) sprintf(cmd,"AT+QFOPEN=\"%s\",2\r\n",filename)
  14. #define cmdReadHTTP(cmd) sprintf(cmd,"AT+QHTTPREAD=10")
  15. #define cmdDeletFile(cmd,filename) sprintf(cmd,"AT+QFDEL=\"UFS:%s\"\r\n",filename)
  16. bool extract_url_and_version(char *data,char* url, char* version) ;
  17. int update_version(BOOT_MESSAGE *old_version, const char *new_version);
  18. int load_file_config(char *url)
  19. {
  20. char cmd[50];
  21. //设置服务器URL len
  22. cmdHttpSetUrlLen(cmd,strlen(url));
  23. EC800MSendCmd(cmd,strlen(cmd));
  24. WaitResponse(RSP_CONNECT, 500);
  25. delay_1ms(200);
  26. //发送服务器url
  27. EC800MSendCmd(url,strlen(url));
  28. if(WaitResponse(RSP_OK, 500)!=true) return -1;
  29. delay_1ms(200);
  30. //向对应服务器发送get请求
  31. cmdHttpGET(cmd);
  32. EC800MSendCmd(cmd,strlen(cmd));
  33. if(WaitResponse("QHTTPGET:", 5000)!=true) return -1;
  34. delay_1ms(200);
  35. //把请求获取的数据通过文件系统保存
  36. readHttpfile(cmd,"bin.txt",80);
  37. EC800MSendCmd(cmd,strlen(cmd));
  38. if(WaitResponse(RSP_OK, 5000)!=true) return -1;
  39. task_fwdgt_reload();
  40. delay_1ms(1000);
  41. task_fwdgt_reload();
  42. delay_1ms(1000);
  43. return 1;
  44. }
  45. //检查程序版本是否要升级
  46. //参数url从此处获取程序 http://gpu.ringzle.com:8082/iot/vesion/control/getDeviceVersionInfo/DTU/4G
  47. int check_soft_version(char *url,char *version)
  48. {
  49. char versionUrl[100];
  50. sprintf(versionUrl,"http://gpu.ringzle.com:8082/iot/vesion/control/getDeviceVersionInfo/DTU/4G");
  51. char cmd[50];
  52. //设置服务器URL len
  53. cmdHttpSetUrlLen(cmd,strlen(versionUrl));
  54. EC800MSendCmd(cmd,strlen(cmd));
  55. WaitResponse(RSP_CONNECT, 5000);
  56. delay_1ms(200);
  57. //发送服务器url
  58. EC800MSendCmd(versionUrl,strlen(versionUrl));
  59. if(WaitResponse(RSP_OK, 5000)!=true) return -1;
  60. //向对应服务器发送get请求
  61. delay_1ms(200);
  62. cmdHttpGET(cmd);
  63. EC800MSendCmd(cmd,strlen(cmd));
  64. delay_1ms(100);
  65. if(WaitResponse("QHTTPGET", 5000)!=true) return -1;
  66. //读取网页响应信息
  67. delay_1ms(200);
  68. readHttpfile(cmd,"version.txt",80);
  69. EC800MSendCmd(cmd,strlen(cmd));
  70. if(WaitResponse(RSP_OK, 5000)!=true) return -1;
  71. delay_1ms(1000);
  72. cmdReadFile(cmd,"version.txt");
  73. EC800MSendCmd(cmd,strlen(cmd));
  74. task_fwdgt_reload();
  75. delay_1ms(1000);
  76. if(extract_url_and_version( (char *)&UART0_RX_BUF,url,version)!=true)return -1;
  77. return 1;
  78. }
  79. // 提取URL和版本的函数
  80. bool extract_url_and_version(char* data, char* url, char* version) {
  81. char *ok_ptr, *json_start, *json_end, *url_start, *url_end, *version_start, *version_end;
  82. // 检查是否含有OK
  83. ok_ptr = strstr(data, "OK");
  84. if (ok_ptr == NULL) {
  85. return false;
  86. }
  87. // 寻找{}中的内容
  88. json_start = strstr(data, "{");
  89. if (json_start == NULL) {
  90. return false;
  91. }
  92. json_end = strstr(json_start, "}");
  93. if (json_end == NULL) {
  94. return false;
  95. }
  96. // 提取URL
  97. url_start = strstr(json_start, "\"url\":\"");
  98. if (url_start == NULL) {
  99. return false;
  100. }
  101. url_start += strlen("\"url\":\"");
  102. url_end = strstr(url_start, "\"");
  103. if (url_end == NULL) {
  104. return false;
  105. }
  106. strncpy(url, url_start, url_end - url_start);
  107. url[url_end - url_start] = '\0';
  108. // 提取版本
  109. version_start = strstr(json_start, "\"version\":\"");
  110. if (version_start == NULL) {
  111. return false;
  112. }
  113. version_start += strlen("\"version\":\"");
  114. version_end = strstr(version_start, "\"");
  115. if (version_end == NULL) {
  116. return false;
  117. }
  118. strncpy(version, version_start, version_end - version_start);
  119. version[version_end - version_start] = '\0';
  120. return true;
  121. }
  122. int update_version(BOOT_MESSAGE *old_version, const char *new_version) {
  123. // 解析新版本号
  124. char *token;
  125. token = strtok((char *)new_version, ".");
  126. uint8_t new_version_h = atoi(token);
  127. token = strtok(NULL, ".");
  128. uint8_t new_version_m = atoi(token);
  129. token = strtok(NULL, ".");
  130. uint8_t new_version_l = atoi(token);
  131. if(new_version_h>old_version->VERSION_H)
  132. {
  133. //发生版本更新
  134. old_version->VERSION_H=new_version_h;
  135. old_version->VERSION_M=new_version_m;
  136. old_version->VERSION_L=new_version_l;
  137. old_version->UP_FLAG=1;
  138. return 1;
  139. }
  140. else if(new_version_m > old_version->VERSION_M)
  141. {
  142. old_version->VERSION_H=new_version_h;
  143. old_version->VERSION_M=new_version_m;
  144. old_version->VERSION_L=new_version_l;
  145. old_version->UP_FLAG=1;
  146. return 1;
  147. }
  148. else if(new_version_l > old_version->VERSION_L)
  149. {
  150. old_version->VERSION_H=new_version_h;
  151. old_version->VERSION_M=new_version_m;
  152. old_version->VERSION_L=new_version_l;
  153. old_version->UP_FLAG=1;
  154. return 1;
  155. }
  156. else
  157. {
  158. return 0;
  159. }
  160. }
  161. void delete_file()
  162. {
  163. char cmd[50];
  164. cmdDeletFile(cmd,"version.txt");
  165. EC800MSendCmd(cmd,strlen(cmd));
  166. WaitResponse(RSP_OK, 5000);
  167. cmdDeletFile(cmd,"bin.txt");
  168. EC800MSendCmd(cmd,strlen(cmd));
  169. WaitResponse(RSP_OK, 5000);
  170. }
  171. void check_update(void)
  172. {
  173. char *bin_url=malloc(100);
  174. char *version=malloc(20);
  175. task_fwdgt_reload();
  176. delete_file();
  177. if(check_soft_version(bin_url,version))//检查提取url
  178. {
  179. //判断两个版本号
  180. BOOT_MESSAGE *old_version=malloc(sizeof(BOOT_MESSAGE));
  181. GD32_READ_OTA(old_version);
  182. delay_1ms(100);
  183. task_fwdgt_reload();
  184. if(update_version(old_version,version)==1)
  185. {
  186. if(load_file_config(bin_url)==1)
  187. {
  188. //列出所有file
  189. delay_1ms(200);
  190. EC800MSendCmd("AT+QFLST=\"*\"\r\n", strlen("AT+QFLST=\"*\"\r\n"));
  191. if(WaitResponse("bin.txt", 100)==true)
  192. {
  193. //文件加载成功写入标志位
  194. write_soft_version(old_version);
  195. NVIC_SystemReset();
  196. }
  197. }
  198. }
  199. free(old_version);
  200. }
  201. free(bin_url);
  202. free(version);
  203. }
  204. void save_version(char *version)
  205. {
  206. BOOT_MESSAGE current_version;
  207. char *token;
  208. token = strtok(version, ".");
  209. current_version.VERSION_H = atoi(token);
  210. token = strtok(NULL, ".");
  211. current_version.VERSION_M = atoi(token);
  212. token = strtok(NULL, ".");
  213. current_version.VERSION_L = atoi(token);
  214. write_soft_version(&current_version);
  215. }