Search
Aby bylo možné využívat v QT komunikaci pomocí MQTT protokolu, je třeba
Zdrojový kód knihovny QtMqtt je k dispozici na GitHub. Je vhodné stáhnout si starší verzi, novější verze mají problém s kompilací oproti QT 5.1x (pro naše potřeby neobsahují novější verze knihovny žádnou funkcionality navíc, klidně můžeme pracovat s nejstarší dostupnou stabilní verzí). Uvedený postup je pro prostředí Windows, v OS Linux bude totožný. Přepnutí do jiné větve GIT stromu lze udělat i pomocí příkazu checkout. Výsledkem procesu je dynamicky linkovatelná knihovna (dll), kterou je třeba umístit (nainstalovat) do místa, kde ji najde systém, nebo program pro deployment (ve Windows windeployqt).
checkout
git clone https://github.com/qt/qtmqtt.git --branch 5.10 cd qtmqtt qmake -spec win32-g++ mingw32-make mingw32-make install
Aby bylo možné komunikovat, je třeba mít přístup na MQTT server, tzv. broker. Je buď možné využít veřejně dostupný (např. HiveMQ, vytvořit si vlastní instanci v cloudu (např. Heroku, Google) nebo si vytvořit vlastní, klidně na svém počítači. Patrně nejznámějším volně dostupným MQTT brokerem je Mosquitto.
Na Internetu lze najít řadu článků o tom, jak MQTT funguje (v češtině např. tento). My se pro naše účely spokojíme s následujícím
Pro vytvoření MQTT subscribera jsou v QT klíčové dvě třídy: QMqttClient a QMqttSubscription. První z nich se postará o konfiguraci a připojení na server, druhá pak zajistí přihlášení k odběru tématu.
class Client : public QObject { Q_OBJECT QMqttClient *client; QMqttSubscription *sub; public: Client (QObject *parent = 0); ~Client (); private slots: void processMessage(const QMqttMessage &msg); };
V konstruktoru klienta provedeme inicializaci MQTT spojení a samotné připojení.
client = new QMqttClient; client->setHostname("localhost"); client->setPort(1883); client->connectToHost();
Samotné přihlášení proběhne voláním metody QMqttClient::subscribe(), jejíž návratouvou hodnotou je instance QMqttSubscription. V případě přijetí zprávy v rámci tématu je emitován signál QMqttSubscription::messageReceived, který předá propojénmu slotu příjatou zprávu jako instanci třídy QMqttMessage
sub = client->subscribe(QString("ppc/nucleo")); connect(sub, &QMqttSubscription::messageReceived, this, &Client::processMessage);
Při samotné implementaci je třeba si dát pozor na to, že navázání spojení s MQTT brokerem má jistou časovou režii a je proto třeba počkat. Možným řešením je třeba spustit v konstruktoru časovač, který po uplynutí jedné vteřiny provede přihlášení k tématu (zde pozor na to, aby přihlášení proběhlo jen jednou, takže buď se ve slotu časovač zase vypne nebo se spustí metodou QTimer::singleShot().