/** * Set up an access point * @param ssid Pointer to the SSID (max 63 char). * @param passphrase (for WPA2 min 8 char, for open use NULL) * @param channel WiFi channel number, 1 - 13. * @param ssid_hidden Network cloaking (0 = broadcast SSID, 1 = hide SSID) * @param max_connection Max simultaneous connected clients, 1 - 4. */ bool ESP8266WiFiAPClass::softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden, int max_connection) { if(!WiFi.enableAP(true)) { // enable AP failed DEBUG_WIFI("[AP] enableAP failed!\n"); return false; } if(!ssid || strlen(ssid) == 0 || strlen(ssid) > 31) { // fail SSID too long or missing! DEBUG_WIFI("[AP] SSID too long or missing!\n"); return false; } if(passphrase && strlen(passphrase) > 0 && (strlen(passphrase) > 63 || strlen(passphrase) < 8)) { // fail passphrase to long or short! DEBUG_WIFI("[AP] fail passphrase to long or short!\n"); return false; } bool ret = true; struct softap_config conf; strcpy(reinterpret_cast<char*>(conf.ssid), ssid); conf.channel = channel; conf.ssid_len = strlen(ssid); conf.ssid_hidden = ssid_hidden; conf.max_connection = max_connection; conf.beacon_interval = 100; if(!passphrase || strlen(passphrase) == 0) { conf.authmode = AUTH_OPEN; *conf.password = 0; } else { conf.authmode = AUTH_WPA2_PSK; strcpy(reinterpret_cast<char*>(conf.password), passphrase); } struct softap_config conf_compare; if(WiFi._persistent){ wifi_softap_get_config_default(&conf_compare); } else { wifi_softap_get_config(&conf_compare); } if(!softap_config_equal(conf, conf_compare)) { ETS_UART_INTR_DISABLE(); if(WiFi._persistent) { ret = wifi_softap_set_config(&conf); } else { ret = wifi_softap_set_config_current(&conf); } ETS_UART_INTR_ENABLE(); if(!ret) { DEBUG_WIFI("[AP] set_config failed!\n"); return false; } } else { DEBUG_WIFI("[AP] softap config unchanged\n"); } if(wifi_softap_dhcps_status() != DHCP_STARTED) { DEBUG_WIFI("[AP] DHCP not started, starting...\n"); if(!wifi_softap_dhcps_start()) { DEBUG_WIFI("[AP] wifi_softap_dhcps_start failed!\n"); ret = false; } } // check IP config struct ip_info ip; if(wifi_get_ip_info(SOFTAP_IF, &ip)) { if(ip.ip.addr == 0x00000000) { // Invalid config DEBUG_WIFI("[AP] IP config Invalid resetting...\n"); //192.168.244.1 , 192.168.244.1 , 255.255.255.0 ret = softAPConfig(0x01F4A8C0, 0x01F4A8C0, 0x00FFFFFF); if(!ret) { DEBUG_WIFI("[AP] softAPConfig failed!\n"); ret = false; } } } else { DEBUG_WIFI("[AP] wifi_get_ip_info failed!\n"); ret = false; } return ret; }
/* Init the wireless * * Call both Soft-AP and Station default config * Change values according to Makefile hard-coded variables * Anyway set wifi opmode to STA+AP, it will change to STA if CHANGE_TO_STA is set to yes in Makefile * Call a timer to check the STA connection */ void ICACHE_FLASH_ATTR wifiInit() { // Check the wifi opmode int x = wifi_get_opmode() & 0x3; // If STA is enabled switch to STA+AP to allow for recovery, it will then switch to STA-only // once it gets an IP address if (x == 1) wifi_set_opmode(3); // Call both STATION and SOFTAP default config wifi_station_get_config_default(&stconf); wifi_softap_get_config_default(&apconf); DBG("Wifi init, mode=%s\n",wifiMode[x]); // Change STATION parameters, if defined in the Makefile #if defined(STA_SSID) && defined(STA_PASS) // Set parameters if (os_strlen((char*)stconf.ssid) == 0 && os_strlen((char*)stconf.password) == 0) { os_strncpy((char*)stconf.ssid, VERS_STR(STA_SSID), 32); os_strncpy((char*)stconf.password, VERS_STR(STA_PASS), 64); wifi_set_opmode(3); DBG("Wifi pre-config trying to connect to AP %s pw %s\n",(char*)stconf.ssid, (char*)stconf.password); // wifi_set_phy_mode(2); // limit to 802.11b/g 'cause n is flaky stconf.bssid_set = 0; wifi_station_set_config(&stconf); } #endif // Change SOFT_AP settings, if defined in Makefile #if defined(AP_SSID) // Check if ssid and pass are alphanumeric values int ssidlen = os_strlen(VERS_STR(AP_SSID)); if(checkString(VERS_STR(AP_SSID)) && ssidlen > 7 && ssidlen < 32){ // Clean memory and set the value of SSID os_memset(apconf.ssid, 0, 32); os_memcpy(apconf.ssid, VERS_STR(AP_SSID), os_strlen(VERS_STR(AP_SSID))); // Specify the length of ssid apconf.ssid_len= ssidlen; #if defined(AP_PASS) // If pass is at least 8 and less than 64 int passlen = os_strlen(VERS_STR(AP_PASS)); if( checkString(VERS_STR(AP_PASS)) && passlen > 7 && passlen < 64 ){ // Clean memory and set the value of PASS os_memset(apconf.password, 0, 64); os_memcpy(apconf.password, VERS_STR(AP_PASS), passlen); // Can't choose auth mode without a valid ssid and password #ifdef AP_AUTH_MODE // If set, use specified auth mode if(AP_AUTH_MODE >= 0 && AP_AUTH_MODE <=4) apconf.authmode = AP_AUTH_MODE; #else // If not, use WPA2 apconf.authmode = AUTH_WPA_WPA2_PSK; #endif }else if ( passlen == 0){ // If ssid is ok and no pass, set auth open apconf.authmode = AUTH_OPEN; // Remove stored password os_memset(apconf.password, 0, 64); } #endif }// end of ssid and pass check #ifdef AP_SSID_HIDDEN // If set, use specified ssid hidden parameter if(AP_SSID_HIDDEN == 0 || AP_SSID_HIDDEN ==1) apconf.ssid_hidden = AP_SSID_HIDDEN; #endif #ifdef AP_MAX_CONN // If set, use specified max conn number if(AP_MAX_CONN > 0 && AP_MAX_CONN <5) apconf.max_connection = AP_MAX_CONN; #endif #ifdef AP_BEACON_INTERVAL // If set use specified beacon interval if(AP_BEACON_INTERVAL >= 100 && AP_BEACON_INTERVAL <= 60000) apconf.beacon_interval = AP_BEACON_INTERVAL; #endif // Check softap config bool softap_set_conf = wifi_softap_set_config(&apconf); // Debug info DBG("Wifi Soft-AP parameters change: %s\n",softap_set_conf? "success":"fail"); #endif // if defined(AP_SSID) configWifiIP(); // The default sleep mode should be modem_sleep, but we set it here explicitly for good // measure. We can't use light_sleep because that powers off everthing and we would loose // all connections. wifi_set_sleep_type(MODEM_SLEEP_T); wifi_set_event_handler_cb(wifiHandleEventCb); // check on the wifi in a few seconds to see whether we need to switch mode os_timer_disarm(&resetTimer); os_timer_setfn(&resetTimer, resetTimerCb, NULL); os_timer_arm(&resetTimer, RESET_TIMEOUT, 0); }