====== 12. Qt - síťové služby ====== ===== MQTT komunikace ===== Aby bylo možné využívat v QT komunikaci pomocí [[https://en.wikipedia.org/wiki/MQTT|MQTT]] protokolu, je třeba * získat komerční verzi QT, která obsahuje kolekci knihoven [[https://doc.qt.io/QtForAutomation/index.html|Qt for Automation]] * stáhnout a zkompilovat knihovnu manuálně :-) ==== Instalace QtMgtt ==== Zdrojový kód knihovny QtMqtt je k dispozici na [[https://github.com/qt/qtmqtt|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 ==== MQTT broker ==== 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ř. [[https://www.hivemq.com/public-mqtt-broker/|HiveMQ]], vytvořit si vlastní instanci v cloudu (např. [[https://devcenter.heroku.com/articles/cloudmqtt|Heroku]], [[https://cloud.google.com/iot/docs/how-tos/mqtt-bridge|Google]]) nebo si vytvořit vlastní, klidně na svém počítači. Patrně nejznámějším volně dostupným MQTT brokerem je [[https://mosquitto.org/|Mosquitto]]. ==== MQTT protokol ==== Na Internetu lze najít řadu článků o tom, jak MQTT funguje (v češtině např. [[https://www.root.cz/clanky/protokol-mqtt-komunikacni-standard-pro-iot/|tento]]). My se pro naše účely spokojíme s následujícím * MQTT funguje na principu návrhového vzoru [[https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern|publisher-subscriber]] * subscriber se přihlašuje k odběru zpráv, které přicházejí v rámci tématu (topic) * publisher posílá zprávy do tématu, zpráva se dostane ke všem subscriberům, kteří se přihlásili k odběru ==== MQTT client - subscriber ==== Pro vytvoření MQTT subscribera jsou v QT klíčové dvě třídy: [[https://doc.qt.io/QtMQTT/qmqttclient.html|QMqttClient]] a [[https://doc.qt.io/QtMQTT/qmqttsubscription.html|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 [[https://doc.qt.io/QtMQTT/qmqttclient.html#subscribe|QMqttClient::subscribe()]], jejíž návratouvou hodnotou je instance [[https://doc.qt.io/QtMQTT/qmqttsubscription.html|QMqttSubscription]]. V případě přijetí zprávy v rámci tématu je emitován signál [[https://doc.qt.io/QtMQTT/qmqttsubscription.html#messageReceived|QMqttSubscription::messageReceived]], který předá propojénmu slotu příjatou zprávu jako instanci třídy [[https://doc.qt.io/QtMQTT/qmqttmessage.html|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 [[https://doc.qt.io/qt-5/qtimer.html#singleShot|QTimer::singleShot()]].