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@8:66d34592c1ad, 2015-09-28 (annotated)
- 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?
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 | 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 | } |