【问题标题】:Return message subscribe using Mosquitto?使用 Mosquitto 返回消息订阅?
【发布时间】:2017-05-29 17:51:35
【问题描述】:

我有下面的 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 "Hello MQTT"

程序输出中不显示任何内容。但是我想要一个代码来显示订阅时在特定主题中产生的特定消息。 任何帮助将不胜感激。

【问题讨论】:

    标签: c++ mosquitto


    【解决方案1】:

    您设置bool myMosq::receive_message(const char * message) 函数的方式有误。就 MQTT 的工作而言,您最初订阅一个主题一次,然后使用 mosquittopp 包装器提供的循环功能检查相应主题上的更改数据。现在您只需要指定在void on_message(const struct mosquitto_message* message) 回调上应该发生什么,并根据使用的数据类型抓取和格式化消息对象。

    例如,为了获取某种与 char 相关的数据,我的重载实现如下所示:

    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() 函数处理线程分离的回调函数。

    最好的问候, 理查德

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      相关资源
      最近更新 更多