Files
MARTe-Integrated-Components/Client/streamhub-qt/WsClient.cpp
T
2026-06-26 09:11:10 +02:00

85 lines
2.1 KiB
C++

/**
* @file WsClient.cpp
*/
#include "WsClient.h"
#include <QUrl>
namespace shq {
WsClient::WsClient(QObject* parent) : QObject(parent) {
connect(&socket_, &QWebSocket::connected, this, &WsClient::onConnected);
connect(&socket_, &QWebSocket::disconnected, this, &WsClient::onDisconnected);
connect(&socket_, &QWebSocket::textMessageReceived,
this, [this](const QString& s) { Q_EMIT textReceived(s); });
connect(&socket_, &QWebSocket::binaryMessageReceived,
this, [this](const QByteArray& b) { Q_EMIT binaryReceived(b); });
reconnectTimer_.setInterval(3000);
connect(&reconnectTimer_, &QTimer::timeout, this, &WsClient::onTick);
}
void WsClient::connectTo(const QString& host, uint16_t port) {
host_ = host;
port_ = port;
wantOpen_ = true;
openSocket();
reconnectTimer_.start();
}
void WsClient::reconnectTo(const QString& host, uint16_t port) {
host_ = host;
port_ = port;
wantOpen_ = true;
socket_.abort(); /* drop current; onTick / openSocket reopens */
openSocket();
if (!reconnectTimer_.isActive()) { reconnectTimer_.start(); }
}
void WsClient::close() {
wantOpen_ = false;
reconnectTimer_.stop();
socket_.close();
}
void WsClient::openSocket() {
if (!wantOpen_) { return; }
if (socket_.state() == QAbstractSocket::ConnectedState ||
socket_.state() == QAbstractSocket::ConnectingState) {
return;
}
QUrl url;
url.setScheme("ws");
url.setHost(host_);
url.setPort(port_);
url.setPath("/ws");
socket_.open(url);
}
void WsClient::onConnected() {
connected_ = true;
Q_EMIT connectedChanged(true);
}
void WsClient::onDisconnected() {
if (connected_) {
connected_ = false;
Q_EMIT connectedChanged(false);
}
}
void WsClient::onTick() {
if (wantOpen_ && socket_.state() == QAbstractSocket::UnconnectedState) {
openSocket();
}
}
void WsClient::sendText(const QString& json) {
if (socket_.state() == QAbstractSocket::ConnectedState) {
socket_.sendTextMessage(json);
}
}
} /* namespace shq */