Вернуться сообщение подписаться с помощью Mosquitto?

У меня есть ниже код Mosquitto, который подписывается на конкретную тему в C ++.

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 localhost -t «topic» -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 () обрабатывает отдельные функции обратного вызова для отдельных потоков.

С наилучшими пожеланиями,
Ричард

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]