@ -18,6 +18,7 @@ Cgi/template routines for the /wifi url.
# include "cgiwifi.h"
# include "cgi.h"
# include "status.h"
# include "config.h"
# include "log.h"
//Enable this to disallow any changes in AP settings
@ -289,10 +290,7 @@ int ICACHE_FLASH_ATTR cgiWiFiConnect(HttpdConnData *connData) {
char essid [ 128 ] ;
char passwd [ 128 ] ;
if ( connData - > conn = = NULL ) {
//Connection aborted. Clean up.
return HTTPD_CGI_DONE ;
}
if ( connData - > conn = = NULL ) return HTTPD_CGI_DONE ;
int el = httpdFindArg ( connData - > getArgs , " essid " , essid , sizeof ( essid ) ) ;
int pl = httpdFindArg ( connData - > getArgs , " passwd " , passwd , sizeof ( passwd ) ) ;
@ -317,6 +315,104 @@ int ICACHE_FLASH_ATTR cgiWiFiConnect(HttpdConnData *connData) {
return HTTPD_CGI_DONE ;
}
static bool parse_ip ( char * buff , ip_addr_t * ip_ptr ) {
char * next = buff ; // where to start parsing next integer
int found = 0 ; // number of integers parsed
uint32_t ip = 0 ; // the ip addres parsed
for ( int i = 0 ; i < 32 ; i + + ) { // 32 is just a safety limit
char c = buff [ i ] ;
if ( c = = ' . ' | | c = = 0 ) {
// parse the preceding integer and accumulate into IP address
bool last = c = = 0 ;
buff [ i ] = 0 ;
uint32_t v = atoi ( next ) ;
ip = ip | ( ( v & 0xff ) < < ( found * 8 ) ) ;
next = buff + i + 1 ; // next integer starts after the '.'
found + + ;
if ( last ) { // if at end of string we better got 4 integers
ip_ptr - > addr = ip ;
return found = = 4 ;
}
continue ;
}
if ( c < ' 0 ' | | c > ' 9 ' ) return false ;
}
return false ;
}
# define DEBUGIP
# ifdef DEBUGIP
static void ICACHE_FLASH_ATTR debugIP ( ) {
struct ip_info info ;
if ( wifi_get_ip_info ( 0 , & info ) ) {
os_printf ( " \" ip \" : \" %d.%d.%d.%d \" \n " , IP2STR ( & info . ip . addr ) ) ;
os_printf ( " \" netmask \" : \" %d.%d.%d.%d \" \n " , IP2STR ( & info . netmask . addr ) ) ;
os_printf ( " \" gateway \" : \" %d.%d.%d.%d \" \n " , IP2STR ( & info . gw . addr ) ) ;
os_printf ( " \" hostname \" : \" %s \" " , flashConfig . hostname ) ;
} else {
os_printf ( " \" ip \" : \" -none- \" \n " ) ;
}
}
# endif
// Change special settings
int ICACHE_FLASH_ATTR cgiWiFiSpecial ( HttpdConnData * connData ) {
char hostname [ 32 ] ;
char staticip [ 32 ] ;
char netmask [ 32 ] ;
char gateway [ 32 ] ;
if ( connData - > conn = = NULL ) return HTTPD_CGI_DONE ;
// get args and their string lengths
int hl = httpdFindArg ( connData - > getArgs , " hostname " , hostname , sizeof ( hostname ) ) ;
int sl = httpdFindArg ( connData - > getArgs , " staticip " , staticip , sizeof ( staticip ) ) ;
int nl = httpdFindArg ( connData - > getArgs , " netmask " , netmask , sizeof ( netmask ) ) ;
int gl = httpdFindArg ( connData - > getArgs , " gateway " , gateway , sizeof ( gateway ) ) ;
if ( hl > = 0 & & sl > = 0 & & nl > = 0 & & gl > = 0 ) {
if ( sl > 0 ) {
// static IP overrides hostname (HDCP stuff)
wifi_station_dhcpc_stop ( ) ;
struct ip_info ipi ;
bool ok = parse_ip ( staticip , & ipi . ip ) ;
if ( nl > 0 ) ok = ok & & parse_ip ( netmask , & ipi . netmask ) ;
else IP4_ADDR ( & ipi . netmask , 255 , 255 , 255 , 0 ) ;
if ( gl > 0 ) ok = ok & & parse_ip ( gateway , & ipi . gw ) ;
else ipi . gw . addr = 0 ;
if ( ok ) {
os_printf ( " Setting static IP: %s \n " , staticip ) ;
ok = wifi_set_ip_info ( 0 , & ipi ) ;
if ( ok ) os_printf ( " Static IP set: %s \n " , staticip ) ;
# ifdef DEBUGIP
debugIP ( ) ;
# endif
jsonHeader ( connData , ok ? 200 : 400 ) ;
return HTTPD_CGI_DONE ;
}
} else {
// no static IP, set hostname
if ( hl = = 0 ) os_strcpy ( hostname , " esp-link " ) ;
if ( wifi_station_dhcpc_status ( ) = = DHCP_STARTED )
wifi_station_dhcpc_stop ( ) ;
bool hok = wifi_station_set_hostname ( hostname ) ;
if ( hok ) {
os_strcpy ( flashConfig . hostname , hostname ) ;
hok = hok & & configSave ( ) ;
}
hok = hok & & wifi_station_dhcpc_start ( ) ;
if ( hok ) os_printf ( " DHCP hostname set: %s \n " , hostname ) ;
jsonHeader ( connData , hok ? 200 : 400 ) ;
if ( ! hok ) httpdSend ( connData , " Error setting hostname or starting DHCP " , - 1 ) ;
return HTTPD_CGI_DONE ;
}
}
jsonHeader ( connData , 400 ) ;
httpdSend ( connData , " Cannot parse hostname or staticip " , - 1 ) ;
return HTTPD_CGI_DONE ;
}
//This cgi changes the operating mode: STA / AP / STA+AP
int ICACHE_FLASH_ATTR cgiWiFiSetMode ( HttpdConnData * connData ) {
int len ;
@ -386,9 +482,10 @@ int ICACHE_FLASH_ATTR printWifiInfo(char *buff) {
struct ip_info info ;
if ( wifi_get_ip_info ( 0 , & info ) ) {
len + = os_sprintf ( buff + len , " , \" ip \" : \" %d.%d.%d.%d \" " ,
( info . ip . addr > > 0 ) & 0xff , ( info . ip . addr > > 8 ) & 0xff ,
( info . ip . addr > > 16 ) & 0xff , ( info . ip . addr > > 24 ) & 0xff ) ;
len + = os_sprintf ( buff + len , " , \" ip \" : \" %d.%d.%d.%d \" " , IP2STR ( & info . ip . addr ) ) ;
len + = os_sprintf ( buff + len , " , \" netmask \" : \" %d.%d.%d.%d \" " , IP2STR ( & info . netmask . addr ) ) ;
len + = os_sprintf ( buff + len , " , \" gateway \" : \" %d.%d.%d.%d \" " , IP2STR ( & info . gw . addr ) ) ;
len + = os_sprintf ( buff + len , " , \" hostname \" : \" %s \" " , flashConfig . hostname ) ;
} else {
len + = os_sprintf ( buff + len , " , \" ip \" : \" -none- \" " ) ;
}
@ -449,7 +546,7 @@ int ICACHE_FLASH_ATTR cgiWifiInfo(HttpdConnData *connData) {
// Init the wireless, which consists of setting a timer if we expect to connect to an AP
// so we can revert to STA+AP mode if we can't connect.
void ICACHE_FLASH_ATTR wifiInit ( ) {
wifi_station_set_hostname ( " esp-link " ) ;
wifi_station_set_hostname ( flashConfig . hostname ) ;
int x = wifi_get_opmode ( ) & 0x3 ;
os_printf ( " Wifi init, mode=%s \n " , wifiMode [ x ] ) ;
wifi_set_phy_mode ( 2 ) ;