Added websocket connection to the bmsd server. Dropped MQTT, not needed. MySQL and webSockets is enough.

Mon, 28 Mar 2022 16:54:08 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 28 Mar 2022 16:54:08 +0200
changeset 91
409d9c7214be
parent 90
2396457a8167
child 92
fb0bb9a2a7e1

Added websocket connection to the bmsd server. Dropped MQTT, not needed. MySQL and webSockets is enough.

CMakeLists.txt file | annotate | diff | comparison | revisions
src/MainWindow.cpp file | annotate | diff | comparison | revisions
src/MainWindow.h file | annotate | diff | comparison | revisions
--- 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})
--- 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 <QtWidgets/QTableWidget>
 #include <QtWidgets/QGroupBox>
 #include <QtWidgets/QPushButton>
+#include <QUrl>
 
 
 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.";
--- 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 <QMap>
 #include <QPrinter>
 #include <QWidget>
+#include <QWebSocket>
 
 
 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.

mercurial