/****************************************************************************** * FunctionName : upgrade_download * Description : Processing the upgrade data from the host * Parameters : bin -- server number * pusrdata -- The upgrade data (or NULL when the connection has been closed!) * length -- The length of upgrade data * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR upgrade_download(void *arg, char *pusrdata, unsigned short length) { char *ptr = NULL; char *ptmp2 = NULL; char lengthbuffer[32]; if (totallength == 0 && (ptr = (char *)os_strstr(pusrdata, "\r\n\r\n")) != NULL && (ptr = (char *)os_strstr(pusrdata, "Content-Length")) != NULL) { ptr = (char *)os_strstr(pusrdata, "\r\n\r\n"); length -= ptr - pusrdata; length -= 4; totallength += length; UPGRADE_DBG("upgrade file download start.\n"); system_upgrade(ptr + 4, length); ptr = (char *)os_strstr(pusrdata, "Content-Length: "); if (ptr != NULL) { ptr += 16; ptmp2 = (char *)os_strstr(ptr, "\r\n"); if (ptmp2 != NULL) { os_memset(lengthbuffer, 0, sizeof(lengthbuffer)); os_memcpy(lengthbuffer, ptr, ptmp2 - ptr); sumlength = atoi(lengthbuffer); } else { UPGRADE_DBG("sumlength failed\n"); } } else { UPGRADE_DBG("Content-Length: failed\n"); } } else { totallength += length; os_printf("totallen = %d\n",totallength); system_upgrade(pusrdata, length); } if (totallength == sumlength) { UPGRADE_DBG("upgrade file download finished.\n"); system_upgrade_flag_set(UPGRADE_FLAG_FINISH); totallength = 0; sumlength = 0; upgrade_check(upgrade_conn->reverse); os_timer_disarm(&upgrade_10s); os_timer_setfn(&upgrade_10s, (os_timer_func_t *)upgrade_deinit, NULL); os_timer_arm(&upgrade_10s, 10, 0); } else { if (upgrade_conn->state != ESPCONN_READ) { totallength = 0; sumlength = 0; os_timer_disarm(&upgrade_10s); os_timer_setfn(&upgrade_10s, (os_timer_func_t *)upgrade_check, upgrade_conn->reverse); os_timer_arm(&upgrade_10s, 10, 0); } } }
int main(int argc, char **argv) { setlocale(LC_ALL, "" ); textdomain("logistics"); int c =0; while(( c = getopt_long(argc, argv, ":lhvi:r:uUgx", args, NULL)) != -1) { switch(c) { case 'h': show_help(); return 0; break; case 'v': show_version(); return 0; break; case 'l': list_all_packages_to_terminal(); break; case 'i': install_package(optarg); break; case 'r': remove_package(optarg); break; case 'u': update_package_db(); break; case 'U': system_upgrade(); break; case 'g': gtk_init(&argc, &argv); init_gui(argc, argv, 0); break; case 'x': gtk_init(&argc, &argv); init_gui(argc, argv, 1); break; default: show_help(); return 1; break; } } return 0; }
/****************************************************************************** * FunctionName : upgrade_data_load * Description : parse the data from server,send fw data to system interface * Parameters : pusrdata--data from server, * : length--length of the pusrdata * Returns : none * * first data from server: * HTTP/1.1 200 OK * Server: nginx/1.6.2 * Date: Tue, 14 Jul 2015 09:15:51 GMT * Content-Type: application/octet-stream * Content-Length: 282448 * Connection: keep-alive * Content-Disposition: attachment;filename=user2.bin * Vary: Cookie * X-RateLimit-Remaining: 3599 * X-RateLimit-Limit: 3600 * X-RateLimit-Reset: 1436866251 *******************************************************************************/ BOOL upgrade_data_load(char *pusrdata, unsigned short length) { char *ptr = NULL; char *ptmp2 = NULL; char lengthbuffer[32]; if (totallength == 0 && (ptr = (char *)strstr(pusrdata, "\r\n\r\n")) != NULL && (ptr = (char *)strstr(pusrdata, "Content-Length")) != NULL) { // os_printf("\n pusrdata %s\n",pusrdata); ptr = (char *)strstr(pusrdata, "Content-Length: "); if (ptr != NULL) { ptr += 16; ptmp2 = (char *)strstr(ptr, "\r\n"); if (ptmp2 != NULL) { memset(lengthbuffer, 0, sizeof(lengthbuffer)); if((ptmp2 - ptr)<=32) memcpy(lengthbuffer, ptr, ptmp2 - ptr); else os_printf("ERR1:arr_overflow,%u,%d\n",__LINE__,(ptmp2 - ptr)); sumlength = atoi(lengthbuffer); os_printf("userbin sumlength:%d \n",sumlength); ptr = (char *)strstr(pusrdata, "\r\n\r\n"); length -= ptr - pusrdata; length -= 4; totallength += length; /*at the begining of the upgrade,we get the sumlength *and erase all the target flash sectors,return false *to close the connection, and start upgrade again. */ if(FALSE==flash_erased){ // os_printf("userbin sumlength:%d flash:%d\n",sumlength,flash_erased); flash_erased=system_upgrade(ptr + 4, sumlength); os_printf("userbin sumlength:%d flash:%d\n",sumlength,flash_erased); return flash_erased; }else{ system_upgrade(ptr + 4, length); } } else { os_printf("ERROR:Get sumlength failed\n"); return false; } } else { os_printf("ERROR:Get Content-Length failed\n"); return false; } } else { if(totallength != 0){ totallength += length; if(totallength > sumlength){ os_printf("strip the 400 error mesg\n"); length =length -(totallength- sumlength); } // os_printf(">>>recv %dB, %dB left\n",totallength,sumlength-totallength); system_upgrade(pusrdata, length); } else { os_printf("server response with something else,check it!\n"); return false; } } return true; }
/****************************************************************************** * FunctionName : upgrade_download * Description : Processing the upgrade data from the host * Parameters : bin -- server number * pusrdata -- The upgrade data (or NULL when the connection has been closed!) * length -- The length of upgrade data * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR upgrade_download(void *arg, char *pusrdata, unsigned short length){ char *ptr = NULL; char *ptmp2 = NULL; char lengthbuffer[32], returncode[4]; uint8_t md5_calc[16],i = 0,progress = 0; char output[64] = {0}; struct upgrade_server_info *server = (struct upgrade_server_info *)upgrade_conn->reverse; uint32_t count; //检查返回码 if (totallength == 0){ ptr = (char *)os_strstr(pusrdata, "HTTP/1.1 "); os_memset(returncode, 0, sizeof(returncode)); os_memcpy(returncode, ptr+9, 3); if(os_strcmp(returncode ,"200")){ //下载失败 UPGRADE_DBG("http download return code error\n"); upgrade_check(server); return; } } if (totallength == 0 && (ptr = (char *)os_strstr(pusrdata, "\r\n\r\n")) != NULL && (ptr = (char *)os_strstr(pusrdata, "Content-Length")) != NULL) { ptr = (char *)os_strstr(pusrdata, "\r\n\r\n"); length -= ptr - pusrdata; length -= 4; totallength += length; UPGRADE_DBG("upgrade file download start.\n"); file_info_clear(); MD5Init(&_ctx); MD5Update(&_ctx, ptr + 4, length); system_upgrade(ptr + 4, length); ptr = (char *)os_strstr(pusrdata, "Content-Length: "); if (ptr != NULL) { ptr += 16; ptmp2 = (char *)os_strstr(ptr, "\r\n"); if (ptmp2 != NULL) { os_memset(lengthbuffer, 0, sizeof(lengthbuffer)); os_memcpy(lengthbuffer, ptr, ptmp2 - ptr); sumlength = atoi(lengthbuffer); } else { UPGRADE_DBG("sumlength failed\n"); upgrade_check(server); return; } } else { upgrade_check(server); UPGRADE_DBG("Content-Length: failed\n"); return; } } else { if(totallength + length > sumlength) {length = sumlength - totallength;} totallength += length; os_printf("totallen = %d\n",totallength); MD5Update(&_ctx, pusrdata, length); system_upgrade(pusrdata, length); } progress = totallength*100/sumlength; os_memset(output, 0, sizeof(output)); os_sprintf(output,"%s:2,%d\r\n", CMD_DOWN_FILE, progress); at_port_print(output); //正在下载 显示下载进度 //at_response_ok(); if ((totallength == sumlength)) { UPGRADE_DBG("upgrade file download finished.\n"); MD5Final(md5_calc, &_ctx); os_memset(output, 0, sizeof(output)); for(i = 0; i < 16; i++) { os_sprintf(output + (i * 2), "%02x", md5_calc[i]); } os_printf("md5 = %s\n",output); if(!os_strcmp(server->md5,output)){ UPGRADE_DBG("md5 check ok.\n"); system_upgrade_flag_set(UPGRADE_FLAG_FINISH); //保存文件 file_info->file_size = sumlength; file_info->file_start_sec = UPDATE_CACHE_WIFIAPP_SEC_START; file_info_write(file_info); totallength = 0; sumlength = 0; upgrade_check(server); return; } UPGRADE_DBG("md5 check error.\n"); upgrade_check(server); return; } if (upgrade_conn->state != ESPCONN_READ) { totallength = 0; sumlength = 0; os_timer_disarm(&upgrade_rev_timer); os_timer_setfn(&upgrade_rev_timer, (os_timer_func_t *)upgrade_check, server); os_timer_arm(&upgrade_rev_timer, 10, 0); } }