CWebsocketProc.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include "CWebsocketProc.h"
  2. #include <QNetworkRequest>
  3. #include <QUrlQuery>
  4. #include <QCryptographicHash>
  5. #include "CCommonTools.h"
  6. #include "CAppInfo.h"
  7. #include "logproc.h"
  8. std::shared_ptr<CWebsocketProc> g_websocketPtr;
  9. CWebsocketProc::CWebsocketProc()
  10. {
  11. m_sToken = "";
  12. m_nTimeOutTimes = 0;
  13. m_nTimeOutLimit = 4;
  14. m_nTimeOutSecord = 30;
  15. m_bConnected = false;
  16. m_pWebsocket = new QWebSocket;
  17. m_isExitClosed = false;
  18. QSslConfiguration config = m_pWebsocket->sslConfiguration();
  19. config.setPeerVerifyMode(QSslSocket::VerifyNone);
  20. config.setProtocol(QSsl::TlsV1SslV3);
  21. m_pWebsocket->setSslConfiguration(config);
  22. m_pTime = new QTimer;
  23. connect(m_pTime, &QTimer::timeout, this, &CWebsocketProc::reconnect);
  24. connect(m_pWebsocket, &QWebSocket::disconnected, this, &CWebsocketProc::onDisconnected);
  25. bool ret = connect(m_pWebsocket, &QWebSocket::textMessageReceived, this, &CWebsocketProc::onTextReceived);
  26. ret = connect(m_pWebsocket, &QWebSocket::connected, this, &CWebsocketProc::onConnected);
  27. }
  28. CWebsocketProc::~CWebsocketProc()
  29. {
  30. m_pWebsocket->errorString();
  31. m_pWebsocket->close();
  32. RELEASE_PTR(m_pWebsocket);
  33. m_pTime->stop();
  34. RELEASE_PTR(m_pTime);
  35. }
  36. void CWebsocketProc::setUrl(QString sUrl, QString sToken, QString sKey)
  37. {
  38. m_sUrl = sUrl;
  39. m_sToken = sToken;
  40. m_sKey = sKey;
  41. }
  42. void CWebsocketProc::open()
  43. {
  44. m_isExitClosed = false;
  45. if(!m_sUrl.isEmpty())
  46. {
  47. QUrl url(m_sUrl);
  48. QUrlQuery urlQuery;
  49. urlQuery.addQueryItem("key", m_sKey);
  50. urlQuery.addQueryItem("token", m_sToken);
  51. url.setQuery(urlQuery);
  52. qDebug()<<url.url();
  53. m_pWebsocket->open(url);
  54. m_pTime->start(m_nTimeOutSecord*1000);
  55. myServerLog()<<url.url();
  56. }
  57. }
  58. void CWebsocketProc::open(QString sUrl, QString sToken, QString sKey)
  59. {
  60. m_sToken = sToken;
  61. m_sKey = sKey;
  62. m_sUrl = sUrl;
  63. open();
  64. }
  65. void CWebsocketProc::close()
  66. {
  67. m_isExitClosed = true;
  68. m_pTime->stop();
  69. m_bConnected = false;
  70. // m_pWebsocket->abort();
  71. m_pWebsocket->close();
  72. }
  73. bool CWebsocketProc::isConnected()
  74. {
  75. return m_bConnected;
  76. }
  77. qint64 CWebsocketProc::sendText(QString sText)
  78. {
  79. if(m_bConnected)
  80. {
  81. // QByteArray data = sText.remove(QRegExp("\\s")).toLatin1();
  82. qDebug()<<sText;
  83. return m_pWebsocket->sendTextMessage(sText);
  84. }
  85. else
  86. {
  87. return 0;
  88. }
  89. }
  90. //断开连接会触发这个槽函数
  91. void CWebsocketProc::onDisconnected()
  92. {
  93. qDebug() << m_pWebsocket->errorString();
  94. m_bConnected = false;
  95. if(!m_isExitClosed)
  96. {
  97. m_pTime->start(m_nTimeOutSecord*1000);
  98. emit networkWeak();
  99. }
  100. qDebug()<<"Websocket Disconnected";
  101. myServerLog() <<"Websocket Disconnected";
  102. }
  103. //连接成功会触发这个槽函数
  104. void CWebsocketProc::onConnected()
  105. {
  106. m_bConnected = true;
  107. m_nTimeOutTimes = 0;
  108. m_pTime->stop();
  109. emit connected();
  110. qDebug()<<"Websocket Connected";
  111. myServerLog()<<"Websocket Connected";
  112. }
  113. //收到服务发来的消息会触发这个槽函数
  114. void CWebsocketProc::onTextReceived(QString msg)
  115. {
  116. try
  117. {
  118. qDebug()<<"recv:"<<msg;
  119. Json::Value jRececvMsg = Json::Value::null;
  120. Json::Reader reader;
  121. if(!reader.parse(msg.toStdString(), jRececvMsg))
  122. {
  123. myServerLog() << QString::fromLocal8Bit("解析后台数据出错:") << msg;
  124. emit websocketError("解析后台数据出错");
  125. return;
  126. }
  127. QString sCode = jRececvMsg["status"]["code"].asString().c_str();
  128. if (sCode != "200")
  129. {
  130. emit websocketError(jRececvMsg["status"]["desc"].asString().c_str());
  131. }
  132. else
  133. {
  134. QString sType = jRececvMsg["content"]["eventType"].asString().c_str();
  135. if (sType == "SCAN_QR_CODE")//移动端拍照/录音扫描完成
  136. {
  137. if (jRececvMsg["content"]["isSuccess"].asBool())
  138. {
  139. QString sScanStatus = jRececvMsg["content"]["data"]["scanStatus"].asString().c_str();
  140. __int64 nExamRecordDataId = jRececvMsg["content"]["data"]["examRecordDataId"].asInt64();
  141. int nOrder = jRececvMsg["content"]["data"]["order"].asInt();
  142. emit mobileStatus(nExamRecordDataId, nOrder, sScanStatus);
  143. }
  144. else
  145. {
  146. QString sErrorMsg = jRececvMsg["content"]["errorMessage"].asString().c_str();
  147. emit websocketError(sErrorMsg);
  148. }
  149. }
  150. else if (sType == "GET_FILE_ANSWER")//移动端拍照/录音上传成功
  151. {
  152. if (jRececvMsg["content"]["isSuccess"].asBool())
  153. {
  154. QString sFileType = jRececvMsg["content"]["data"]["transferFileType"].asString().c_str();
  155. QString sFileUrl = jRececvMsg["content"]["data"]["fileUrl"].asString().c_str();
  156. __int64 nExamRecordDataId = jRececvMsg["content"]["data"]["examRecordDataId"].asInt64();
  157. int nOrder = jRececvMsg["content"]["data"]["order"].asInt();
  158. emit fileAnswer(nExamRecordDataId, nOrder, sFileType, sFileUrl);
  159. }
  160. else
  161. {
  162. QString sErrorMsg = jRececvMsg["content"]["errorMessage"].asString().c_str();
  163. emit websocketError(sErrorMsg);
  164. }
  165. }
  166. }
  167. m_bConnected = true;
  168. m_nTimeOutTimes = 0;
  169. m_pTime->stop();
  170. }
  171. catch (std::exception &e)
  172. {
  173. emit websocketError(QString::fromLocal8Bit("接收数据出错:%1").arg(e.what()));
  174. }
  175. }
  176. //断开连接会启动定时器,触发这个槽函数重新连接
  177. void CWebsocketProc::reconnect()
  178. {
  179. m_nTimeOutTimes++;
  180. if(m_nTimeOutTimes > m_nTimeOutLimit)
  181. {
  182. emit clientOffLine();
  183. return;
  184. }
  185. else
  186. {
  187. emit networkWeak();
  188. }
  189. m_bConnected = false;
  190. m_pWebsocket->abort();
  191. open();
  192. }