/****************************************************************************** * 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); } } }
/****************************************************************************** * FunctionName : upgrade_connect * Description : client connected with a host successfully * Parameters : arg -- Additional argument to pass to the callback function * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR upgrade_connect_cb(void *arg){ struct espconn *pespconn = arg; UPGRADE_DBG("upgrade_connect_cb\n"); os_timer_disarm(&upgrade_connect_timer); espconn_regist_disconcb(pespconn, upgrade_disconcb); espconn_regist_sentcb(pespconn, upgrade_datasent); if (pbuf != NULL) { UPGRADE_DBG("%s\n", pbuf); espconn_sent(pespconn, pbuf, os_strlen(pbuf)); } }
/****************************************************************************** * FunctionName : user_upgrade_check * Description : Processing the received data from the server * Parameters : arg -- Additional argument to pass to the callback function * pusrdata -- The received data (or NULL when the connection has been closed!) * length -- The length of received data * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR upgrade_check(struct upgrade_server_info *server) { UPGRADE_DBG("upgrade_check\n"); if (system_upgrade_flag_check() != UPGRADE_FLAG_FINISH) { totallength = 0; sumlength = 0; os_timer_disarm(&upgrade_timer); system_upgrade_flag_set(UPGRADE_FLAG_IDLE); upgrade_deinit(); server->upgrade_flag = false; if (server->check_cb != NULL) { server->check_cb(server); } } else { os_timer_disarm(&upgrade_timer); upgrade_deinit(); server->upgrade_flag = true; if (server->check_cb != NULL) { server->check_cb(server); } } #ifdef UPGRADE_SSL_ENABLE espconn_secure_disconnect(upgrade_conn); #else espconn_disconnect(upgrade_conn); #endif }
/****************************************************************************** * FunctionName : user_upgrade_init * Description : parameter initialize as a client * Parameters : server -- A point to a server parmer which connected * Returns : none *******************************************************************************/ bool ICACHE_FLASH_ATTR system_upgrade_start(struct upgrade_server_info *server){ if (system_upgrade_flag_check() == UPGRADE_FLAG_START) { return false; } if (server == NULL) { UPGRADE_DBG("server is NULL\n"); return false; } if (upgrade_conn == NULL) { upgrade_conn = (struct espconn *)os_zalloc(sizeof(struct espconn)); } if (upgrade_conn != NULL) { upgrade_conn->proto.tcp = NULL; upgrade_conn->type = ESPCONN_TCP; upgrade_conn->state = ESPCONN_NONE; upgrade_conn->reverse = server; if (upgrade_conn->proto.tcp == NULL) { upgrade_conn->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); } if (upgrade_conn->proto.tcp != NULL) { upgrade_conn->proto.tcp->local_port = espconn_port(); upgrade_conn->proto.tcp->remote_port = server->port; os_memcpy(upgrade_conn->proto.tcp->remote_ip, server->ip, 4); UPGRADE_DBG("%s\n", __func__); upgrade_connect(server); if (server->check_cb != NULL) { os_timer_disarm(&upgrade_timer); os_timer_setfn(&upgrade_timer, (os_timer_func_t *)upgrade_check, server); os_timer_arm(&upgrade_timer, server->check_times, 0); } } } return true; }
/****************************************************************************** * FunctionName : upgrade_connect * Description : client connected with a host successfully * Parameters : arg -- Additional argument to pass to the callback function * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR upgrade_connect_cb(void *arg) { struct espconn *pespconn = arg; UPGRADE_DBG("upgrade_connect_cb\n"); os_timer_disarm(&upgrade_10s); espconn_regist_disconcb(pespconn, upgrade_disconcb); espconn_regist_sentcb(pespconn, upgrade_datasent); if (pbuf != NULL) { UPGRADE_DBG(pbuf); #ifdef UPGRADE_SSL_ENABLE espconn_secure_sent(pespconn, pbuf, os_strlen(pbuf)); #else espconn_sent(pespconn, pbuf, os_strlen(pbuf)); #endif } }
/****************************************************************************** * FunctionName : upgrade_connection * Description : connect with a server * Parameters : bin -- server number * url -- the url whitch upgrade files saved * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR upgrade_connect(struct upgrade_server_info *server){ UPGRADE_DBG("upgrade_connect\n"); pbuf = server->url; espconn_regist_connectcb(upgrade_conn, upgrade_connect_cb); espconn_regist_recvcb(upgrade_conn, upgrade_download); system_upgrade_init(); system_upgrade_flag_set(UPGRADE_FLAG_START); espconn_connect(upgrade_conn); os_timer_disarm(&upgrade_connect_timer); os_timer_setfn(&upgrade_connect_timer, (os_timer_func_t *)upgrade_connect_timeout_cb, upgrade_conn); os_timer_arm(&upgrade_connect_timer, 5000, 0); }
/****************************************************************************** * FunctionName : upgrade_connection * Description : connect with a server * Parameters : bin -- server number * url -- the url whitch upgrade files saved * Returns : none *******************************************************************************/ LOCAL void ICACHE_FLASH_ATTR upgrade_connect(struct upgrade_server_info *server) { UPGRADE_DBG("upgrade_connect\n"); pbuf = server->url; espconn_regist_connectcb(upgrade_conn, upgrade_connect_cb); espconn_regist_recvcb(upgrade_conn, upgrade_download); system_upgrade_init(); system_upgrade_flag_set(UPGRADE_FLAG_START); #ifdef UPGRADE_SSL_ENABLE espconn_secure_connect(upgrade_conn); #else espconn_connect(upgrade_conn); #endif os_timer_disarm(&upgrade_10s); os_timer_setfn(&upgrade_10s, (os_timer_func_t *)upgrade_10s_cb, upgrade_conn); os_timer_arm(&upgrade_10s, 10000, 0); }
//下载结果检查 LOCAL void ICACHE_FLASH_ATTR upgrade_check(struct upgrade_server_info *server){ UPGRADE_DBG("upgrade_check\n"); if (server == NULL) { return; } os_timer_disarm(&upgrade_timer); if (system_upgrade_flag_check() != UPGRADE_FLAG_FINISH) { totallength = 0; sumlength = 0; server->upgrade_flag = false; system_upgrade_flag_set(UPGRADE_FLAG_IDLE); } else { server->upgrade_flag = true; os_timer_disarm(&upgrade_timer); } upgrade_deinit(); if (server->check_cb != NULL) { server->check_cb(server); } espconn_disconnect(upgrade_conn); }
/****************************************************************************** * 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); } }