Example node for Yodiwo's Plegma API
Dependencies: EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL
pairing_backend.c@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 | 5:1ef168357347 | 1 | #include <stdint.h> |
mitsarionas | 5:1ef168357347 | 2 | #include <stdbool.h> |
mitsarionas | 5:1ef168357347 | 3 | #include <stdio.h> |
mitsarionas | 5:1ef168357347 | 4 | #include <string.h> |
mitsarionas | 5:1ef168357347 | 5 | #include "jsmn.h" |
mitsarionas | 5:1ef168357347 | 6 | #include "yodiwo_helpers.h" |
mitsarionas | 5:1ef168357347 | 7 | #include "config.h" |
mitsarionas | 5:1ef168357347 | 8 | #include "system.h" |
mitsarionas | 5:1ef168357347 | 9 | #include "pairing_backend.h" |
mitsarionas | 5:1ef168357347 | 10 | |
mitsarionas | 5:1ef168357347 | 11 | char recvBuff[1024*20]; |
mitsarionas | 5:1ef168357347 | 12 | void *__get_tokens(pairing_context *ctx); |
mitsarionas | 5:1ef168357347 | 13 | void *__get_keys(pairing_context *ctx); |
mitsarionas | 5:1ef168357347 | 14 | |
mitsarionas | 5:1ef168357347 | 15 | void *do_on_thread(thread_func func, void *args, unsigned int stack_size); |
mitsarionas | 5:1ef168357347 | 16 | |
mitsarionas | 5:1ef168357347 | 17 | #define PAGE_SERVER_PHASE2 "userconfirm" |
mitsarionas | 5:1ef168357347 | 18 | |
mitsarionas | 5:1ef168357347 | 19 | int pairing_context_init_with_defaults(pairing_context *ctx, onPaired_callback callback) |
mitsarionas | 5:1ef168357347 | 20 | { |
mitsarionas | 5:1ef168357347 | 21 | ctx->postUrl = "http://10.30.254.199:3334/pairing/"; |
mitsarionas | 5:1ef168357347 | 22 | ctx->uuid = "1337CNode"; |
mitsarionas | 5:1ef168357347 | 23 | ctx->name = "Nodas"; |
mitsarionas | 5:1ef168357347 | 24 | ctx->onPaired = callback; |
mitsarionas | 5:1ef168357347 | 25 | return 0; |
mitsarionas | 5:1ef168357347 | 26 | } |
mitsarionas | 5:1ef168357347 | 27 | |
mitsarionas | 5:1ef168357347 | 28 | extern Yodiwo_Tools_APIGenerator_CNodeConfig_t *activeConfig; |
mitsarionas | 5:1ef168357347 | 29 | |
mitsarionas | 5:1ef168357347 | 30 | int pairing_context_init_from_config(pairing_context *ctx, onPaired_callback callback) |
mitsarionas | 5:1ef168357347 | 31 | { |
mitsarionas | 5:1ef168357347 | 32 | printf("server url: %s\n", activeConfig->PairingServerUrl); |
mitsarionas | 5:1ef168357347 | 33 | printf("uuid: %s\n", activeConfig->Uuid); |
mitsarionas | 5:1ef168357347 | 34 | printf("name: %s\n", activeConfig->Name); |
mitsarionas | 5:1ef168357347 | 35 | ctx->postUrl = activeConfig->PairingServerUrl; |
mitsarionas | 5:1ef168357347 | 36 | ctx->uuid = activeConfig->Uuid; |
mitsarionas | 5:1ef168357347 | 37 | ctx->name = activeConfig->Name; |
mitsarionas | 5:1ef168357347 | 38 | ctx->onPaired = callback; |
mitsarionas | 5:1ef168357347 | 39 | return 0; |
mitsarionas | 5:1ef168357347 | 40 | } |
mitsarionas | 5:1ef168357347 | 41 | |
mitsarionas | 5:1ef168357347 | 42 | #define STACK_SIZE 24000 |
mitsarionas | 5:1ef168357347 | 43 | |
mitsarionas | 5:1ef168357347 | 44 | |
mitsarionas | 5:1ef168357347 | 45 | int pairing_get_tokens(pairing_context *ctx) |
mitsarionas | 5:1ef168357347 | 46 | { |
mitsarionas | 5:1ef168357347 | 47 | printf("getting tokens from server\n"); |
mitsarionas | 5:1ef168357347 | 48 | return (int)do_on_thread((thread_func)__get_tokens, ctx, STACK_SIZE); |
mitsarionas | 5:1ef168357347 | 49 | } |
mitsarionas | 5:1ef168357347 | 50 | |
mitsarionas | 5:1ef168357347 | 51 | char* get_server_phase2_url(pairing_context *ctx, char *hostname, int port, char *urlBase) |
mitsarionas | 5:1ef168357347 | 52 | { |
mitsarionas | 5:1ef168357347 | 53 | int len = 200; //TODO: proper calculation |
mitsarionas | 5:1ef168357347 | 54 | char* result = (char *)malloc(sizeof(char) * len); |
mitsarionas | 5:1ef168357347 | 55 | if (!result) |
mitsarionas | 5:1ef168357347 | 56 | return NULL; |
mitsarionas | 5:1ef168357347 | 57 | sprintf(result, "%s" "1/" PAGE_SERVER_PHASE2 "?token2=%s&noderedirect=http://%s:%d%snext", |
mitsarionas | 5:1ef168357347 | 58 | ctx->postUrl, ctx->token2, hostname, (port == 0) ? 80 : port, urlBase); |
mitsarionas | 5:1ef168357347 | 59 | return result; |
mitsarionas | 5:1ef168357347 | 60 | } |
mitsarionas | 5:1ef168357347 | 61 | |
mitsarionas | 5:1ef168357347 | 62 | int pairing_get_keys(pairing_context *ctx) |
mitsarionas | 5:1ef168357347 | 63 | { |
mitsarionas | 5:1ef168357347 | 64 | printf("getting keys from server\n"); |
mitsarionas | 5:1ef168357347 | 65 | return (int)do_on_thread((thread_func)__get_keys, ctx, STACK_SIZE); |
mitsarionas | 5:1ef168357347 | 66 | } |
mitsarionas | 5:1ef168357347 | 67 | |
mitsarionas | 5:1ef168357347 | 68 | void *do_on_thread(thread_func func, void *args, unsigned int stack_size) |
mitsarionas | 5:1ef168357347 | 69 | { |
mitsarionas | 5:1ef168357347 | 70 | int r; |
mitsarionas | 5:1ef168357347 | 71 | thread_t t; |
mitsarionas | 5:1ef168357347 | 72 | r = thread_run(&t, func, args, 0, stack_size); |
mitsarionas | 5:1ef168357347 | 73 | printf("run: %d\n", r); |
mitsarionas | 5:1ef168357347 | 74 | if (r < 0) |
mitsarionas | 5:1ef168357347 | 75 | return (void *)-1; |
mitsarionas | 5:1ef168357347 | 76 | return thread_join(&t); |
mitsarionas | 5:1ef168357347 | 77 | } |
mitsarionas | 5:1ef168357347 | 78 | |
mitsarionas | 5:1ef168357347 | 79 | void *__get_tokens(pairing_context *ctx) |
mitsarionas | 5:1ef168357347 | 80 | { |
mitsarionas | 5:1ef168357347 | 81 | char url[100]; |
mitsarionas | 5:1ef168357347 | 82 | char postfields[100]; |
mitsarionas | 5:1ef168357347 | 83 | char response[512]; |
mitsarionas | 5:1ef168357347 | 84 | int ret; |
mitsarionas | 5:1ef168357347 | 85 | strcpy(url, ctx->postUrl); |
mitsarionas | 5:1ef168357347 | 86 | strcat(url, "/1/gettokensreq"); |
mitsarionas | 5:1ef168357347 | 87 | |
mitsarionas | 5:1ef168357347 | 88 | //POST data |
mitsarionas | 5:1ef168357347 | 89 | sprintf(postfields, "name=%s&uuid=%s", ctx->name, ctx->uuid); |
mitsarionas | 5:1ef168357347 | 90 | printf("\nTrying to post data...\n"); |
mitsarionas | 5:1ef168357347 | 91 | ret = http_post(url, postfields, response, 512); |
mitsarionas | 5:1ef168357347 | 92 | Yodiwo_Plegma_NodePairing_PairingServerTokensResponse_t tokens; |
mitsarionas | 5:1ef168357347 | 93 | if (ret > 0) |
mitsarionas | 5:1ef168357347 | 94 | { |
mitsarionas | 5:1ef168357347 | 95 | printf("Executed POST successfully - read %zu characters\n", strlen(response)); |
mitsarionas | 5:1ef168357347 | 96 | printf("Result: %s\n", response); |
mitsarionas | 5:1ef168357347 | 97 | int jret = Yodiwo_Plegma_NodePairing_PairingServerTokensResponse_FromJson(response, strlen(response), &tokens); |
mitsarionas | 5:1ef168357347 | 98 | if (jret == Yodiwo_JsonSuccessParse) { |
mitsarionas | 5:1ef168357347 | 99 | ctx->token1 = tokens.token1; |
mitsarionas | 5:1ef168357347 | 100 | ctx->token2 = tokens.token2; |
mitsarionas | 5:1ef168357347 | 101 | return (void *)0; |
mitsarionas | 5:1ef168357347 | 102 | } else { |
mitsarionas | 5:1ef168357347 | 103 | printf("error parsing response"); |
mitsarionas | 5:1ef168357347 | 104 | return (void *)-2; |
mitsarionas | 5:1ef168357347 | 105 | } |
mitsarionas | 5:1ef168357347 | 106 | } |
mitsarionas | 5:1ef168357347 | 107 | else |
mitsarionas | 5:1ef168357347 | 108 | { |
mitsarionas | 5:1ef168357347 | 109 | printf("Error HTTP Post return code = %d\n", ret); |
mitsarionas | 5:1ef168357347 | 110 | } |
mitsarionas | 5:1ef168357347 | 111 | return (void *)ret; |
mitsarionas | 5:1ef168357347 | 112 | |
mitsarionas | 5:1ef168357347 | 113 | } |
mitsarionas | 5:1ef168357347 | 114 | |
mitsarionas | 5:1ef168357347 | 115 | |
mitsarionas | 5:1ef168357347 | 116 | void *__get_keys(pairing_context *ctx) |
mitsarionas | 5:1ef168357347 | 117 | { |
mitsarionas | 5:1ef168357347 | 118 | char url[100]; |
mitsarionas | 5:1ef168357347 | 119 | char postfields[100]; |
mitsarionas | 5:1ef168357347 | 120 | char response[512]; |
mitsarionas | 5:1ef168357347 | 121 | |
mitsarionas | 5:1ef168357347 | 122 | strcpy(url, ctx->postUrl); |
mitsarionas | 5:1ef168357347 | 123 | strcat(url, "/1/getkeysreq"); |
mitsarionas | 5:1ef168357347 | 124 | int ret; |
mitsarionas | 5:1ef168357347 | 125 | |
mitsarionas | 5:1ef168357347 | 126 | //POST data |
mitsarionas | 5:1ef168357347 | 127 | sprintf(postfields, "uuid=%s&token1=%s", ctx->uuid, ctx->token1); |
mitsarionas | 5:1ef168357347 | 128 | |
mitsarionas | 5:1ef168357347 | 129 | printf("\nTrying to post data...\n"); |
mitsarionas | 5:1ef168357347 | 130 | ret = http_post(url, postfields, response, 512); |
mitsarionas | 5:1ef168357347 | 131 | Yodiwo_Plegma_NodePairing_PairingServerKeysResponse_t keys; |
mitsarionas | 5:1ef168357347 | 132 | if (ret > 0) |
mitsarionas | 5:1ef168357347 | 133 | { |
mitsarionas | 5:1ef168357347 | 134 | printf("Executed POST successfully - read %zu characters\n", strlen(response)); |
mitsarionas | 5:1ef168357347 | 135 | printf("Result: %s\n", response); |
mitsarionas | 5:1ef168357347 | 136 | int jret = Yodiwo_Plegma_NodePairing_PairingServerKeysResponse_FromJson(response, strlen(response), &keys); |
mitsarionas | 5:1ef168357347 | 137 | if (jret == Yodiwo_JsonSuccessParse) { |
mitsarionas | 5:1ef168357347 | 138 | ctx->nodeKey = keys.nodeKey; |
mitsarionas | 5:1ef168357347 | 139 | ctx->secretKey = keys.secretKey; |
mitsarionas | 5:1ef168357347 | 140 | return (void *)0; |
mitsarionas | 5:1ef168357347 | 141 | } else { |
mitsarionas | 5:1ef168357347 | 142 | printf("error parsing response"); |
mitsarionas | 5:1ef168357347 | 143 | return (void *)-2; |
mitsarionas | 5:1ef168357347 | 144 | } |
mitsarionas | 5:1ef168357347 | 145 | } |
mitsarionas | 5:1ef168357347 | 146 | else |
mitsarionas | 5:1ef168357347 | 147 | { |
mitsarionas | 5:1ef168357347 | 148 | printf("Error HTTP Post return code = %d\n", ret); |
mitsarionas | 5:1ef168357347 | 149 | } |
mitsarionas | 5:1ef168357347 | 150 | return (void *)ret; |
mitsarionas | 5:1ef168357347 | 151 | |
mitsarionas | 5:1ef168357347 | 152 | } |
mitsarionas | 5:1ef168357347 | 153 |