Example node for Yodiwo's Plegma API
Dependencies: EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL
Diff: pairing_http_handler.cpp
- Revision:
- 2:b7489c070d1f
- Child:
- 5:1ef168357347
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pairing_http_handler.cpp Fri Sep 04 08:41:34 2015 +0000 @@ -0,0 +1,79 @@ +#include "EthernetInterface.h" +#include "HTTPD.h" +#include "string.h" +#include "pairing_backend.h" +#include "pairing_http_handler.h" + +HTTPD *httpd; +pairing_context pairing_state; +onPaired_callback pairing_done_cb; +EthernetInterface *interface; +void pairing_handler (int id); + +int start_pairing_http_server(EthernetInterface *eth, int port, onPaired_callback onPaired) +{ + pairing_done_cb = onPaired; + interface = eth; + httpd = new HTTPD; +// httpd->attach("/cgi-bin/", &callback_cgi); +// httpd->attach("/ws/", &callback_ws); + httpd->attach("/pairing/", &pairing_handler); + httpd->attach("/", "/sd/www/"); + return httpd->start(port); +} + +void pairing_handler (int id) +{ + int i, n; + int ret; + char buf[256]; + char backUrl[100]; + + if (!strcmp(httpd->getFilename(id), "startpairing")) { + printf("starting pairing...\n"); + pairing_context_init_from_config(&pairing_state, pairing_done_cb); + pairing_get_tokens(&pairing_state); + + int idx = 0; + i = 0; + sprintf(backUrl, "http://%s", interface->getIPAddress()); + char *uri = httpd->getUri(id); + printf("1st url part: %s\n",backUrl); + while (uri[i] != '\0') { + if (uri[i] == '/') { + idx = i; + } + i++; + } + strncat(backUrl, uri, idx + 1); + printf("more of url: %s\n", backUrl); + char *redirect = get_server_phase2_url(&pairing_state, backUrl); + printf("redirect url: %s\n", redirect); + if (redirect) { + httpd->redirect(id, 302, redirect, NULL, 0, NULL); +// free(redirect); + return; + } + + } else if (!strcmp(httpd->getFilename(id), "next")) { + ret = pairing_get_keys(&pairing_state); + pairing_done_cb(pairing_state.nodeKey, pairing_state.secretKey); + sprintf(buf, "OK\r\nnodeKey: %s\r\nsecretKey: %s\r\n", pairing_state.nodeKey, pairing_state.secretKey); + httpd->send(id, buf, strlen(buf), "Content-Type: text/plain\r\n"); + } else { + httpd->httpdError(id, 404); + } + 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"); +} \ No newline at end of file