Library für ESP01 Webserver STM32F103RB Nucleo

Dependents:   Nucleo_dht11_Webserver WebServerGSOEWorkshopSlider WebServerGSOEWorkshopDynamisch WebServerGSOEWorkshopStatisch ... more

Committer:
jack1930
Date:
Fri Jul 23 11:23:04 2021 +0000
Revision:
19:e0bcbb2a3480
Parent:
17:87c762acb8d0
Child:
20:7924d3383786
update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jack1930 13:ed5c59ed4ae5 1 #include "ESP8266Webserver.h"
jack1930 16:b09391fb73b4 2 //#include "string"
jack1930 13:ed5c59ed4ae5 3
jack1930 14:d17cfd8131b1 4 ESP8266Webserver::ESP8266Webserver()
jack1930 13:ed5c59ed4ae5 5 {
jack1930 17:87c762acb8d0 6 bool erg;
jack1930 13:ed5c59ed4ae5 7 //HAL_Delay(1000);
jack1930 19:e0bcbb2a3480 8 DigitalOut ch_pd(CH_PD);
jack1930 19:e0bcbb2a3480 9 DigitalOut rst(RST);
jack1930 19:e0bcbb2a3480 10 ch_pd=1;
jack1930 19:e0bcbb2a3480 11 rst=0;
jack1930 19:e0bcbb2a3480 12 HAL_Delay(100);
jack1930 19:e0bcbb2a3480 13 rst=1;
jack1930 13:ed5c59ed4ae5 14 hs_count=0;
jack1930 13:ed5c59ed4ae5 15 clientIdx=0;
jack1930 13:ed5c59ed4ae5 16 if (pDebug) printf("\nATCmdParser with ESP8266 example");
jack1930 13:ed5c59ed4ae5 17 port=Port;
jack1930 13:ed5c59ed4ae5 18
jack1930 13:ed5c59ed4ae5 19 dbg=pDebug;
jack1930 13:ed5c59ed4ae5 20 _serial = new BufferedSerial(tx,rx, ESP8266_DEFAULT_BAUD_RATE);
jack1930 13:ed5c59ed4ae5 21 _parser = new ATCmdParser(_serial, "\r\n");
jack1930 17:87c762acb8d0 22 _parser->debug_on(true);
jack1930 13:ed5c59ed4ae5 23
jack1930 17:87c762acb8d0 24 _parser->set_timeout(2000);
jack1930 13:ed5c59ed4ae5 25
jack1930 13:ed5c59ed4ae5 26 //AT
jack1930 13:ed5c59ed4ae5 27 if (pDebug) printf("\nATCmdParser: AT\r\n");
jack1930 13:ed5c59ed4ae5 28 _parser->send("AT");
jack1930 13:ed5c59ed4ae5 29
jack1930 13:ed5c59ed4ae5 30 if (_parser->recv("OK")) {
jack1930 13:ed5c59ed4ae5 31 if (pDebug) printf("\nAntw.: OK\r\n");
jack1930 13:ed5c59ed4ae5 32 } else {
jack1930 17:87c762acb8d0 33 printf("\nATCmdParser: AT OK failed\r\n");
jack1930 13:ed5c59ed4ae5 34 }
jack1930 15:e710f0431920 35
jack1930 15:e710f0431920 36 if (station==true)
jack1930 15:e710f0431920 37 {
jack1930 15:e710f0431920 38 listAPs();
jack1930 15:e710f0431920 39 printf("%s",ipadr);
jack1930 15:e710f0431920 40 }
jack1930 15:e710f0431920 41 else {
jack1930 15:e710f0431920 42 _parser->send("ATE0");
jack1930 15:e710f0431920 43 strcpy(ipadr,ip);
jack1930 13:ed5c59ed4ae5 44
jack1930 15:e710f0431920 45 if (pDebug) printf("\nATCmdParser: //AT+CWMODE=2 \r\n");
jack1930 17:87c762acb8d0 46
jack1930 15:e710f0431920 47 _parser->send("AT+CWMODE=2");
jack1930 17:87c762acb8d0 48 HAL_Delay(1000);
jack1930 15:e710f0431920 49
jack1930 15:e710f0431920 50 if (_parser->recv("OK")) {
jack1930 15:e710f0431920 51 if (pDebug) printf("\nAntw.: OK\r\n");
jack1930 15:e710f0431920 52 } else {
jack1930 17:87c762acb8d0 53 printf("\nATCmdParser: AT+CWMODE=2 OK failed\r\n");
jack1930 15:e710f0431920 54 }
jack1930 15:e710f0431920 55
jack1930 13:ed5c59ed4ae5 56 //AT+CWMODE?
jack1930 13:ed5c59ed4ae5 57 if (pDebug) printf("\nATCmdParser: //AT+CWMODE? \r\n");
jack1930 17:87c762acb8d0 58
jack1930 13:ed5c59ed4ae5 59 _parser->send("AT+CWMODE?");
jack1930 13:ed5c59ed4ae5 60
jack1930 13:ed5c59ed4ae5 61 if (_parser->recv("OK")) {
jack1930 13:ed5c59ed4ae5 62 if (pDebug) printf("\nAntw.: OK\r\n");
jack1930 13:ed5c59ed4ae5 63 } else {
jack1930 17:87c762acb8d0 64 printf("\nATCmdParser: AT+CWMODE? OK failed\r\n");
jack1930 13:ed5c59ed4ae5 65 }
jack1930 13:ed5c59ed4ae5 66
jack1930 17:87c762acb8d0 67
jack1930 17:87c762acb8d0 68 //AT+CIPAP="192.168.5.1","192.168.5.1","255.255.255.0"
jack1930 15:e710f0431920 69 if (pDebug) printf("\nATCmdParser: //AT+CIPAP=\"%s\",\"%s\",\"%s\" \r\n",ipad.c_str(),ipad.c_str(),netzmaske);
jack1930 17:87c762acb8d0 70 do
jack1930 17:87c762acb8d0 71 {
jack1930 17:87c762acb8d0 72 _parser->send("AT+CIPAP=\"%s\",\"%s\",\"%s\"",ipad.c_str(),ipad.c_str(),netzmaske);
jack1930 17:87c762acb8d0 73 erg=_parser->recv("OK");
jack1930 17:87c762acb8d0 74 if (erg==true) {
jack1930 17:87c762acb8d0 75 if (pDebug) printf("\nAntw.: OK\r\n");
jack1930 17:87c762acb8d0 76 } else {
jack1930 17:87c762acb8d0 77 printf("\nATCmdParser: AT+CIPAP OK failed\r\n");
jack1930 17:87c762acb8d0 78 HAL_Delay(1000);
jack1930 17:87c762acb8d0 79 }
jack1930 17:87c762acb8d0 80 }
jack1930 17:87c762acb8d0 81 while (erg==false);
jack1930 15:e710f0431920 82
jack1930 15:e710f0431920 83
jack1930 13:ed5c59ed4ae5 84
jack1930 13:ed5c59ed4ae5 85 //AT+CIPMUX=1
jack1930 13:ed5c59ed4ae5 86 if (pDebug) printf("\nATCmdParser: //AT+CIPMUX=1");
jack1930 13:ed5c59ed4ae5 87 _parser->send("AT+CIPMUX=1");
jack1930 13:ed5c59ed4ae5 88
jack1930 13:ed5c59ed4ae5 89 if (_parser->recv("OK")) {
jack1930 13:ed5c59ed4ae5 90 if (pDebug) printf("\nAntw.: OK\r\n");
jack1930 13:ed5c59ed4ae5 91 } else {
jack1930 17:87c762acb8d0 92 printf("\nATCmdParser: AT+CIPMUX=1 OK failed\r\n");
jack1930 13:ed5c59ed4ae5 93 }
jack1930 15:e710f0431920 94 }
jack1930 13:ed5c59ed4ae5 95 }
jack1930 13:ed5c59ed4ae5 96
jack1930 13:ed5c59ed4ae5 97 int ESP8266Webserver::on(const char* handlestring,Callback< void()> func)
jack1930 13:ed5c59ed4ae5 98 {
jack1930 13:ed5c59ed4ae5 99 if (hs_count>9) return -1;
jack1930 13:ed5c59ed4ae5 100 else
jack1930 13:ed5c59ed4ae5 101 {
jack1930 13:ed5c59ed4ae5 102 strcpy(hs[hs_count],handlestring);
jack1930 13:ed5c59ed4ae5 103 if (dbg) printf("\r\n\r\n%s, %s\r\n",handlestring,hs[hs_count]);
jack1930 13:ed5c59ed4ae5 104 cbs[hs_count]=func;
jack1930 13:ed5c59ed4ae5 105 hs_count++;
jack1930 13:ed5c59ed4ae5 106 return 0;
jack1930 13:ed5c59ed4ae5 107 }
jack1930 13:ed5c59ed4ae5 108
jack1930 13:ed5c59ed4ae5 109 }
jack1930 13:ed5c59ed4ae5 110
jack1930 13:ed5c59ed4ae5 111 int ESP8266Webserver::begin(void)
jack1930 13:ed5c59ed4ae5 112 {
jack1930 13:ed5c59ed4ae5 113 //AT+CIPSERVER=1,80
jack1930 15:e710f0431920 114 if (dbg) printf("\nATCmdParser: //AT+CIPSERVER=1,%d",Port);
jack1930 15:e710f0431920 115 _parser->send("AT+CIPSERVER=1,%d",Port);
jack1930 13:ed5c59ed4ae5 116 if (_parser->recv("OK")) {
jack1930 13:ed5c59ed4ae5 117 if (dbg) printf("\nAntw.: OK\r\n");
jack1930 13:ed5c59ed4ae5 118 return 0;
jack1930 13:ed5c59ed4ae5 119 } else {
jack1930 17:87c762acb8d0 120 printf("\nATCmdParser: AT+CIPSERVER=1 OK failed\r\n");
jack1930 13:ed5c59ed4ae5 121 return -1;
jack1930 13:ed5c59ed4ae5 122 }
jack1930 13:ed5c59ed4ae5 123 }
jack1930 13:ed5c59ed4ae5 124
jack1930 13:ed5c59ed4ae5 125 //durchsucht recbuf nach suchstring
jack1930 13:ed5c59ed4ae5 126 bool ESP8266Webserver::beinhaltet(char* suchstring)
jack1930 13:ed5c59ed4ae5 127 {
jack1930 13:ed5c59ed4ae5 128 char* referer;
jack1930 13:ed5c59ed4ae5 129 char* fundort;
jack1930 13:ed5c59ed4ae5 130 char* favicon;
jack1930 13:ed5c59ed4ae5 131 favicon=strstr(recbuf,"favicon");
jack1930 13:ed5c59ed4ae5 132 if (favicon!=NULL) return false;
jack1930 13:ed5c59ed4ae5 133 referer=strstr(recbuf,"Referer");
jack1930 13:ed5c59ed4ae5 134 fundort=strstr(recbuf, suchstring);
jack1930 13:ed5c59ed4ae5 135 if (strstr(recbuf,"ERROR")==NULL)
jack1930 13:ed5c59ed4ae5 136 if( fundort != NULL&&(fundort<referer||referer==NULL)) return true;
jack1930 13:ed5c59ed4ae5 137 return false;
jack1930 13:ed5c59ed4ae5 138 }
jack1930 13:ed5c59ed4ae5 139
jack1930 13:ed5c59ed4ae5 140 int ESP8266Webserver::handleClient(void)
jack1930 13:ed5c59ed4ae5 141 {
jack1930 13:ed5c59ed4ae5 142 int value,value2;
jack1930 13:ed5c59ed4ae5 143 if (_serial->readable())
jack1930 13:ed5c59ed4ae5 144 {
jack1930 16:b09391fb73b4 145 if (_parser->recv("+IPD,%d,%d:",&clientID[clientIdx],&value2))
jack1930 13:ed5c59ed4ae5 146 {
jack1930 13:ed5c59ed4ae5 147 if (dbg) printf("\r\nich Client ID=%d, Anzahl=%d",clientID[clientIdx],value2);
jack1930 13:ed5c59ed4ae5 148 _parser->read(recbuf, value2);
jack1930 13:ed5c59ed4ae5 149
jack1930 13:ed5c59ed4ae5 150 if (dbg) printf("\r\nBuf=\n%s",recbuf);
jack1930 13:ed5c59ed4ae5 151
jack1930 13:ed5c59ed4ae5 152 gefunden=false;
jack1930 13:ed5c59ed4ae5 153 for (int i=0;i<hs_count&&!gefunden;i++)
jack1930 16:b09391fb73b4 154 {
jack1930 13:ed5c59ed4ae5 155 if (beinhaltet(hs[i]))
jack1930 16:b09391fb73b4 156 {
jack1930 16:b09391fb73b4 157 (cbs[i])();
jack1930 13:ed5c59ed4ae5 158 gefunden=true;
jack1930 13:ed5c59ed4ae5 159 }
jack1930 13:ed5c59ed4ae5 160 }
jack1930 13:ed5c59ed4ae5 161 if (dbg) for (int i=0;i<hs_count;i++)
jack1930 13:ed5c59ed4ae5 162 {
jack1930 13:ed5c59ed4ae5 163 printf("\r\n%s\r\n",hs[i]);
jack1930 16:b09391fb73b4 164 }
jack1930 13:ed5c59ed4ae5 165 if (dbg) printf("\r\nich Got\r\n");
jack1930 16:b09391fb73b4 166 }
jack1930 13:ed5c59ed4ae5 167 }
jack1930 13:ed5c59ed4ae5 168
jack1930 13:ed5c59ed4ae5 169 return 0;
jack1930 13:ed5c59ed4ae5 170 }
jack1930 13:ed5c59ed4ae5 171
jack1930 13:ed5c59ed4ae5 172
jack1930 13:ed5c59ed4ae5 173 int ESP8266Webserver::send(int HTTPStatus,const char* Mimetype, string webseite)
jack1930 13:ed5c59ed4ae5 174 {
jack1930 13:ed5c59ed4ae5 175 return ESP8266Webserver::send(HTTPStatus,Mimetype, webseite.c_str());
jack1930 13:ed5c59ed4ae5 176 }
jack1930 16:b09391fb73b4 177
jack1930 13:ed5c59ed4ae5 178 int ESP8266Webserver::send(int HTTPStatus,const char* Mimetype, const char* webseite)
jack1930 13:ed5c59ed4ae5 179 {
jack1930 13:ed5c59ed4ae5 180 char hilf[40];
jack1930 13:ed5c59ed4ae5 181
jack1930 16:b09391fb73b4 182 //printf("\r\nHallo\r\n");
jack1930 13:ed5c59ed4ae5 183 Aufrufe++;
jack1930 13:ed5c59ed4ae5 184 sprintf(sendstring,"HTTP/1.1 %d OK\n",HTTPStatus);
jack1930 13:ed5c59ed4ae5 185 strcat(sendstring,"Date: Wed, 23 Apr 2021 04:36:25 GMT\n");
jack1930 13:ed5c59ed4ae5 186 strcat(sendstring,"Connection: close\n");
jack1930 13:ed5c59ed4ae5 187 strcat(sendstring,"Content-Type: ");
jack1930 13:ed5c59ed4ae5 188 strcat(sendstring,Mimetype);
jack1930 13:ed5c59ed4ae5 189 strcat(sendstring,"\n");
jack1930 13:ed5c59ed4ae5 190 sprintf(hilf,"%d",strlen(webseite));
jack1930 13:ed5c59ed4ae5 191 strcat(sendstring,"Content-Length: ");
jack1930 13:ed5c59ed4ae5 192 strcat(sendstring,hilf);
jack1930 13:ed5c59ed4ae5 193 strcat(sendstring,"\n\n");
jack1930 13:ed5c59ed4ae5 194 strcat(sendstring,webseite);
jack1930 13:ed5c59ed4ae5 195 if (dbg) printf("len=%d, inhalt=\n%s",strlen(sendstring),sendstring);
jack1930 16:b09391fb73b4 196
jack1930 13:ed5c59ed4ae5 197 _parser->debug_on(true);
jack1930 13:ed5c59ed4ae5 198 _parser->send("AT+CIPSEND=%d,%d",clientID[clientIdx],strlen(sendstring));
jack1930 13:ed5c59ed4ae5 199 _parser->debug_on(false);
jack1930 13:ed5c59ed4ae5 200 _parser->write(sendstring,strlen(sendstring));
jack1930 13:ed5c59ed4ae5 201 HAL_Delay(200);
jack1930 13:ed5c59ed4ae5 202 _parser->send("AT+CIPCLOSE=%d",clientID[clientIdx]);
jack1930 13:ed5c59ed4ae5 203 return 0;
jack1930 13:ed5c59ed4ae5 204 }
jack1930 13:ed5c59ed4ae5 205
jack1930 13:ed5c59ed4ae5 206 void ESP8266Webserver::debugOn(bool pD)
jack1930 13:ed5c59ed4ae5 207 {
jack1930 13:ed5c59ed4ae5 208 dbg=pD;
jack1930 16:b09391fb73b4 209 _parser->debug_on(pD);
jack1930 13:ed5c59ed4ae5 210 }
jack1930 13:ed5c59ed4ae5 211
jack1930 16:b09391fb73b4 212 const char* ESP8266Webserver::gibWert(string suchstring)
jack1930 13:ed5c59ed4ae5 213 {
jack1930 13:ed5c59ed4ae5 214 return ESP8266Webserver::gibWert(suchstring.c_str());
jack1930 13:ed5c59ed4ae5 215 }
jack1930 13:ed5c59ed4ae5 216
jack1930 13:ed5c59ed4ae5 217 const char* ESP8266Webserver::gibWert(const char* suchstring)
jack1930 13:ed5c59ed4ae5 218 {
jack1930 13:ed5c59ed4ae5 219 static char hilf[20];
jack1930 13:ed5c59ed4ae5 220
jack1930 13:ed5c59ed4ae5 221 char *fundort;
jack1930 13:ed5c59ed4ae5 222 int i=0;
jack1930 13:ed5c59ed4ae5 223 fundort=strstr(recbuf,suchstring);
jack1930 13:ed5c59ed4ae5 224 if (fundort!=NULL)
jack1930 13:ed5c59ed4ae5 225 {
jack1930 13:ed5c59ed4ae5 226 fundort=fundort+strlen(suchstring)+1;
jack1930 13:ed5c59ed4ae5 227 while(i<20 && fundort[i]!=38 && fundort[i]>32 ) //space, &
jack1930 13:ed5c59ed4ae5 228 {
jack1930 13:ed5c59ed4ae5 229 hilf[i]=fundort[i];
jack1930 13:ed5c59ed4ae5 230 i++;
jack1930 13:ed5c59ed4ae5 231 }
jack1930 13:ed5c59ed4ae5 232 hilf[i]=0;
jack1930 13:ed5c59ed4ae5 233 if (dbg) printf("\r\nsuchergebnis=%s\r\n",hilf);
jack1930 13:ed5c59ed4ae5 234 return hilf;
jack1930 13:ed5c59ed4ae5 235 }
jack1930 13:ed5c59ed4ae5 236 else
jack1930 13:ed5c59ed4ae5 237 return NULL;
jack1930 14:d17cfd8131b1 238 }
jack1930 14:d17cfd8131b1 239
jack1930 15:e710f0431920 240 void ESP8266Webserver::listAPs()
jack1930 14:d17cfd8131b1 241 {
jack1930 16:b09391fb73b4 242 int ips[4];
jack1930 15:e710f0431920 243 //_parser->debug_on(true);
jack1930 15:e710f0431920 244 _parser->send("AT+CWMODE=1");
jack1930 17:87c762acb8d0 245 HAL_Delay(300);
jack1930 15:e710f0431920 246 while (_parser->recv("OK")==false);
jack1930 15:e710f0431920 247 HAL_Delay(1000);
jack1930 15:e710f0431920 248 if (scanAPs==true)
jack1930 14:d17cfd8131b1 249 {
jack1930 15:e710f0431920 250 _parser->send("AT+CWLAP");
jack1930 15:e710f0431920 251 while (!_serial->readable());
jack1930 15:e710f0431920 252 HAL_Delay(10000);
jack1930 15:e710f0431920 253 printf("\r\nBuf=");
jack1930 15:e710f0431920 254 while (_serial->readable())
jack1930 15:e710f0431920 255 {
jack1930 15:e710f0431920 256 _parser->read(recbuf, 1);
jack1930 15:e710f0431920 257 printf("%s",recbuf);
jack1930 15:e710f0431920 258 }
jack1930 15:e710f0431920 259 printf("\r\n");
jack1930 14:d17cfd8131b1 260 }
jack1930 15:e710f0431920 261 for (int i=0;i<5;i++)
jack1930 15:e710f0431920 262 {
jack1930 15:e710f0431920 263 _parser->send("AT+CWJAP=\"%s\",\"%s\"",ssid,passwort);
jack1930 15:e710f0431920 264 HAL_Delay(1000);
jack1930 15:e710f0431920 265 if (_parser->recv("WIFI GOT IP")) i=6;
jack1930 15:e710f0431920 266 }
jack1930 15:e710f0431920 267 _parser->send("AT+CIFSR");
jack1930 15:e710f0431920 268 while (_parser->recv("+CIFSR:STAIP,")==false)
jack1930 15:e710f0431920 269 {
jack1930 15:e710f0431920 270 _parser->send("AT+CIFSR");
jack1930 15:e710f0431920 271 HAL_Delay(100);
jack1930 15:e710f0431920 272 }
jack1930 16:b09391fb73b4 273
jack1930 16:b09391fb73b4 274 // _parser->read(ipadr,15);
jack1930 16:b09391fb73b4 275 _parser->scanf("\"%d.%d.%d.%d\"",&ips[0],&ips[1],&ips[2],&ips[3]);
jack1930 16:b09391fb73b4 276 sprintf(ipadr,"%d.%d.%d.%d",ips[0],ips[1],ips[2],ips[3]);
jack1930 15:e710f0431920 277 printf("%s",ipadr);
jack1930 15:e710f0431920 278
jack1930 15:e710f0431920 279 _parser->send("AT+CIPMUX=1");
jack1930 15:e710f0431920 280 while (_parser->recv("OK")==false);
jack1930 15:e710f0431920 281
jack1930 15:e710f0431920 282 //_parser->debug_on(false);
jack1930 14:d17cfd8131b1 283 }
jack1930 14:d17cfd8131b1 284
jack1930 15:e710f0431920 285 char* ESP8266Webserver::gibIP()
jack1930 14:d17cfd8131b1 286 {
jack1930 16:b09391fb73b4 287 static char ipa[16];
jack1930 16:b09391fb73b4 288 int j=0;
jack1930 16:b09391fb73b4 289 for (int i=0;i<strlen(ipadr);i++)
jack1930 16:b09391fb73b4 290 {
jack1930 16:b09391fb73b4 291 if (i==0 && ipadr[0]=='"'){}
jack1930 16:b09391fb73b4 292 else
jack1930 16:b09391fb73b4 293 {
jack1930 16:b09391fb73b4 294 switch (ipadr[i])
jack1930 16:b09391fb73b4 295 {
jack1930 16:b09391fb73b4 296 case '0':
jack1930 16:b09391fb73b4 297 case '1':
jack1930 16:b09391fb73b4 298 case '2':
jack1930 16:b09391fb73b4 299 case '3':
jack1930 16:b09391fb73b4 300 case '4':
jack1930 16:b09391fb73b4 301 case '5':
jack1930 16:b09391fb73b4 302 case '6':
jack1930 16:b09391fb73b4 303 case '7':
jack1930 16:b09391fb73b4 304 case '8':
jack1930 16:b09391fb73b4 305 case '9':
jack1930 16:b09391fb73b4 306 case '.': ipa[j]=ipadr[i];
jack1930 16:b09391fb73b4 307 j++;
jack1930 16:b09391fb73b4 308 break;
jack1930 16:b09391fb73b4 309 default: i=10000; break;
jack1930 16:b09391fb73b4 310 }
jack1930 16:b09391fb73b4 311 if (i==10000) break;
jack1930 16:b09391fb73b4 312 }
jack1930 16:b09391fb73b4 313 }
jack1930 16:b09391fb73b4 314 ipa[j+1]='\0';
jack1930 16:b09391fb73b4 315
jack1930 16:b09391fb73b4 316 return ipa;
jack1930 14:d17cfd8131b1 317 }
jack1930 14:d17cfd8131b1 318