我正在创建一个线程,在该线程中:
m_client = new QMqttClient(this);
m_client->setHostname("ps01.xx.com");
m_client->setPort(1883);
m_client->setClientId("Sas-RASPi-001");
m_client->connectToHost();
正在连接到MQT代理。
任何信号连接尝试,如:
QObject::connect(m_client, &QMqttClient::stateChanged, this, &Messenqt::updateLogStateChange);
产生如下错误:
QObject::Connect:无法对“ClientState”类型的参数进行排队
(确保使用qRegisterMetaType()注册了“ClientState”)。
我补充道:
qRegisterMetaType<QMqttClient::ClientState>("QMqttClient::ClientState");
在代码的开头(上面的代码)
同样的问题。
在qt信号/插槽方式中,使用来自不同线程的MQT的正确方法是什么?
编辑:
for (int i = 20 ; i < 20 ; i++){
QThread::sleep(1);
if(m_client->publish(topic_, QString("testing. . . ").toLocal8Bit() , 1 ,true) == -1;
qDebug() << " error" <<;
}
你好,
我在for循环中使用qmqtt,休眠1秒,然后处理等待发送消息,直到所有20条消息都发布为止。
当循环完成时,所有20条消息都会发送。
但是。如果我们不使用qthread::sleep(1)。然后分别发送每个消息。为什么?是吗?
是否有任何方法可以在每封邮件发布后立即强制发送给它?
编辑2
下面的示例不将图像发送到代理。它挡住了某个地方。我需要刷新消息:)
最小示例:
m_client = new QMqttClient(this);
m_client->setHostname("ps01.xxx.com");
m_client->setPort(1883);
m_client->setClientId("RASPBERRY-009");
m_client->setUsername("vv");
m_client->setPassword("vv");
m_client->setCleanSession(false);
m_client->connectToHost();
//yeni slot mekanizmasi. kendi icinde &Publisher örneÄi..
QObject::connect(m_client, &QMqttClient::stateChanged, this, &Publisher::updateStateChange);
QObject::connect(m_client, &QMqttClient::connected, this, &Publisher::sendMessages);
a发送消息:
void Publisher::sendMessages()
{
QDir dir("/ram");
int count = 0;
QThread::sleep(5);
while (true){
QStringList images_metas = dir.entryList(QStringList() << "*.png" ,QDir::Files);
if (images_metas.size() > 0){
foreach(QString filename, images_metas) {
dataLoad *dl = new dataLoad;
QString img_path = "/ram/" + filename;
QImage img(img_path);
qDebug() << " : : : " << QImage("/ram/00-02-2018-04-05-2.png").size() << endl;
dl->image = img;
dl->text = "Deneme MEsajıdır . . ";
QByteArray byteArray_;
QDataStream stream(&byteArray_, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_5_10);
stream << dl->image << dl->text;
qDebug() << count++ << " sending : " << byteArray_.size() << " " << filename << endl;
qDebug() << testPublish(byteArray_)<< endl;
}
}
else {
qDebug() << " folder is empty waiting... " << endl;
}
//Check every 1 second
QThread::sleep(1);
}
}
出版业:
qint32 Publisher::testPublish(QByteArray &bytarray)
{
QMqttTopicName topic_ = QString("qtmqtt/topic1");
QString mesaj = ".x.x.x.x.x.x.x.";
auto id = m_client->publish(topic_, mesaj.toLocal8Bit() , 1 ,true);
return id;
}