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 5:1ef168357347 1 #include "mbed.h"
mitsarionas 5:1ef168357347 2 #include "rtos.h"
mitsarionas 5:1ef168357347 3
mitsarionas 5:1ef168357347 4 #include <stdint.h>
mitsarionas 5:1ef168357347 5
mitsarionas 5:1ef168357347 6 #include "MQTTClient.h"
mitsarionas 5:1ef168357347 7 #include "MQTTSocket.h"
mitsarionas 5:1ef168357347 8
mitsarionas 5:1ef168357347 9 #include "mqtt_helpers.h"
mitsarionas 5:1ef168357347 10 #include "yodiwo_functions.h"
mitsarionas 5:1ef168357347 11 #include "jsmn.h"
mitsarionas 5:1ef168357347 12 #include "yodiwo_helpers.h"
mitsarionas 5:1ef168357347 13
mitsarionas 5:1ef168357347 14 ///////////////////////////////// NETWORK
mitsarionas 5:1ef168357347 15 //MQTTEthernet ipstack;
mitsarionas 5:1ef168357347 16 MQTTSocket ipstack;
mitsarionas 5:1ef168357347 17 MQTT::Client<MQTTSocket, Countdown, MAX_MSG_LEN> *client;
mitsarionas 5:1ef168357347 18
mitsarionas 5:1ef168357347 19 ///////////////////////////////// MQTT
mitsarionas 5:1ef168357347 20 Thread *mqtt_thread;
mitsarionas 5:1ef168357347 21 void mqtt_thread_func(void const *args);
mitsarionas 5:1ef168357347 22
mitsarionas 5:1ef168357347 23 char mqtt_topic_sub[MAX_TOPIC_LEN];
mitsarionas 5:1ef168357347 24 char mqtt_topic_pub[MAX_TOPIC_LEN];
mitsarionas 5:1ef168357347 25
mitsarionas 5:1ef168357347 26
mitsarionas 5:1ef168357347 27 int mqtt_init(char *hostname, int port, char *certfile, char *nodeKeyS, char *nodeSecret)
mitsarionas 5:1ef168357347 28 {
mitsarionas 5:1ef168357347 29 // initialize_things(nodeKeyS);
mitsarionas 5:1ef168357347 30 Yodiwo_Plegma_NodeKey_t nodeKey;
mitsarionas 5:1ef168357347 31 NodeKey_FromString(&nodeKey, nodeKeyS);
mitsarionas 5:1ef168357347 32 sprintf(mqtt_topic_sub, "/api/out/" YODIWO_API_VERSION_STR "/%s/#", nodeKeyS);
mitsarionas 5:1ef168357347 33 sprintf(mqtt_topic_pub, "/api/in/" YODIWO_API_VERSION_STR "/%s/%s/", nodeKey.UserKey.UserID, nodeKeyS);
mitsarionas 5:1ef168357347 34 printf("topic to subscribe: %s\n", mqtt_topic_sub);
mitsarionas 5:1ef168357347 35
mitsarionas 5:1ef168357347 36 client = new MQTT::Client<MQTTSocket, Countdown, MAX_MSG_LEN>(ipstack);
mitsarionas 5:1ef168357347 37 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
mitsarionas 5:1ef168357347 38 data.MQTTVersion = 4;
mitsarionas 5:1ef168357347 39 data.clientID.cstring = nodeKeyS;
mitsarionas 5:1ef168357347 40 data.username.cstring = nodeKeyS;
mitsarionas 5:1ef168357347 41 data.password.cstring = nodeSecret;
mitsarionas 5:1ef168357347 42 ipstack = MQTTSocket();
mitsarionas 5:1ef168357347 43
mitsarionas 5:1ef168357347 44 printf("connecting to MQTT broker: %s:%d\n", hostname, port);
mitsarionas 5:1ef168357347 45
mitsarionas 5:1ef168357347 46 int rc = ipstack.connect(hostname, port, port > 8000 ? certfile : NULL);
mitsarionas 5:1ef168357347 47 if (rc != 0)
mitsarionas 5:1ef168357347 48 printf("rc from TCP connect is %d\n", rc);
mitsarionas 5:1ef168357347 49
mitsarionas 5:1ef168357347 50 if ((rc = client->connect(data)) != 0)
mitsarionas 5:1ef168357347 51 printf("rc from MQTT connect is %d\n", rc);
mitsarionas 5:1ef168357347 52 printf("MQTT connected\n") ;
mitsarionas 5:1ef168357347 53 if ((rc = client->subscribe(mqtt_topic_sub, MQTT::QOS0, on_mqtt_message)) != 0)
mitsarionas 5:1ef168357347 54 printf("rc from MQTT subscribe is %d\n", rc);
mitsarionas 5:1ef168357347 55 printf("Subscribed\n") ;
mitsarionas 5:1ef168357347 56 if (rc != 0) {
mitsarionas 5:1ef168357347 57 printf("MQTT init failed: %d\n", rc);
mitsarionas 5:1ef168357347 58 return rc;
mitsarionas 5:1ef168357347 59 }
mitsarionas 5:1ef168357347 60 mqtt_thread = new Thread(mqtt_thread_func, (void *)client, osPriorityNormal, 10000);
mitsarionas 5:1ef168357347 61 return 0;
mitsarionas 5:1ef168357347 62 }
mitsarionas 5:1ef168357347 63
mitsarionas 5:1ef168357347 64 void mqtt_thread_func(void const *args)
mitsarionas 5:1ef168357347 65 {
mitsarionas 5:1ef168357347 66 MQTT::Client<MQTTSocket, Countdown, MAX_MSG_LEN> *client = (MQTT::Client<MQTTSocket, Countdown, MAX_MSG_LEN>*)args;
mitsarionas 5:1ef168357347 67 while(1)
mitsarionas 5:1ef168357347 68 client->yield(100);
mitsarionas 5:1ef168357347 69 }
mitsarionas 5:1ef168357347 70
mitsarionas 5:1ef168357347 71
mitsarionas 5:1ef168357347 72 void on_mqtt_message(MQTT::MessageData &md)
mitsarionas 5:1ef168357347 73 {
mitsarionas 5:1ef168357347 74 MQTT::Message &message = md.message;
mitsarionas 5:1ef168357347 75
mitsarionas 5:1ef168357347 76 printf("%.*s\n", md.topicName.lenstring.len, md.topicName.lenstring.data);
mitsarionas 5:1ef168357347 77 printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\n", message.qos, message.retained, message.dup, message.id);
mitsarionas 5:1ef168357347 78 printf("Payload %.*s\n", message.payloadlen, (char*)message.payload);
mitsarionas 5:1ef168357347 79
mitsarionas 5:1ef168357347 80 yodiwo_handle_message((char *)message.payload, message.payloadlen, md.topicName.lenstring.data, md.topicName.lenstring.len);
mitsarionas 5:1ef168357347 81 }
mitsarionas 5:1ef168357347 82
mitsarionas 5:1ef168357347 83 int publisher(char *msg, int msg_len, char *msg_type)
mitsarionas 5:1ef168357347 84 {
mitsarionas 5:1ef168357347 85 int r;
mitsarionas 5:1ef168357347 86 char topic[MAX_TOPIC_LEN];
mitsarionas 5:1ef168357347 87 MQTT::Message message;
mitsarionas 5:1ef168357347 88 message.retained = false;
mitsarionas 5:1ef168357347 89 message.dup = false;
mitsarionas 5:1ef168357347 90 message.payload = (void*)msg;
mitsarionas 5:1ef168357347 91 message.qos = MQTT::QOS0;
mitsarionas 5:1ef168357347 92 message.payloadlen = msg_len - 1;
mitsarionas 5:1ef168357347 93
mitsarionas 5:1ef168357347 94 strcpy(topic, mqtt_topic_pub);
mitsarionas 5:1ef168357347 95 strcat(topic, msg_type);
mitsarionas 5:1ef168357347 96 printf("publishing to %s\n", topic);
mitsarionas 5:1ef168357347 97 printf("content: %.*s\n", msg_len, msg);
mitsarionas 5:1ef168357347 98 printf("length: %d\n", msg_len);
mitsarionas 5:1ef168357347 99 r = client->publish(topic, message);
mitsarionas 5:1ef168357347 100 printf("publish returned %d\n", r);
mitsarionas 5:1ef168357347 101 return r;
mitsarionas 5:1ef168357347 102 }