NNN40 change mode from AP to STA by HTTP server
Dependencies: WIFI_API_32kRAM mbed
How to use Demo code
- Step1: Prepare a router, and set the SSID and Password as follow
- SSID: "SSID"
- Password: "0123456789"
- Step2: Burn demo code to NNN40 module.
You can drag and drop the sample code to NNN40 module.
- Step3: Login module from Http server (192.168.2.1) by PC.
You can set SSID and password by browser. After clicking "confirm" button, the module will change mode from AP to STA, get IP from router
- DEMO video:
HTTPServer.cpp@7:838d7ea07e18, 2013-07-17 (annotated)
- Committer:
- feb11
- Date:
- Wed Jul 17 16:23:35 2013 +0000
- Revision:
- 7:838d7ea07e18
- Parent:
- 4:624527ebc0fa
- Child:
- 8:464abd184b7b
Improved error handling and added log
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
feb11 | 0:9e4bcb10b3e3 | 1 | #include "HTTPServer.h" |
feb11 | 0:9e4bcb10b3e3 | 2 | |
feb11 | 0:9e4bcb10b3e3 | 3 | #define INVALID_FORMATTER "No valid formatter specified" |
feb11 | 0:9e4bcb10b3e3 | 4 | |
feb11 | 0:9e4bcb10b3e3 | 5 | bool cmp(char* a, char* b) |
feb11 | 0:9e4bcb10b3e3 | 6 | { |
feb11 | 0:9e4bcb10b3e3 | 7 | return strcmp(a,b) < 0; |
feb11 | 0:9e4bcb10b3e3 | 8 | } |
feb11 | 4:624527ebc0fa | 9 | |
feb11 | 0:9e4bcb10b3e3 | 10 | HTTPServer::HTTPServer(Formatter *f): |
feb11 | 0:9e4bcb10b3e3 | 11 | socket(), |
feb11 | 0:9e4bcb10b3e3 | 12 | handlers(&cmp), |
feb11 | 0:9e4bcb10b3e3 | 13 | formatter(f), |
feb11 | 0:9e4bcb10b3e3 | 14 | reply(), |
feb11 | 0:9e4bcb10b3e3 | 15 | command() |
feb11 | 0:9e4bcb10b3e3 | 16 | { |
feb11 | 0:9e4bcb10b3e3 | 17 | } |
feb11 | 0:9e4bcb10b3e3 | 18 | |
feb11 | 0:9e4bcb10b3e3 | 19 | HTTPServer::~HTTPServer() |
feb11 | 0:9e4bcb10b3e3 | 20 | { |
feb11 | 0:9e4bcb10b3e3 | 21 | for(std::map<char*, RequestHandler*>::iterator itor = handlers.begin(); |
feb11 | 0:9e4bcb10b3e3 | 22 | itor != handlers.end(); |
feb11 | 0:9e4bcb10b3e3 | 23 | ++itor) |
feb11 | 0:9e4bcb10b3e3 | 24 | delete itor->second; |
feb11 | 0:9e4bcb10b3e3 | 25 | |
feb11 | 0:9e4bcb10b3e3 | 26 | if(formatter) |
feb11 | 0:9e4bcb10b3e3 | 27 | delete formatter; |
feb11 | 0:9e4bcb10b3e3 | 28 | } |
feb11 | 0:9e4bcb10b3e3 | 29 | |
feb11 | 0:9e4bcb10b3e3 | 30 | bool HTTPServer::init(int port) |
feb11 | 0:9e4bcb10b3e3 | 31 | { |
feb11 | 0:9e4bcb10b3e3 | 32 | socket.set_blocking(true); |
feb11 | 0:9e4bcb10b3e3 | 33 | return !socket.bind(port) && !socket.listen(); |
feb11 | 0:9e4bcb10b3e3 | 34 | } |
feb11 | 0:9e4bcb10b3e3 | 35 | |
feb11 | 0:9e4bcb10b3e3 | 36 | void HTTPServer::run() |
feb11 | 0:9e4bcb10b3e3 | 37 | { |
feb11 | 0:9e4bcb10b3e3 | 38 | TCPSocketConnection c; |
feb11 | 0:9e4bcb10b3e3 | 39 | while(true) |
feb11 | 0:9e4bcb10b3e3 | 40 | { |
feb11 | 0:9e4bcb10b3e3 | 41 | while(socket.accept(c)); |
feb11 | 0:9e4bcb10b3e3 | 42 | c.set_blocking(false, 1000); |
feb11 | 0:9e4bcb10b3e3 | 43 | while(c.is_connected()) |
feb11 | 0:9e4bcb10b3e3 | 44 | { |
feb11 | 0:9e4bcb10b3e3 | 45 | char buffer[512]; |
feb11 | 0:9e4bcb10b3e3 | 46 | int n = c.receive_all(buffer, sizeof(buffer)-1); |
feb11 | 0:9e4bcb10b3e3 | 47 | if(n == 0) |
feb11 | 0:9e4bcb10b3e3 | 48 | { |
feb11 | 0:9e4bcb10b3e3 | 49 | c.close(); |
feb11 | 0:9e4bcb10b3e3 | 50 | break; |
feb11 | 0:9e4bcb10b3e3 | 51 | } |
feb11 | 0:9e4bcb10b3e3 | 52 | else if(n != -1) |
feb11 | 0:9e4bcb10b3e3 | 53 | { |
feb11 | 7:838d7ea07e18 | 54 | printf("Received data\n"); |
feb11 | 0:9e4bcb10b3e3 | 55 | buffer[n] = '\0'; |
feb11 | 0:9e4bcb10b3e3 | 56 | handle_request(buffer); |
feb11 | 0:9e4bcb10b3e3 | 57 | if(formatter != NULL) |
feb11 | 0:9e4bcb10b3e3 | 58 | { |
feb11 | 7:838d7ea07e18 | 59 | printf("Sending data..."); |
feb11 | 0:9e4bcb10b3e3 | 60 | char *page = formatter->get_page(reply); |
feb11 | 0:9e4bcb10b3e3 | 61 | do |
feb11 | 0:9e4bcb10b3e3 | 62 | { |
feb11 | 0:9e4bcb10b3e3 | 63 | c.send(page, strlen(page)+1); |
feb11 | 0:9e4bcb10b3e3 | 64 | page = formatter->get_page(reply); |
feb11 | 0:9e4bcb10b3e3 | 65 | }while(strlen(page)>0); |
feb11 | 7:838d7ea07e18 | 66 | printf("done\n"); |
feb11 | 0:9e4bcb10b3e3 | 67 | } |
feb11 | 0:9e4bcb10b3e3 | 68 | else |
feb11 | 0:9e4bcb10b3e3 | 69 | c.send(INVALID_FORMATTER, strlen(INVALID_FORMATTER)+1); |
feb11 | 0:9e4bcb10b3e3 | 70 | } |
feb11 | 7:838d7ea07e18 | 71 | else |
feb11 | 7:838d7ea07e18 | 72 | printf("Error while receiving data\n"); |
feb11 | 0:9e4bcb10b3e3 | 73 | } |
feb11 | 0:9e4bcb10b3e3 | 74 | } |
feb11 | 0:9e4bcb10b3e3 | 75 | } |
feb11 | 0:9e4bcb10b3e3 | 76 | |
feb11 | 0:9e4bcb10b3e3 | 77 | void HTTPServer::handle_request(char *buffer) |
feb11 | 0:9e4bcb10b3e3 | 78 | { |
feb11 | 0:9e4bcb10b3e3 | 79 | char *request_type = strtok(buffer, " "); |
feb11 | 0:9e4bcb10b3e3 | 80 | char *request = strtok(NULL, " "); |
feb11 | 0:9e4bcb10b3e3 | 81 | |
feb11 | 0:9e4bcb10b3e3 | 82 | reply[0] = '\0'; |
feb11 | 0:9e4bcb10b3e3 | 83 | if(!strcmp(request, "/")) |
feb11 | 0:9e4bcb10b3e3 | 84 | return; |
feb11 | 0:9e4bcb10b3e3 | 85 | |
feb11 | 0:9e4bcb10b3e3 | 86 | if(!command.decode(request)) |
feb11 | 0:9e4bcb10b3e3 | 87 | { |
feb11 | 0:9e4bcb10b3e3 | 88 | strcat(reply, "Malformed request"); |
feb11 | 0:9e4bcb10b3e3 | 89 | return; |
feb11 | 0:9e4bcb10b3e3 | 90 | } |
feb11 | 0:9e4bcb10b3e3 | 91 | |
feb11 | 0:9e4bcb10b3e3 | 92 | std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type); |
feb11 | 0:9e4bcb10b3e3 | 93 | if(itor == handlers.end()) |
feb11 | 0:9e4bcb10b3e3 | 94 | { |
feb11 | 0:9e4bcb10b3e3 | 95 | strcat(reply, "Only PUT, DELETE and GET requests are accepted."); |
feb11 | 0:9e4bcb10b3e3 | 96 | return; |
feb11 | 0:9e4bcb10b3e3 | 97 | } |
feb11 | 0:9e4bcb10b3e3 | 98 | if(itor->second != NULL) |
feb11 | 0:9e4bcb10b3e3 | 99 | itor->second->handle(command, reply); |
feb11 | 0:9e4bcb10b3e3 | 100 | else |
feb11 | 0:9e4bcb10b3e3 | 101 | strcat(reply, "Invalid request handler"); |
feb11 | 0:9e4bcb10b3e3 | 102 | } |
feb11 | 0:9e4bcb10b3e3 | 103 | |
feb11 | 0:9e4bcb10b3e3 | 104 | void HTTPServer::add_request_handler(char *name, RequestHandler* handler) |
feb11 | 0:9e4bcb10b3e3 | 105 | { |
feb11 | 0:9e4bcb10b3e3 | 106 | handlers[name] = handler; |
feb11 | 0:9e4bcb10b3e3 | 107 | } |
feb11 | 0:9e4bcb10b3e3 | 108 |