![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
LeeT WiFiLamp code and test
Dependencies: ESP8266_WebServer mbed
Fork of WiFiLamp by
main.cpp@0:d21e3e1c0a4b, 2014-11-16 (annotated)
- Committer:
- sschocke
- Date:
- Sun Nov 16 13:28:19 2014 +0000
- Revision:
- 0:d21e3e1c0a4b
- Child:
- 1:f07afcffeb5a
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sschocke | 0:d21e3e1c0a4b | 1 | #include "mbed.h" |
sschocke | 0:d21e3e1c0a4b | 2 | #include <string> |
sschocke | 0:d21e3e1c0a4b | 3 | #define DEBUG_WIFI |
sschocke | 0:d21e3e1c0a4b | 4 | |
sschocke | 0:d21e3e1c0a4b | 5 | DigitalOut wifiCHPD(D4); |
sschocke | 0:d21e3e1c0a4b | 6 | DigitalOut wifiReset(D9); |
sschocke | 0:d21e3e1c0a4b | 7 | |
sschocke | 0:d21e3e1c0a4b | 8 | int wifiOn = 0; |
sschocke | 0:d21e3e1c0a4b | 9 | |
sschocke | 0:d21e3e1c0a4b | 10 | Serial wifiSerial(D8,D2); |
sschocke | 0:d21e3e1c0a4b | 11 | Serial pc(USBTX,USBRX); |
sschocke | 0:d21e3e1c0a4b | 12 | |
sschocke | 0:d21e3e1c0a4b | 13 | char buffer[1024]; |
sschocke | 0:d21e3e1c0a4b | 14 | char reply[1024]; |
sschocke | 0:d21e3e1c0a4b | 15 | char response[2048]; |
sschocke | 0:d21e3e1c0a4b | 16 | char* rxptr = buffer; |
sschocke | 0:d21e3e1c0a4b | 17 | |
sschocke | 0:d21e3e1c0a4b | 18 | void rxint() { |
sschocke | 0:d21e3e1c0a4b | 19 | char c = wifiSerial.getc(); |
sschocke | 0:d21e3e1c0a4b | 20 | if( wifiOn == 0 ) return; |
sschocke | 0:d21e3e1c0a4b | 21 | #ifdef DEBUG_WIFI |
sschocke | 0:d21e3e1c0a4b | 22 | pc.putc(c); |
sschocke | 0:d21e3e1c0a4b | 23 | #endif |
sschocke | 0:d21e3e1c0a4b | 24 | *rxptr = c; |
sschocke | 0:d21e3e1c0a4b | 25 | rxptr++; |
sschocke | 0:d21e3e1c0a4b | 26 | *rxptr = 0; |
sschocke | 0:d21e3e1c0a4b | 27 | } |
sschocke | 0:d21e3e1c0a4b | 28 | |
sschocke | 0:d21e3e1c0a4b | 29 | void readBuffer() { |
sschocke | 0:d21e3e1c0a4b | 30 | strncpy(reply, buffer, 1024); |
sschocke | 0:d21e3e1c0a4b | 31 | rxptr = buffer; |
sschocke | 0:d21e3e1c0a4b | 32 | *rxptr = 0; |
sschocke | 0:d21e3e1c0a4b | 33 | } |
sschocke | 0:d21e3e1c0a4b | 34 | |
sschocke | 0:d21e3e1c0a4b | 35 | short data_waiting(void) |
sschocke | 0:d21e3e1c0a4b | 36 | { |
sschocke | 0:d21e3e1c0a4b | 37 | char* ok = strstr(buffer, "OK\r\n"); |
sschocke | 0:d21e3e1c0a4b | 38 | char* error = strstr(buffer, "ERROR\r\n"); |
sschocke | 0:d21e3e1c0a4b | 39 | char* nochange = strstr(buffer, "no change\r\n"); |
sschocke | 0:d21e3e1c0a4b | 40 | |
sschocke | 0:d21e3e1c0a4b | 41 | if( (ok != NULL) || (error != NULL ) || (nochange != NULL ) ) |
sschocke | 0:d21e3e1c0a4b | 42 | { |
sschocke | 0:d21e3e1c0a4b | 43 | return 1; |
sschocke | 0:d21e3e1c0a4b | 44 | } |
sschocke | 0:d21e3e1c0a4b | 45 | |
sschocke | 0:d21e3e1c0a4b | 46 | return 0; |
sschocke | 0:d21e3e1c0a4b | 47 | } |
sschocke | 0:d21e3e1c0a4b | 48 | |
sschocke | 0:d21e3e1c0a4b | 49 | short string_waiting(const char* str) |
sschocke | 0:d21e3e1c0a4b | 50 | { |
sschocke | 0:d21e3e1c0a4b | 51 | char* pr = strstr(buffer, str); |
sschocke | 0:d21e3e1c0a4b | 52 | char* error = strstr(buffer, "ERROR\r\n"); |
sschocke | 0:d21e3e1c0a4b | 53 | |
sschocke | 0:d21e3e1c0a4b | 54 | if( (pr != NULL) || (error != NULL ) ) |
sschocke | 0:d21e3e1c0a4b | 55 | { |
sschocke | 0:d21e3e1c0a4b | 56 | return 1; |
sschocke | 0:d21e3e1c0a4b | 57 | } |
sschocke | 0:d21e3e1c0a4b | 58 | |
sschocke | 0:d21e3e1c0a4b | 59 | return 0; |
sschocke | 0:d21e3e1c0a4b | 60 | } |
sschocke | 0:d21e3e1c0a4b | 61 | |
sschocke | 0:d21e3e1c0a4b | 62 | int main() { |
sschocke | 0:d21e3e1c0a4b | 63 | pc.printf("WiFi Lamp Test...\r\n"); |
sschocke | 0:d21e3e1c0a4b | 64 | wifiCHPD = 0; |
sschocke | 0:d21e3e1c0a4b | 65 | wifiReset = 0; |
sschocke | 0:d21e3e1c0a4b | 66 | wifiSerial.baud(9600); |
sschocke | 0:d21e3e1c0a4b | 67 | wifiSerial.attach(&rxint); |
sschocke | 0:d21e3e1c0a4b | 68 | wait_ms(1000); |
sschocke | 0:d21e3e1c0a4b | 69 | |
sschocke | 0:d21e3e1c0a4b | 70 | pc.printf("Powering WiFi...\r\n"); |
sschocke | 0:d21e3e1c0a4b | 71 | wifiCHPD = 1; |
sschocke | 0:d21e3e1c0a4b | 72 | wait_ms(250); |
sschocke | 0:d21e3e1c0a4b | 73 | pc.printf("Hardware Reset WiFi...\r\n"); |
sschocke | 0:d21e3e1c0a4b | 74 | wifiReset = 1; |
sschocke | 0:d21e3e1c0a4b | 75 | wifiOn = 1; |
sschocke | 0:d21e3e1c0a4b | 76 | readBuffer(); |
sschocke | 0:d21e3e1c0a4b | 77 | while( string_waiting("\r\nready\r\n") == 0 ) { |
sschocke | 0:d21e3e1c0a4b | 78 | wait_ms(10); |
sschocke | 0:d21e3e1c0a4b | 79 | } |
sschocke | 0:d21e3e1c0a4b | 80 | readBuffer(); |
sschocke | 0:d21e3e1c0a4b | 81 | |
sschocke | 0:d21e3e1c0a4b | 82 | pc.printf("Starting WiFi...\r\n"); |
sschocke | 0:d21e3e1c0a4b | 83 | pc.printf("Setting Operating Mode..."); |
sschocke | 0:d21e3e1c0a4b | 84 | wifiSerial.printf("AT+CWMODE=3\r\n"); |
sschocke | 0:d21e3e1c0a4b | 85 | while( data_waiting() == 0 ) { |
sschocke | 0:d21e3e1c0a4b | 86 | wait_ms(10); |
sschocke | 0:d21e3e1c0a4b | 87 | } |
sschocke | 0:d21e3e1c0a4b | 88 | readBuffer(); |
sschocke | 0:d21e3e1c0a4b | 89 | |
sschocke | 0:d21e3e1c0a4b | 90 | pc.printf("Done\r\nAccept Multiple connections..."); |
sschocke | 0:d21e3e1c0a4b | 91 | wifiSerial.printf("AT+CIPMUX=1\r\n"); |
sschocke | 0:d21e3e1c0a4b | 92 | while( data_waiting() == 0 ) { |
sschocke | 0:d21e3e1c0a4b | 93 | wait_ms(10); |
sschocke | 0:d21e3e1c0a4b | 94 | } |
sschocke | 0:d21e3e1c0a4b | 95 | readBuffer(); |
sschocke | 0:d21e3e1c0a4b | 96 | |
sschocke | 0:d21e3e1c0a4b | 97 | pc.printf("Done\r\nStarting Web Server..."); |
sschocke | 0:d21e3e1c0a4b | 98 | wifiSerial.printf("AT+CIPSERVER=1,80\r\n"); |
sschocke | 0:d21e3e1c0a4b | 99 | while( data_waiting() == 0 ) { |
sschocke | 0:d21e3e1c0a4b | 100 | wait_ms(10); |
sschocke | 0:d21e3e1c0a4b | 101 | } |
sschocke | 0:d21e3e1c0a4b | 102 | readBuffer(); |
sschocke | 0:d21e3e1c0a4b | 103 | |
sschocke | 0:d21e3e1c0a4b | 104 | pc.printf("Done\r\n"); |
sschocke | 0:d21e3e1c0a4b | 105 | |
sschocke | 0:d21e3e1c0a4b | 106 | while(true) { |
sschocke | 0:d21e3e1c0a4b | 107 | if( (string_waiting("+IPD") == 1) && (string_waiting("\r\nOK\r\n") == 1) ) { |
sschocke | 0:d21e3e1c0a4b | 108 | pc.printf("\r\nGot Data\r\n"); |
sschocke | 0:d21e3e1c0a4b | 109 | readBuffer(); |
sschocke | 0:d21e3e1c0a4b | 110 | |
sschocke | 0:d21e3e1c0a4b | 111 | char* ipdPacket = strstr(reply, "+IPD"); |
sschocke | 0:d21e3e1c0a4b | 112 | int linkID, bytesRecv, ipdLen; |
sschocke | 0:d21e3e1c0a4b | 113 | int numMatched = sscanf(ipdPacket,"+IPD,%d,%d:%n", &linkID, &bytesRecv, &ipdLen); |
sschocke | 0:d21e3e1c0a4b | 114 | if( numMatched != 2 ) { |
sschocke | 0:d21e3e1c0a4b | 115 | pc.printf("IPD ERROR : Matched %d, LinkID=%d, BytesRecv=%d, IPD Header Len=%d\r\n", numMatched, linkID, bytesRecv, ipdLen); |
sschocke | 0:d21e3e1c0a4b | 116 | continue; |
sschocke | 0:d21e3e1c0a4b | 117 | } |
sschocke | 0:d21e3e1c0a4b | 118 | |
sschocke | 0:d21e3e1c0a4b | 119 | pc.printf("IPD Data: LinkID=%d, BytesRecv=%d, IPD Header Len=%d\r\n", linkID, bytesRecv, ipdLen); |
sschocke | 0:d21e3e1c0a4b | 120 | if( strstr(ipdPacket, "HTTP") != NULL ) { |
sschocke | 0:d21e3e1c0a4b | 121 | pc.printf("Got HTTP Request\r\n"); |
sschocke | 0:d21e3e1c0a4b | 122 | char* httpPacket = ipdPacket + ipdLen; |
sschocke | 0:d21e3e1c0a4b | 123 | pc.printf("HTTP Packet: %s\r\n", httpPacket); |
sschocke | 0:d21e3e1c0a4b | 124 | |
sschocke | 0:d21e3e1c0a4b | 125 | std::string httpReply = "<html><head><title>WiFi Lamp</title></head><body><h1>The WiFi Lamp is alive</h1></body></html>"; |
sschocke | 0:d21e3e1c0a4b | 126 | std::string httpReplyPacket = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s"; |
sschocke | 0:d21e3e1c0a4b | 127 | |
sschocke | 0:d21e3e1c0a4b | 128 | sprintf(response, httpReplyPacket.c_str(), httpReply.length(), httpReply.c_str()); |
sschocke | 0:d21e3e1c0a4b | 129 | int bytes = strlen(response); |
sschocke | 0:d21e3e1c0a4b | 130 | pc.printf("HTTP Reply Packet(%d bytes): %s\r\n", bytes, response); |
sschocke | 0:d21e3e1c0a4b | 131 | wifiSerial.printf("AT+CIPSEND=%d,%d\r\n", linkID, bytes); |
sschocke | 0:d21e3e1c0a4b | 132 | wait_ms(500); |
sschocke | 0:d21e3e1c0a4b | 133 | if( (string_waiting("\r\n>") == 1) ) { |
sschocke | 0:d21e3e1c0a4b | 134 | wifiSerial.printf(response); |
sschocke | 0:d21e3e1c0a4b | 135 | } |
sschocke | 0:d21e3e1c0a4b | 136 | while( string_waiting("\r\nSEND OK\r\n") == 0 ) { |
sschocke | 0:d21e3e1c0a4b | 137 | wait_ms(10); |
sschocke | 0:d21e3e1c0a4b | 138 | } |
sschocke | 0:d21e3e1c0a4b | 139 | pc.printf("\r\nHTTP Reply Sent\r\n"); |
sschocke | 0:d21e3e1c0a4b | 140 | } |
sschocke | 0:d21e3e1c0a4b | 141 | } |
sschocke | 0:d21e3e1c0a4b | 142 | wait_ms(10); |
sschocke | 0:d21e3e1c0a4b | 143 | } |
sschocke | 0:d21e3e1c0a4b | 144 | } |