forked from ccsens_hardware/qt_qcp_show
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
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);
|
|
}
|
|
|