给我一瓶大乌苏 2022-07-02 16:01 采纳率: 0%
浏览 369
已结题

MQTT接收不到报文信息

关于MQTT能收到字符串信息,却接收不到报文信息

最近从官网下载了MQTT的源码,并用QT制作了一个客户端,但是只能接收到普通的字符串信息,却接收不到报文信息,

img


下面附上代码,大家能帮我看看问题出哪了吗,我找了几天了。顺便问下该如何判断MQTT有没有接收到数据啊!

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtCore/QDateTime>
#include <QtWidgets/QMessageBox>
#include <QtMqtt/QMqttClient>

extern "C"
{
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

}

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

m_client = new QMqttClient(this);
m_client->setHostname(ui->lineEditHost->text());
m_client->setPort(ui->spinBoxPort->value());
m_client->setUsername(ui->lineEditUser->text());
m_client->setPassword(ui->lineEditPass->text());

connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange);
connect(m_client, &QMqttClient::disconnected, this, &MainWindow::brokerDisconnected);

//如果接收到订阅主题的消息,就会将消息打印到输出框中
connect(m_client, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {
    const QString content =message;

    ui->editLog->insertPlainText(content);
    QString q_mt = "\n";
    ui->editLog->insertPlainText(q_mt);

    QString name = "hello world";
    QByteArray b = QByteArray::number(name.toLatin1().toHex().toInt(),16);
    QByteArray b1 = QByteArray::fromHex(message);
    QString s = QString::fromLatin1(b1);


   qDebug() << s << endl;
   qDebug() << " "<< "Length:" << message.length() << endl;
   QByteArray p;
   p = QByteArray::fromRawData((const char*)message,message.length());
   qDebug() << "p" << p << endl;

});
//心跳间隔,隔一段时间ping一下服务器
connect(m_client, &QMqttClient::pingResponseReceived, this, [this]() {
    ui->buttonPing->setEnabled(true);
    const QString content = QDateTime::currentDateTime().toString()
                + QLatin1String(" PingResponse")
                + QLatin1Char('\n');
    ui->editLog->insertPlainText(content);
});

//当输入框的数值发生变化时,会实时设置对应的数值
connect(ui->lineEditHost, &QLineEdit::textChanged, m_client, &QMqttClient::setHostname);
connect(ui->lineEditUser, &QLineEdit::textChanged, m_client, &QMqttClient::setUsername);
connect(ui->lineEditPass, &QLineEdit::textChanged, m_client, &QMqttClient::setPassword);
connect(ui->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);
updateLogStateChange();

}

MainWindow::~MainWindow()
{
delete ui;
}
//连接服务器
void MainWindow::on_buttonConnect_clicked()
{
if (m_client->state() == QMqttClient::Disconnected) {
ui->lineEditHost->setEnabled(false);
ui->spinBoxPort->setEnabled(false);
ui->lineEditUser->setEnabled(false);
ui->lineEditPass->setEnabled(false);
ui->buttonConnect->setText(tr("Disconnect"));
m_client->connectToHost();
} else {
ui->lineEditHost->setEnabled(true);
ui->spinBoxPort->setEnabled(true);
ui->lineEditUser->setEnabled(true);
ui->lineEditPass->setEnabled(true);
ui->buttonConnect->setText(tr("Connect"));
m_client->disconnectFromHost();
}
}
//退出函数
void MainWindow::on_buttonQuit_clicked()
{
QApplication::quit();
}
//显示消息
void MainWindow::updateLogStateChange()
{
const QString content = QDateTime::currentDateTime().toString()
+ QLatin1String(": State Change")
+ QString::number(m_client->state())
+ QLatin1Char('\n');
ui->editLog->insertPlainText(content);
}
//断开连接
void MainWindow::brokerDisconnected()
{
ui->lineEditHost->setEnabled(true);
ui->spinBoxPort->setEnabled(true);
ui->buttonConnect->setText(tr("Connect"));
}
//设置端口
void MainWindow::setClientPort(int p)
{
m_client->setPort(p);
}
//发送信息并判断
void MainWindow::on_buttonPublish_clicked()
{

if (m_client->publish(ui->lineEditTopic->text(), ui->lineEditMessage->text().toUtf8()) == -1)
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not publish message"));

}

void MainWindow::on_buttonSubscribe_clicked()//订阅主题
{
auto subscription = m_client->subscribe(ui->lineEditTopic->text());
if (!subscription) {
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("Could not subscribe. Is there a valid connection?"));
return;
}
}

void MainWindow::on_buttonPing_clicked()//ping测试
{
ui->buttonPing->setEnabled(false);
m_client->requestPing();
}

//清空输出框
void MainWindow::on_Button_Clean_clicked()
{
ui->editLog->setPlainText("");
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 7月10日
    • 创建了问题 7月2日

    悬赏问题

    • ¥15 悬赏Python-playwright部署在centos7上
    • ¥15 psoc creator软件有没有人能远程安装啊
    • ¥15 快速扫描算法求解Eikonal方程咨询
    • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
    • ¥30 关于R语言运行分区生存模型中的问题!
    • ¥15 校内二手商品转让网站
    • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
    • ¥100 求Web版SPC控制图程序包调式
    • ¥20 指导如何跑通以下两个Github代码
    • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀