QThreadHttpClient - 副本.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "QThreadHttpClient.h"
  2. #include "DataManager.h"
  3. #include <QSettings>
  4. #include <QDebug>
  5. #include <QApplication>
  6. #include "AsioUDPNetDLL.h"
  7. #include "TaskMNG.h"
  8. #include "ElectricityVOC.h"
  9. #ifdef Q_OS_WIN
  10. #pragma execution_character_set("utf-8")
  11. #endif
  12. QThreadHttpClient* QThreadHttpClient::g_HttpSingle;
  13. QMutex QThreadHttpClient::m_clientMutex;
  14. QThreadHttpClient& QThreadHttpClient::instance()
  15. {
  16. if (g_HttpSingle == NULL)
  17. {
  18. QMutexLocker lock(&m_clientMutex);
  19. if (g_HttpSingle == NULL)
  20. {
  21. g_HttpSingle = new (std::nothrow) QThreadHttpClient(nullptr);
  22. }
  23. }
  24. return *g_HttpSingle;
  25. }
  26. void QThreadHttpClient::destroyInstance()
  27. {
  28. QMutexLocker lock(&m_clientMutex);
  29. if (g_HttpSingle)
  30. {
  31. delete g_HttpSingle;
  32. g_HttpSingle = NULL;
  33. }
  34. }
  35. QThreadHttpClient::QThreadHttpClient(QObject *parent)
  36. : QObject(parent), pClient(nullptr)
  37. {
  38. qRegisterMetaType<std::string>("std::string");
  39. connect(this, SIGNAL(signal_SignalData(std::string, std::string)), this, SLOT(slot_SendPost(std::string,std::string)),Qt::QueuedConnection);
  40. }
  41. QThreadHttpClient::~QThreadHttpClient()
  42. {}
  43. void QThreadHttpClient::initHttpClient()
  44. {
  45. QString strHost="";
  46. int nPort = 0;
  47. QString strGetPath=QApplication::applicationDirPath();
  48. strGetPath.append("/config");
  49. QSettings settings(strGetPath, QSettings::IniFormat);
  50. settings.setIniCodec("GBK");
  51. int nTimeOut = READ_INI_INT("HttpClient/HttpTimeOut", 2);
  52. strHost = READ_INI_STR("HttpClient/IP", "127.0.0.1");
  53. nPort = READ_INI_INT("HttpClient/port", 8090);
  54. qDebug()<<"HttpClient:"<<strHost<<" port:"<<nPort;
  55. pClient = new httplib::Client(strHost.toStdString(),nPort);
  56. pClient->set_connection_timeout(nTimeOut);
  57. pClient->set_write_timeout(nTimeOut);
  58. pClient->set_read_timeout(nTimeOut);
  59. }
  60. bool QThreadHttpClient::HttpPost(const std::string& strUrl, const std::string& strRequest, std::string& strResponse)
  61. {
  62. QMutexLocker lock(&m_clientMutex);
  63. if (!pClient) {
  64. if (!reconnect()) {
  65. AddLogJson(strRequest, "Client is null, reconnect failed", strUrl, false);
  66. return false;
  67. }
  68. }
  69. try {
  70. auto result = pClient->Post(strUrl.c_str(), strRequest, "application/json");
  71. if (!result) {
  72. // 请求失败,尝试重连并重试一次
  73. if (reconnect()) {
  74. result = pClient->Post(strUrl.c_str(), strRequest, "application/json");
  75. }
  76. if (!result) {
  77. AddLogJson(strRequest, "Request failed or timeout", strUrl, false);
  78. return false;
  79. }
  80. }
  81. strResponse = result->body;
  82. AddLogJson(strRequest, strResponse, strUrl, result->status);
  83. return (result->status == 200);
  84. } catch (const std::exception& e) {
  85. AddLogJson(strRequest, std::string("Exception: ") + e.what(), strUrl, false);
  86. reconnect(); // 发生异常后重连
  87. return false;
  88. } catch (...) {
  89. AddLogJson(strRequest, "Unknown exception", strUrl, false);
  90. reconnect(); // 发生异常后重连
  91. return false;
  92. }
  93. }
  94. bool QThreadHttpClient::reconnect()
  95. {
  96. //QMutexLocker lock(&m_clientMutex);
  97. if (pClient) {
  98. delete pClient;
  99. pClient = nullptr;
  100. }
  101. QString strHost="";
  102. int nPort = 0;
  103. QString strGetPath=QApplication::applicationDirPath();
  104. strGetPath.append("/config");
  105. QSettings settings(strGetPath, QSettings::IniFormat);
  106. settings.setIniCodec("GBK");
  107. int nTimeOut = READ_INI_INT("HttpClient/HttpTimeOut", 2);
  108. strHost = READ_INI_STR("HttpClient/IP", "127.0.0.1");
  109. nPort = READ_INI_INT("HttpClient/port", 8090);
  110. pClient = new httplib::Client(strHost.toStdString(),nPort);
  111. pClient->set_connection_timeout(nTimeOut);
  112. pClient->set_write_timeout(nTimeOut);
  113. pClient->set_read_timeout(nTimeOut);
  114. return (pClient != nullptr);
  115. }
  116. bool QThreadHttpClient::isConnected()
  117. {
  118. QMutexLocker lock(&m_clientMutex);
  119. if (!pClient) return false;
  120. // 简单的连接测试
  121. auto result = pClient->Get("/");
  122. return (result != nullptr && result->status == 200);
  123. }
  124. void QThreadHttpClient::InitConnect(QObject* pCMD)
  125. {
  126. qRegisterMetaType<OCCCOMMAND>("OCCCOMMAND");
  127. connect(pCMD, SIGNAL(signal_Command2Server(int, OCCCOMMAND)), this, SLOT(slot_CMDPop(int, OCCCOMMAND)),Qt::QueuedConnection);
  128. }
  129. void QThreadHttpClient::slot_CMDPop(int nCmdID, OCCCOMMAND pCmdData)
  130. {
  131. NetDll_SendUDPDataToMulti(HDDSType::HDDSType_sOCCCMD,&pCmdData,pCmdData.DateLen+32);
  132. switch (nCmdID)
  133. {
  134. case OCCCOMMAND::eUpdateEqpmtStatus:
  135. {
  136. ElectricityVOC* pElcVoc = (ElectricityVOC*)TaskMNG::instance()->pGetEleVOC();
  137. if (!pElcVoc)
  138. {
  139. return;
  140. }
  141. Json::Value pJson;
  142. pJson["LineID"] = pElcVoc->m_nRunLineID;
  143. pJson["CmdType"] = 0;//设备控制
  144. pJson["EqpmtID"]= pCmdData.Net_DH_EqpmtUpdate.EqpmtStrID;
  145. pJson["Status"] = pCmdData.Net_DH_EqpmtUpdate.Status;
  146. pJson["CtrlType"] = pCmdData.Net_DH_EqpmtUpdate.CtrlType;
  147. pJson["CtrlLock"] = pCmdData.Net_DH_EqpmtUpdate.CtrlLock;
  148. pJson["FaultLock"] = pCmdData.Net_DH_EqpmtUpdate.FaultLock;
  149. pJson["RemoteLock"] = pCmdData.Net_DH_EqpmtUpdate.RemoteLock;
  150. pJson["CtrlArea"] = pCmdData.Net_DH_EqpmtUpdate.CtrlArea;
  151. pJson["fValue"] = "";
  152. pJson["nValueType"] = "";
  153. pJson["IsReset"] = "";
  154. Json::FastWriter pfastW;
  155. std::string strJson=pfastW.write(pJson);
  156. emit signal_SignalData("/courserun/eqpmtstatus", strJson);
  157. }
  158. break;
  159. case OCCCOMMAND::eUpdateEqpmtTelemeteryValue:
  160. {
  161. ElectricityVOC* pElcVoc = (ElectricityVOC*)TaskMNG::instance()->pGetEleVOC();
  162. if (!pElcVoc)
  163. {
  164. return;
  165. }
  166. Json::Value pJson;
  167. pJson["LineID"] = pElcVoc->m_nRunLineID;
  168. pJson["CmdType"] = 1;//设备数据
  169. pJson["EqpmtID"] = pCmdData.Net_DH_EqpmtTelemtryValue.EqpmtStrID;
  170. pJson["Status"] = "";
  171. pJson["CtrlType"] = "";
  172. pJson["CtrlLock"] = "";
  173. pJson["FaultLock"] = "";
  174. pJson["RemoteLock"] = "";
  175. pJson["CtrlArea"] = "";
  176. pJson["fValue"] = pCmdData.Net_DH_EqpmtTelemtryValue.fValue;
  177. pJson["nValueType"] = pCmdData.Net_DH_EqpmtTelemtryValue.nType;
  178. pJson["IsReset"] = pCmdData.Net_DH_EqpmtTelemtryValue.IsReset;
  179. Json::FastWriter pfastW;
  180. std::string strJson = pfastW.write(pJson);
  181. emit signal_SignalData("/courserun/eqpmtstatus", strJson);
  182. }
  183. break;
  184. case OCCCOMMAND::eUpdateEvaOperStatus:
  185. {
  186. Json::Value pJson;
  187. pJson["CtrlType"] = pCmdData.Net_JY_UpdateEvaOperStatus.OperItemSubType1;
  188. pJson["CtrlSubType"] = pCmdData.Net_JY_UpdateEvaOperStatus.OperItemSubType2;
  189. pJson["CtrlFrom"] = pCmdData.Net_JY_UpdateEvaOperStatus.OperClientID;
  190. std::string strData = std::to_string(pCmdData.Net_JY_UpdateEvaOperStatus.OperStuID);
  191. pJson["CtrlUser"] = strData;
  192. pJson["Param1"] = pCmdData.Net_JY_UpdateEvaOperStatus.AssociPara1;
  193. pJson["Param2"] = pCmdData.Net_JY_UpdateEvaOperStatus.AssociPara2;
  194. pJson["Param3"] = pCmdData.Net_JY_UpdateEvaOperStatus.AssociPara3;
  195. pJson["Param4"] = pCmdData.Net_JY_UpdateEvaOperStatus.AssociPara4;
  196. pJson["Param5"] = pCmdData.Net_JY_UpdateEvaOperStatus.AssociPara5;
  197. Json::FastWriter pfastW;
  198. std::string strJson = pfastW.write(pJson);
  199. emit signal_SignalData("/courserun/add_ctrl_log", strJson);
  200. }
  201. break;
  202. default:
  203. break;
  204. }
  205. }
  206. void QThreadHttpClient::slot_SendPost(std::string strUrl, std::string strRequest)
  207. {
  208. std::string strReData;
  209. HttpPost(strUrl, strRequest, strReData);
  210. }
  211. void QThreadHttpClient::AddLogJson(std::string strRequest, std::string strResponse, std::string nAPIID, bool bStatus)
  212. {
  213. std::string strShow = "", strRetrun = "";
  214. // strShow = UTF8_to_string(strRequest);
  215. // strRetrun = strResponse;
  216. if (!DataManager::JsonToStyled(strRequest, strShow))
  217. {
  218. strShow = DataManager::UTF8_to_string(strRequest);
  219. }
  220. else
  221. {
  222. strShow = DataManager::UTF8_to_string(strShow);
  223. }
  224. if (!DataManager::JsonToStyled(strResponse, strRetrun))
  225. {
  226. strRetrun = strResponse;
  227. }
  228. LogJson pData(strShow, strRetrun, nAPIID, bStatus);
  229. DataManager::instance().AddHttpLog(pData);
  230. }