void ICACHE_FLASH_ATTR station_connect_status_check_timercb(void* _timer) { ETSTimer* timer = (ETSTimer*)_timer; os_printf("wifi_station_dhcpc_status: [%d]\n", wifi_station_dhcpc_status()); if(wifi_station_dhcpc_status() == DHCP_STOPPED && !wifi_station_dhcpc_start()) { os_printf("wifi_station_dhcpc_start error\n"); } os_printf("wifi station connect status: [%d]\n", wifi_station_get_connect_status()); if(wifi_station_get_connect_status() == STATION_GOT_IP && client_status != STATUS_CONNECTED) { os_printf("Connected to ROUTER, connecting to cloud\n"); connect_to_cloud(); client_status = STATUS_CONNECTING; } //连接成功后停止定时器 if(client_status == STATUS_CONNECTED) { os_timer_disarm(timer); } //如果系统模式非station模式,则停止 if(wifi_get_opmode() != STATION_MODE) { os_timer_disarm(timer); } }
struct netif * ICACHE_FLASH_ATTR eagle_lwip_if_alloc(struct ieee80211_conn *conn, uint8 *macaddr, struct ip_info *info) { struct netif *myif = conn->myif; if (myif == NULL) { myif = (void *) pvPortMalloc(sizeof(struct netif)); // SDK 1.1.2 : pvPortZalloc(64) conn->myif = myif; } if(myif == NULL) return NULL; if (conn->dhcps_if == 0) { // +176 if(default_hostname) { wifi_station_set_default_hostname(macaddr); } myif->hostname = hostname; // +40 } else myif->hostname = NULL; // +40 myif->state = conn; // +28 myif->name[0] = 'e'; // + 54 myif->name[1] = 'w'; // + 55 myif->output = etharp_output; // +20 myif->linkoutput = ieee80211_output_pbuf; // +24 ets_memcpy(myif->hwaddr, macaddr, 6); // +47 ETSEvent *queue = (void *) pvPortMalloc(sizeof(struct ETSEventTag) * QUEUE_LEN); // pvPortZalloc(80) if(queue == NULL) return NULL; if (conn->dhcps_if != 0) { // +176 lwip_if_queues[1] = queue; netif_set_addr(myif, &info->ip, &info->netmask, &info->gw); ets_task(task_if1, LWIP_IF1_PRIO, (ETSEvent *)lwip_if_queues[1], QUEUE_LEN); netif_add(myif, &info->ip, &info->netmask, &info->gw, conn, init_fn, ethernet_input); if(dhcps_flag) { dhcps_start(info); os_printf("dhcp server start:(ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR ")\n", IP2STR(&info->ip), IP2STR(&info->netmask), IP2STR(&info->gw)); } } else { lwip_if_queues[0] = queue; ets_task(task_if0, LWIP_IF0_PRIO, (ETSEvent *)lwip_if_queues[0], QUEUE_LEN); struct ip_info ipn; if(wifi_station_dhcpc_status()) { ipn.ip.addr = 0; ipn.netmask.addr = 0; ipn.gw.addr = 0; } else { ipn = *info; } netif_add(myif, &ipn.ip, &ipn.netmask, &ipn.gw, conn, init_fn, ethernet_input); } return myif; }
// configure Wifi, specifically DHCP vs static IP address based on flash config void ICACHE_FLASH_ATTR configWifiIP() { if (flashConfig.staticip == 0) { // let's DHCP! wifi_station_set_hostname(flashConfig.hostname); if (wifi_station_dhcpc_status() == DHCP_STARTED) wifi_station_dhcpc_stop(); wifi_station_dhcpc_start(); DBG("Wifi uses DHCP, hostname=%s\n", flashConfig.hostname); } else { // no DHCP, we got static network config! wifi_station_dhcpc_stop(); struct ip_info ipi; ipi.ip.addr = flashConfig.staticip; ipi.netmask.addr = flashConfig.netmask; ipi.gw.addr = flashConfig.gateway; wifi_set_ip_info(0, &ipi); DBG("Wifi uses static IP %d.%d.%d.%d\n", IP2STR(&ipi.ip.addr)); } #ifdef DEBUGIP debugIP(); #endif }
struct netif * ICACHE_FLASH_ATTR eagle_lwip_if_alloc(struct myif_state *state, u8_t hw[6], struct ip_info * ips) { #if 1 // optimize ... struct netif *myif = state->myif; if (myif == NULL) { myif = (void *) pvPortMalloc(sizeof(struct netif)); // pvPortZalloc(60) state->myif = myif; } myif->state = state; // +28 myif->name[0] = 'e'; // +50 myif->name[1] = 'w'; // +51 myif->linkoutput = ieee80211_output_pbuf; // +24 myif->output = etharp_output; // +20 ets_memcpy(myif->hwaddr, hw, 6); // +43 ETSEvent *queue = (void *) pvPortMalloc(sizeof(struct ETSEventTag) * QUEUE_LEN); // pvPortZalloc(80) if (state->dhcps_if != 0) { // +176 lwip_if_queues[1] = queue; netif_set_addr(myif, &ips->ip, &ips->netmask, &ips->gw); ets_task(task_if1, TASK_IF1_PRIO, (ETSEvent *)lwip_if_queues[1], QUEUE_LEN); netif_add(myif, &ips->ip, &ips->netmask, &ips->gw, state, init_fn, ethernet_input); if(dhcps_flag) { dhcps_start(ips); // os_printf("dhcp server start:(ip:%08x,mask:%08x,gw:%08x)\n", ips->ip.addr, ips->netmask.addr, ips->gw.addr); } } else { lwip_if_queues[0] = queue; ets_task(task_if0, TASK_IF0_PRIO, (ETSEvent *)lwip_if_queues[0], QUEUE_LEN); struct ip_info ipn; if(wifi_station_dhcpc_status()) { ipn = *ips; } else { ipn.ip.addr = 0; ipn.netmask.addr = 0; ipn.gw.addr = 0; } netif_add(myif, &ipn.ip, &ipn.netmask, &ipn.gw, state, init_fn, ethernet_input); } return myif; #else // source ETSEvent *queue; ip_addr_t ipaddr; ip_addr_t netmask; ip_addr_t gw; struct netif *myif = state->myif; if (myif == NULL) { myif = (void *) pvPortMalloc(sizeof(struct netif)); // pvPortZalloc(60) state->myif = myif; } myif->state = state; // +28 myif->name[0] = 'e'; // +50 myif->name[1] = 'w'; // +51 myif->linkoutput = ieee80211_output_pbuf; // +24 myif->output = etharp_output; // +20 ets_memcpy(myif->hwaddr, hw, 6); // +43 if (state->dhcps_if != 0) { // +176 ipaddr = ips->ip; netmask = ips->netmask; gw = ips->gw; netif_set_addr(myif, &ipaddr, &netmask, &gw); queue = (void *) pvPortMalloc(sizeof(struct ETSEventTag) * QUEUE_LEN); // pvPortZalloc(80) lwip_if_queues[1] = queue; ets_task(task_if1, TASK_IF1_PRIO, (ETSEvent *)queue, QUEUE_LEN); netif_add(myif, &ipaddr, &netmask, &gw, state, init_fn, ethernet_input); if(dhcps_flag) { dhcps_start(ips); // os_printf("dhcp server start:(ip:%08x,mask:%08x,gw:%08x)\n", ipaddr.addr, netmask.addr, gw.addr); } } else { if(wifi_station_dhcpc_status()) { ipaddr = ips->ip; netmask = ips->netmask; gw = ips->gw; } else { ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; } queue = (void *) pvPortMalloc(sizeof(struct ETSEventTag) * QUEUE_LEN); // pvPortZalloc(80) lwip_if_queues[0] = queue; ets_task(task_if0, TASK_IF0_PRIO, (ETSEvent *)queue, QUEUE_LEN); netif_add(myif, &ipaddr, &netmask, &gw, state, init_fn, ethernet_input); } return myif; #endif }
/****************************************************************************** * FunctionName : user_esp_platform_init * Description : device parame init based on espressif platform * Parameters : none * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR user_esp_platform_init(void) { os_sprintf(iot_version,"%s%d.%d.%dt%d(%s)",VERSION_TYPE,IOT_VERSION_MAJOR,\ IOT_VERSION_MINOR,IOT_VERSION_REVISION,device_type,UPGRADE_FALG); os_printf("IOT VERSION = %s\n",iot_version); system_param_load(ESP_PARAM_START_SEC, 0, &esp_param, sizeof(esp_param)); struct rst_info *rtc_info = system_get_rst_info(); os_printf("reset reason: %x\n", rtc_info->reason); if (rtc_info->reason == REASON_WDT_RST || rtc_info->reason == REASON_EXCEPTION_RST || rtc_info->reason == REASON_SOFT_WDT_RST) { if (rtc_info->reason == REASON_EXCEPTION_RST) { os_printf("Fatal exception (%d):\n", rtc_info->exccause); } os_printf("epc1=0x%08x, epc2=0x%08x, epc3=0x%08x, excvaddr=0x%08x, depc=0x%08x\n", rtc_info->epc1, rtc_info->epc2, rtc_info->epc3, rtc_info->excvaddr, rtc_info->depc); } /***add by tzx for saving ip_info to avoid dhcp_client start****/ struct dhcp_client_info dhcp_info; struct ip_info sta_info; system_rtc_mem_read(64,&dhcp_info,sizeof(struct dhcp_client_info)); if(dhcp_info.flag == 0x01 ) { if (true == wifi_station_dhcpc_status()) { wifi_station_dhcpc_stop(); } sta_info.ip = dhcp_info.ip_addr; sta_info.gw = dhcp_info.gw; sta_info.netmask = dhcp_info.netmask; if ( true != wifi_set_ip_info(STATION_IF,&sta_info)) { os_printf("set default ip wrong\n"); } } os_memset(&dhcp_info,0,sizeof(struct dhcp_client_info)); system_rtc_mem_write(64,&dhcp_info,sizeof(struct rst_info)); #if AP_CACHE wifi_station_ap_number_set(AP_CACHE_NUMBER); #endif #if 0 { char sofap_mac[6] = {0x16, 0x34, 0x56, 0x78, 0x90, 0xab}; char sta_mac[6] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab}; struct ip_info info; wifi_set_macaddr(SOFTAP_IF, sofap_mac); wifi_set_macaddr(STATION_IF, sta_mac); IP4_ADDR(&info.ip, 192, 168, 3, 200); IP4_ADDR(&info.gw, 192, 168, 3, 1); IP4_ADDR(&info.netmask, 255, 255, 255, 0); wifi_set_ip_info(STATION_IF, &info); IP4_ADDR(&info.ip, 10, 10, 10, 1); IP4_ADDR(&info.gw, 10, 10, 10, 1); IP4_ADDR(&info.netmask, 255, 255, 255, 0); wifi_set_ip_info(SOFTAP_IF, &info); } #endif if (esp_param.activeflag != 1) { #ifdef SOFTAP_ENCRYPT struct softap_config config; char password[33]; char macaddr[6]; wifi_softap_get_config(&config); wifi_get_macaddr(SOFTAP_IF, macaddr); os_memset(config.password, 0, sizeof(config.password)); os_sprintf(password, MACSTR "_%s", MAC2STR(macaddr), PASSWORD); os_memcpy(config.password, password, os_strlen(password)); config.authmode = AUTH_WPA_WPA2_PSK; wifi_softap_set_config(&config); #endif wifi_station_set_hostname( HOST_NAME ); wifi_set_opmode(STATION_MODE); } #if SENSOR_DEVICE user_sensor_init(esp_param.activeflag); #endif #if 0 if (wifi_get_opmode() != SOFTAP_MODE) { os_timer_disarm(&client_timer); os_timer_setfn(&client_timer, (os_timer_func_t *)user_esp_platform_check_ip, 1); os_timer_arm(&client_timer, 100, 0); } // 2015-12-27 single_key[0] = key_init_single( 12, PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12, NULL, GPIO_INTER); keys.key_num = 1; keys.single_key = single_key; key_init(&keys); #endif }