123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- #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;
- }
|