Example node for Yodiwo's Plegma API
Dependencies: EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL
pairing_http_handler.cpp@2:b7489c070d1f, 2015-09-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |