/** * Websocket interface for building control unit * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-01-30 */ #include "web_socket_handler.h" #include #include #include #include #include namespace ExerciseEventManagement { WebSocketHandler::WebSocketHandler(QObject *parent) : QObject(parent) , m_webSocketServer(new QWebSocketServer(QStringLiteral("AVS-Server"), QWebSocketServer::NonSecureMode, this)) , m_timer(new QTimer()) , m_logger(getLogger("Json.WebSocketHandler")) { connect(m_timer, &QTimer::timeout, this, &WebSocketHandler::onSendMessage); m_timer->start(1000); } WebSocketHandler::~WebSocketHandler() { for (auto s : qAsConst(m_webSockets)) { s->disconnect(this); s->close(); } qDeleteAll(m_webSockets); } bool WebSocketHandler::init(quint16 listenPort) { if (!m_webSocketServer->listen(QHostAddress::Any, listenPort)) { WARNING_LOG(m_logger) << "Can not listen on port " << listenPort << " - aborting"; return false; } // inform calling process via stdout about the port/url std::cout << "web socket listen port: " << m_webSocketServer->serverPort() << std::endl; std::cout << "web socket url: " << m_webSocketServer->serverUrl().toString() << std::endl; connect(m_webSocketServer, &QWebSocketServer::newConnection, this, &WebSocketHandler::onNewConnection); return true; } bool WebSocketHandler::sendTelegram(const QString &jsonStr) { if (!isConnected()) return false; ERROR_LOG(m_logger) << "jsonStr" << jsonStr; bool bOk = false; for (QWebSocket *ws : qAsConst(m_webSockets)) { if (ws->sendTextMessage(jsonStr)) bOk = true; } return bOk; } void WebSocketHandler::onNewConnection() { QWebSocket *ws = m_webSocketServer->nextPendingConnection(); if (!ws) return; INFO_LOG(m_logger) << "New websocket connection from " << ws->peerAddress().toString() << ":" << ws->peerPort(); connect(ws, &QWebSocket::disconnected, this, &WebSocketHandler::onWebSocketDisconnected); m_webSockets += ws; emit webSocketConnected(ws); } void WebSocketHandler::onSendMessage() { ERROR_LOG(m_logger) << "Send message: "; QJsonObject obj; obj[QStringLiteral("eventTime")] = QJsonValue(QDateTime::currentMSecsSinceEpoch()); QString jsonStr = QString::fromUtf8(QJsonDocument(obj).toJson()); sendTelegram(jsonStr); } void WebSocketHandler::onWebSocketDisconnected() { QWebSocket *ws = qobject_cast(sender()); if (!ws) return; m_webSockets.remove(ws); ws->deleteLater(); } } // namespace ExerciseEventManagement