11. Qt - síťové služby

Weather map

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.

MQTT komunikace

Aby bylo možné využívat v QT komunikaci pomocí MQTT protokolu, je třeba

  • získat komerční verzi QT, která obsahuje kolekci knihoven Qt for Automation
  • stáhnout a zkompilovat knihovnu manuálně :-)

Instalace QtMgtt

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

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ř. 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.

MQTT protokol

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

  • MQTT funguje na principu návrhového vzoru 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: 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().

courses/b2b99ppc/tutorials/11.txt · Last modified: 2024/02/26 13:53 by nentvond