You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

133 lines
4.9 KiB

#include "websocketservice.h"
#include "mainconfig.h"
#include <QtCore>
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()<<jobj;
QString firstAidId = jobj.take("firstAidId").toString();
QString name = jobj.take("name").toString();
QString content = jobj.take("content").toString();
qint64 realCountdown = jobj.take("realCountdown").toString("-1000").toInt(0) / 1000;
emit newPatientMergencyInfo(firstAidId,name,content,realCountdown);
}
void WebsocketService::handleWsUpdateStatusMsg(QJsonObject jobj)
{
QString firstAidId = jobj.take("firstAidId").toString();
QString time = jobj.take("time").toString();
QString status = jobj.take("status").toString();
emit patientMergencyStatusChanged(firstAidId,time,status);
}