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
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?

UserRevisionLine numberNew 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 }