gpt4 book ai didi

c++ - libmosquittopp - 示例客户端在 loop_stop() 方法上挂起

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:52 25 4
gpt4 key购买 nike

我正在尝试为我的家庭应用程序创建一个简单的 MQTT 客户端,并且我正在使用 libmosquittopp(它是 libmosquitto 的 C++ 版本)。
该库的文档不多,但我找到了 2 个示例(herehere),它们帮助我为我的“MQTTWrapper”类创建代码。

这是我的代码:

MQTTWrapper.h :

#pragma once

#include <mosquittopp.h>
#include <string>

class MQTTWrapper : public mosqpp::mosquittopp
{
public:
MQTTWrapper(const char* id, const char* host_, int port_);
virtual ~MQTTWrapper();

void myPublish(std::string topic, std::string value);
private:
void on_connect(int rc);
void on_publish(int mid);

std::string host;
int port;
};

MQTTWrapper.cpp

#include "MQTTWrapper.h"

#include <iostream>

MQTTWrapper::MQTTWrapper(const char* id, const char* host_, int port_) :
mosquittopp(id), host(host_), port(port_)
{
mosqpp::lib_init();

int keepalive = 10;
if (username_pw_set("sampleuser", "samplepass") != MOSQ_ERR_SUCCESS) {
std::cout << "setting passwd failed" << std::endl;
}
connect_async(host.c_str(), port, keepalive);
if (loop_start() != MOSQ_ERR_SUCCESS) {
std::cout << "loop_start failed" << std::endl;
}
}

MQTTWrapper::~MQTTWrapper()
{
std::cout << "1" << std::endl;
if (loop_stop() != MOSQ_ERR_SUCCESS) {
std::cout << "loop_stop failed" << std::endl;
}
std::cout << "2" << std::endl;
mosqpp::lib_cleanup();
std::cout << "3" << std::endl;
}

void MQTTWrapper::on_connect(int rc)
{
std::cout << "Connected with code " << rc << "." << std::endl;
}

void MQTTWrapper::myPublish(std::string topic, std::string value) {
int ret = publish(NULL, topic.c_str(), value.size(), value.c_str(), 1, false);
if (ret != MOSQ_ERR_SUCCESS) {
std::cout << "Sending failed." << std::endl;
}
}

void MQTTWrapper::on_publish(int mid) {
std::cout << "Published message with id: " << mid << std::endl;
}

和我的 main():

#include <iostream>
#include <string>
#include "MQTTWrapper.h"

int main(int argc, char *argv[])
{
MQTTWrapper* mqtt;
mqtt = new MQTTWrapper("Lewiatan IoT", "my.cloudmqtt.host", 12345);

std::string value("Test123");
mqtt->myPublish("sensors/temp", value);

std::cout << "about to delete mqtt" << std::endl;
delete mqtt;
std::cout << "mqtt deleted" << std::endl;
return 0;
}

抱歉,代码太多。

我的问题是,当我编译并执行它时 - 我的应用程序在 loop_stop() 方法的 MQTTWrapper 析构函数中无限挂起(我只等了 9 分钟)。
使用 libmosquittopp 1.4.8(debian 软件包)进行测试,然后在删除它之后 - 使用来自 github 的版本 1.4.9 .

loop_start()loop_stop(bool force=false) 应该启动/停止处理消息传递的单独线程。

我已经用强制停止 (loop_stop(true)) 对其进行了测试,但这样我的应用程序就会停止并且不会发布任何数据。另一方面,loop_stop() 发布数据但随后停止。

控制台输出(make && ./executable):

g++ -c MQTTWrapper.cpp
g++ -c main.cpp
g++ -o executable main.o MQTTWrapper.o -lmosquittopp
about to delete mqtt
1
Connected with code 0.
Published message with id: 1
(here it hangs infinitely...)

我的问题:
为什么此 loop_stop() 挂起以及如何修复它?

(感谢任何文档/教程/示例)

最佳答案

尝试在 loop_stop() 之前调用 disconnect()。您还应该记住,您正在有效地执行此操作:

connect_async();
loop_start();
loop_stop();

客户端可能甚至没有机会连接,在您告诉它停止之前线程也没有真正启动。

值得考虑在回调中运行操作:

on_connect -> call publish
on_publish -> call disconnect

关于c++ - libmosquittopp - 示例客户端在 loop_stop() 方法上挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37956152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com