Example node for Yodiwo's Plegma API

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

Committer:
mitsarionas
Date:
Tue Sep 15 14:43:15 2015 +0000
Revision:
3:11b767300d32
Child:
4:cc4c5b6d9730
demo 1

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