318 lines
10 KiB
C
318 lines
10 KiB
C
#include "ets_sys.h"
|
|
#include "osapi.h"
|
|
#include "os_type.h"
|
|
|
|
#include "lwip/err.h"
|
|
#include "lwip/ip_addr.h"
|
|
#include "lwip/mem.h"
|
|
#include "lwip/app/espconn.h"
|
|
|
|
#include "upgrade.h"
|
|
|
|
#include "upgrade_lib.c"
|
|
|
|
#define UPGRADE_DEBUG
|
|
#ifdef UPGRADE_DEBUG
|
|
#define UPGRADE_DBG os_printf
|
|
#else
|
|
#define UPGRADE_DBG
|
|
#endif
|
|
|
|
LOCAL struct espconn *upgrade_conn;
|
|
LOCAL uint8 *pbuf;
|
|
LOCAL os_timer_t upgrade_10s;
|
|
LOCAL os_timer_t upgrade_timer;
|
|
LOCAL uint32 totallength = 0;
|
|
LOCAL uint32 sumlength = 0;
|
|
|
|
/******************************************************************************
|
|
* FunctionName : upgrade_disconcb
|
|
* Description : The connection has been disconnected successfully.
|
|
* Parameters : arg -- Additional argument to pass to the callback function
|
|
* Returns : none
|
|
*******************************************************************************/
|
|
LOCAL void ICACHE_FLASH_ATTR
|
|
upgrade_disconcb(void *arg)
|
|
{
|
|
struct espconn *pespconn = arg;
|
|
|
|
if (pespconn == NULL) {
|
|
return;
|
|
}
|
|
|
|
os_free(pespconn->proto.tcp);
|
|
pespconn->proto.tcp = NULL;
|
|
os_free(pespconn);
|
|
pespconn = NULL;
|
|
upgrade_conn = NULL;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* FunctionName : upgrade_datasent
|
|
* Description : Data has been sent successfully,This means that more data can
|
|
* be sent.
|
|
* Parameters : arg -- Additional argument to pass to the callback function
|
|
* Returns : none
|
|
*******************************************************************************/
|
|
LOCAL void ICACHE_FLASH_ATTR
|
|
upgrade_datasent(void *arg)
|
|
{
|
|
struct espconn *pespconn = arg;
|
|
|
|
if (pespconn ->state == ESPCONN_CONNECT) {
|
|
}
|
|
}
|
|
|
|
/******************************************************************************
|
|
* FunctionName : upgrade_deinit
|
|
* Description : disconnect the connection with the host
|
|
* Parameters : bin -- server number
|
|
* Returns : none
|
|
*******************************************************************************/
|
|
void ICACHE_FLASH_ATTR
|
|
LOCAL upgrade_deinit(void)
|
|
{
|
|
if (system_upgrade_flag_check() != UPGRADE_FLAG_START) {
|
|
system_upgrade_deinit();
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/******************************************************************************
|
|
* FunctionName : upgrade_10s_cb
|
|
* Description : Processing the client when connected with host time out
|
|
* Parameters : pespconn -- A point to the host
|
|
* Returns : none
|
|
*******************************************************************************/
|
|
LOCAL void ICACHE_FLASH_ATTR upgrade_10s_cb(struct espconn *pespconn)
|
|
{
|
|
if (pespconn == NULL) {
|
|
return;
|
|
}
|
|
|
|
system_upgrade_deinit();
|
|
os_free(pespconn->proto.tcp);
|
|
pespconn->proto.tcp = NULL;
|
|
os_free(pespconn);
|
|
pespconn = NULL;
|
|
upgrade_conn = NULL;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* 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 : 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_10s);
|
|
|
|
espconn_regist_disconcb(pespconn, upgrade_disconcb);
|
|
espconn_regist_sentcb(pespconn, upgrade_datasent);
|
|
|
|
if (pbuf != NULL) {
|
|
UPGRADE_DBG("%s\n", 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);
|
|
|
|
#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);
|
|
}
|
|
|
|
/******************************************************************************
|
|
* 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
|
|
#ifdef UPGRADE_SSL_ENABLE
|
|
system_upgrade_start_ssl(struct upgrade_server_info *server)
|
|
#else
|
|
system_upgrade_start(struct upgrade_server_info *server)
|
|
#endif
|
|
{
|
|
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;
|
|
}
|