Example node for Yodiwo's Plegma API

Dependencies:   EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL

Committer:
mitsarionas
Date:
Fri Sep 04 08:41:34 2015 +0000
Revision:
2:b7489c070d1f
Child:
5:1ef168357347
pairing & configuration read/write working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mitsarionas 2:b7489c070d1f 1 #include "EthernetInterface.h"
mitsarionas 2:b7489c070d1f 2 #include "HTTPD.h"
mitsarionas 2:b7489c070d1f 3 #include "string.h"
mitsarionas 2:b7489c070d1f 4 #include "pairing_backend.h"
mitsarionas 2:b7489c070d1f 5 #include "pairing_http_handler.h"
mitsarionas 2:b7489c070d1f 6
mitsarionas 2:b7489c070d1f 7 HTTPD *httpd;
mitsarionas 2:b7489c070d1f 8 pairing_context pairing_state;
mitsarionas 2:b7489c070d1f 9 onPaired_callback pairing_done_cb;
mitsarionas 2:b7489c070d1f 10 EthernetInterface *interface;
mitsarionas 2:b7489c070d1f 11 void pairing_handler (int id);
mitsarionas 2:b7489c070d1f 12
mitsarionas 2:b7489c070d1f 13 int start_pairing_http_server(EthernetInterface *eth, int port, onPaired_callback onPaired)
mitsarionas 2:b7489c070d1f 14 {
mitsarionas 2:b7489c070d1f 15 pairing_done_cb = onPaired;
mitsarionas 2:b7489c070d1f 16 interface = eth;
mitsarionas 2:b7489c070d1f 17 httpd = new HTTPD;
mitsarionas 2:b7489c070d1f 18 // httpd->attach("/cgi-bin/", &callback_cgi);
mitsarionas 2:b7489c070d1f 19 // httpd->attach("/ws/", &callback_ws);
mitsarionas 2:b7489c070d1f 20 httpd->attach("/pairing/", &pairing_handler);
mitsarionas 2:b7489c070d1f 21 httpd->attach("/", "/sd/www/");
mitsarionas 2:b7489c070d1f 22 return httpd->start(port);
mitsarionas 2:b7489c070d1f 23 }
mitsarionas 2:b7489c070d1f 24
mitsarionas 2:b7489c070d1f 25 void pairing_handler (int id)
mitsarionas 2:b7489c070d1f 26 {
mitsarionas 2:b7489c070d1f 27 int i, n;
mitsarionas 2:b7489c070d1f 28 int ret;
mitsarionas 2:b7489c070d1f 29 char buf[256];
mitsarionas 2:b7489c070d1f 30 char backUrl[100];
mitsarionas 2:b7489c070d1f 31
mitsarionas 2:b7489c070d1f 32 if (!strcmp(httpd->getFilename(id), "startpairing")) {
mitsarionas 2:b7489c070d1f 33 printf("starting pairing...\n");
mitsarionas 2:b7489c070d1f 34 pairing_context_init_from_config(&pairing_state, pairing_done_cb);
mitsarionas 2:b7489c070d1f 35 pairing_get_tokens(&pairing_state);
mitsarionas 2:b7489c070d1f 36
mitsarionas 2:b7489c070d1f 37 int idx = 0;
mitsarionas 2:b7489c070d1f 38 i = 0;
mitsarionas 2:b7489c070d1f 39 sprintf(backUrl, "http://%s", interface->getIPAddress());
mitsarionas 2:b7489c070d1f 40 char *uri = httpd->getUri(id);
mitsarionas 2:b7489c070d1f 41 printf("1st url part: %s\n",backUrl);
mitsarionas 2:b7489c070d1f 42 while (uri[i] != '\0') {
mitsarionas 2:b7489c070d1f 43 if (uri[i] == '/') {
mitsarionas 2:b7489c070d1f 44 idx = i;
mitsarionas 2:b7489c070d1f 45 }
mitsarionas 2:b7489c070d1f 46 i++;
mitsarionas 2:b7489c070d1f 47 }
mitsarionas 2:b7489c070d1f 48 strncat(backUrl, uri, idx + 1);
mitsarionas 2:b7489c070d1f 49 printf("more of url: %s\n", backUrl);
mitsarionas 2:b7489c070d1f 50 char *redirect = get_server_phase2_url(&pairing_state, backUrl);
mitsarionas 2:b7489c070d1f 51 printf("redirect url: %s\n", redirect);
mitsarionas 2:b7489c070d1f 52 if (redirect) {
mitsarionas 2:b7489c070d1f 53 httpd->redirect(id, 302, redirect, NULL, 0, NULL);
mitsarionas 2:b7489c070d1f 54 // free(redirect);
mitsarionas 2:b7489c070d1f 55 return;
mitsarionas 2:b7489c070d1f 56 }
mitsarionas 2:b7489c070d1f 57
mitsarionas 2:b7489c070d1f 58 } else if (!strcmp(httpd->getFilename(id), "next")) {
mitsarionas 2:b7489c070d1f 59 ret = pairing_get_keys(&pairing_state);
mitsarionas 2:b7489c070d1f 60 pairing_done_cb(pairing_state.nodeKey, pairing_state.secretKey);
mitsarionas 2:b7489c070d1f 61 sprintf(buf, "OK\r\nnodeKey: %s\r\nsecretKey: %s\r\n", pairing_state.nodeKey, pairing_state.secretKey);
mitsarionas 2:b7489c070d1f 62 httpd->send(id, buf, strlen(buf), "Content-Type: text/plain\r\n");
mitsarionas 2:b7489c070d1f 63 } else {
mitsarionas 2:b7489c070d1f 64 httpd->httpdError(id, 404);
mitsarionas 2:b7489c070d1f 65 }
mitsarionas 2:b7489c070d1f 66 strcpy(buf, httpd->getFilename(id));
mitsarionas 2:b7489c070d1f 67 strcat(buf, "\r\n");
mitsarionas 2:b7489c070d1f 68 strcat(buf, httpd->getQueryString(id));
mitsarionas 2:b7489c070d1f 69 strcat(buf, "\r\n");
mitsarionas 2:b7489c070d1f 70 n = strlen(buf);
mitsarionas 2:b7489c070d1f 71
mitsarionas 2:b7489c070d1f 72 i = httpd->receive(id, &buf[n], sizeof(buf) - n);
mitsarionas 2:b7489c070d1f 73 if (i < 0) return;
mitsarionas 2:b7489c070d1f 74 i += n;
mitsarionas 2:b7489c070d1f 75 buf[i] = 0;
mitsarionas 2:b7489c070d1f 76
mitsarionas 2:b7489c070d1f 77 printf("CGI %d %s\r\n", id, buf);
mitsarionas 2:b7489c070d1f 78 // httpd->send(id, buf, i, "Content-Type: text/plain\r\n");
mitsarionas 2:b7489c070d1f 79 }