Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: EDUVANCE_WIFI_SHIELD.cpp
- Revision:
- 0:c359fee24b6c
- Child:
- 1:52cad7057640
diff -r 000000000000 -r c359fee24b6c EDUVANCE_WIFI_SHIELD.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EDUVANCE_WIFI_SHIELD.cpp Sat May 28 13:59:48 2016 +0000 @@ -0,0 +1,488 @@ + +#include "mbed.h" +#include "EDUVANCE_WIFI_SHIELD.h" +//CONSTANTS FOR MODES +#define STATIONMODE 10 +#define APMODE 20 + +Serial pc(USBTX, USBRX);// COMPUTER DISPLAY +Serial esp(PTE0, PTE1); //ESP8266 SERIAL + +char ssid[32]; +char pwd[32]; + +const char ch = 's'; +char *getreq,*ssid_new,*pass_new,*left,*right; +//ADD DEVICES,PINS AND LEDS HERE +DigitalOut led1(LED_RED); + + + + + +Timer t1; +Timer t2; +int setval=0; + +int bufflen, DataRX, count, getcount, replycount, servreq, timeout; +int bufl, ipdLen, linkID, weberror, webcounter; + + +char webcount[8]; + +char timebuf[30]; +char type[16]; +char type1[16]; +char channel[2]; +char cmdbuff[32]; +char replybuff[512]; +char webdata[1024]; // This may need to be bigger depending on WEB browser used +char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added +int mode_sel=0; + +int port ; // set server port +int SERVtimeout =5; // set server timeout in seconds incase link breaks.void callback(void); + +//TAKES SSID, PASSWORD AND PORT ADDRESS +void get_ssid_pass(char ssid_f[32],char pass_f[32],int port_f){ + pc.printf("\n\r+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n"); + pc.printf("\n\r+++++++++++++++++++++ INITIALIZING ++++++++++++++++++++++++\r\n"); + pc.printf("\n\r+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n"); + pc.printf("\r\n SSID is %s, PASSWORD is %s, PORT number is %d \r\n",ssid_f,pass_f,port_f); + strcpy(ssid,ssid_f); + strcpy(pwd,pass_f); + port=port_f; + } + +//SETS BAUD RATE +void setbaudrate(int baud_f){ + pc.baud(baud_f); + esp.baud(baud_f); + } + +// Serial Interrupt read ESP data +void callback() { + while (esp.readable()) {webbuff[count] = esp.getc();count++;} + if(strlen(webbuff)>bufflen){DataRX=1;} + } +//SENDS COMMANDS TO ESP +void SendCMD(void){ + esp.printf("%s", cmdbuff); + } +//GETS REPLY IN THE FORM OF STRING +void getreply(void){ + memset(replybuff, '\0', sizeof(replybuff)); + t1.reset(); t1.start();replycount=0; + while(t1.read_ms()< timeout && replycount < getcount) { + if(esp.readable()) { + replybuff[replycount] = esp.getc();replycount++; + } + } + t1.stop(); + } + +//READ THE RESPONSE AND TRIGGERS THE ACTIONS [CONTROLS LEDS] +void ReadWebData() + { + wait_ms(200); + esp.attach(NULL); + count=0;DataRX=0;weberror=0; + memset(webdata, '\0', sizeof(webdata)); + + int x = strcspn (webbuff,"+"); + if(x){ + strcpy(webdata, webbuff + x);weberror=0; + int numMatched = sscanf(webdata,"+IPD,%d,%d:%s", &linkID, &ipdLen, type); + + + if( strstr(webdata, "led1=1") != NULL ) {led1=0;} + if( strstr(webdata, "led1=0") != NULL ) {led1=1;} + + sprintf(channel, "%d",linkID); + if (strstr(webdata, "GET") != NULL) {servreq=1;} + if (strstr(webdata, "POST") != NULL) {servreq=1;} + webcounter++; + sprintf(webcount, "%d",webcounter); + } + else { + memset(webbuff, '\0', sizeof(webbuff)); + esp.attach(&callback);weberror=1; + } +} + + + + +//READ THE RESPONSE AND TRIGGERS THE ACTIONS [CONTROLS LEDS] +void ReadWebData_register() + { + wait_ms(200); + esp.attach(NULL); + count=0;DataRX=0;weberror=0; + memset(webdata, '\0', sizeof(webdata)); + + int x = strcspn (webbuff,"+"); + if(x){ + strcpy(webdata, webbuff + x);weberror=0; + int numMatched = sscanf(webdata,"+IPD,%d,%d:%s", &linkID, &ipdLen, type); + + + //setval=1; + // if( strstr(webdata, "led1=1") != NULL ) {led1=0;} + // if( strstr(webdata, "led1=0") != NULL ) {led1=1;} + sprintf(channel, "%d",linkID); + if (strstr(webdata, "GET") != NULL) {servreq=1;} + if (strstr(webdata, "POST") != NULL) {servreq=1;} + webcounter++; + + sprintf(webcount, "%d",webcounter); + newcre(webdata); + } + else { + memset(webbuff, '\0', sizeof(webbuff)); + esp.attach(&callback);weberror=1; + } +} + + + + + +// Static WEB page TO DISPLAY +void sendpage() +{ +// WEB page data + strcpy(webbuff, "<!DOCTYPE html>"); + strcat(webbuff, "<html><head><title>ESP8266 Mbed</title></head>"); + strcat(webbuff, "<body>"); + + strcat(webbuff, "<p><form method=\"GET\"></p>"); + + + if(led1==1){strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" checked> Red LED off"); + strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" > Red LED on");} + else{strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" > Red LED off"); + strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" checked> Red LED on");} + + strcat(webbuff, "<p><input type=\"submit\" value=\"send-refresh\" ></form></p>"); + + + strcat(webbuff, "</body></html>"); +// end of WEB page data + bufl = strlen(webbuff); // get total page buffer length + sprintf(cmdbuff,"AT+CIPSEND=%d,%d\r\n", linkID, bufl); // send IPD link channel and buffer character length. + timeout=200;getcount=7; + SendCMD(); + getreply(); + SendWEB(); // send web page + memset(webbuff, '\0', sizeof(webbuff)); + sendcheck(); +} + +void sendpage_register() +{ +// WEB page data + strcpy(webbuff, "<!DOCTYPE html>"); + strcat(webbuff, "<html><head><title>ESP8266 Mbed</title></head>"); + strcat(webbuff, "<body>"); + + strcat(webbuff, "<form method=\"GET\">"); + + // strcat(webbuff, "<p><input type=\"radio\" name=\"led1\" value=\"0\" > Red LED off"); + // strcat(webbuff, "<br><input type=\"radio\" name=\"led1\" value=\"1\" checked> Red LED on"); + strcat(webbuff, "<input type=\"text\" name=\"ssid\"> ssid"); + strcat(webbuff, "<br><input type=\"text\" name=\"pass\" > password"); + + + + strcat(webbuff, "<input type=\"submit\" value=\"send-refresh\" >"); + strcat(webbuff,"</form>") ; + + + strcat(webbuff, "</body></html>"); +// end of WEB page data + bufl = strlen(webbuff); // get total page buffer length + sprintf(cmdbuff,"AT+CIPSEND=%d,%d\r\n", linkID, bufl); // send IPD link channel and buffer character length. + timeout=200;getcount=7; + SendCMD(); + getreply(); + SendWEB(); // send web page + memset(webbuff, '\0', sizeof(webbuff)); + sendcheck(); + + + +} + +// wait for ESP "SEND OK" reply, then close IP to load web page +void sendcheck() +{ + weberror=1;timeout=500;getcount=24; + t2.reset();t2.start(); + while(weberror==1 && t2.read() <5){ + getreply(); + if (strstr(replybuff, "SEND OK") != NULL) {weberror=0;} // wait for valid SEND OK + } + if(weberror==1){ // restart connection + strcpy(cmdbuff, "AT+CIPMUX=1\r\n"); + timeout=500;getcount=10; + SendCMD();getreply(); + sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port); + timeout=500;getcount=10; + SendCMD();getreply(); + } + else{ + sprintf(cmdbuff, "AT+CIPCLOSE=%s\r\n",channel); // close current connection + SendCMD();} + t2.reset(); +} + +// Large WEB buffer data send +void SendWEB() +{ + int i=0; + if(esp.writeable()) { + while(webbuff[i]!='\0') {esp.putc(webbuff[i]);i++;} + } +} + +void ATcheck(void){ +//FIRST AT COMMAND + pc.printf("\r\n++++++++++++++++++++ AT RESPONSE ESP ++++++++++++++++++++\r\n"); + strcpy(cmdbuff,"AT\r\n"); + timeout=8000; + getcount=1000; + SendCMD(); + getreply(); + pc.printf("%s\r\n",replybuff); + } + +void ATReset(void){ + //RESET ESP + pc.printf("+++++++++++++++++++++++++ Resetting ESP ++++++++++++++++++++++\r\n"); + strcpy(cmdbuff,"AT+RST\r\n"); + timeout=2000;getcount=600; + SendCMD(); + getreply(); + pc.printf(replybuff); + pc.printf("%d",count); + } + + void ListAccessPts(void){ +//list access points + pc.printf("++++++++++++++++++ Listing Access POINTS NEARBY +++++++++++++++\r\n"); + strcpy(cmdbuff,"AT+CWLAP\r\n"); + timeout=8000; + getcount=1000; + SendCMD(); + getreply(); + //strcpy(replybuff,"\0"); + pc.printf("%s\r\n",replybuff); + //const char *tempdata=replybuff; + //return replybuff; + if (strstr(cmdbuff, ssid) != NULL){mode_sel=STATIONMODE;} + else{mode_sel=APMODE;} + } + +void StationModeSet(void){ + //SET CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station) + pc.printf("+++++++++++++++++++ SETTING ESP IN STATION MODE +++++++++++++++++\r\n"); + strcpy(cmdbuff,"AT+CWMODE=1\r\n"); + timeout=8000; + getcount=1000; + SendCMD(); + getreply(); + pc.printf("%s\r\n",replybuff); + } + +void ApModeSet(void){ + //SET CWMODE to 1=Station,2=AP,3=BOTH, default mode 1 (Station) + pc.printf("+++++++++++++++++++++ SETTING ESP IN AP MODE +++++++++++++++++++\r\n"); + strcpy(cmdbuff,"AT+CWMODE=2\r\n"); + timeout=8000; + getcount=1000; + SendCMD(); + getreply(); + pc.printf("%s\r\n",replybuff); + } + +void ConnectWifiServer(void){ + + pc.printf("\n+++++++++++++++ Connecting to WIFI SERVER (AP) +++++++++++++++\r\n"); + pc.printf("ssid = %s pwd = %s\r\n",ssid,pwd); + strcpy(cmdbuff, "AT+CWJAP=\""); + strcat(cmdbuff, ssid); + strcat(cmdbuff, "\",\""); + strcat(cmdbuff, pwd); + strcat(cmdbuff, "\"\r\n"); + timeout=8000; + getcount=1000; + SendCMD(); + getreply(); + pc.printf("%s\r\n",cmdbuff); + } + +void Commtype(void){ + // set CIPMUX to 0=Single,1=Multi + pc.printf("+++++++++++++++++ Setting Connection of ESP in MULTI ++++++++++++++\r\n"); + strcpy(cmdbuff,"AT+CIPMUX=1\r\n"); + timeout=500; + getcount=10; + SendCMD(); + getreply(); + pc.printf("%s\r\n",replybuff); + } + +void StartServer_AT(void){ + //START SERVER + pc.printf("\n++++++++++++++++++++++ STARTING SERVER OF ESP +++++++++++++++++++\r\n"); + sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", port); + timeout=500;getcount=10; + SendCMD(); + getreply(); + sprintf(cmdbuff,"AT+CIPSTO=%d\r\n",SERVtimeout); + timeout=500;getcount=50; + SendCMD(); + getreply(); + } +void getIP(void){ + //GET IP + pc.printf("\n Getting Server IP \r\n"); + strcpy(cmdbuff, "AT+CIFSR\r\n"); + timeout=1000;getcount=50; + while(weberror==0){ + SendCMD();getreply(); + if (strstr(replybuff, "0.0.0.0") == NULL) {weberror=1;} // wait for valid IP + } + pc.printf("\n Enter WEB address in your browser \r\n\n"); + replybuff[strlen(replybuff) - 8] = '\0'; + char* IP = replybuff + 5; + sprintf(webdata," http://%s:%d", IP, port); + pc.printf(webdata); + } + +void finishup(void){ + //END PART + bufflen=200;count=0; + pc.printf("\n\n++++++++++++++++++++++++ READY ++++++++++++++++++++++++++\r\n\n"); + esp.attach(&callback); + } + + + +int startserver(void){ + ATcheck(); + ATReset(); + StationModeSet(); + + //list access points + pc.printf("++++++++++++++++++++++++ Listing Access ESP ++++++++++++++++++++++\r\n"); + strcpy(cmdbuff,"AT+CWLAP\r\n"); + timeout=8000; + getcount=1000; + SendCMD(); + getreply(); + pc.printf("%s\r\n",replybuff); + if (strstr(replybuff, ssid) != NULL) { + + t2.reset();t2.start(); + return 10; + } + else{ + t2.reset();t2.start(); + return 20; + } + + } + + + +void StationConfig(void){ + pc.printf("\n\r------------------- IN THE STATION MODE -------------------\r\n"); + StationModeSet(); + ConnectWifiServer(); + Commtype(); + StartServer_AT(); + getIP(); + finishup(); + } +void ApConfig(void){ + pc.printf("\n\r--------------------- IN THE AP MODE -----------------------\r\n"); + ApModeSet(); + Commtype(); + StartServer_AT(); + getIP(); + finishup(); + } +void request_fetch_station(void){ + + if(DataRX==1){ + ReadWebData(); + + if (servreq == 1 && weberror == 0){sendpage();} + esp.attach(&callback); + pc.printf(" IPD Data:\r\n\n Link ID = %d,\r\n IPD Header Length = %d \r\n IPD Type = %s\r\n", linkID, ipdLen, type); + pc.printf("\n\n HTTP Packet: \n\n%s\n", webdata); + pc.printf(" Web Characters sent : %d\n\n", bufl); + pc.printf(" -------------------------------------\n\n"); + //strcpy(lasthit, timebuf); + servreq=0; + } + } + + +void request_fetch_ap(void){ + if(DataRX==1){ + + + ReadWebData_register(); + + if (servreq == 1 && weberror == 0){sendpage_register();} + esp.attach(&callback); + pc.printf(" IPD Data:\r\n\n Link ID = %d,\r\n IPD Header Length = %d \r\n IPD Type = %s\r\n", linkID, ipdLen, type); + pc.printf("\n\n HTTP Packet: \n\n%s\n", webdata); + pc.printf(" Web Characters sent : %d\n\n", bufl); + pc.printf(" -------------------------------------\n\n"); + //strcpy(lasthit, timebuf); + + servreq=0; + + } + + } + +char* getname(char *strd,const char s[2],int part){ + char *temp; + char *token,*dataarr[2]; + int i=0; + + token = strtok(strd, s); + + while( token != NULL ) + { + dataarr[i]=token; + i++; + token = strtok(NULL, s); + } + + if(part==1){temp=dataarr[0];} + else if(part==2){temp=dataarr[1];} + return temp; + +} +void newcre(char webstring[]){ + // char webstring[]="http://192.168.4.1:8266/ssid=hellogfg&pwd=thisispwd"; + char *pass_l,*ssid_temp,*pass_temp; + getreq = strchr(webstring, ch); + pc.printf("\n\r Desired substring: %s\n\r", getreq); + + left = getname(getreq,"&",1); + right = getname(getreq,"&",2); + ssid_temp=getname(left,"=",2); + pass_l=getname(right,"=",2); + pass_temp=getname(pass_l," ",1); + pc.printf( "\n\r new ssid is %s\n", ssid_temp ); + pc.printf( "\n\r new password is %s\n", pass_temp ); + + + } \ No newline at end of file