Example node for Yodiwo's Plegma API

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

Committer:
mitsarionas
Date:
Mon Sep 28 09:13:43 2015 +0000
Revision:
8:66d34592c1ad
Parent:
5:1ef168357347
using published HTTPClient

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 5:1ef168357347 12 int server_port; //TODO: get this from HTTPD?
mitsarionas 2:b7489c070d1f 13
mitsarionas 5:1ef168357347 14
mitsarionas 5:1ef168357347 15 int startpairing(int id);
mitsarionas 5:1ef168357347 16 int next(int id);
mitsarionas 5:1ef168357347 17
mitsarionas 5:1ef168357347 18 int start_pairing_http_server(void *ifdata, int port, onPaired_callback onPaired)
mitsarionas 2:b7489c070d1f 19 {
mitsarionas 5:1ef168357347 20 interface = (EthernetInterface *)ifdata;
mitsarionas 2:b7489c070d1f 21 pairing_done_cb = onPaired;
mitsarionas 2:b7489c070d1f 22 httpd = new HTTPD;
mitsarionas 2:b7489c070d1f 23 // httpd->attach("/cgi-bin/", &callback_cgi);
mitsarionas 2:b7489c070d1f 24 // httpd->attach("/ws/", &callback_ws);
mitsarionas 2:b7489c070d1f 25 httpd->attach("/pairing/", &pairing_handler);
mitsarionas 2:b7489c070d1f 26 httpd->attach("/", "/sd/www/");
mitsarionas 2:b7489c070d1f 27 return httpd->start(port);
mitsarionas 2:b7489c070d1f 28 }
mitsarionas 2:b7489c070d1f 29
mitsarionas 2:b7489c070d1f 30 void pairing_handler (int id)
mitsarionas 2:b7489c070d1f 31 {
mitsarionas 2:b7489c070d1f 32 if (!strcmp(httpd->getFilename(id), "startpairing")) {
mitsarionas 5:1ef168357347 33 if (!startpairing(id)) {
mitsarionas 5:1ef168357347 34 return;
mitsarionas 2:b7489c070d1f 35 }
mitsarionas 5:1ef168357347 36 } else if (!strcmp(httpd->getFilename(id), "next")) {
mitsarionas 5:1ef168357347 37 if (!next(id)) {
mitsarionas 2:b7489c070d1f 38 return;
mitsarionas 2:b7489c070d1f 39 }
mitsarionas 2:b7489c070d1f 40
mitsarionas 2:b7489c070d1f 41 } else {
mitsarionas 2:b7489c070d1f 42 httpd->httpdError(id, 404);
mitsarionas 2:b7489c070d1f 43 }
mitsarionas 5:1ef168357347 44 httpd->httpdError(id, 400);
mitsarionas 5:1ef168357347 45 }
mitsarionas 5:1ef168357347 46
mitsarionas 5:1ef168357347 47 int startpairing(int id)
mitsarionas 5:1ef168357347 48 {
mitsarionas 5:1ef168357347 49 char urlBase[100];
mitsarionas 5:1ef168357347 50 int i;
mitsarionas 5:1ef168357347 51 printf("starting pairing...\n");
mitsarionas 5:1ef168357347 52 pairing_context_init_from_config(&pairing_state, pairing_done_cb);
mitsarionas 5:1ef168357347 53 pairing_get_tokens(&pairing_state);
mitsarionas 5:1ef168357347 54
mitsarionas 5:1ef168357347 55 int idx = 0;
mitsarionas 5:1ef168357347 56 i = 0;
mitsarionas 5:1ef168357347 57 char *uri = httpd->getUri(id);
mitsarionas 5:1ef168357347 58 while (uri[i] != '\0') {
mitsarionas 5:1ef168357347 59 if (uri[i] == '/') {
mitsarionas 5:1ef168357347 60 idx = i;
mitsarionas 5:1ef168357347 61 }
mitsarionas 5:1ef168357347 62 i++;
mitsarionas 5:1ef168357347 63 }
mitsarionas 5:1ef168357347 64 urlBase[0] = '\0';
mitsarionas 5:1ef168357347 65 strncat(urlBase, uri, idx + 1);
mitsarionas 5:1ef168357347 66 char *redirect = get_server_phase2_url(&pairing_state, interface->getIPAddress(), server_port, urlBase);
mitsarionas 5:1ef168357347 67 printf("redirect url: %s\n", redirect);
mitsarionas 5:1ef168357347 68 if (redirect) {
mitsarionas 5:1ef168357347 69 httpd->redirect(id, 302, redirect, NULL, 0, NULL);
mitsarionas 5:1ef168357347 70 free(redirect);
mitsarionas 5:1ef168357347 71 return 0;
mitsarionas 5:1ef168357347 72 }
mitsarionas 5:1ef168357347 73 return -1;
mitsarionas 5:1ef168357347 74 }
mitsarionas 5:1ef168357347 75
mitsarionas 5:1ef168357347 76 int next(int id)
mitsarionas 5:1ef168357347 77 {
mitsarionas 5:1ef168357347 78 char buf[300];
mitsarionas 5:1ef168357347 79 int ret;
mitsarionas 5:1ef168357347 80 ret = pairing_get_keys(&pairing_state);
mitsarionas 5:1ef168357347 81 if (ret) {
mitsarionas 5:1ef168357347 82 return ret;
mitsarionas 5:1ef168357347 83 }
mitsarionas 5:1ef168357347 84 pairing_done_cb(pairing_state.nodeKey, pairing_state.secretKey);
mitsarionas 5:1ef168357347 85 sprintf(buf, "OK\r\nnodeKey: %s\r\nsecretKey: %s\r\n", pairing_state.nodeKey, pairing_state.secretKey);
mitsarionas 5:1ef168357347 86 httpd->send(id, buf, strlen(buf), "Content-Type: text/plain\r\n");
mitsarionas 5:1ef168357347 87 return 0;
mitsarionas 5:1ef168357347 88 }