Library für ESP01 Webserver STM32F103RB Nucleo

Dependents:   Nucleo_dht11_Webserver WebServerGSOEWorkshopSlider WebServerGSOEWorkshopDynamisch WebServerGSOEWorkshopStatisch ... more

Committer:
jack1930
Date:
Tue Jun 22 07:45:32 2021 +0000
Revision:
16:b09391fb73b4
Parent:
15:e710f0431920
Child:
17:87c762acb8d0
getestet mit Nucleo-F103RB

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