Search
Na adrese https://openweathermap.org lze získat informace o současném počasí a pomocí API lze data číst. Data jsou uložena ve formátu JSON a je třeba je v QT dekódovat, aby je bylo možné použít.
https://api.openweathermap.org/data/2.5/weather?q=prague&appid=9015878572d5a56d22bafb7d1e71c92e
API Key: 9015878572d5a56d22bafb7d1e71c92e
Obrázky počasí lze najít na odkazu http://openweathermap.org/img/wn/04d@2x.png, kde 04d je typ ikony získaný v JSON objektu.
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 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().