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 3:11b767300d32 1 #include <stdint.h>
mitsarionas 3:11b767300d32 2 #include <stdbool.h>
mitsarionas 3:11b767300d32 3 #include <stdlib.h>
mitsarionas 3:11b767300d32 4 #include <string.h>
mitsarionas 3:11b767300d32 5 #include <stdio.h>
mitsarionas 3:11b767300d32 6 #include <errno.h>
mitsarionas 3:11b767300d32 7
mitsarionas 3:11b767300d32 8 #include "yodiwo_functions.h"
mitsarionas 3:11b767300d32 9 #include "jsmn.h"
mitsarionas 5:1ef168357347 10 #include "yodiwo_helpers.h"
mitsarionas 3:11b767300d32 11
mitsarionas 3:11b767300d32 12 #define MAX_TOPIC_LEN 100
mitsarionas 3:11b767300d32 13 #define MAX_PORTEVENT_HANDLERS 5
mitsarionas 3:11b767300d32 14
mitsarionas 3:11b767300d32 15 int SeqNo = 0;
mitsarionas 3:11b767300d32 16
mitsarionas 3:11b767300d32 17 int handle_nodeinforeq(char *json, size_t len);
mitsarionas 3:11b767300d32 18 int handle_thingsreq(char *json, size_t len);
mitsarionas 3:11b767300d32 19 int handle_portstatersp(char *json, size_t len);
mitsarionas 3:11b767300d32 20 int handle_activeportkeysmsg(char *json, size_t len);
mitsarionas 3:11b767300d32 21 int handle_porteventmsg(char *json, size_t len);
mitsarionas 3:11b767300d32 22
mitsarionas 3:11b767300d32 23 typedef int (*portevent_handler_func)(Yodiwo_Plegma_PortEvent_t *event);
mitsarionas 3:11b767300d32 24
mitsarionas 3:11b767300d32 25 typedef struct
mitsarionas 3:11b767300d32 26 {
mitsarionas 3:11b767300d32 27 char *portKey;
mitsarionas 3:11b767300d32 28 portevent_handler_func handler;
mitsarionas 3:11b767300d32 29 } portevent_handler;
mitsarionas 3:11b767300d32 30
mitsarionas 3:11b767300d32 31 portevent_handler portevent_handlers[MAX_PORTEVENT_HANDLERS] = { 0 };
mitsarionas 3:11b767300d32 32
mitsarionas 3:11b767300d32 33 message_translators translators[] = {
mitsarionas 3:11b767300d32 34 // {"loginreq", (func_ToJson *)Yodiwo_Plegma_LoginReq_ToJson, (func_FromJson *)Yodiwo_Plegma_LoginReq_FromJson, handle_loginreq},
mitsarionas 3:11b767300d32 35 // {"loginrsp", (func_ToJson *)Yodiwo_Plegma_LoginRsp_ToJson, (func_FromJson *)Yodiwo_Plegma_LoginRsp_FromJson},
mitsarionas 3:11b767300d32 36 {"nodeinforeq", (func_ToJson *)Yodiwo_Plegma_NodeInfoReq_ToJson, (func_FromJson *)Yodiwo_Plegma_NodeInfoReq_FromJson, handle_nodeinforeq},
mitsarionas 3:11b767300d32 37 // {"nodeinforsp", (func_ToJson *)Yodiwo_Plegma_NodeInfoRsp_ToJson, (func_FromJson *)Yodiwo_Plegma_NodeInfoRsp_FromJson, handle_nodeinforsp},
mitsarionas 3:11b767300d32 38 {"thingsreq", (func_ToJson *)Yodiwo_Plegma_ThingsReq_ToJson, (func_FromJson *)Yodiwo_Plegma_ThingsReq_FromJson, handle_thingsreq},
mitsarionas 3:11b767300d32 39 // {"thingsrsp", (func_ToJson *)Yodiwo_Plegma_ThingsRsp_ToJson, (func_FromJson *)Yodiwo_Plegma_ThingsRsp_FromJson, handle_thingsrsp},
mitsarionas 3:11b767300d32 40 {"porteventmsg", (func_ToJson *)Yodiwo_Plegma_PortEventMsg_ToJson, (func_FromJson *)Yodiwo_Plegma_PortEventMsg_FromJson, handle_porteventmsg},
mitsarionas 3:11b767300d32 41 // {"portstatereq", (func_ToJson *)Yodiwo_Plegma_PortStateReq_ToJson, (func_FromJson *)Yodiwo_Plegma_PortStateReq_FromJson},
mitsarionas 3:11b767300d32 42 {"portstatersp", (func_ToJson *)Yodiwo_Plegma_PortStateRsp_ToJson, (func_FromJson *)Yodiwo_Plegma_PortStateRsp_FromJson, handle_portstatersp},
mitsarionas 3:11b767300d32 43 {"activeportkeysmsg", (func_ToJson *)Yodiwo_Plegma_ActivePortKeysMsg_ToJson, (func_FromJson *)Yodiwo_Plegma_ActivePortKeysMsg_FromJson, handle_activeportkeysmsg},
mitsarionas 3:11b767300d32 44 };
mitsarionas 3:11b767300d32 45
mitsarionas 3:11b767300d32 46 char node_name[50] = "";
mitsarionas 4:cc4c5b6d9730 47 static Array_Yodiwo_Plegma_Thing_t *array_things = NULL;
mitsarionas 3:11b767300d32 48 msg_sender send_func = NULL;
mitsarionas 3:11b767300d32 49
mitsarionas 3:11b767300d32 50 int translators_num = sizeof(translators) / sizeof(translators[0]);
mitsarionas 3:11b767300d32 51
mitsarionas 3:11b767300d32 52
mitsarionas 3:11b767300d32 53 void init_yodiwo(char *nodeName, Array_Yodiwo_Plegma_Thing_t *things, msg_sender sender)
mitsarionas 3:11b767300d32 54 {
mitsarionas 3:11b767300d32 55 strcpy(node_name, nodeName);
mitsarionas 4:cc4c5b6d9730 56 array_things = things;
mitsarionas 3:11b767300d32 57 send_func = sender;
mitsarionas 3:11b767300d32 58 }
mitsarionas 3:11b767300d32 59
mitsarionas 3:11b767300d32 60 void get_topic_token(char *dst, char *src, int max_len, int token_idx)
mitsarionas 3:11b767300d32 61 {
mitsarionas 3:11b767300d32 62 char buf[MAX_TOPIC_LEN];
mitsarionas 3:11b767300d32 63 char *cur = buf;
mitsarionas 3:11b767300d32 64 int i;
mitsarionas 3:11b767300d32 65 buf[0] = '\0';
mitsarionas 3:11b767300d32 66 strncat(buf, src, max_len);
mitsarionas 3:11b767300d32 67 for(i = 0; i < token_idx + 1; i++) {
mitsarionas 3:11b767300d32 68 cur = strtok((i==0) ? buf : NULL, "/");
mitsarionas 3:11b767300d32 69 // printf("a token: %s\n", cur);
mitsarionas 3:11b767300d32 70 if (cur == NULL) {
mitsarionas 3:11b767300d32 71 *dst = '\0';
mitsarionas 3:11b767300d32 72 return;
mitsarionas 3:11b767300d32 73 }
mitsarionas 3:11b767300d32 74 }
mitsarionas 3:11b767300d32 75 strcpy(dst, cur);
mitsarionas 3:11b767300d32 76 }
mitsarionas 3:11b767300d32 77
mitsarionas 3:11b767300d32 78 int yodiwo_handle_message(char *message, int message_len, char *topic, int topic_len)
mitsarionas 3:11b767300d32 79 {
mitsarionas 3:11b767300d32 80 int i;
mitsarionas 3:11b767300d32 81 Yodiwo_Plegma_Mqtt_MqttAPIMessage_t api_msg;
mitsarionas 3:11b767300d32 82 char token[40];
mitsarionas 3:11b767300d32 83
mitsarionas 3:11b767300d32 84 i = Yodiwo_Plegma_Mqtt_MqttAPIMessage_FromJson(message, message_len, &api_msg);
mitsarionas 3:11b767300d32 85 if (i < 0) {
mitsarionas 3:11b767300d32 86 printf("Error deserializing MqttApiMessage\n");
mitsarionas 3:11b767300d32 87 return -1;
mitsarionas 3:11b767300d32 88 }
mitsarionas 3:11b767300d32 89
mitsarionas 3:11b767300d32 90 get_topic_token(token, topic, topic_len, 4);
mitsarionas 3:11b767300d32 91
mitsarionas 3:11b767300d32 92 printf("found token: %s\n", token);
mitsarionas 3:11b767300d32 93 for (i = 0; i < translators_num; i++) {
mitsarionas 3:11b767300d32 94 printf("checking for %s\n", translators[i].name);
mitsarionas 3:11b767300d32 95 if (!strcmp(token, translators[i].name)) {
mitsarionas 3:11b767300d32 96 printf("matched message type: %s\n", token);
mitsarionas 3:11b767300d32 97 translators[i].msg_handler(api_msg.Payload, strlen(api_msg.Payload));
mitsarionas 3:11b767300d32 98 break;
mitsarionas 3:11b767300d32 99 }
mitsarionas 3:11b767300d32 100 }
mitsarionas 3:11b767300d32 101 // free api_msg internal
mitsarionas 3:11b767300d32 102 return 0;
mitsarionas 3:11b767300d32 103 }
mitsarionas 3:11b767300d32 104
mitsarionas 3:11b767300d32 105 int publish_helper(char *msg, size_t len, char *subtopic, int responseToSeqNo)
mitsarionas 3:11b767300d32 106 {
mitsarionas 3:11b767300d32 107 int r;
mitsarionas 3:11b767300d32 108 int final_len;
mitsarionas 3:11b767300d32 109 Yodiwo_Plegma_Mqtt_MqttAPIMessage_t mqtt_api_msg;
mitsarionas 3:11b767300d32 110
mitsarionas 4:cc4c5b6d9730 111 char *final_msg = (char *)malloc(len + 500); // TODO: more accurate / proper?
mitsarionas 3:11b767300d32 112 if (final_msg == NULL) {
mitsarionas 4:cc4c5b6d9730 113 printf("nomem\n");
mitsarionas 3:11b767300d32 114 return -ENOMEM;
mitsarionas 3:11b767300d32 115 }
mitsarionas 3:11b767300d32 116
mitsarionas 3:11b767300d32 117 mqtt_api_msg.ResponseToSeqNo = responseToSeqNo;
mitsarionas 3:11b767300d32 118 mqtt_api_msg.Payload = msg;
mitsarionas 4:cc4c5b6d9730 119 final_len = Yodiwo_Plegma_Mqtt_MqttAPIMessage_ToJson(final_msg, len + 500, &mqtt_api_msg);
mitsarionas 3:11b767300d32 120
mitsarionas 3:11b767300d32 121 r = send_func(final_msg, final_len, subtopic);
mitsarionas 3:11b767300d32 122
mitsarionas 3:11b767300d32 123 free(final_msg);
mitsarionas 3:11b767300d32 124 return r;
mitsarionas 3:11b767300d32 125 }
mitsarionas 3:11b767300d32 126
mitsarionas 3:11b767300d32 127 int handle_nodeinforeq(char *json, size_t len)
mitsarionas 3:11b767300d32 128 {
mitsarionas 3:11b767300d32 129 int r;
mitsarionas 3:11b767300d32 130 Yodiwo_Plegma_NodeInfoReq_t msg;
mitsarionas 3:11b767300d32 131 Yodiwo_Plegma_NodeInfoRsp_t rsp;
mitsarionas 3:11b767300d32 132 r = Yodiwo_Plegma_NodeInfoReq_FromJson(json, len, &msg);
mitsarionas 3:11b767300d32 133 printf("fromjson: %d\n", r);
mitsarionas 3:11b767300d32 134 if (r)
mitsarionas 3:11b767300d32 135 return r;
mitsarionas 3:11b767300d32 136 char *json_rsp = (char *)malloc(100); //TODO proper size
mitsarionas 3:11b767300d32 137 if (json_rsp == NULL) {
mitsarionas 3:11b767300d32 138 return -ENOMEM;
mitsarionas 3:11b767300d32 139 }
mitsarionas 3:11b767300d32 140 rsp.SeqNo = msg.SeqNo;
mitsarionas 3:11b767300d32 141 rsp.Name = node_name;
mitsarionas 3:11b767300d32 142 rsp.Type = Yodiwo_eNodeType_TestEndpoint;
mitsarionas 3:11b767300d32 143 rsp.ThingTypes.num = 0;
mitsarionas 3:11b767300d32 144 rsp.Capabilities = Yodiwo_eNodeCapa_None;
mitsarionas 3:11b767300d32 145 r = Yodiwo_Plegma_NodeInfoRsp_ToJson(json_rsp, 100, &rsp);
mitsarionas 3:11b767300d32 146 printf("tojson: %d\n", r);
mitsarionas 3:11b767300d32 147 if (r < 0)
mitsarionas 3:11b767300d32 148 return r;
mitsarionas 3:11b767300d32 149 r = publish_helper(json_rsp, r, "nodeinforsp", msg.SeqNo);
mitsarionas 3:11b767300d32 150
mitsarionas 3:11b767300d32 151 free(json_rsp);
mitsarionas 3:11b767300d32 152 return r;
mitsarionas 3:11b767300d32 153 }
mitsarionas 3:11b767300d32 154
mitsarionas 3:11b767300d32 155 int handle_thingsreq(char *json, size_t len)
mitsarionas 3:11b767300d32 156 {
mitsarionas 3:11b767300d32 157 int r;
mitsarionas 3:11b767300d32 158 Yodiwo_Plegma_ThingsReq_t msg;
mitsarionas 3:11b767300d32 159 Yodiwo_Plegma_ThingsRsp_t rsp;
mitsarionas 3:11b767300d32 160 char *sendbuf = NULL;
mitsarionas 3:11b767300d32 161 r = Yodiwo_Plegma_ThingsReq_FromJson(json, len, &msg);
mitsarionas 3:11b767300d32 162 printf("thingsreq json: %s\n", json);
mitsarionas 3:11b767300d32 163 printf("fromjson: %d\n", r);
mitsarionas 3:11b767300d32 164 if (r)
mitsarionas 3:11b767300d32 165 goto exit;
mitsarionas 5:1ef168357347 166 printf("%p\n", &msg);
mitsarionas 5:1ef168357347 167 printf("%p\n", &msg.SeqNo);
mitsarionas 5:1ef168357347 168 printf("%p\n", &msg.Operation);
mitsarionas 5:1ef168357347 169 printf("%p\n", &msg.ThingKey);
mitsarionas 5:1ef168357347 170 printf("%p\n", &msg.Data);
mitsarionas 3:11b767300d32 171
mitsarionas 3:11b767300d32 172 rsp.SeqNo = msg.SeqNo;
mitsarionas 3:11b767300d32 173 rsp.Operation = msg.Operation;
mitsarionas 5:1ef168357347 174 printf("thingsreq operation: %d\n", msg.Operation);
mitsarionas 3:11b767300d32 175 if (msg.Operation == Yodiwo_eThingsOperation_Get) {
mitsarionas 4:cc4c5b6d9730 176 rsp.Data = *array_things;
mitsarionas 3:11b767300d32 177 rsp.Status = 1;
mitsarionas 3:11b767300d32 178 } else {
mitsarionas 3:11b767300d32 179 rsp.Data.num = 0;
mitsarionas 3:11b767300d32 180 rsp.Data.elems = NULL;
mitsarionas 3:11b767300d32 181 rsp.Status = 0;
mitsarionas 3:11b767300d32 182 }
mitsarionas 3:11b767300d32 183
mitsarionas 4:cc4c5b6d9730 184 sendbuf = (char *)malloc(2500 * sizeof(char));
mitsarionas 3:11b767300d32 185 if (sendbuf == NULL) {
mitsarionas 3:11b767300d32 186 r = -ENOMEM;
mitsarionas 3:11b767300d32 187 goto exit;
mitsarionas 3:11b767300d32 188 }
mitsarionas 4:cc4c5b6d9730 189 r = Yodiwo_Plegma_ThingsRsp_ToJson(sendbuf, 2500, &rsp);
mitsarionas 3:11b767300d32 190 printf("thingsrsp json: %s\n", sendbuf);
mitsarionas 3:11b767300d32 191 printf("tojson: %d\n", r);
mitsarionas 3:11b767300d32 192 if (r < 0)
mitsarionas 3:11b767300d32 193 goto exit;
mitsarionas 3:11b767300d32 194 r = publish_helper(sendbuf, r, "thingsrsp", msg.SeqNo);
mitsarionas 3:11b767300d32 195 exit:
mitsarionas 3:11b767300d32 196 free(sendbuf);
mitsarionas 3:11b767300d32 197 //free thingsreq internals
mitsarionas 3:11b767300d32 198 return r;
mitsarionas 3:11b767300d32 199 }
mitsarionas 3:11b767300d32 200
mitsarionas 3:11b767300d32 201 int portevents(Array_Yodiwo_Plegma_PortEvent_t *events)
mitsarionas 3:11b767300d32 202 {
mitsarionas 3:11b767300d32 203 Yodiwo_Plegma_PortEventMsg_t msg;
mitsarionas 3:11b767300d32 204 char *msgbuf;
mitsarionas 3:11b767300d32 205 int r;
mitsarionas 3:11b767300d32 206 msg.SeqNo = SeqNo++;
mitsarionas 3:11b767300d32 207 msg.PortEvents = *events;
mitsarionas 3:11b767300d32 208
mitsarionas 3:11b767300d32 209 msgbuf = (char *)malloc(200); //proper
mitsarionas 3:11b767300d32 210 if (msgbuf == NULL) {
mitsarionas 3:11b767300d32 211 printf("can't remember\n");
mitsarionas 3:11b767300d32 212 return -ENOMEM;
mitsarionas 3:11b767300d32 213 }
mitsarionas 3:11b767300d32 214 r = Yodiwo_Plegma_PortEventMsg_ToJson(msgbuf, 200, &msg);
mitsarionas 3:11b767300d32 215 if (r < 0) {
mitsarionas 3:11b767300d32 216 printf("i'm afraid json couldn't make it\n");
mitsarionas 3:11b767300d32 217 free(msgbuf);
mitsarionas 3:11b767300d32 218 return r;
mitsarionas 3:11b767300d32 219 }
mitsarionas 3:11b767300d32 220 r = publish_helper(msgbuf, r, "porteventmsg", 0);
mitsarionas 3:11b767300d32 221
mitsarionas 3:11b767300d32 222 free(msgbuf);
mitsarionas 3:11b767300d32 223 return r;
mitsarionas 3:11b767300d32 224 }
mitsarionas 3:11b767300d32 225
mitsarionas 3:11b767300d32 226 int register_portevent_handler(char *portKey, portevent_handler_func handler)
mitsarionas 3:11b767300d32 227 {
mitsarionas 3:11b767300d32 228 int i;
mitsarionas 3:11b767300d32 229 for (i = 0; i < MAX_PORTEVENT_HANDLERS; i++) {
mitsarionas 3:11b767300d32 230 if (portevent_handlers[i].portKey == NULL) {
mitsarionas 3:11b767300d32 231 portevent_handlers[i].portKey = portKey;
mitsarionas 3:11b767300d32 232 portevent_handlers[i].handler = handler;
mitsarionas 3:11b767300d32 233 return 0;
mitsarionas 3:11b767300d32 234 }
mitsarionas 3:11b767300d32 235 }
mitsarionas 3:11b767300d32 236 return -1;
mitsarionas 3:11b767300d32 237 }
mitsarionas 3:11b767300d32 238
mitsarionas 3:11b767300d32 239
mitsarionas 3:11b767300d32 240 int handle_portevent(Yodiwo_Plegma_PortEvent_t *event)
mitsarionas 3:11b767300d32 241 {
mitsarionas 3:11b767300d32 242 int i, r;
mitsarionas 3:11b767300d32 243 for (i = 0; i < MAX_PORTEVENT_HANDLERS; i++) {
mitsarionas 3:11b767300d32 244 printf("checking handler for %s, event from %s\n", portevent_handlers[i].portKey, event->PortKey);
mitsarionas 3:11b767300d32 245 if (portevent_handlers[i].portKey != NULL && !strcmp(portevent_handlers[i].portKey, event->PortKey)) {
mitsarionas 3:11b767300d32 246 r = portevent_handlers[i].handler(event);
mitsarionas 3:11b767300d32 247 if (r < 0)
mitsarionas 3:11b767300d32 248 return r;
mitsarionas 3:11b767300d32 249 }
mitsarionas 3:11b767300d32 250 }
mitsarionas 3:11b767300d32 251 return 0;
mitsarionas 3:11b767300d32 252 }
mitsarionas 3:11b767300d32 253
mitsarionas 3:11b767300d32 254 int handle_portstatersp(char *json, size_t len)
mitsarionas 3:11b767300d32 255 {
mitsarionas 4:cc4c5b6d9730 256 return 0;
mitsarionas 3:11b767300d32 257 }
mitsarionas 3:11b767300d32 258
mitsarionas 3:11b767300d32 259 int handle_activeportkeysmsg(char *json, size_t len)
mitsarionas 3:11b767300d32 260 {
mitsarionas 4:cc4c5b6d9730 261 return 0;
mitsarionas 3:11b767300d32 262 }
mitsarionas 3:11b767300d32 263
mitsarionas 3:11b767300d32 264 int handle_porteventmsg(char *json, size_t len)
mitsarionas 3:11b767300d32 265 {
mitsarionas 3:11b767300d32 266 int i, r;
mitsarionas 3:11b767300d32 267 Yodiwo_Plegma_PortEventMsg_t msg;
mitsarionas 3:11b767300d32 268 r = Yodiwo_Plegma_PortEventMsg_FromJson(json, len, &msg);
mitsarionas 3:11b767300d32 269 printf("fromjson: %d\n", r);
mitsarionas 3:11b767300d32 270 if (r)
mitsarionas 3:11b767300d32 271 return r;
mitsarionas 3:11b767300d32 272 for (i = 0; i < msg.PortEvents.num; i++) {
mitsarionas 3:11b767300d32 273 r = handle_portevent(&msg.PortEvents.elems[i]);
mitsarionas 3:11b767300d32 274 if (r < 0)
mitsarionas 3:11b767300d32 275 goto exit;
mitsarionas 3:11b767300d32 276 }
mitsarionas 3:11b767300d32 277
mitsarionas 3:11b767300d32 278 exit:
mitsarionas 3:11b767300d32 279 //TODO: free msg internals
mitsarionas 3:11b767300d32 280 return r;
mitsarionas 3:11b767300d32 281 }
mitsarionas 5:1ef168357347 282