Commit 11fe0b09d19faa4f76dea23f651ebf5e6b376555
1 parent
4b9da1a8
Rework for subscription async
Showing
5 changed files
with
39 additions
and
9 deletions
examples/sub/main.cpp
... | ... | @@ -76,7 +76,8 @@ int main( int argc, char* argv[] ) |
76 | 76 | { |
77 | 77 | std::cout << "[OK]" << std::endl; |
78 | 78 | std::cout << "Connecting to the test-broker : " << std::endl; |
79 | - pSubscriber->connect( "localhost", 1883, "", "" ); | |
79 | + pSubscriber->connect( "localhost", 1883, "", "", "test/subscriber/LWT", "Subscriber disconnected." ); | |
80 | + | |
80 | 81 | std::cout << "Subscribing to the test-topic....." << std::endl; |
81 | 82 | pSubscriber->subscribe( "test/publisher/#" ); |
82 | 83 | |
... | ... | @@ -84,6 +85,7 @@ int main( int argc, char* argv[] ) |
84 | 85 | while( 1 ) |
85 | 86 | { |
86 | 87 | sleepcp( 1, T_SECONDS ); // Sleep 1 Sec to give the scheduler the change to interfene. |
88 | + std::cout << "."; | |
87 | 89 | } |
88 | 90 | } |
89 | 91 | else | ... | ... |
examples/sub/subscriber.cpp
... | ... | @@ -24,11 +24,25 @@ |
24 | 24 | #include <iostream> |
25 | 25 | |
26 | 26 | Subscriber::Subscriber( const std::string &client_id ) |
27 | - : MqttSubscriberBase( client_id ) | |
27 | + : m_mqtt_client( client_id ) | |
28 | 28 | { |
29 | 29 | |
30 | 30 | } |
31 | 31 | |
32 | +void Subscriber::connect( const std::string &hostname, int portnumber, const std::string &username, const std::string &password, const std::string &lwt_topic, const std::string &lwt_message ) | |
33 | +{ | |
34 | + m_mqtt_client.connect( hostname, portnumber, osdev::components::mqtt::Credentials( username, password ), osdev::components::mqtt::mqtt_LWT( lwt_topic, lwt_message ) ); | |
35 | + std::cout << "Client state : " << m_mqtt_client.state() << std::endl; | |
36 | +} | |
37 | + | |
38 | +void Subscriber::subscribe( const std::string &message_topic ) | |
39 | +{ | |
40 | + m_mqtt_client.subscribe( message_topic, 1, [this](const osdev::components::mqtt::MqttMessage &message ) | |
41 | + { | |
42 | + this->receive_data( message.topic(), message.payload() ); | |
43 | + }); | |
44 | +} | |
45 | + | |
32 | 46 | void Subscriber::receive_data( const std::string &message_topic, const std::string &message_payload ) |
33 | 47 | { |
34 | 48 | std::cout << "[Subscriber::receive_data] - Received message : " << message_payload << " from topic : " << message_topic << std::endl; | ... | ... |
examples/sub/subscriber.h
... | ... | @@ -22,19 +22,29 @@ |
22 | 22 | #pragma once |
23 | 23 | |
24 | 24 | // std |
25 | +#include <memory> | |
25 | 26 | #include <string> |
26 | 27 | |
27 | 28 | // mqtt-cpp |
28 | -#include "mqttsubscriberbase.h" | |
29 | +#include "mqttclient.h" | |
30 | +#include "compat-c++14.h" | |
29 | 31 | |
30 | -class Subscriber : public MqttSubscriberBase | |
32 | +class Subscriber | |
31 | 33 | { |
32 | 34 | public: |
33 | - Subscriber( const std::string &client_id ); | |
35 | + Subscriber(const std::string &client_id); | |
34 | 36 | |
35 | 37 | virtual ~Subscriber() {} |
36 | 38 | |
39 | + void connect( const std::string &hostname, int portnumber = 1883, const std::string &username = std::string(), const std::string &password = std::string(), | |
40 | + const std::string &lwt_topic = std::string(), const std::string &lwt_message = std::string() ); | |
41 | + | |
42 | + void subscribe( const std::string &message_topic ); | |
43 | + | |
37 | 44 | protected: |
38 | - void receive_data( const std::string &message_topic, const std::string &message_payload ); | |
45 | + void receive_data( const std::string &message_topic, const std::string &message_payload ); | |
46 | + | |
47 | +private: | |
48 | + osdev::components::mqtt::MqttClient m_mqtt_client; | |
39 | 49 | |
40 | 50 | }; | ... | ... |
src/clientpaho.cpp
... | ... | @@ -425,12 +425,14 @@ std::int32_t ClientPaho::subscribe( const std::string& topic, int qos, const std |
425 | 425 | { |
426 | 426 | if( ConnectionStatus::Connected != m_connectionStatus ) |
427 | 427 | { |
428 | - // MqttException, "Not connected" | |
428 | + LogDebug( "[ClientPaho::subscribe]", std::string( m_clientId + " - Client not connected..." ) ); | |
429 | 429 | } |
430 | 430 | |
431 | 431 | if( !isValidTopic( topic ) ) |
432 | 432 | { |
433 | 433 | // ("ClientPaho", "%1 - topic %2 is invalid", m_clientId, topic); |
434 | + LogDebug( "[ClientPaho::subscribe]", std::string( m_clientId + " - Topic " + topic + " is invalid." ) ); | |
435 | + return -1; | |
434 | 436 | } |
435 | 437 | |
436 | 438 | if( qos > 2 ) |
... | ... | @@ -477,6 +479,7 @@ std::int32_t ClientPaho::subscribe( const std::string& topic, int qos, const std |
477 | 479 | if( isOverlappingInternal( topic, existingTopic ) ) |
478 | 480 | { |
479 | 481 | // (OverlappingTopicException, "overlapping topic", existingTopic, topic); |
482 | + LogDebug( "[ClientPaho::subscribe]", std::string( m_clientId + " - Overlapping topic : Existing Topic : " + existingTopic + " => New Topic : " + topic ) ); | |
480 | 483 | } |
481 | 484 | |
482 | 485 | LogDebug( "[ClientPaho::subscribe]", std::string( m_clientId + " -adding subscription on topic " + topic + " to the pending subscriptions" ) ); | ... | ... |
src/mqttclient.cpp
... | ... | @@ -284,7 +284,7 @@ Token MqttClient::subscribe(const std::string& topic, int qos, const std::functi |
284 | 284 | } |
285 | 285 | if (!clientFound) |
286 | 286 | { |
287 | - client->connect(true); | |
287 | + client->connect( false ); | |
288 | 288 | } |
289 | 289 | return Token{ client->clientId(), client->subscribe(topic, qos, cb) }; |
290 | 290 | } |
... | ... | @@ -401,7 +401,8 @@ void MqttClient::connectionStatusChanged(const std::string& id, ConnectionStatus |
401 | 401 | } |
402 | 402 | auto newState = determineState(connectionStates); |
403 | 403 | bool resubscribe = (StateEnum::ConnectionFailure == m_serverState.state() && StateEnum::Good == newState); |
404 | - if (resubscribe) { | |
404 | + if (resubscribe) | |
405 | + { | |
405 | 406 | { |
406 | 407 | OSDEV_COMPONENTS_LOCKGUARD(m_internalMutex); |
407 | 408 | m_activeTokens.clear(); | ... | ... |