From cdd2b8a458204dfcc2ed770ae5ec899b63922a63 Mon Sep 17 00:00:00 2001 From: zhangsan Date: Tue, 19 Oct 2021 14:22:22 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0websocketservice?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=AE=8C=E5=96=84=E8=BF=9E=E6=8E=A5=E3=80=81?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E3=80=81=E5=BF=83=E8=B7=B3=E3=80=81=E9=87=8D?= =?UTF-8?q?=E8=BF=9E=E3=80=81=E5=8D=8F=E8=AE=AE=E9=80=9A=E7=9F=A5=202.=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0httpservice,=E5=B9=B6=E5=AE=8C=E5=96=84login?= =?UTF-8?q?=E3=80=81updateStatus=E8=AF=B7=E6=B1=82=203.=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0MainWidget=E4=B8=8EWebsocket=E5=92=8CHttp=E7=9A=84?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QCPShow.pro | 17 +++- QCPShow.pro.user | 12 +-- httpservice.cpp | 166 +++++++++++++++++++++++++++++++++++++++ httpservice.h | 25 ++++++ main.cpp | 28 +++++++ mainconfig.cpp | 112 ++++++++++++++++++++++++++ mainconfig.h | 35 +++++++++ mainwidget.cpp | 33 ++++++++ mainwidget.h | 8 ++ patientemergencyinfo.cpp | 8 ++ patientemergencyinfo.h | 22 ++++++ resttest | 9 +++ websocketservice.cpp | 131 ++++++++++++++++++++++++++++++ websocketservice.h | 38 +++++++++ 14 files changed, 634 insertions(+), 10 deletions(-) create mode 100644 httpservice.cpp create mode 100644 httpservice.h create mode 100644 mainconfig.cpp create mode 100644 mainconfig.h create mode 100644 patientemergencyinfo.cpp create mode 100644 patientemergencyinfo.h create mode 100644 resttest create mode 100644 websocketservice.cpp create mode 100644 websocketservice.h diff --git a/QCPShow.pro b/QCPShow.pro index 5005623..dbafbdc 100644 --- a/QCPShow.pro +++ b/QCPShow.pro @@ -5,7 +5,7 @@ #------------------------------------------------- QT += core gui -QT += serialport network +QT += serialport network websockets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -31,7 +31,11 @@ SOURCES += main.cpp\ ccwidgets/cqspinbox.cpp \ ccwidgets/cqtextedit.cpp \ ccwidgets/cqwidgetspinbox.cpp \ - util/commonutil.cpp + util/commonutil.cpp \ + httpservice.cpp \ + mainconfig.cpp \ + websocketservice.cpp \ + patientemergencyinfo.cpp HEADERS += mainwidget.h \ serial/serialport.h \ @@ -39,7 +43,11 @@ HEADERS += mainwidget.h \ ccwidgets/cqspinbox.h \ ccwidgets/cqtextedit.h \ ccwidgets/cqwidgetspinbox.h \ - util/commonutil.h + util/commonutil.h \ + httpservice.h \ + mainconfig.h \ + websocketservice.h \ + patientemergencyinfo.h FORMS += mainwidget.ui @@ -48,4 +56,5 @@ RESOURCES += \ DISTFILES += \ .gitignore \ - ReadMe.md + ReadMe.md \ + resttest diff --git a/QCPShow.pro.user b/QCPShow.pro.user index aecb588..1ea09b4 100644 --- a/QCPShow.pro.user +++ b/QCPShow.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -284,15 +284,15 @@ 2 - QcpShow - - Qt4ProjectManager.Qt4RunConfiguration:E:/Qt/QtSpace/QcpShow/QcpShow.pro + QCPShow + QCPShow2 + Qt4ProjectManager.Qt4RunConfiguration:E:/Qt/QtSpace/QCPShow/QCPShow.pro true - QcpShow.pro + QCPShow.pro false - + E:/Qt/QtSpace/build-QcpShow-Desktop_Qt_5_8_0_MinGW_32bit-Debug 3768 false true diff --git a/httpservice.cpp b/httpservice.cpp new file mode 100644 index 0000000..9a338a4 --- /dev/null +++ b/httpservice.cpp @@ -0,0 +1,166 @@ +#include "httpservice.h" +#include "mainconfig.h" + +HttpService::HttpService(QObject *parent) : QObject(parent) +{ + mManager = new QNetworkAccessManager; +} + +QByteArray HttpService::get(QUrl url,quint32 timeoutInMs) +{ + qDebug() << url; + //设置超时 + QTimer timer; + timer.setInterval(timeoutInMs); + timer.setSingleShot(true); + + //构造并发送请求 + QNetworkRequest request; + request.setUrl(url); + request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); + request.setRawHeader("Authorization",QByteArray("Bearer ").append(MainConfig::token)); + QNetworkReply *reply = mManager->get(request); + + //超时绑定 + QEventLoop loop; + QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); + QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + timer.start(); + loop.exec(); + + //处理响应 + if (!timer.isActive()) {// 超时 + disconnect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + reply->abort(); + reply->deleteLater(); + qDebug() << "Timeout"; + return ""; + } + + QByteArray result = ""; + //未超时 + timer.stop(); + if (reply->error() != QNetworkReply::NoError) { + // 错误处理 + qDebug() << "Error String : " << reply->errorString(); + } else { + QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + int nStatusCode = variant.toInt(); + // 根据状态码做进一步数据处理 + //QByteArray bytes = pReply->readAll(); + qDebug() << "Status Code : " << nStatusCode; + if(nStatusCode == 200){ + result = reply->readAll(); + } + } + return result; +} + +QByteArray HttpService::postJson(QUrl url,const QByteArray &json, quint32 timeoutInMs) +{ + qDebug() << url << "\n" << json; + //设置超时 + QTimer timer; + timer.setInterval(timeoutInMs); + timer.setSingleShot(true); + + //构造并发送请求 + QNetworkRequest request; + request.setUrl(url); + request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); + request.setRawHeader("Authorization",QByteArray("Bearer ").append(MainConfig::token)); + QNetworkReply *reply = mManager->post(request,json); + + //超时绑定 + QEventLoop loop; + QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); + QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + timer.start(); + loop.exec(); + + //处理响应 + if (!timer.isActive()) {// 超时 + disconnect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + reply->abort(); + reply->deleteLater(); + qDebug() << "Timeout"; + return ""; + } + + QByteArray result = ""; + //未超时 + timer.stop(); + if (reply->error() != QNetworkReply::NoError) { + // 错误处理 + qDebug() << "Error String : " << reply->errorString(); + } else { + QVariant variant = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + int nStatusCode = variant.toInt(); + // 根据状态码做进一步数据处理 + //QByteArray bytes = pReply->readAll(); + qDebug() << "Status Code : " << nStatusCode; + if(nStatusCode == 200){ + result = reply->readAll(); + } + } + return result; +} + +void HttpService::login(QString username, QString password) +{ + //构造参数 + QString rawJson = "{\"client\":1,\"data\":{\"credential\":\"%2\",\"identifier\":\"%1\"},\"scene\":0,\"type\":3}"; + QString json = rawJson.arg(username).arg(password); + + //发送请求 + QByteArray result = postJson(MainConfig::loginUrl,json.toUtf8()); + qDebug() << result; + + //解析响应 + QJsonParseError jerror; + QJsonDocument jdoc; + QJsonObject jobj; + jdoc = QJsonDocument::fromJson(result, &jerror); + if (jerror.error != QJsonParseError::NoError || !jdoc.isObject() || !jdoc.object().contains("code")) + { + qDebug() << QString::fromUtf8("登录请求发送失败"); + return; + } + jobj = jdoc.object(); + int resCode = jobj.take("code").toInt(); + if(resCode == 200){ + MainConfig::token = jobj.take("data").toObject().take("token").toString(); + qDebug() << MainConfig::token; + }else{ + qDebug() << "登录失败:" << resCode; + } +} + +void HttpService::updateStatus(QString firstAidId, QString status) +{ + //构造参数 + QString rawJson = "{\"param\":{\"firstAidId\":\"%1\",\"status\":\"%2\"}}"; + QString json = rawJson.arg(firstAidId).arg(status); + + //发送请求 + QByteArray result = postJson(MainConfig::serviceStatusChangedUrl,json.toUtf8()); + qDebug() << result; + + //解析响应 + QJsonParseError jerror; + QJsonDocument jdoc; + QJsonObject jobj; + jdoc = QJsonDocument::fromJson(result, &jerror); + if (jerror.error != QJsonParseError::NoError || !jdoc.isObject() || !jdoc.object().contains("code")) + { + qDebug() << QString::fromUtf8("请求失败"); + return; + } + jobj = jdoc.object(); + int resCode = jobj.take("code").toInt(); + if(resCode == 200){ + qDebug() << "updateStatus请求成功"; + }else{ + qDebug() << "updateStatus失败:" << resCode; + } +} diff --git a/httpservice.h b/httpservice.h new file mode 100644 index 0000000..793e1af --- /dev/null +++ b/httpservice.h @@ -0,0 +1,25 @@ +#ifndef HTTPSERVICE_H +#define HTTPSERVICE_H + +#include +#include + +class HttpService : public QObject +{ + Q_OBJECT +public: + explicit HttpService(QObject *parent = 0); + QByteArray get(QUrl url, quint32 timeoutInMs = 5000); + QByteArray postJson(QUrl url,const QByteArray &json, quint32 timeoutInMs = 5000); +// void sendIdcardInfo(); + +private: + QNetworkAccessManager *mManager; +signals: + +public slots: + void login(QString username,QString password); + void updateStatus(QString firstAidId,QString status); +}; + +#endif // HTTPSERVICE_H diff --git a/main.cpp b/main.cpp index d93db8c..063c36a 100644 --- a/main.cpp +++ b/main.cpp @@ -1,10 +1,38 @@ #include "mainwidget.h" #include +#include "mainconfig.h" +#include "httpservice.h" +#include "websocketservice.h" +#include "patientemergencyinfo.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); + + //初始化配置文件 + MainConfig::initConfig(); + + //初始化httpservice,并自动登录 + HttpService httpService; + httpService.login(MainConfig::username,MainConfig::password); + + //初始化websocket,并自动连接服务器 + WebsocketService websocketService; + websocketService.connectToServer(MainConfig::wsUrl); + + //创建主窗体 MainWidget w; + + //绑定信号与槽 + QObject::connect(&websocketService,&WebsocketService::wsConnectedStatusChanged, + &w,MainWidget::onWsConnectedStatusChanged); + QObject::connect(&websocketService,&WebsocketService::newPatientMergencyInfo, + &w,MainWidget::onNewPatientMergencyInfo); + QObject::connect(&websocketService,&WebsocketService::patientMergencyStatusChanged, + &w,MainWidget::onPatientMergencyStatusChanged); + + QObject::connect(&w,&MainWidget::statusChanged,&httpService,&HttpService::updateStatus); + w.show(); return a.exec(); diff --git a/mainconfig.cpp b/mainconfig.cpp new file mode 100644 index 0000000..e5a1c79 --- /dev/null +++ b/mainconfig.cpp @@ -0,0 +1,112 @@ +#include "mainconfig.h" +#include +#include + +#define D_CONFIG_FILE_PATH "./setting.ini" + +QString MainConfig::token = ""; +QString MainConfig::username = "shoufeichu"; +QString MainConfig::password = "123456"; +QString MainConfig::loginUrl = "http://test.tall.wiki/gateway/tall3/v3.0/users/signin"; +QString MainConfig::sendUserInfoUrl = "https://test.tall.wiki/gateway/qcp/v3.0/button/idCardDiscern"; +QString MainConfig::oneKeyStartUrl = "https://test.tall.wiki/gateway/qcp/v3.0/button/buttonStart"; +QString MainConfig::serviceStatusChangedUrl = "https://test.tall.wiki/gateway/qcp/v3.0/button/updateStatus"; +QString MainConfig::wsUrl = "wss://test.tall.wiki/websocket/message/v4.0/ws"; +QString MainConfig::wsHeartInterval = "10"; + +MainConfig::MainConfig(QObject *parent) : QObject(parent) +{ + +} + +/** + * @brief 使用原生模式创建ini文件,QSetting模式无法写入注释 + */ +void MainConfig::createConfigFileWithDefaultValues() +{ + //创建ini配置文件 +// QSettings *iniFile = new QSettings(D_CONFIG_FILE_PATH, QSettings::IniFormat); + +// iniFile->beginGroup("MAIN"); +// iniFile->setValue("videodir", videodir); +// iniFile->setValue("videoNumInRow", videoNumInRow); +// iniFile->setValue("videoAutoPlay", videoAutoPlay); +// iniFile->setValue("videoAutoMode", videoAutoMode); +// iniFile->endGroup(); + +// iniFile->beginGroup("USER"); +// iniFile->setValue("username", username); +// iniFile->setValue("password", password); +// iniFile->endGroup(); + + QString content = "[USER]\n"; + content.append(";登录用户名\n").append("username = ").append(username).append("\n"); + content.append(";登录密码\n").append("password = ").append(password).append("\n"); + content.append("\n"); + content.append("[HTTP]\n"); + content.append(";登录请求URL\n").append("loginUrl = ").append(loginUrl).append("\n"); + content.append(";发送身份证信息URL\n").append("sendUserInfoUrl = ").append(sendUserInfoUrl).append("\n"); + content.append(";一键启动URL\n").append("oneKeyStartUrl = ").append(oneKeyStartUrl).append("\n"); + content.append(";服务状态改变URL(rgb)\n").append("serviceStatusChangedUrl = ").append(serviceStatusChangedUrl).append("\n"); + content.append("\n"); + content.append("[WEBSOCKET]\n"); + content.append(";Websocket URL\n").append("wsUrl = ").append(wsUrl).append("\n"); + content.append(";Websocket心跳间隔(s)\n").append("wsHeartInterval = ").append(wsHeartInterval).append("\n"); + + QFile file(D_CONFIG_FILE_PATH); + file.open(QIODevice::WriteOnly | QIODevice::Text); + file.write(content.toUtf8()); + file.close(); +} + +void MainConfig::readConfigFile(){ + + //创建ini配置文件 + QSettings *iniFile = new QSettings(D_CONFIG_FILE_PATH, QSettings::IniFormat); + iniFile->setIniCodec("UTF-8"); + + //获取配置文件名 + QString fileName = iniFile->fileName(); + qDebug().noquote()<<"fileName:"<contains("USER/username")){ + username = iniFile->value("USER/username").toString(); + } + if(iniFile->contains("USER/password")){ + password = iniFile->value("USER/password").toString(); + } + if(iniFile->contains("HTTP/loginUrl")){ + loginUrl = iniFile->value("HTTP/loginUrl").toString(); + } + if(iniFile->contains("HTTP/sendUserInfoUrl")){ + sendUserInfoUrl = iniFile->value("HTTP/sendUserInfoUrl").toString(); + } + if(iniFile->contains("HTTP/oneKeyStartUrl")){ + oneKeyStartUrl = iniFile->value("HTTP/oneKeyStartUrl").toString(); + } + if(iniFile->contains("HTTP/serviceStatusChangedUrl")){ + serviceStatusChangedUrl = iniFile->value("HTTP/serviceStatusChangedUrl").toString(); + } + if(iniFile->contains("WEBSOCKET/wsUrl")){ + wsUrl = iniFile->value("WEBSOCKET/wsUrl").toString(); + } + if(iniFile->contains("WEBSOCKET/wsHeartInterval")){ + wsHeartInterval = iniFile->value("WEBSOCKET/wsHeartInterval").toString(); + } + qDebug() << username << password << "\n" + << loginUrl << sendUserInfoUrl << oneKeyStartUrl << serviceStatusChangedUrl << "\n" + << wsUrl << wsHeartInterval ; +} + +void MainConfig::initConfig() +{ + QFile file(D_CONFIG_FILE_PATH); + if(!file.exists()){ + qDebug() << D_CONFIG_FILE_PATH << " Not Exist. Create it by defalut values."; + createConfigFileWithDefaultValues(); + }else{ + qDebug() << D_CONFIG_FILE_PATH << "Exists"; + readConfigFile(); + } +} diff --git a/mainconfig.h b/mainconfig.h new file mode 100644 index 0000000..7b3d2a6 --- /dev/null +++ b/mainconfig.h @@ -0,0 +1,35 @@ +#ifndef MAINCONFIG_H +#define MAINCONFIG_H + +#include +#include + +class MainConfig : public QObject +{ + Q_OBJECT +public: + explicit MainConfig(QObject *parent = 0); + static void initConfig(); + static void createConfigFileWithDefaultValues(); + static void readConfigFile(); + static void createUserConfigFileWithDefaultValues(); + static void readUserConfigFile(); + +public: + static QString token; + static QString username; + static QString password; + static QString loginUrl; + static QString sendUserInfoUrl; + static QString oneKeyStartUrl; + static QString serviceStatusChangedUrl; + static QString wsUrl; + static QString wsHeartInterval; +signals: + +public slots: + +}; + + +#endif // MAINCONFIG_H diff --git a/mainwidget.cpp b/mainwidget.cpp index 4c35308..d6e40f6 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -1,5 +1,7 @@ #include "mainwidget.h" #include "ui_mainwidget.h" +#include +#include "httpservice.h" MainWidget::MainWidget(QWidget *parent) : QWidget(parent), @@ -12,3 +14,34 @@ MainWidget::~MainWidget() { delete ui; } + +void MainWidget::onWsConnectedStatusChanged(int status) +{ + qDebug() << "MainWidget::onWsConnectedStatusChanged " << status; +} + +void MainWidget::onNewPatientMergencyInfo(QString firstAidId, QString name, QString content, quint64 realCountDownInSeconds) +{ + qDebug() << "MainWidget::onNewPatientMergencyInfo " << firstAidId << name << content << realCountDownInSeconds; +} + +void MainWidget::onPatientMergencyStatusChanged(QString firstAidId,QString time, QString status) +{ + //TODO firstAidId == null 选择倒计时最小的急救 + + qDebug() << "MainWidget::onPatientMergencyStatusChanged " << firstAidId << time << status; + + if(status == 0){ + return; + } + + //发送信号,该信号与httpservice的updatestatus请求绑定 + emit statusChanged(firstAidId,status); + + //处理状态改变 + if(status == 1){ //进行中(拍了一下按键) + + }else if(status == 2){//服务环节结束 + + } +} diff --git a/mainwidget.h b/mainwidget.h index bc6b7fa..0a91c2b 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -17,6 +17,14 @@ public: private: Ui::MainWidget *ui; + +public slots: + void onWsConnectedStatusChanged(int); + void onNewPatientMergencyInfo(QString firstAidId,QString name,QString content,quint64 realCountDownInSeconds); + void onPatientMergencyStatusChanged(QString firstAidId,QString time,QString status); + +signals: + statusChanged(QString firstAidId,QString status); }; #endif // MAINWIDGET_H diff --git a/patientemergencyinfo.cpp b/patientemergencyinfo.cpp new file mode 100644 index 0000000..7b69366 --- /dev/null +++ b/patientemergencyinfo.cpp @@ -0,0 +1,8 @@ +#include "patientemergencyinfo.h" + +PatientEmergencyInfo::PatientEmergencyInfo( + QString id,QString name,QString text,quint64 realCountDownInSeconds,QObject *parent) + :id(id),name(name),text(text),realCountDownInSeconds(realCountDownInSeconds),QObject(parent) +{ + +} diff --git a/patientemergencyinfo.h b/patientemergencyinfo.h new file mode 100644 index 0000000..ce6f333 --- /dev/null +++ b/patientemergencyinfo.h @@ -0,0 +1,22 @@ +#ifndef PATIENTEMERGENCYINFO_H +#define PATIENTEMERGENCYINFO_H + +#include + +class PatientEmergencyInfo : public QObject +{ + Q_OBJECT +public: + explicit PatientEmergencyInfo( + QString id,QString name,QString text,quint64 realCountDownInSeconds,QObject *parent = 0); + QString id; + QString name; + QString text; + quint64 realCountDownInSeconds; + +signals: + +public slots: +}; + +#endif // PATIENTEMERGENCYINFO_H diff --git a/resttest b/resttest new file mode 100644 index 0000000..b92ab71 --- /dev/null +++ b/resttest @@ -0,0 +1,9 @@ +https://example.com/comments/1 + +POST https://example.com/comments HTTP/1.1 +content-type: application/json + +{ + "name": "sample", + "time": "Wed, 21 Oct 2015 18:27:50 GMT" +} diff --git a/websocketservice.cpp b/websocketservice.cpp new file mode 100644 index 0000000..772a87d --- /dev/null +++ b/websocketservice.cpp @@ -0,0 +1,131 @@ +#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); +} + + +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) +{ + QString firstAidId = jobj.take("firstAidId").toString(); + QString name = jobj.take("name").toString(); + QString content = jobj.take("content").toString(); + quint64 realCountdown = jobj.take("realCountdown").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); +} diff --git a/websocketservice.h b/websocketservice.h new file mode 100644 index 0000000..f8bec9a --- /dev/null +++ b/websocketservice.h @@ -0,0 +1,38 @@ +#ifndef WEBSOCKETSERVICE_H +#define WEBSOCKETSERVICE_H + +#include +#include +#include +#include "patientemergencyinfo.h" + +class WebsocketService : public QObject +{ + Q_OBJECT +public: + explicit WebsocketService(QObject *parent = 0); + void connectToServer(QString url); + void handleWsButtonStartMsg(QJsonObject jobj); + void handleWsUpdateStatusMsg(QJsonObject jobj); + void sendWsAckMessage(QString ackId); +private: + QWebSocket m_webSocket; + QString m_url; + qint64 m_lastSendDataInSeconds; + QTimer m_heartTimer; + quint32 m_wsHeartInterval; + +signals: + void wsConnectedStatusChanged(int); + //void newPatientMergencyInfo(PatientEmergencyInfo *); + void newPatientMergencyInfo(QString firstAidId,QString name,QString content,quint64 realCountDownInSeconds); + void patientMergencyStatusChanged(QString firstAidId,QString time,QString status); +public slots: + void onConnected(); + void onDisconnected(); + void wsSendPingMsg(); + void wsSendAuthMsg(); + void onTextMessageReceived(const QString &message); +}; + +#endif // WEBSOCKETSERVICE_H