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:
Fri Mar 29 09:12:39 2019 +0000
Revision:
2:61ed6c1c9bdd
Parent:
1:aa115daaaa02
Add Access Point mode

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 2:61ed6c1c9bdd 7 Version: 1.0.0
EliasN 0:afba75b3b390 8 (C)2019 Elias Nestl
EliasN 0:afba75b3b390 9 */
EliasN 0:afba75b3b390 10
EliasN 2:61ed6c1c9bdd 11 ESPAT::ESPAT(PinName tx, PinName rx, int baud) : espSerial(tx, rx, baud) {
EliasN 0:afba75b3b390 12 }
EliasN 0:afba75b3b390 13
EliasN 2:61ed6c1c9bdd 14 //Serial pc(USBTX, USBRX, 115200);
EliasN 2:61ed6c1c9bdd 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 2:61ed6c1c9bdd 28 //string s;
EliasN 0:afba75b3b390 29 for (int i = 0; i < strlen(text); i++) {
EliasN 0:afba75b3b390 30 char c = espSerial.getc();
EliasN 2:61ed6c1c9bdd 31 //s += c;
EliasN 0:afba75b3b390 32 if (c != text[i]) {
EliasN 0:afba75b3b390 33 i = 0;
EliasN 0:afba75b3b390 34 }
EliasN 0:afba75b3b390 35 }
EliasN 2:61ed6c1c9bdd 36 //pc.printf("%s", s.c_str());
EliasN 0:afba75b3b390 37 }
EliasN 0:afba75b3b390 38
EliasN 0:afba75b3b390 39 void ESPAT::sendCommand(char * cmd, bool waitOk) {
EliasN 2:61ed6c1c9bdd 40 //pc.printf("%s\r\n", cmd);
EliasN 0:afba75b3b390 41 espSerial.printf("%s\r\n", cmd);
EliasN 0:afba75b3b390 42 if (waitOk) waitFor("OK");
EliasN 0:afba75b3b390 43 }
EliasN 0:afba75b3b390 44
EliasN 0:afba75b3b390 45 void ESPAT::resetEsp() {
EliasN 0:afba75b3b390 46 sendCommand("AT+RST");
EliasN 0:afba75b3b390 47 waitFor("ready");
EliasN 0:afba75b3b390 48 }
EliasN 0:afba75b3b390 49
EliasN 2:61ed6c1c9bdd 50 void ESPAT::initWifiStation(string ssid, string pwd) {
EliasN 0:afba75b3b390 51 sendCommand("AT+CWMODE_CUR=1");
EliasN 2:61ed6c1c9bdd 52 string wifiCmd = "AT+CWJAP_CUR=\"" + ssid + "\",\"" + pwd + "\"";
EliasN 2:61ed6c1c9bdd 53 sendCommand((char*) wifiCmd.c_str());
EliasN 2:61ed6c1c9bdd 54 }
EliasN 2:61ed6c1c9bdd 55
EliasN 2:61ed6c1c9bdd 56 void ESPAT::initWifiAP(string ssid, string pwd, string channel, string encryption) {
EliasN 2:61ed6c1c9bdd 57 sendCommand("AT+CWMODE_CUR=2");
EliasN 2:61ed6c1c9bdd 58 string wifiCmd = "AT+CWSAP_CUR=\"" + ssid + "\",\"" + pwd + "\"," + channel + "," + encryption;
EliasN 0:afba75b3b390 59 sendCommand((char*) wifiCmd.c_str());
EliasN 0:afba75b3b390 60 }
EliasN 0:afba75b3b390 61
EliasN 0:afba75b3b390 62 void ESPAT::initServer(void (*requestHandler)(int, string)) {
EliasN 0:afba75b3b390 63 sendCommand("AT+CIPMUX=1");
EliasN 0:afba75b3b390 64 sendCommand("AT+CIPSERVER=1,80");
EliasN 0:afba75b3b390 65 while (true) {
EliasN 0:afba75b3b390 66 // Input looks like this: +IPD,0,372:GET / HTTP/1.1
EliasN 0:afba75b3b390 67 waitFor("+IPD,");
EliasN 0:afba75b3b390 68 // Parse linkId
EliasN 0:afba75b3b390 69 int linkId = 0;
EliasN 0:afba75b3b390 70 char c;
EliasN 0:afba75b3b390 71 while (true) {
EliasN 0:afba75b3b390 72 c = espSerial.getc();
EliasN 0:afba75b3b390 73 if (c == ',') break;
EliasN 0:afba75b3b390 74 linkId = linkId * 10 + (c - '0');
EliasN 0:afba75b3b390 75 }
EliasN 0:afba75b3b390 76 // Parse path
EliasN 0:afba75b3b390 77 waitFor(":GET ");
EliasN 0:afba75b3b390 78 string path;
EliasN 0:afba75b3b390 79 readStrUntil(&path, ' ');
EliasN 0:afba75b3b390 80 // Send request to handler
EliasN 0:afba75b3b390 81 requestHandler(linkId, path);
EliasN 0:afba75b3b390 82 }
EliasN 0:afba75b3b390 83 }
EliasN 0:afba75b3b390 84
EliasN 0:afba75b3b390 85 void ESPAT::tcpReply(int linkId, string data) {
EliasN 0:afba75b3b390 86 espSerial.printf("AT+CIPSEND=%d,%d\r\n", linkId, data.length());
EliasN 0:afba75b3b390 87 wait(0.1); // Can't use waitFor here as it isn't fast enough
EliasN 1:aa115daaaa02 88 for (int i = 0; i < data.length(); i++) {
EliasN 1:aa115daaaa02 89 // Artificially slowing down this to prevent errors
EliasN 1:aa115daaaa02 90 espSerial.printf("%c", data[i]);
EliasN 1:aa115daaaa02 91 }
EliasN 0:afba75b3b390 92 waitFor("SEND OK");
EliasN 0:afba75b3b390 93 espSerial.printf("AT+CIPCLOSE=%d\r\n", linkId);
EliasN 0:afba75b3b390 94 waitFor("OK");
EliasN 0:afba75b3b390 95 }
EliasN 0:afba75b3b390 96
EliasN 0:afba75b3b390 97 void ESPAT::httpReply(int linkId, string code, string payload) {
EliasN 0:afba75b3b390 98 string data = "HTTP/1.1 " + code + "\r\nContent-Type: text/html\r\n\r\n" + payload;
EliasN 0:afba75b3b390 99 tcpReply(linkId, data);
EliasN 0:afba75b3b390 100 }