# HG changeset patch # User Michiel Broek # Date 1648479248 -7200 # Node ID 409d9c7214bef369b62e9c8d588c29834dfc371a # Parent 2396457a81675c28105d3d4e7956fcc39aa6b679 Added websocket connection to the bmsd server. Dropped MQTT, not needed. MySQL and webSockets is enough. diff -r 2396457a8167 -r 409d9c7214be CMakeLists.txt --- a/CMakeLists.txt Sun Mar 27 22:03:18 2022 +0200 +++ b/CMakeLists.txt Mon Mar 28 16:54:08 2022 +0200 @@ -53,7 +53,7 @@ # ===== Find Qt5 ===== # Minimum versio 5.13 for debug messages. -find_package(Qt5 5.13 REQUIRED COMPONENTS Core Widgets Network Sql LinguistTools PrintSupport) +find_package(Qt5 5.13 REQUIRED COMPONENTS Core Widgets Network Sql LinguistTools PrintSupport WebSockets) # PrintSupport Xml LinguistTools @@ -195,7 +195,7 @@ add_executable(${bmsapp_EXECUTABLE} ${SOURCE_FILES} ${QM_FILES}) -target_link_libraries(${bmsapp_EXECUTABLE} Qt5::Core Qt5::Widgets Qt5::Network Qt5::Sql Qt5::PrintSupport) +target_link_libraries(${bmsapp_EXECUTABLE} Qt5::Core Qt5::Widgets Qt5::Network Qt5::Sql Qt5::PrintSupport Qt5::WebSockets) # `make translations' add_custom_target(translations DEPENDS ${QM_FILES}) diff -r 2396457a8167 -r 409d9c7214be src/MainWindow.cpp --- a/src/MainWindow.cpp Sun Mar 27 22:03:18 2022 +0200 +++ b/src/MainWindow.cpp Mon Mar 28 16:54:08 2022 +0200 @@ -42,6 +42,7 @@ #include #include #include +#include MainWindow::MainWindow(bool useDevelopOption, bool startConfigOption, QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) @@ -53,6 +54,8 @@ readsettings(); db = new DataBase(); db->openDataBase(useDevelopOption); + + openWS(useDevelopOption); } @@ -61,11 +64,54 @@ qDebug() << Q_FUNC_INFO; writesettings(); + webSocket->close(QWebSocketProtocol::CloseCodeNormal, ""); db->closeDataBase(); delete ui; } + +bool MainWindow::openWS(bool develop) +{ + QString server; + if (develop) + server = wsDev.host; + else + server = wsProd.host; + QUrl url(QString("ws://%1/ws").arg(server)); + qDebug() << "Open websocket:" << url; + + webSocket = new QWebSocket; + QObject::connect(webSocket, &QWebSocket::connected, this, &MainWindow::wsConnected); + QObject::connect(webSocket, &QWebSocket::disconnected, this, &MainWindow::wsClosed); + + webSocket->open(QUrl(url)); + return true; +} + + +void MainWindow::wsConnected() +{ + qDebug() << Q_FUNC_INFO; + + connect(webSocket, &QWebSocket::textMessageReceived, this, &MainWindow::wsTextMessageReceived); +} + + +void MainWindow::wsClosed() +{ + qDebug() << Q_FUNC_INFO << webSocket->closeReason(); + + // Should triger a periodic timer to try to reconnect. +} + + +void MainWindow::wsTextMessageReceived(QString message) +{ +// qDebug() << "WS received:" << message; +} + + void MainWindow::readsettings() { QSettings settings(QSettings::IniFormat, QSettings::UserScope, "mbse", "bmsapp"); @@ -120,43 +166,23 @@ settings.endGroup(); qDebug() << "MySQL dev" << dbDev.host << dbDev.port << dbDev.name << dbDev.pass; - settings.beginGroup("mqttprod"); - mqttProd.host = settings.value("host").toString(); - if (mqttProd.host.isEmpty()) { - mqttProd.host = "localhost"; - mqttProd.port = "1883"; - mqttProd.user = "nobody"; - mqttProd.pass = "secret"; - settings.setValue("host", mqttProd.host); - settings.setValue("port", mqttProd.port); - settings.setValue("user", mqttProd.user); - settings.setValue("pass", mqttProd.pass); - } else { - mqttProd.port = settings.value("port").toString(); - mqttProd.user = settings.value("user").toString(); - mqttProd.pass = settings.value("pass").toString(); + settings.beginGroup("wsprod"); + wsProd.host = settings.value("host").toString(); + if (wsProd.host.isEmpty()) { + wsProd.host = "localhost"; + settings.setValue("host", wsProd.host); } settings.endGroup(); - qDebug() << "MQTT prod" << mqttProd.host << mqttProd.port << mqttProd.user << mqttProd.pass; + qDebug() << "WS prod" << wsProd.host; - settings.beginGroup("mqttdev"); - mqttDev.host = settings.value("host").toString(); - if (mqttDev.host.isEmpty()) { - mqttDev.host = "localhost"; - mqttDev.port = "1883"; - mqttDev.user = "nobody"; - mqttDev.pass = "secret"; - settings.setValue("host", mqttDev.host); - settings.setValue("port", mqttDev.port); - settings.setValue("user", mqttDev.user); - settings.setValue("pass", mqttDev.pass); - } else { - mqttDev.port = settings.value("port").toString(); - mqttDev.user = settings.value("user").toString(); - mqttDev.pass = settings.value("pass").toString(); + settings.beginGroup("wsdev"); + wsDev.host = settings.value("host").toString(); + if (wsDev.host.isEmpty()) { + wsDev.host = "localhost"; + settings.setValue("host", wsDev.host); } settings.endGroup(); - qDebug() << "MQTT dev" << mqttDev.host << mqttDev.port << mqttDev.user << mqttDev.pass; + qDebug() << "WS dev" << wsDev.host; } @@ -182,18 +208,12 @@ settings.setValue("charset", dbDev.charset); settings.endGroup(); - settings.beginGroup("mqttprod"); - settings.setValue("host", mqttProd.host); - settings.setValue("port", mqttProd.port); - settings.setValue("user", mqttProd.user); - settings.setValue("pass", mqttProd.pass); + settings.beginGroup("wsprod"); + settings.setValue("host", wsProd.host); settings.endGroup(); - settings.beginGroup("mqttdev"); - settings.setValue("host", mqttDev.host); - settings.setValue("port", mqttDev.port); - settings.setValue("user", mqttDev.user); - settings.setValue("pass", mqttDev.pass); + settings.beginGroup("wsdev"); + settings.setValue("host", wsDev.host); settings.endGroup(); qDebug() << "writesettings() done."; diff -r 2396457a8167 -r 409d9c7214be src/MainWindow.h --- a/src/MainWindow.h Sun Mar 27 22:03:18 2022 +0200 +++ b/src/MainWindow.h Mon Mar 28 16:54:08 2022 +0200 @@ -52,6 +52,7 @@ #include #include #include +#include typedef struct IniMySQL @@ -67,16 +68,15 @@ static IniMySQL dbProd; static IniMySQL dbDev; -typedef struct IniMQTT + +typedef struct IniWS { QString host; ///< MQTT host QString port; ///< MQTT port - QString user; ///< MQTT username - QString pass; ///< MQTT password -} IniMQTT; +} IniWS; -static IniMQTT mqttProd; -static IniMQTT mqttDev; +static IniWS wsProd; +static IniWS wsDev; namespace Ui { @@ -144,6 +144,20 @@ private: Ui::MainWindow *ui; + QWebSocket *webSocket; + + /** + * @brief Open Websocket connection. + * @param develop Is true if connect to develop server, else production. + * @return Returns true if succes. + */ + bool openWS(bool develop); + + void wsConnected(); + + void wsClosed(); + + void wsTextMessageReceived(QString message); /** * @brief Read user settings for the MySQL connection.