123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- /******************************************************************************
- * Copyright 2015-2018 Espressif Systems (Wuxi)
- *
- * FileName: user_main.c
- *
- * Description: entry file of user application
- *
- * Modification history:
- * 2015/3/06, v1.0 create this file.
- *******************************************************************************/
- #include "c_types.h"
- #include "user_interface.h"
- #include "espconn.h"
- #include "mem.h"
- #include "osapi.h"
- #include "upgrade.h"
- #ifdef AT_UPGRADE_SUPPORT
- #ifdef AT_CUSTOM_UPGRADE
- #define UPGRADE_FRAME "{\"path\": \"/v1/messages/\", \"method\": \"POST\", \"meta\": {\"Authorization\": \"token %s\"},\
- \"get\":{\"action\":\"%s\"},\"body\":{\"pre_rom_version\":\"%s\",\"rom_version\":\"%s\"}}\n"
- #define pheadbuffer "Connection: keep-alive\r\n\
- Cache-Control: no-cache\r\n\
- User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36 \r\n\
- Accept: */*\r\n\
- Accept-Encoding: gzip,deflate\r\n\
- Accept-Language: zh-CN,eb-US;q=0.8\r\n\r\n"
- /**/
- struct espconn *pespconn = NULL;
- struct upgrade_server_info *upServer = NULL;
- static os_timer_t at_delay_check;
- static struct espconn *pTcpServer = NULL;
- static ip_addr_t host_ip;
- /******************************************************************************
- * FunctionName : user_esp_platform_upgrade_cb
- * Description : Processing the downloaded data from the server
- * Parameters : pespconn -- the espconn used to connetion with the host
- * Returns : none
- *******************************************************************************/
- LOCAL void ICACHE_FLASH_ATTR
- at_upDate_rsp(void *arg)
- {
- struct upgrade_server_info *server = arg;
- if(server->upgrade_flag == true)
- {
- os_printf("device_upgrade_success\r\n");
- at_response_ok();
- system_upgrade_reboot();
- }
- else
- {
- os_printf("device_upgrade_failed\r\n");
- at_response_error();
- }
- os_free(server->url);
- server->url = NULL;
- os_free(server);
- server = NULL;
- }
- /**
- * @brief Tcp client disconnect success callback function.
- * @param arg: contain the ip link information
- * @retval None
- */
- static void ICACHE_FLASH_ATTR
- at_upDate_discon_cb(void *arg)
- {
- struct espconn *pespconn = (struct espconn *)arg;
- uint8_t idTemp = 0;
- if(pespconn->proto.tcp != NULL)
- {
- os_free(pespconn->proto.tcp);
- }
- if(pespconn != NULL)
- {
- os_free(pespconn);
- }
- os_printf("disconnect\r\n");
- if(system_upgrade_start(upServer) == false)
- {
- at_response_error();
- }
- else
- {
- at_port_print("+CIPUPDATE:4\r\n");
- }
- }
- /**
- * @brief Udp server receive data callback function.
- * @param arg: contain the ip link information
- * @retval None
- */
- LOCAL void ICACHE_FLASH_ATTR
- at_upDate_recv(void *arg, char *pusrdata, unsigned short len)
- {
- struct espconn *pespconn = (struct espconn *)arg;
- char temp[32] = {0};
- uint8_t user_bin[12] = {0};
- uint8_t i = 0;
- os_timer_disarm(&at_delay_check);
- at_port_print("+CIPUPDATE:3\r\n");
- upServer = (struct upgrade_server_info *)os_zalloc(sizeof(struct upgrade_server_info));
- upServer->upgrade_version[5] = '\0';
- upServer->pespconn = pespconn;
- os_memcpy(upServer->ip, pespconn->proto.tcp->remote_ip, 4);
- upServer->port = pespconn->proto.tcp->remote_port;
- upServer->check_cb = at_upDate_rsp;
- upServer->check_times = 60000;
- if(upServer->url == NULL)
- {
- upServer->url = (uint8 *) os_zalloc(1024);
- }
- if(system_upgrade_userbin_check() == UPGRADE_FW_BIN1)
- {
- os_memcpy(user_bin, "user2.bin", 10);
- }
- else if(system_upgrade_userbin_check() == UPGRADE_FW_BIN2)
- {
- os_memcpy(user_bin, "user1.bin", 10);
- }
- os_sprintf(upServer->url,
- "GET /%s HTTP/1.1\r\nHost: "IPSTR"\r\n"pheadbuffer"",
- user_bin, IP2STR(upServer->ip));
- }
- LOCAL void ICACHE_FLASH_ATTR
- at_upDate_wait(void *arg)
- {
- struct espconn *pespconn = arg;
- os_timer_disarm(&at_delay_check);
- if(pespconn != NULL)
- {
- espconn_disconnect(pespconn);
- }
- else
- {
- at_response_error();
- }
- }
- /******************************************************************************
- * FunctionName : user_esp_platform_sent_cb
- * Description : Data has been sent successfully and acknowledged by the remote host.
- * Parameters : arg -- Additional argument to pass to the callback function
- * Returns : none
- *******************************************************************************/
- LOCAL void ICACHE_FLASH_ATTR
- at_upDate_sent_cb(void *arg)
- {
- struct espconn *pespconn = arg;
- os_timer_disarm(&at_delay_check);
- os_timer_setfn(&at_delay_check, (os_timer_func_t *)at_upDate_wait, pespconn);
- os_timer_arm(&at_delay_check, 5000, 0);
- os_printf("at_upDate_sent_cb\r\n");
- }
- /**
- * @brief Tcp client connect success callback function.
- * @param arg: contain the ip link information
- * @retval None
- */
- static void ICACHE_FLASH_ATTR
- at_upDate_connect_cb(void *arg)
- {
- struct espconn *pespconn = (struct espconn *)arg;
- uint8_t user_bin[9] = {0};
- char *temp = NULL;
- at_port_print("+CIPUPDATE:2\r\n");
- espconn_regist_disconcb(pespconn, at_upDate_discon_cb);
- espconn_regist_recvcb(pespconn, at_upDate_recv);////////
- espconn_regist_sentcb(pespconn, at_upDate_sent_cb);
- temp = (uint8 *) os_zalloc(512);
- os_sprintf(temp,"GET /v1/device/rom/?is_format_simple=true HTTP/1.0\r\nHost: "IPSTR"\r\n"pheadbuffer"",
- IP2STR(pespconn->proto.tcp->remote_ip));
- espconn_sent(pespconn, temp, os_strlen(temp));
- os_free(temp);
- }
- /**
- * @brief Tcp client connect repeat callback function.
- * @param arg: contain the ip link information
- * @retval None
- */
- static void ICACHE_FLASH_ATTR
- at_upDate_recon_cb(void *arg, sint8 errType)
- {
- struct espconn *pespconn = (struct espconn *)arg;
- at_response_error();
- if(pespconn->proto.tcp != NULL)
- {
- os_free(pespconn->proto.tcp);
- }
- os_free(pespconn);
- os_printf("disconnect\r\n");
- if(upServer != NULL)
- {
- os_free(upServer);
- upServer = NULL;
- }
- at_response_error();
- }
- /******************************************************************************
- * FunctionName : upServer_dns_found
- * Description : dns found callback
- * Parameters : name -- pointer to the name that was looked up.
- * ipaddr -- pointer to an ip_addr_t containing the IP address of
- * the hostname, or NULL if the name could not be found (or on any
- * other error).
- * callback_arg -- a user-specified callback argument passed to
- * dns_gethostbyname
- * Returns : none
- *******************************************************************************/
- LOCAL void ICACHE_FLASH_ATTR
- upServer_dns_found(const char *name, ip_addr_t *ipaddr, void *arg)
- {
- struct espconn *pespconn = (struct espconn *) arg;
- // char temp[32];
- if(ipaddr == NULL)
- {
- at_response_error();
- return;
- }
- at_port_print("+CIPUPDATE:1\r\n");
- if(host_ip.addr == 0 && ipaddr->addr != 0)
- {
- if(pespconn->type == ESPCONN_TCP)
- {
- os_memcpy(pespconn->proto.tcp->remote_ip, &ipaddr->addr, 4);
- espconn_regist_connectcb(pespconn, at_upDate_connect_cb);
- espconn_regist_reconcb(pespconn, at_upDate_recon_cb);
- espconn_connect(pespconn);
- }
- }
- }
- void ICACHE_FLASH_ATTR
- at_exeCmdCiupdate(uint8_t id)
- {
- pespconn = (struct espconn *)os_zalloc(sizeof(struct espconn));
- pespconn->type = ESPCONN_TCP;
- pespconn->state = ESPCONN_NONE;
- pespconn->proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));
- pespconn->proto.tcp->local_port = espconn_port();
- pespconn->proto.tcp->remote_port = 80;
- host_ip.addr = ipaddr_addr("192.168.10.9");
- at_port_print("+CIPUPDATE:1\r\n");
- os_memcpy(pespconn->proto.tcp->remote_ip, &host_ip.addr, 4);
- espconn_regist_connectcb(pespconn, at_upDate_connect_cb);
- espconn_regist_reconcb(pespconn, at_upDate_recon_cb);
- espconn_connect(pespconn);
- }
- #endif
- #endif
|