Version of niMQTT library which includes separate process for pings and ability to publish retained messages.
Dependencies: EthernetInterface mbed-rtos mbed
Fork of niMQTT by
Diff: niMQTT.cpp
- Revision:
- 9:3be69efa4402
- Parent:
- 8:438958bb9df3
- Child:
- 10:28cfb74b0584
--- a/niMQTT.cpp Tue Aug 13 13:36:05 2013 +0000 +++ b/niMQTT.cpp Mon Mar 03 14:53:08 2014 +0000 @@ -1,9 +1,15 @@ #include "niMQTT.h" -niMQTT::niMQTT(char *server, void (*callback)(const char*, const char*), char *id, int port, char *username, char *password, bool debug): - server(server), port(port), id(id), callback(callback), username(username), password(password), - debug(debug), connected(true), message_id(0), thread(&niMQTT::thread_starter, this), - waiting_new_packet(true), packet_sent(false), waiting_connack(0), waiting_suback(0), waiting_pingresp(0) { +niMQTT::niMQTT(char *server, void (*callback)(const char*, const char*), + char *id, int port, char *username, char *password, bool debug): + server(server), port(port), id(id), callback(callback), username(username), + password(password), + debug(debug), connected(true), message_id(0), + ping_thread(&niMQTT::ping_thread_starter, this), + recv_thread(&niMQTT::recv_thread_starter, this), + waiting_new_packet(true), packet_sent(false), waiting_connack(0), + waiting_suback(0), waiting_pingresp(0) +{ init(); } @@ -15,7 +21,8 @@ printf("Socket connected.\r\n"); - thread.signal_set(START_THREAD); + ping_thread.signal_set(START_THREAD); + recv_thread.signal_set(START_THREAD); return connect(); } @@ -331,23 +338,37 @@ connect(); } -void niMQTT::thread_starter(void const *p) { +void niMQTT::ping_thread_starter(void const *p) { niMQTT *instance = (niMQTT*)p; - instance->thread_worker(); + instance->ping_thread_worker(); +} + +void niMQTT::recv_thread_starter(void const *p) { + niMQTT *instance = (niMQTT*)p; + instance->recv_thread_worker(); } -void niMQTT::thread_worker() { - if (debug) printf("*thread_worker\r\n"); - thread.signal_wait(START_THREAD); +void niMQTT::ping_thread_worker() { + if (debug) printf("*ping_thread_worker\r\n"); + ping_thread.signal_wait(START_THREAD); while (connected) { - if (debug) printf("New loop in thread worker\r\n"); - recv(); + if (debug) printf("New loop in ping thread worker\r\n"); Thread::wait(KEEP_ALIVE*100); // KEEP_ALIVE / 10 in seconds if (!packet_sent) pingreq(); packet_sent = false; } } +void niMQTT::recv_thread_worker() { + if (debug) printf("*recv_thread_worker\r\n"); + recv_thread.signal_wait(START_THREAD); + while (connected) { + if (debug) printf("New loop in recv thread worker\r\n"); + recv(); + packet_sent = false; + } +} + void niMQTT::get_remaining_length(int remaining_length, char *packet) { int X = remaining_length; int n = 1;