Example node for Yodiwo's Plegma API
Dependencies: EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL
mqtt_helpers.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 | 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 | } |