|
|
|
@ -4,9 +4,12 @@ Some random cgi routines. |
|
|
|
|
|
|
|
|
|
#include <string.h> |
|
|
|
|
#include <osapi.h> |
|
|
|
|
#include "user_interface.h" |
|
|
|
|
#include "mem.h" |
|
|
|
|
#include "httpd.h" |
|
|
|
|
#include "cgi.h" |
|
|
|
|
#include "io.h" |
|
|
|
|
#include "espmissingincludes.h" |
|
|
|
|
|
|
|
|
|
int ICACHE_FLASH_ATTR cgiLed(HttpdConnData *connData) { |
|
|
|
|
int len; |
|
|
|
@ -18,33 +21,215 @@ int ICACHE_FLASH_ATTR cgiLed(HttpdConnData *connData) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
len=httpdFindArg(connData->postBuff, "led", buff, sizeof(buff)); |
|
|
|
|
ioLed(atoi(buff)); |
|
|
|
|
if (len!=0) ioLed(atoi(buff)); |
|
|
|
|
|
|
|
|
|
httpdRedirect(connData, "led.html"); |
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ICACHE_FLASH_ATTR cgiTest(HttpdConnData *connData) { |
|
|
|
|
|
|
|
|
|
//WiFi access point data
|
|
|
|
|
typedef struct { |
|
|
|
|
char ssid[32]; |
|
|
|
|
char rssi; |
|
|
|
|
char enc; |
|
|
|
|
} ApData; |
|
|
|
|
|
|
|
|
|
//Scan resolt
|
|
|
|
|
typedef struct { |
|
|
|
|
char scanInProgress; |
|
|
|
|
ApData **apData; |
|
|
|
|
int noAps; |
|
|
|
|
} ScanResultData; |
|
|
|
|
|
|
|
|
|
//Static scan status storage.
|
|
|
|
|
ScanResultData cgiWifiAps; |
|
|
|
|
|
|
|
|
|
void ICACHE_FLASH_ATTR wifiScanDoneCb(void *arg, STATUS status) { |
|
|
|
|
int n; |
|
|
|
|
struct bss_info *bss_link = (struct bss_info *)arg; |
|
|
|
|
os_printf("wifiScanDoneCb %d\n", status); |
|
|
|
|
if (status!=OK) { |
|
|
|
|
cgiWifiAps.scanInProgress=0; |
|
|
|
|
wifi_station_disconnect(); //test HACK
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//Clear prev ap data if needed.
|
|
|
|
|
if (cgiWifiAps.apData!=NULL) { |
|
|
|
|
for (n=0; n<cgiWifiAps.noAps; n++) os_free(cgiWifiAps.apData[n]); |
|
|
|
|
os_free(cgiWifiAps.apData); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//Count amount of access points found.
|
|
|
|
|
n=0; |
|
|
|
|
while (bss_link != NULL) { |
|
|
|
|
bss_link = bss_link->next.stqe_next; |
|
|
|
|
n++; |
|
|
|
|
} |
|
|
|
|
//Allocate memory for access point data
|
|
|
|
|
cgiWifiAps.apData=(ApData **)os_malloc(sizeof(ApData *)*n); |
|
|
|
|
cgiWifiAps.noAps=n; |
|
|
|
|
|
|
|
|
|
//Copy access point data to the static struct
|
|
|
|
|
n=0; |
|
|
|
|
bss_link = (struct bss_info *)arg; |
|
|
|
|
while (bss_link != NULL) { |
|
|
|
|
cgiWifiAps.apData[n]=(ApData *)os_malloc(sizeof(ApData)); |
|
|
|
|
cgiWifiAps.apData[n]->rssi=bss_link->rssi; |
|
|
|
|
cgiWifiAps.apData[n]->enc=bss_link->authmode; |
|
|
|
|
strncpy(cgiWifiAps.apData[n]->ssid, (char*)bss_link->ssid, 32); |
|
|
|
|
|
|
|
|
|
bss_link = bss_link->next.stqe_next; |
|
|
|
|
n++; |
|
|
|
|
} |
|
|
|
|
os_printf("Scan done: found %d APs\n", n); |
|
|
|
|
//We're done.
|
|
|
|
|
cgiWifiAps.scanInProgress=0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void ICACHE_FLASH_ATTR wifiStartScan() { |
|
|
|
|
int x; |
|
|
|
|
cgiWifiAps.scanInProgress=1; |
|
|
|
|
x=wifi_station_get_connect_status(); |
|
|
|
|
if (x!=STATION_GOT_IP) { |
|
|
|
|
//Unit probably is trying to connect to a bogus AP. This messes up scanning. Stop that.
|
|
|
|
|
os_printf("STA status = %d. Disconnecting STA...\n", x); |
|
|
|
|
wifi_station_disconnect(); |
|
|
|
|
} |
|
|
|
|
wifi_station_scan(NULL, wifiScanDoneCb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int ICACHE_FLASH_ATTR cgiWiFiScan(HttpdConnData *connData) { |
|
|
|
|
int len; |
|
|
|
|
char val1[128]; |
|
|
|
|
char val2[128]; |
|
|
|
|
int i; |
|
|
|
|
char buff[1024]; |
|
|
|
|
httpdStartResponse(connData, 200); |
|
|
|
|
httpdHeader(connData, "Content-Type", "text/json"); |
|
|
|
|
httpdEndHeaders(connData); |
|
|
|
|
|
|
|
|
|
if (cgiWifiAps.scanInProgress==1) { |
|
|
|
|
len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"1\"\n }\n}\n"); |
|
|
|
|
espconn_sent(connData->conn, (uint8 *)buff, len); |
|
|
|
|
} else { |
|
|
|
|
len=os_sprintf(buff, "{\n \"result\": { \n\"inProgress\": \"0\", \n\"APs\": [\n"); |
|
|
|
|
espconn_sent(connData->conn, (uint8 *)buff, len); |
|
|
|
|
if (cgiWifiAps.apData==NULL) cgiWifiAps.noAps=0; |
|
|
|
|
for (i=0; i<cgiWifiAps.noAps; i++) { |
|
|
|
|
len=os_sprintf(buff, "{\"essid\": \"%s\", \"rssi\": \"%d\", \"enc\": \"%d\"}%s\n",
|
|
|
|
|
cgiWifiAps.apData[i]->ssid, cgiWifiAps.apData[i]->rssi,
|
|
|
|
|
cgiWifiAps.apData[i]->enc, (i==cgiWifiAps.noAps-1)?"":","); |
|
|
|
|
espconn_sent(connData->conn, (uint8 *)buff, len); |
|
|
|
|
} |
|
|
|
|
len=os_sprintf(buff, "]\n}\n}\n"); |
|
|
|
|
espconn_sent(connData->conn, (uint8 *)buff, len); |
|
|
|
|
wifiStartScan(); |
|
|
|
|
} |
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct station_config stconf; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void ICACHE_FLASH_ATTR resetTimerCb(void *arg) { |
|
|
|
|
int x=wifi_station_get_connect_status(); |
|
|
|
|
if (x==STATION_GOT_IP) { |
|
|
|
|
//Go to STA mode. This needs a reset, so do that.
|
|
|
|
|
wifi_set_opmode(1); |
|
|
|
|
system_restart(); |
|
|
|
|
} else { |
|
|
|
|
os_printf("Connect fail. Not going into STA-only mode.\n"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void ICACHE_FLASH_ATTR reassTimerCb(void *arg) { |
|
|
|
|
int x; |
|
|
|
|
static ETSTimer resetTimer; |
|
|
|
|
wifi_station_disconnect(); |
|
|
|
|
wifi_station_set_config(&stconf); |
|
|
|
|
wifi_station_connect(); |
|
|
|
|
x=wifi_get_opmode(); |
|
|
|
|
if (x!=1) { |
|
|
|
|
//Schedule disconnect/connect
|
|
|
|
|
os_timer_disarm(&resetTimer); |
|
|
|
|
os_timer_setfn(&resetTimer, resetTimerCb, NULL); |
|
|
|
|
os_timer_arm(&resetTimer, 4000, 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ICACHE_FLASH_ATTR cgiWiFiConnect(HttpdConnData *connData) { |
|
|
|
|
char essid[128]; |
|
|
|
|
char passwd[128]; |
|
|
|
|
static ETSTimer reassTimer; |
|
|
|
|
|
|
|
|
|
if (connData->conn==NULL) { |
|
|
|
|
//Connection aborted. Clean up.
|
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
httpdFindArg(connData->postBuff, "essid", essid, sizeof(essid)); |
|
|
|
|
httpdFindArg(connData->postBuff, "passwd", passwd, sizeof(passwd)); |
|
|
|
|
|
|
|
|
|
os_strncpy((char*)stconf.ssid, essid, 32); |
|
|
|
|
os_strncpy((char*)stconf.password, passwd, 64); |
|
|
|
|
|
|
|
|
|
//Schedule disconnect/connect
|
|
|
|
|
os_timer_disarm(&reassTimer); |
|
|
|
|
os_timer_setfn(&reassTimer, reassTimerCb, NULL); |
|
|
|
|
os_timer_arm(&reassTimer, 1000, 0); |
|
|
|
|
|
|
|
|
|
httpdRedirect(connData, "connecting.html"); |
|
|
|
|
|
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//Cgi that reads the SPI flash. Assumes 512KByte flash.
|
|
|
|
|
int ICACHE_FLASH_ATTR cgiReadFlash(HttpdConnData *connData) { |
|
|
|
|
int *pos=(int *)&connData->cgiData; |
|
|
|
|
if (connData->conn==NULL) { |
|
|
|
|
//Connection aborted. Clean up.
|
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (*pos==0) { |
|
|
|
|
os_printf("Start flash download.\n"); |
|
|
|
|
httpdStartResponse(connData, 200); |
|
|
|
|
httpdHeader(connData, "Content-Type", "text/plain"); |
|
|
|
|
httpdHeader(connData, "Content-Type", "application/bin"); |
|
|
|
|
httpdEndHeaders(connData); |
|
|
|
|
*pos=0x40200000; |
|
|
|
|
return HTTPD_CGI_MORE; |
|
|
|
|
} |
|
|
|
|
espconn_sent(connData->conn, (uint8 *)(*pos), 1024); |
|
|
|
|
*pos+=1024; |
|
|
|
|
if (*pos>=0x40200000+(512*1024)) return HTTPD_CGI_DONE; else return HTTPD_CGI_MORE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ICACHE_FLASH_ATTR cgiTest(HttpdConnData *connData) { |
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
httpdFindArg(connData->postBuff, "Test1", val1, sizeof(val1)); |
|
|
|
|
httpdFindArg(connData->postBuff, "Test2", val2, sizeof(val2)); |
|
|
|
|
len=os_sprintf(buff, "Field 1: %s\nField 2: %s\n", val1, val2); |
|
|
|
|
espconn_sent(connData->conn, (uint8 *)buff, len); |
|
|
|
|
|
|
|
|
|
return HTTPD_CGI_DONE; |
|
|
|
|
void ICACHE_FLASH_ATTR tplWlan(HttpdConnData *connData, char *token, void **arg) { |
|
|
|
|
char buff[1024]; |
|
|
|
|
int x; |
|
|
|
|
static struct station_config stconf; |
|
|
|
|
if (token==NULL) return; |
|
|
|
|
wifi_station_get_config(&stconf); |
|
|
|
|
|
|
|
|
|
os_strcpy(buff, "Unknown"); |
|
|
|
|
if (os_strcmp(token, "WiFiMode")==0) { |
|
|
|
|
x=wifi_get_opmode(); |
|
|
|
|
if (x==1) os_strcpy(buff, "Client"); |
|
|
|
|
if (x==2) os_strcpy(buff, "SoftAP"); |
|
|
|
|
if (x==3) os_strcpy(buff, "STA+AP"); |
|
|
|
|
} else if (os_strcmp(token, "currSsid")==0) { |
|
|
|
|
os_strcpy(buff, (char*)stconf.ssid); |
|
|
|
|
} else if (os_strcmp(token, "WiFiPasswd")==0) { |
|
|
|
|
os_strcpy(buff, (char*)stconf.password); |
|
|
|
|
} |
|
|
|
|
espconn_sent(connData->conn, (uint8 *)buff, os_strlen(buff)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|