2016-08-01 92 views
0

我有以下代碼的訂閱在C++中的特定主題的蚊子。使用Mosquitto返回消息訂閱?

main.cpp中

/* 
    * main.cpp 
    * 
    * Created on: Jul 28, 2016 
    *  Author: nilav 
    */ 
#include <iostream> 
#include "myMosq.h" 
#include <string.h> 
#include <unistd.h> 

using namespace std; 
int main() { 

    myMosq *mosq; 
    mosq = new myMosq("unique","topic", "localhost",1883); 
    int res; 
    while(1) { 
     char tstr[500] ; 
//  cin.getline(tstr,sizeof(tstr)); 
       sleep(2); 
//    mosq->send_message(tstr); 
       mosq->receive_message(tstr); 

      res = mosq->loop();      // Keep MQTT connection 
      if (res) 
       mosq->reconnect(); 
     } 
    } 

myMosq.h

/* 
* myMosq.h 
* 
* Created on: Jul 28, 2016 
*  Author: nilav 
*/ 

#ifndef MYMOSQ_H_ 
#define MYMOSQ_H_ 

#include <mosquittopp.h> 
#include <mosquitto.h> 
class myMosq : public mosqpp::mosquittopp 
{ 
private: 
const char  *  host; 
const char *  id; 
const char *  topic; 
int    port; 
int    keepalive; 

void on_connect(int rc); 
void on_disconnect(int rc); 
void on_subscribe(int mid, int qos_count, const int *granted_qos); 
public: 
myMosq(const char *id, const char * _topic, const char *host, int port); 
~myMosq(); 
bool send_message(const char * _message); 
bool receive_message(const char * _message); 
}; 

#endif 

myMosq.cpp

#include <cstdio> 
#include <cstring> 
#include <iostream> 

#include "myMosq.h" 
#include <mosquittopp.h> 

using namespace std; 

myMosq::myMosq(const char * _id,const char * _topic, const char * _host, int _port) : mosquittopp(_id) 
{ 
mosqpp::lib_init();  // Mandatory initialization for mosquitto library 
this->keepalive = 60; // Basic configuration setup for myMosq class 
this->id = _id; 
this->port = _port; 
this->host = _host; 
this->topic = _topic; 
connect_async(host,  // non blocking connection to broker request 
port, 
keepalive); 
loop_start();   // Start thread managing connection/publish/subscribe 
}; 


myMosq::~myMosq() { 
loop_stop();   // Kill the thread 
mosqpp::lib_cleanup(); // Mosquitto library cleanup 
} 

//bool myMosq::send_message(const char * _message) 
// { 
// int ret = publish(NULL,this->topic,strlen(_message),_message,1,false); 
// cout << ret; 
// return (ret == MOSQ_ERR_SUCCESS); 
// } 

bool myMosq::receive_message(const char * message) 
{ 
    int set = subscribe(NULL, this->topic,2); 
    return set; 
} 

void myMosq::on_disconnect(int rc) { 
std::cout << ">> myMosq - disconnection(" << rc << ")" << std::endl; 
} 


void myMosq::on_connect(int rc) 
{ 
if (rc == 0) { 
std::cout << ">> myMosq - connected with server" << std::endl; 
} else { 
std::cout << ">> myMosq - Impossible to connect with server(" << rc << ")" << std::endl; 
} 
} 

void myMosq::on_subscribe(int mid, int qos_count, const int *granted_qos) 
{ 
    std::cout << ">> subscription succeeded (" << mid << ") " << std::endl; 
    printf("Subscription succeeded.\n"); 
} 

現在,當我發出從Ubuntu的

mosquitto_pub -h本地主機-t 「主題」 -m 「你好MQTT」 的終端以下命令

中沒有顯示程序的輸出。但是我想要一個代碼來顯示訂閱時在特定主題中產生的特定消息。 任何幫助將不勝感激。

回答

0

設置bool myMosq::receive_message(const char * message)函數的方式有錯誤。就MQTT的工作原理而言,您最初只需訂閱一個主題,然後使用提供的mosquittopp包裝的循環函數來檢查相應主題上的更改數據。現在,您只需指定void on_message(const struct mosquitto_message* message)回調會發生什麼情況,並根據使用的數據類型獲取並格式化消息對象。

例如,要抓住一些類型的字符有關的數據,我超載實施看起來是這樣的:

void MQTTSubscriber::on_message(const mosquitto_message* message) { cout << "Subscriber " << id << " received message of topic: " << message->topic << " Data: " << reinterpret_cast<char*>(message->payload) << "\n"; }

的connect_async()做了所有的工作,爲建立和保持你的經紀人連接和loop_start ()函數處理線程獨立的回調函數。

此致敬禮 理查德