HTTP Server, WebSocket support
Dependencies: EthernetInterface HTTPD mbed-rtos mbed mbed-rpc
HTTP Server library
for EthernetInterface or compatible interface
multi connection, keep alive support.
Filesystem:
http://192.168.1.2/mbed.htm
CGI:
http://192.168.1.2/cgi-bin/test?query
WebSocket:
ws://192.168.1.2/ws/test
RPC:
http://192.168.1.2/rpc/DigitalOut/new%20LED4%20myled http://192.168.1.2/rpc/myled/write%201
Import libraryHTTPD
HTTP Server, WebSocket support
HTTPD.h
#define HTTPD_PORT 80 #define HTTPD_MAX_CLIENTS 2 #define HTTPD_KEEPALIVE 10
main.cpp@1:2971dd3e5168, 2013-11-13 (annotated)
- Committer:
- okini3939
- Date:
- Wed Nov 13 06:59:58 2013 +0000
- Revision:
- 1:2971dd3e5168
- Parent:
- 0:c4a353ed707d
RPC support
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:c4a353ed707d | 1 | #include "mbed.h" |
okini3939 | 0:c4a353ed707d | 2 | #include "rtos.h" |
okini3939 | 0:c4a353ed707d | 3 | #include "EthernetInterface.h" |
okini3939 | 1:2971dd3e5168 | 4 | #include "mbed_rpc.h" |
okini3939 | 0:c4a353ed707d | 5 | #include "HTTPD.h" |
okini3939 | 0:c4a353ed707d | 6 | |
okini3939 | 0:c4a353ed707d | 7 | EthernetInterface *eth; |
okini3939 | 0:c4a353ed707d | 8 | HTTPD *httpd; |
okini3939 | 0:c4a353ed707d | 9 | |
okini3939 | 0:c4a353ed707d | 10 | Serial pc(USBTX, USBRX); |
okini3939 | 0:c4a353ed707d | 11 | LocalFileSystem local("local"); |
okini3939 | 0:c4a353ed707d | 12 | DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); |
okini3939 | 0:c4a353ed707d | 13 | |
okini3939 | 0:c4a353ed707d | 14 | void callback_cgi (int id) { |
okini3939 | 0:c4a353ed707d | 15 | int i, n; |
okini3939 | 0:c4a353ed707d | 16 | char buf[256]; |
okini3939 | 0:c4a353ed707d | 17 | |
okini3939 | 0:c4a353ed707d | 18 | strcpy(buf, httpd->getFilename(id)); |
okini3939 | 0:c4a353ed707d | 19 | strcat(buf, "\r\n"); |
okini3939 | 0:c4a353ed707d | 20 | strcat(buf, httpd->getQueryString(id)); |
okini3939 | 0:c4a353ed707d | 21 | strcat(buf, "\r\n"); |
okini3939 | 0:c4a353ed707d | 22 | n = strlen(buf); |
okini3939 | 0:c4a353ed707d | 23 | |
okini3939 | 0:c4a353ed707d | 24 | i = httpd->receive(id, &buf[n], sizeof(buf) - n); |
okini3939 | 0:c4a353ed707d | 25 | if (i < 0) return; |
okini3939 | 0:c4a353ed707d | 26 | i += n; |
okini3939 | 0:c4a353ed707d | 27 | buf[i] = 0; |
okini3939 | 0:c4a353ed707d | 28 | |
okini3939 | 0:c4a353ed707d | 29 | printf("CGI %d %s\r\n", id, buf); |
okini3939 | 0:c4a353ed707d | 30 | httpd->send(id, buf, i, "Content-Type: text/plain\r\n"); |
okini3939 | 0:c4a353ed707d | 31 | } |
okini3939 | 0:c4a353ed707d | 32 | |
okini3939 | 0:c4a353ed707d | 33 | void callback_ws (int id) { |
okini3939 | 0:c4a353ed707d | 34 | int i; |
okini3939 | 0:c4a353ed707d | 35 | char buf[256]; |
okini3939 | 0:c4a353ed707d | 36 | |
okini3939 | 0:c4a353ed707d | 37 | i = httpd->receive(id, buf, sizeof(buf)); |
okini3939 | 0:c4a353ed707d | 38 | if (i < 0) return; |
okini3939 | 0:c4a353ed707d | 39 | buf[i] = 0; |
okini3939 | 0:c4a353ed707d | 40 | |
okini3939 | 0:c4a353ed707d | 41 | printf("WS %d %s\r\n", id, buf); |
okini3939 | 0:c4a353ed707d | 42 | httpd->sendWebsocket(id, buf, i); |
okini3939 | 0:c4a353ed707d | 43 | } |
okini3939 | 0:c4a353ed707d | 44 | |
okini3939 | 1:2971dd3e5168 | 45 | void callback_rpc (int id) { |
okini3939 | 1:2971dd3e5168 | 46 | char buf[40], outbuf[40]; |
okini3939 | 1:2971dd3e5168 | 47 | |
okini3939 | 1:2971dd3e5168 | 48 | strcpy(buf, "/"); |
okini3939 | 1:2971dd3e5168 | 49 | httpd->urldecode(httpd->getFilename(id), &buf[1], sizeof(buf) - 2); |
okini3939 | 1:2971dd3e5168 | 50 | RPC::call(buf, outbuf); |
okini3939 | 1:2971dd3e5168 | 51 | |
okini3939 | 1:2971dd3e5168 | 52 | printf("RPC id %d '%s' '%s'\r\n", id, buf, outbuf); |
okini3939 | 1:2971dd3e5168 | 53 | httpd->send(id, outbuf, strlen(outbuf), "Content-Type: text/plain\r\n"); |
okini3939 | 1:2971dd3e5168 | 54 | } |
okini3939 | 1:2971dd3e5168 | 55 | |
okini3939 | 0:c4a353ed707d | 56 | int main () { |
okini3939 | 0:c4a353ed707d | 57 | |
okini3939 | 0:c4a353ed707d | 58 | pc.baud(115200); |
okini3939 | 0:c4a353ed707d | 59 | printf("HTTP Server...\r\n"); |
okini3939 | 0:c4a353ed707d | 60 | |
okini3939 | 0:c4a353ed707d | 61 | eth = new EthernetInterface; |
okini3939 | 1:2971dd3e5168 | 62 | // eth->init(); //Use DHCP |
okini3939 | 1:2971dd3e5168 | 63 | eth->init("192.168.1.2", "255.255.255.0", "192.168.1.1"); |
okini3939 | 0:c4a353ed707d | 64 | if (eth->connect()) return -1; |
okini3939 | 0:c4a353ed707d | 65 | printf("IP Address is %s\r\n", eth->getIPAddress()); |
okini3939 | 0:c4a353ed707d | 66 | |
okini3939 | 1:2971dd3e5168 | 67 | // RPC::add_rpc_class<RpcAnalogIn>(); |
okini3939 | 1:2971dd3e5168 | 68 | // RPC::add_rpc_class<RpcAnalogOut>(); |
okini3939 | 1:2971dd3e5168 | 69 | RPC::add_rpc_class<RpcDigitalIn>(); |
okini3939 | 1:2971dd3e5168 | 70 | RPC::add_rpc_class<RpcDigitalOut>(); |
okini3939 | 1:2971dd3e5168 | 71 | RPC::add_rpc_class<RpcDigitalInOut>(); |
okini3939 | 1:2971dd3e5168 | 72 | RPC::add_rpc_class<RpcPwmOut>(); |
okini3939 | 1:2971dd3e5168 | 73 | |
okini3939 | 0:c4a353ed707d | 74 | httpd = new HTTPD; |
okini3939 | 0:c4a353ed707d | 75 | httpd->attach("/cgi-bin/", &callback_cgi); |
okini3939 | 0:c4a353ed707d | 76 | httpd->attach("/ws/", &callback_ws); |
okini3939 | 1:2971dd3e5168 | 77 | httpd->attach("/rpc/", &callback_rpc); |
okini3939 | 0:c4a353ed707d | 78 | httpd->attach("/", "/local/"); |
okini3939 | 0:c4a353ed707d | 79 | httpd->start(80); |
okini3939 | 0:c4a353ed707d | 80 | printf("httpd ready\r\n"); |
okini3939 | 0:c4a353ed707d | 81 | led1 = 1; |
okini3939 | 0:c4a353ed707d | 82 | |
okini3939 | 0:c4a353ed707d | 83 | for (;;) { |
okini3939 | 0:c4a353ed707d | 84 | } |
okini3939 | 0:c4a353ed707d | 85 | } |