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@0:afba75b3b390, 2019-02-18 (annotated)
- 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?
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 | 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 | } |