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

Committer:
okini3939
Date:
2013-11-13
Revision:
1:2971dd3e5168
Parent:
0:c4a353ed707d

File content as of revision 1:2971dd3e5168:

#include "mbed.h"
#include "rtos.h"
#include "EthernetInterface.h"
#include "mbed_rpc.h"
#include "HTTPD.h"

EthernetInterface *eth;
HTTPD *httpd;

Serial pc(USBTX, USBRX);
LocalFileSystem local("local");
DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);

void callback_cgi (int id) {
    int i, n;
    char buf[256];

    strcpy(buf, httpd->getFilename(id));
    strcat(buf, "\r\n");
    strcat(buf, httpd->getQueryString(id));
    strcat(buf, "\r\n");
    n = strlen(buf);

    i = httpd->receive(id, &buf[n], sizeof(buf) - n);
    if (i < 0) return;
    i += n;
    buf[i] = 0;

    printf("CGI %d %s\r\n", id, buf);
    httpd->send(id, buf, i, "Content-Type: text/plain\r\n");
}

void callback_ws (int id) {
    int i;
    char buf[256];

    i = httpd->receive(id, buf, sizeof(buf));
    if (i < 0) return;
    buf[i] = 0;

    printf("WS %d %s\r\n", id, buf);
    httpd->sendWebsocket(id, buf, i);
}

void callback_rpc (int id) {
    char buf[40], outbuf[40];

    strcpy(buf, "/");
    httpd->urldecode(httpd->getFilename(id), &buf[1], sizeof(buf) - 2);
    RPC::call(buf, outbuf);

    printf("RPC id %d '%s' '%s'\r\n", id, buf, outbuf);
    httpd->send(id, outbuf, strlen(outbuf), "Content-Type: text/plain\r\n");
}

int main () {

    pc.baud(115200);
    printf("HTTP Server...\r\n");

    eth = new EthernetInterface;
//    eth->init(); //Use DHCP
    eth->init("192.168.1.2", "255.255.255.0", "192.168.1.1");
    if (eth->connect()) return -1;
    printf("IP Address is %s\r\n", eth->getIPAddress());

//    RPC::add_rpc_class<RpcAnalogIn>();
//    RPC::add_rpc_class<RpcAnalogOut>();
    RPC::add_rpc_class<RpcDigitalIn>();
    RPC::add_rpc_class<RpcDigitalOut>();
    RPC::add_rpc_class<RpcDigitalInOut>();
    RPC::add_rpc_class<RpcPwmOut>();

    httpd = new HTTPD;
    httpd->attach("/cgi-bin/", &callback_cgi);
    httpd->attach("/ws/", &callback_ws);
    httpd->attach("/rpc/", &callback_rpc);
    httpd->attach("/", "/local/");
    httpd->start(80);
    printf("httpd ready\r\n");
    led1 = 1;

    for (;;) {
    }
}