added command queue

This commit is contained in:
bernhard.trinnes 2020-08-18 15:51:31 +02:00 committed by Simon Stürz
parent f2a401aedf
commit 015349d2e5
3 changed files with 34 additions and 7 deletions

View File

@ -148,6 +148,9 @@ void IntegrationPluginSma::executeAction(ThingActionInfo *info)
return; return;
if (action.actionTypeId() == sunnyWebBoxSearchDevicesActionTypeId) { if (action.actionTypeId() == sunnyWebBoxSearchDevicesActionTypeId) {
QString requestId = sunnyWebBox->getDevices(); QString requestId = sunnyWebBox->getDevices();
if (requestId.isEmpty()) {
return info->finish(Thing::ThingErrorHardwareNotAvailable);
}
m_asyncActions.insert(requestId, info); m_asyncActions.insert(requestId, info);
connect(info, &ThingActionInfo::aborted, info, [requestId, this] {m_asyncActions.remove(requestId);}); connect(info, &ThingActionInfo::aborted, info, [requestId, this] {m_asyncActions.remove(requestId);});
} else { } else {

View File

@ -60,10 +60,11 @@ SunnyWebBoxCommunication::SunnyWebBoxCommunication(QObject *parent) : QObject(pa
QString SunnyWebBoxCommunication::sendMessage(const QHostAddress &address, const QString &procedure) QString SunnyWebBoxCommunication::sendMessage(const QHostAddress &address, const QString &procedure)
{ {
QString requestId = QUuid::createUuid().toString().remove('{').left(14); QString requestId = QUuid::createUuid().toString().remove('{').remove('-').left(14);
QJsonDocument doc; QJsonDocument doc;
QJsonObject obj; QJsonObject obj;
obj.insert("params", QJsonObject());
obj["format"] = "JSON"; obj["format"] = "JSON";
obj["id"] = requestId; obj["id"] = requestId;
obj["proc"] = procedure; obj["proc"] = procedure;
@ -71,20 +72,27 @@ QString SunnyWebBoxCommunication::sendMessage(const QHostAddress &address, const
doc.setObject(obj); doc.setObject(obj);
QByteArray data = doc.toJson(QJsonDocument::JsonFormat::Compact); QByteArray data = doc.toJson(QJsonDocument::JsonFormat::Compact);
qCDebug(dcSma()) << "Send message" << data << address << m_port; qCDebug(dcSma()) << "Send message" << data << address << m_port;
m_udpSocket->writeDatagram(data, address, m_port); if(m_messageQueue.value(address).isEmpty()) {
m_udpSocket->writeDatagram(data, address, m_port);
} else {
if (m_messageQueue[address].length() < 40) {
m_messageQueue[address].append(data);
} else {
qCDebug(dcSma()) << "Message queue overflow";
return "";
}
}
return requestId; return requestId;
} }
QString SunnyWebBoxCommunication::sendMessage(const QHostAddress &address, const QString &procedure, const QJsonObject &params) QString SunnyWebBoxCommunication::sendMessage(const QHostAddress &address, const QString &procedure, const QJsonObject &params)
{ {
QString requestId = QUuid::createUuid().toString().remove('{').left(14); QString requestId = QUuid::createUuid().toString().remove('{').remove('-').left(14);
QJsonDocument doc; QJsonDocument doc;
QJsonObject obj; QJsonObject obj;
if (!params.isEmpty()) { obj.insert("params", params);
obj.insert("params", params);
}
obj["format"] = "JSON"; obj["format"] = "JSON";
obj["id"] = requestId; obj["id"] = requestId;
obj["proc"] = procedure; obj["proc"] = procedure;
@ -92,12 +100,27 @@ QString SunnyWebBoxCommunication::sendMessage(const QHostAddress &address, const
doc.setObject(obj); doc.setObject(obj);
QByteArray data = doc.toJson(QJsonDocument::JsonFormat::Compact); QByteArray data = doc.toJson(QJsonDocument::JsonFormat::Compact);
qCDebug(dcSma()) << "Send message" << data << address << m_port; qCDebug(dcSma()) << "Send message" << data << address << m_port;
m_udpSocket->writeDatagram(data, address, m_port); if(m_messageQueue.value(address).isEmpty()) {
m_udpSocket->writeDatagram(data, address, m_port);
} else {
if (m_messageQueue[address].length() < 40) {
m_messageQueue[address].append(data);
} else {
qCDebug(dcSma()) << "Message queue overflow";
return "";
}
}
return requestId; return requestId;
} }
void SunnyWebBoxCommunication::datagramReceived(const QHostAddress &address, const QByteArray &data) void SunnyWebBoxCommunication::datagramReceived(const QHostAddress &address, const QByteArray &data)
{ {
if(!m_messageQueue.value(address).isEmpty()) {
QByteArray data = m_messageQueue[address].takeFirst();
qCDebug(dcSma()) << "Send message from queue" << data << address << m_port;
m_udpSocket->writeDatagram(data, address, m_port);
}
QList<QByteArray> arrayList = data.split('\x00'); QList<QByteArray> arrayList = data.split('\x00');
QByteArray cleanData; QByteArray cleanData;
Q_FOREACH(QByteArray i, arrayList) { Q_FOREACH(QByteArray i, arrayList) {

View File

@ -46,6 +46,7 @@ public:
private: private:
int m_port = 34268; int m_port = 34268;
QUdpSocket *m_udpSocket; QUdpSocket *m_udpSocket;
QHash<QHostAddress, QList<QByteArray>> m_messageQueue;
void datagramReceived(const QHostAddress &address, const QByteArray &data); void datagramReceived(const QHostAddress &address, const QByteArray &data);