123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- #include "load_file.h"
- #include <stdlib.h>
- #include "ec800m.h"
- #include "usart.h"
- #include <string.h>
- #include "gd_ota_flash.h"
- #include "systick.h"
- #include "main.h"
- #define readHttpfile(cmd, filename, time_out) sprintf(cmd, "AT+QHTTPREADFILE=\"UFS:%s\",%d\r\n", filename, time_out)
- #define cmdHttpSetUrlLen(cmd,urlLen) sprintf(cmd,"AT+QHTTPURL=%d\r\n",urlLen)
- #define cmdHttpGET(cmd) sprintf(cmd,"AT+QHTTPGET=100\r\n")
- #define cmdReadFile(cmd,filename) sprintf(cmd,"AT+QFDWL=%s\r\n",filename)
- #define cmdOpenFile(cmd,filename) sprintf(cmd,"AT+QFOPEN=\"%s\",2\r\n",filename)
- #define cmdReadHTTP(cmd) sprintf(cmd,"AT+QHTTPREAD=10")
- #define cmdDeletFile(cmd,filename) sprintf(cmd,"AT+QFDEL=\"UFS:%s\"\r\n",filename)
- bool extract_url_and_version(char *data,char* url, char* version) ;
- int update_version(BOOT_MESSAGE *old_version, const char *new_version);
- int load_file_config(char *url)
- {
- char cmd[50];
- //设置服务器URL len
- cmdHttpSetUrlLen(cmd,strlen(url));
- EC800MSendCmd(cmd,strlen(cmd));
- WaitResponse(RSP_CONNECT, 500);
- delay_1ms(200);
- //发送服务器url
- EC800MSendCmd(url,strlen(url));
- if(WaitResponse(RSP_OK, 500)!=true) return -1;
- delay_1ms(200);
- //向对应服务器发送get请求
- cmdHttpGET(cmd);
- EC800MSendCmd(cmd,strlen(cmd));
- if(WaitResponse("QHTTPGET:", 5000)!=true) return -1;
- delay_1ms(200);
-
- //把请求获取的数据通过文件系统保存
- readHttpfile(cmd,"bin.txt",80);
- EC800MSendCmd(cmd,strlen(cmd));
- if(WaitResponse(RSP_OK, 5000)!=true) return -1;
- task_fwdgt_reload();
- delay_1ms(1000);
- task_fwdgt_reload();
- delay_1ms(1000);
- return 1;
-
- }
- //检查程序版本是否要升级
- //参数url从此处获取程序 http://gpu.ringzle.com:8082/iot/vesion/control/getDeviceVersionInfo/DTU/4G
- int check_soft_version(char *url,char *version)
- {
- char versionUrl[100];
- sprintf(versionUrl,"http://gpu.ringzle.com:8082/iot/vesion/control/getDeviceVersionInfo/DTU/4G");
-
- char cmd[50];
- //设置服务器URL len
- cmdHttpSetUrlLen(cmd,strlen(versionUrl));
- EC800MSendCmd(cmd,strlen(cmd));
- WaitResponse(RSP_CONNECT, 5000);
- delay_1ms(200);
- //发送服务器url
- EC800MSendCmd(versionUrl,strlen(versionUrl));
- if(WaitResponse(RSP_OK, 5000)!=true) return -1;
- //向对应服务器发送get请求
- delay_1ms(200);
- cmdHttpGET(cmd);
- EC800MSendCmd(cmd,strlen(cmd));
- delay_1ms(100);
- if(WaitResponse("QHTTPGET", 5000)!=true) return -1;
- //读取网页响应信息
- delay_1ms(200);
- readHttpfile(cmd,"version.txt",80);
- EC800MSendCmd(cmd,strlen(cmd));
- if(WaitResponse(RSP_OK, 5000)!=true) return -1;
- delay_1ms(1000);
- cmdReadFile(cmd,"version.txt");
- EC800MSendCmd(cmd,strlen(cmd));
- task_fwdgt_reload();
- delay_1ms(1000);
- if(extract_url_and_version( (char *)&UART0_RX_BUF,url,version)!=true)return -1;
- return 1;
- }
- // 提取URL和版本的函数
- bool extract_url_and_version(char* data, char* url, char* version) {
- char *ok_ptr, *json_start, *json_end, *url_start, *url_end, *version_start, *version_end;
- // 检查是否含有OK
- ok_ptr = strstr(data, "OK");
- if (ok_ptr == NULL) {
- return false;
- }
- // 寻找{}中的内容
- json_start = strstr(data, "{");
- if (json_start == NULL) {
- return false;
- }
- json_end = strstr(json_start, "}");
- if (json_end == NULL) {
- return false;
- }
- // 提取URL
- url_start = strstr(json_start, "\"url\":\"");
- if (url_start == NULL) {
- return false;
- }
- url_start += strlen("\"url\":\"");
- url_end = strstr(url_start, "\"");
- if (url_end == NULL) {
- return false;
- }
- strncpy(url, url_start, url_end - url_start);
- url[url_end - url_start] = '\0';
- // 提取版本
- version_start = strstr(json_start, "\"version\":\"");
- if (version_start == NULL) {
- return false;
- }
- version_start += strlen("\"version\":\"");
- version_end = strstr(version_start, "\"");
- if (version_end == NULL) {
- return false;
- }
- strncpy(version, version_start, version_end - version_start);
- version[version_end - version_start] = '\0';
- return true;
- }
- int update_version(BOOT_MESSAGE *old_version, const char *new_version) {
- // 解析新版本号
- char *token;
- token = strtok((char *)new_version, ".");
- uint8_t new_version_h = atoi(token);
- token = strtok(NULL, ".");
- uint8_t new_version_m = atoi(token);
- token = strtok(NULL, ".");
- uint8_t new_version_l = atoi(token);
- if(new_version_h>old_version->VERSION_H)
- {
- //发生版本更新
- old_version->VERSION_H=new_version_h;
- old_version->VERSION_M=new_version_m;
- old_version->VERSION_L=new_version_l;
- old_version->UP_FLAG=1;
- return 1;
- }
- else if(new_version_m > old_version->VERSION_M)
- {
- old_version->VERSION_H=new_version_h;
- old_version->VERSION_M=new_version_m;
- old_version->VERSION_L=new_version_l;
- old_version->UP_FLAG=1;
- return 1;
- }
- else if(new_version_l > old_version->VERSION_L)
- {
- old_version->VERSION_H=new_version_h;
- old_version->VERSION_M=new_version_m;
- old_version->VERSION_L=new_version_l;
- old_version->UP_FLAG=1;
- return 1;
- }
- else
- {
- return 0;
- }
-
- }
- void delete_file()
- {
- char cmd[50];
- cmdDeletFile(cmd,"version.txt");
- EC800MSendCmd(cmd,strlen(cmd));
- WaitResponse(RSP_OK, 5000);
-
- cmdDeletFile(cmd,"bin.txt");
- EC800MSendCmd(cmd,strlen(cmd));
- WaitResponse(RSP_OK, 5000);
- }
- void check_update(void)
- {
- char *bin_url=malloc(100);
- char *version=malloc(20);
- task_fwdgt_reload();
- delete_file();
- if(check_soft_version(bin_url,version))//检查提取url
- {
- //判断两个版本号
- BOOT_MESSAGE *old_version=malloc(sizeof(BOOT_MESSAGE));
- GD32_READ_OTA(old_version);
- delay_1ms(100);
- task_fwdgt_reload();
- if(update_version(old_version,version)==1)
- {
- if(load_file_config(bin_url)==1)
- {
- //列出所有file
- delay_1ms(200);
- EC800MSendCmd("AT+QFLST=\"*\"\r\n", strlen("AT+QFLST=\"*\"\r\n"));
- if(WaitResponse("bin.txt", 100)==true)
- {
- //文件加载成功写入标志位
- write_soft_version(old_version);
- NVIC_SystemReset();
- }
- }
- }
- free(old_version);
- }
- free(bin_url);
- free(version);
- }
- void save_version(char *version)
- {
- BOOT_MESSAGE current_version;
- char *token;
- token = strtok(version, ".");
- current_version.VERSION_H = atoi(token);
- token = strtok(NULL, ".");
- current_version.VERSION_M = atoi(token);
- token = strtok(NULL, ".");
- current_version.VERSION_L = atoi(token);
- write_soft_version(¤t_version);
- }
|