DE: Ein sehr, sehr einfacher Webserver mithilfe eines ESP8266 auf dem die AT-Firmware läuft . Für Bulme Bertl. - EN: A very, very, basic web server that works using an ESP8266 running the AT-Firmware.

Dependents:   BULME_BERTL17_WebServer_ESPAT Bravo Team

Click here for example code!

DE:

Ein sehr, sehr einfacher Webserver mithilfe eines ESP8266 auf dem die AT-Firmware läuft. Getestet mit einem ESP-01 Modul am Bulme Bertl 2017 (LPC11U68).

EN:

A very, very, basic web server that works using an ESP8266 running the AT-Firmware. Tested with an ESP-01 Module and Bulme Bertl 2017 (LPC11U68).

Committer:
EliasN
Date:
Mon Feb 18 21:31:03 2019 +0000
Revision:
0:afba75b3b390
Child:
1:aa115daaaa02
Publish ESPAT library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EliasN 0:afba75b3b390 1 #include "ESPAT.h"
EliasN 0:afba75b3b390 2 #include "mbed.h"
EliasN 0:afba75b3b390 3 #include "string"
EliasN 0:afba75b3b390 4
EliasN 0:afba75b3b390 5 /*
EliasN 0:afba75b3b390 6 Library for using an ESP8266 (e.g. ESP-01 board) with its AT command firmware as webserver
EliasN 0:afba75b3b390 7 Version: 0.1.0
EliasN 0:afba75b3b390 8 (C)2019 Elias Nestl
EliasN 0:afba75b3b390 9 */
EliasN 0:afba75b3b390 10
EliasN 0:afba75b3b390 11 ESPAT::ESPAT(PinName tx, PinName rx, string _wifiName, string _wifiPass, int baud) : espSerial(tx, rx, baud) {
EliasN 0:afba75b3b390 12 wifiName = _wifiName;
EliasN 0:afba75b3b390 13 wifiPass = _wifiPass;
EliasN 0:afba75b3b390 14 }
EliasN 0:afba75b3b390 15
EliasN 0:afba75b3b390 16 void ESPAT::readStrUntil(string * str, char until) {
EliasN 0:afba75b3b390 17 while (true) {
EliasN 0:afba75b3b390 18 char c = espSerial.getc();
EliasN 0:afba75b3b390 19 if (c != until) {
EliasN 0:afba75b3b390 20 *str += c;
EliasN 0:afba75b3b390 21 } else {
EliasN 0:afba75b3b390 22 break;
EliasN 0:afba75b3b390 23 }
EliasN 0:afba75b3b390 24 }
EliasN 0:afba75b3b390 25 }
EliasN 0:afba75b3b390 26
EliasN 0:afba75b3b390 27 void ESPAT::waitFor(char * text) {
EliasN 0:afba75b3b390 28 for (int i = 0; i < strlen(text); i++) {
EliasN 0:afba75b3b390 29 char c = espSerial.getc();
EliasN 0:afba75b3b390 30 if (c != text[i]) {
EliasN 0:afba75b3b390 31 i = 0;
EliasN 0:afba75b3b390 32 }
EliasN 0:afba75b3b390 33 }
EliasN 0:afba75b3b390 34 }
EliasN 0:afba75b3b390 35
EliasN 0:afba75b3b390 36 void ESPAT::sendCommand(char * cmd, bool waitOk) {
EliasN 0:afba75b3b390 37 espSerial.printf("%s\r\n", cmd);
EliasN 0:afba75b3b390 38 if (waitOk) waitFor("OK");
EliasN 0:afba75b3b390 39 }
EliasN 0:afba75b3b390 40
EliasN 0:afba75b3b390 41 void ESPAT::resetEsp() {
EliasN 0:afba75b3b390 42 sendCommand("AT+RST");
EliasN 0:afba75b3b390 43 waitFor("ready");
EliasN 0:afba75b3b390 44 }
EliasN 0:afba75b3b390 45
EliasN 0:afba75b3b390 46 void ESPAT::initWifi() {
EliasN 0:afba75b3b390 47 sendCommand("AT+CWMODE_CUR=1");
EliasN 0:afba75b3b390 48 string wifiCmd = "AT+CWJAP_CUR=\"" + wifiName + "\",\"" + wifiPass + "\"";
EliasN 0:afba75b3b390 49 sendCommand((char*) wifiCmd.c_str());
EliasN 0:afba75b3b390 50 }
EliasN 0:afba75b3b390 51
EliasN 0:afba75b3b390 52 void ESPAT::initServer(void (*requestHandler)(int, string)) {
EliasN 0:afba75b3b390 53 sendCommand("AT+CIPMUX=1");
EliasN 0:afba75b3b390 54 sendCommand("AT+CIPSERVER=1,80");
EliasN 0:afba75b3b390 55 while (true) {
EliasN 0:afba75b3b390 56 // Input looks like this: +IPD,0,372:GET / HTTP/1.1
EliasN 0:afba75b3b390 57 waitFor("+IPD,");
EliasN 0:afba75b3b390 58 // Parse linkId
EliasN 0:afba75b3b390 59 int linkId = 0;
EliasN 0:afba75b3b390 60 char c;
EliasN 0:afba75b3b390 61 while (true) {
EliasN 0:afba75b3b390 62 c = espSerial.getc();
EliasN 0:afba75b3b390 63 if (c == ',') break;
EliasN 0:afba75b3b390 64 linkId = linkId * 10 + (c - '0');
EliasN 0:afba75b3b390 65 }
EliasN 0:afba75b3b390 66 // Parse path
EliasN 0:afba75b3b390 67 waitFor(":GET ");
EliasN 0:afba75b3b390 68 string path;
EliasN 0:afba75b3b390 69 readStrUntil(&path, ' ');
EliasN 0:afba75b3b390 70 // Send request to handler
EliasN 0:afba75b3b390 71 requestHandler(linkId, path);
EliasN 0:afba75b3b390 72 }
EliasN 0:afba75b3b390 73 }
EliasN 0:afba75b3b390 74
EliasN 0:afba75b3b390 75 void ESPAT::startWebServer(void (*readyCallback)(), void (*requestHandler)(int, string)) {
EliasN 0:afba75b3b390 76 resetEsp();
EliasN 0:afba75b3b390 77 initWifi();
EliasN 0:afba75b3b390 78 readyCallback();
EliasN 0:afba75b3b390 79 initServer(requestHandler);
EliasN 0:afba75b3b390 80 }
EliasN 0:afba75b3b390 81
EliasN 0:afba75b3b390 82 void ESPAT::tcpReply(int linkId, string data) {
EliasN 0:afba75b3b390 83 espSerial.printf("AT+CIPSEND=%d,%d\r\n", linkId, data.length());
EliasN 0:afba75b3b390 84 wait(0.1); // Can't use waitFor here as it isn't fast enough
EliasN 0:afba75b3b390 85 espSerial.printf(data.c_str());
EliasN 0:afba75b3b390 86 waitFor("SEND OK");
EliasN 0:afba75b3b390 87 espSerial.printf("AT+CIPCLOSE=%d\r\n", linkId);
EliasN 0:afba75b3b390 88 waitFor("OK");
EliasN 0:afba75b3b390 89 }
EliasN 0:afba75b3b390 90
EliasN 0:afba75b3b390 91 void ESPAT::httpReply(int linkId, string code, string payload) {
EliasN 0:afba75b3b390 92 string data = "HTTP/1.1 " + code + "\r\nContent-Type: text/html\r\n\r\n" + payload;
EliasN 0:afba75b3b390 93 tcpReply(linkId, data);
EliasN 0:afba75b3b390 94 }