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).
ESPAT.cpp@2:61ed6c1c9bdd, 2019-03-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |