#include "websocketservice.h" #include "mainconfig.h" #include WebsocketService::WebsocketService(QObject *parent) :QObject(parent) { m_wsHeartInterval = MainConfig::wsHeartInterval.toInt(); m_heartTimer.setInterval(1 * 1000); m_heartTimer.start(); connect(&m_heartTimer,&QTimer::timeout,this,&WebsocketService::wsSendPingMsg); connect(&m_webSocket, &QWebSocket::connected, this, &WebsocketService::onConnected); connect(&m_webSocket, &QWebSocket::disconnected, this, &WebsocketService::onDisconnected); connect(&m_webSocket, &QWebSocket::textMessageReceived, this,&WebsocketService::onTextMessageReceived); } void WebsocketService::connectToServer(QString url) { m_url = url; m_webSocket.open(QUrl(url)); } void WebsocketService::onConnected() { qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "ws connected.."; emit wsConnectedStatusChanged(1); //发送授权包 wsSendAuthMsg(); } void WebsocketService::onDisconnected() { qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "ws disconnected.."; emit wsConnectedStatusChanged(0); //重新连接服务器 connectToServer(m_url); } void WebsocketService::wsSendAuthMsg() { m_lastSendDataInSeconds = QDateTime::currentSecsSinceEpoch(); QString rawJson = "{\"toDomain\":\"Server\",\"data\":\"{\\\"type\\\":\\\"Auth\\\",\\\"data\\\":{\\\"token\\\":\\\"%1\\\"}}\"}"; QString json = rawJson.arg(MainConfig::token); m_webSocket.sendTextMessage(json); //qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsSendAuthMsg: " << json; } void WebsocketService::wsSendPingMsg() { quint64 now = QDateTime::currentSecsSinceEpoch(); if(now - m_lastSendDataInSeconds < m_wsHeartInterval){ return; } m_lastSendDataInSeconds = now; QString rawJson = "{\"toDomain\":\"Server\",\"data\":\"{\\\"type\\\":\\\"Ping\\\"}\"}"; QString json = rawJson; m_webSocket.sendTextMessage(json); //qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsSendPingMsg: " << json; } void WebsocketService::sendWsAckMessage(QString ackId) { m_lastSendDataInSeconds = QDateTime::currentSecsSinceEpoch(); QString rawJson = "{\"toDomain\":\"Server\",\"data\":\"{\\\"type\\\":\\\"Ack\\\",\\\"data\\\":{\\\"ackId\\\":\\\"%1\\\"}}\"}"; QString json = rawJson.arg(ackId); m_webSocket.sendTextMessage(json); //qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "sendWsAckMessage: " << json; } void WebsocketService::onTextMessageReceived(const QString &message) { //qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsRecvMsg: " << message.toUtf8(); //解析响应中的data字段,data又是一个json字符串 QJsonParseError jerror; QJsonDocument jdoc; QJsonObject jobj; jdoc = QJsonDocument::fromJson(message.toUtf8(), &jerror); if (jerror.error != QJsonParseError::NoError || !jdoc.isObject() || !jdoc.object().contains("messageSet")) { qDebug() << QString::fromUtf8("ws消息错误"); return; } jobj = jdoc.object(); QString ackId = jobj.take("ackId").toString(); QString dataString = jobj.take("messageSet").toArray().at(0).toObject().take("data").toString(); //解析data字段 jdoc = QJsonDocument::fromJson(dataString.toUtf8(), &jerror); if (jerror.error != QJsonParseError::NoError || !jdoc.isObject() || !jdoc.object().contains("type")) { qDebug() << QString::fromUtf8("ws data消息错误"); return; } jobj = jdoc.object(); QString notifyType = jobj.take("type").toString(); if(notifyType == "buttonStart"){ qDebug() << "buttonStart Message"; //处理消息 handleWsButtonStartMsg(jobj.take("data").toObject()); //回复ws消息 sendWsAckMessage(ackId); }else if(notifyType == "updateStatus"){ qDebug() << "updateStatus Message"; //处理消息 handleWsUpdateStatusMsg(jobj.take("data").toObject()); //回复ws消息 sendWsAckMessage(ackId); }else if(notifyType == "Pong"){ qDebug() << "Pong Message"; }else if(notifyType == "ChannelStatus"){ //qDebug() << "Auth Message"; } } void WebsocketService::handleWsButtonStartMsg(QJsonObject jobj) { qDebug()<