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).
git clone https://github.com/qt/qtmqtt.git --branch 6.0 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().