sp_httpDefine.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928
  1. #include "sp_httpDefine.h"
  2. #include "sp_cfg.h"
  3. #include "json/json.h"
  4. #include <sstream>
  5. #include "SpBase.h"
  6. #include <time.h>
  7. #include <ctime>
  8. #include <iomanip>
  9. #include <fstream>
  10. #include <ostream>
  11. #include <iostream>
  12. #include "SpUtility.h"
  13. //#include "cpp-httplib/httplib.h"
  14. #define QUERY_TERMINAL_MAX_WAIT_TIME 10000
  15. std::string Token_Save::channelId = "";
  16. std::string Token_Save::token = "";
  17. void Token_Save::getToken(std::string& t_channelId, std::string& t_token)
  18. {
  19. t_channelId = channelId;
  20. t_token = token;
  21. }
  22. CAutoArray<CSimpleString> generateUrlArr(CSimpleString url, CSimpleString appendStr)
  23. {
  24. auto urlArr = url.Split('|');
  25. for (int i = 0; i < urlArr.GetCount(); i++)
  26. urlArr[i].Append(appendStr);
  27. return urlArr;
  28. }
  29. bool VTMErrMsgCfgRet::Parse(string strData)
  30. {
  31. Json::Value root;
  32. Json::Reader reader;
  33. reader.parse(strData, root, false);
  34. if (root["code"].isString())
  35. {
  36. std::string return_code = root["code"].asString();
  37. if (return_code != "SUC0000")
  38. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get VTMErrMsgCfgRet Failed , code:%s", return_code.c_str());
  39. }
  40. do
  41. {
  42. //judge success
  43. if (root["success"].isBool())
  44. {
  45. m_result = root["success"].asBool();
  46. if (root["error_msg"].isString())
  47. error_msg = root["error_msg"].asString();
  48. if (!m_result)
  49. {
  50. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get VTMErrMsgCfgRet::success False");
  51. break;
  52. }
  53. }
  54. else
  55. {
  56. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get VTMErrMsgCfgRet::success not bool");
  57. break;
  58. }
  59. //judge data
  60. if (!root[TOTALCONFIG_HEAD].isObject())
  61. {
  62. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get VTMErrMsgCfgRet::data not object");
  63. break;
  64. }
  65. auto json_data = root[TOTALCONFIG_HEAD];
  66. //get total
  67. if (json_data[VTMERRMSG_CONFIG_TOTAL].isInt())
  68. total = json_data[VTMERRMSG_CONFIG_TOTAL].asInt();
  69. else
  70. {
  71. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get VTMErrMsgCfgRet::data::%s not int", VTMERRMSG_CONFIG_TOTAL);
  72. break;
  73. }
  74. //get version_no
  75. if (json_data[VTMERRMSG_CONFIG_VERSION].isString())
  76. version_no = json_data[VTMERRMSG_CONFIG_VERSION].asString();
  77. else
  78. {
  79. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get VTMErrMsgCfgRet::data::%s not string", VTMERRMSG_CONFIG_VERSION);
  80. break;
  81. }
  82. //get page_total
  83. if (json_data[VTMERRMSG_CONFIG_PAGETOTAL].isInt())
  84. page_total = json_data[VTMERRMSG_CONFIG_PAGETOTAL].asInt();
  85. else
  86. {
  87. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get VTMErrMsgCfgRet::data::%s not int", VTMERRMSG_CONFIG_PAGETOTAL);
  88. break;
  89. }
  90. if (!json_data[VTMERRMSG_CONFIG_CONFIG].isArray())
  91. {
  92. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get VTMErrMsgCfgRet::data::%s not array", VTMERRMSG_CONFIG_CONFIG);
  93. break;
  94. }
  95. //parse config
  96. auto vtmerrmsg_config = json_data[VTMERRMSG_CONFIG_CONFIG];
  97. for (Json::Value::ArrayIndex i = 0; i != vtmerrmsg_config.size(); i++) {
  98. std::string errorCode = vtmerrmsg_config[i][VTMERRMSG_CONFIG_ERRORCODE].asString();
  99. std::string description = vtmerrmsg_config[i][VTMERRMSG_CONFIG_DESCRIPETION].asString();
  100. std::string remark = vtmerrmsg_config[i][VTMERRMSG_CONFIG_REMARK].asString();
  101. errorCodeArr.push_back(errorCode);
  102. descriptionArr.push_back(description);
  103. remarkArr.push_back(remark);
  104. }
  105. return true;
  106. } while (false);
  107. return false;
  108. }
  109. bool TerminalCfgRet::Parse(string strData) {
  110. Json::Value root;
  111. Json::Reader reader;
  112. reader.parse(strData, root, false);
  113. if (root["code"].isString())
  114. {
  115. std::string return_code = root["code"].asString();
  116. if (return_code != "SUC0000")
  117. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get RootCfgRet Failed , code:%s", return_code.c_str());
  118. }
  119. do
  120. {
  121. //judge success
  122. if (root["success"].isBool())
  123. {
  124. m_result = root["success"].asBool();
  125. if (!m_result)
  126. {
  127. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::success False");
  128. break;
  129. }
  130. }
  131. else
  132. {
  133. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::success not bool");
  134. break;
  135. }
  136. //judge data
  137. if (!root[TOTALCONFIG_HEAD].isObject())
  138. {
  139. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data not object");
  140. break;
  141. }
  142. auto json_data = root[TOTALCONFIG_HEAD];
  143. if (!json_data[TOTALCONFIG_CENTER_HEAD].isObject())
  144. {
  145. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::%s not object", TOTALCONFIG_CENTER_HEAD);
  146. break;
  147. }
  148. if (!json_data[TOTALCONFIG_ROOT_HEAD].isObject())
  149. {
  150. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::%s not object", TOTALCONFIG_ROOT_HEAD);
  151. break;
  152. }
  153. if (!json_data[TOTALCONFIG_SHELL_HEAD].isObject())
  154. {
  155. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::%s not object", TOTALCONFIG_SHELL_HEAD);
  156. break;
  157. }
  158. //parse center_config
  159. auto terminal_config = json_data[TOTALCONFIG_CENTER_HEAD];
  160. if (!terminal_config[TOTALCONFIG_CENTER_UPDATE].isBool())
  161. {
  162. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::center_config_dto::update not Bool");
  163. break;
  164. }
  165. if (!terminal_config[TOTALCONFIG_CENTER_RESET].isBool())
  166. {
  167. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::center_config_dto::reset not Bool");
  168. break;
  169. }
  170. center_update = terminal_config[TOTALCONFIG_CENTER_UPDATE].asBool();
  171. center_reset = terminal_config[TOTALCONFIG_CENTER_RESET].asBool();
  172. //只有有center_update时才进行解析
  173. if (center_update)
  174. {
  175. if (!terminal_config[TOTALCONFIG_CENTER_VERSION].isString())
  176. {
  177. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::center_config_dto::sm3 not string");
  178. break;
  179. }
  180. if (!terminal_config[TOTALCONFIG_CONFIG_HEAD].isArray())
  181. {
  182. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::center_config_dto::config not array");
  183. break;
  184. }
  185. center_version = terminal_config[TOTALCONFIG_CENTER_VERSION].asString();
  186. auto tmp_center_config = terminal_config[TOTALCONFIG_CONFIG_HEAD];
  187. for (Json::Value::ArrayIndex i = 0; i != tmp_center_config.size(); i++) {
  188. std::string module = tmp_center_config[i][TOTALCONFIG_CONFIG_MODULE].asString();
  189. std::string name = tmp_center_config[i][TOTALCONFIG_CONFIG_NAME].asString();
  190. std::string value = tmp_center_config[i][TOTALCONFIG_CONFIG_VALUE].asString();
  191. if (center_config.find(module) == center_config.end())
  192. center_config.insert(std::make_pair(module, std::map<std::string, std::string>()));
  193. center_config[module][name] = value;
  194. }
  195. }
  196. //parse root_config
  197. auto root_config_json = json_data[TOTALCONFIG_ROOT_HEAD];
  198. if (!root_config_json[TOTALCONFIG_ROOT_UPDATE].isBool())
  199. {
  200. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::root_config_dto::update not Bool");
  201. break;
  202. }
  203. root_update = root_config_json[TOTALCONFIG_ROOT_UPDATE].asBool();
  204. if (root_update)//坑爹啊,竟然说这个root_update==false就是终端没有上收
  205. {
  206. if (!root_config_json[TOTALCONFIG_ROOT_VERSION].isString())
  207. {
  208. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::root_config_dto::version_no not string");
  209. break;
  210. }
  211. if (!root_config_json[TOTALCONFIG_CONFIG_HEAD].isArray())
  212. {
  213. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::root_config_dto::config not array");
  214. break;
  215. }
  216. root_version = root_config_json[TOTALCONFIG_ROOT_VERSION].asString();
  217. auto tmp_root_config = root_config_json[TOTALCONFIG_CONFIG_HEAD];
  218. for (Json::Value::ArrayIndex i = 0; i != tmp_root_config.size(); i++) {
  219. std::string module = tmp_root_config[i][TOTALCONFIG_CONFIG_MODULE].asString();
  220. std::string name = tmp_root_config[i][TOTALCONFIG_CONFIG_NAME].asString();
  221. std::string value = tmp_root_config[i][TOTALCONFIG_CONFIG_VALUE].asString();
  222. if (root_config.find(module) == root_config.end())
  223. root_config.insert(std::make_pair(module, std::map<std::string, std::string>()));
  224. root_config[module][name] = value;
  225. }
  226. }
  227. //parse shell_config
  228. auto shell_config_json = json_data[TOTALCONFIG_SHELL_HEAD];
  229. if (!shell_config_json[TOTALCONFIG_SHELL_UPDATE].isBool())
  230. {
  231. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::shell_config_dto::update not Bool");
  232. break;
  233. }
  234. shell_update = shell_config_json[TOTALCONFIG_SHELL_UPDATE].asBool();
  235. if (shell_update)
  236. {
  237. if(!shell_config_json[TOTALCONFIG_SHELL_VERSION].isString())
  238. {
  239. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::shell_config_dto::version_no not string");
  240. break;
  241. }
  242. if (!shell_config_json[TOTALCONFIG_CONFIG_HEAD].isArray())
  243. {
  244. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get TerminalCfgRet::data::shell_config_dto::config not string");
  245. break;
  246. }
  247. shell_version = shell_config_json[TOTALCONFIG_SHELL_VERSION].asString();
  248. auto tmp_shell_config = shell_config_json[TOTALCONFIG_CONFIG_HEAD];
  249. for (Json::Value::ArrayIndex i = 0; i != tmp_shell_config.size(); i++) {
  250. std::string module = tmp_shell_config[i][TOTALCONFIG_CONFIG_MODULE].asString();
  251. std::string name = tmp_shell_config[i][TOTALCONFIG_CONFIG_NAME].asString();
  252. std::string value = tmp_shell_config[i][TOTALCONFIG_CONFIG_VALUE].asString();
  253. if (shell_config.find(module) == shell_config.end())
  254. shell_config.insert(std::make_pair(module, std::map<std::string, std::string>()));
  255. shell_config[module][name] = value;
  256. }
  257. }
  258. return true;
  259. } while (false);
  260. return false;
  261. }
  262. std::pair<bool, std::string> VTMErrMsgCfgRet::saveVTMErrToFile(const std::string fileName)
  263. {
  264. // 转换为Json::Value
  265. Json::Value root;
  266. Json::Value config;
  267. for (int i = 0; i < errorCodeArr.size(); i++)
  268. {
  269. Json::Value error;
  270. error[VTMERRMSG_CONFIG_ERRORCODE] = errorCodeArr[i];
  271. error[VTMERRMSG_CONFIG_DESCRIPETION] = descriptionArr[i];
  272. error[VTMERRMSG_CONFIG_REMARK] = remarkArr[i];
  273. config.append(error);
  274. }
  275. root[VTMERRMSG_CONFIG_CONFIG] = config;
  276. Json::StyledWriter writer; // 或者 Json::FastWriter writer;
  277. std::string output = writer.write(root);
  278. std::ofstream outputFile(fileName);
  279. if (!outputFile.is_open())
  280. return std::make_pair(false, "file open failed");
  281. outputFile << output;
  282. outputFile.close();
  283. return std::make_pair(true, output);
  284. }
  285. std::string TerminalCfgRet::ConvertMapMapConfigToStr(const std::map<std::string, std::map<std::string, std::string>>& tmpMap)
  286. {
  287. // 转换为Json::Value
  288. Json::Value jsonMap;
  289. std::map<std::string, std::map<std::string, std::string>>::const_iterator outer_it = tmpMap.begin();
  290. std::map<std::string, std::map<std::string, std::string>>::const_iterator outer_end = tmpMap.end();
  291. for (; outer_it != outer_end; ++outer_it) {
  292. Json::Value innerMap;
  293. std::map<std::string, std::string>::const_iterator inner_it = outer_it->second.begin();
  294. std::map<std::string, std::string>::const_iterator inner_end = outer_it->second.end();
  295. for (; inner_it != inner_end; ++inner_it) {
  296. innerMap[inner_it->first] = inner_it->second;
  297. }
  298. jsonMap[outer_it->first] = innerMap;
  299. }
  300. // 生成std::string
  301. Json::StyledWriter writer; // 或者 Json::FastWriter writer;
  302. std::string output = writer.write(jsonMap);
  303. return output;
  304. }
  305. bool TerminalCfgRet::saveMapMapToFile(const std::string fileName, const std::map<std::string, std::map<std::string, std::string>>& tmpMap)
  306. {
  307. std::ofstream outputFile(fileName);
  308. if (!outputFile.is_open())
  309. return false;
  310. std::string cur = TerminalCfgRet::ConvertMapMapConfigToStr(tmpMap);
  311. /*for test
  312. std::map<std::string, std::map<std::string, std::string>> testConfig;
  313. ConvertStrToDeviceConfigMap(cur, testConfig);
  314. */
  315. outputFile << cur;
  316. outputFile.close();
  317. return true;
  318. }
  319. string TerminalCfgRet::readStrFromFile(const std::string fileName)
  320. {
  321. std::ifstream inputFile(fileName);
  322. if (!inputFile.is_open()) {
  323. return "";
  324. }
  325. std::string str((std::istreambuf_iterator<char>(inputFile)),
  326. std::istreambuf_iterator<char>());
  327. inputFile.close();
  328. return str;
  329. }
  330. string VTMErrMsgCfgReq::ToJson()
  331. {
  332. Json::Value root;
  333. root["terminal_no"] = terminal_no;
  334. root["page_num"] = page_num;
  335. Json::FastWriter writer;
  336. std::string json_str = writer.write(root);
  337. return json_str;
  338. }
  339. string TerminalCfgReq::ToJson() {
  340. // 创建一个json对象,并把结构体的数据复制到json对象中
  341. Json::Value root;
  342. root["terminal_no"] = terminalNo;
  343. if (center_version.length() > 0 && center_config.size() > 0)
  344. {
  345. root["center_version"] = center_version;
  346. Json::Value center_sub(Json::arrayValue);
  347. for (auto p = center_config.begin(); p != center_config.end(); p++) {
  348. for (auto q = p->second.begin(); q != p->second.end(); q++) {
  349. Json::Value tmp;
  350. tmp["module"] = p->first;
  351. tmp["name"] = q->first;
  352. tmp["value"] = q->second;
  353. center_sub.append(tmp);
  354. }
  355. }
  356. root["center_config"] = center_sub;
  357. }
  358. if (root_version.length() > 0 && root_config.size() > 0)
  359. {
  360. root["root_version"] = root_version;
  361. Json::Value root_sub(Json::arrayValue);
  362. for (auto p = root_config.begin(); p != root_config.end(); p++) {
  363. for (auto q = p->second.begin(); q != p->second.end(); q++) {
  364. Json::Value tmp;
  365. tmp["module"] = p->first;
  366. tmp["name"] = q->first;
  367. tmp["value"] = q->second;
  368. root_sub.append(tmp);
  369. }
  370. }
  371. root["root_config"] = root_sub;
  372. }
  373. if (shell_version.length() > 0 && shell_config.size() > 0)
  374. {
  375. root["shell_version"] = root_version;
  376. Json::Value shell_sub(Json::arrayValue);
  377. for (auto p = shell_config.begin(); p != shell_config.end(); p++) {
  378. for (auto q = p->second.begin(); q != p->second.end(); q++) {
  379. Json::Value tmp;
  380. tmp["module"] = p->first;
  381. tmp["name"] = q->first;
  382. tmp["value"] = q->second;
  383. shell_sub.append(tmp);
  384. }
  385. }
  386. root["shell_config"] = shell_sub;
  387. }
  388. // 创建一个json写入器,并把json对象转换为字符串
  389. Json::FastWriter writer;
  390. std::string json_str = writer.write(root);
  391. return json_str;
  392. }
  393. bool QueryTokenHTTPRet::Parse(std::string strData) {
  394. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryTokenHTTPRet: data = %s", strData.c_str());
  395. Json::Value root;
  396. Json::Reader reader;
  397. reader.parse(strData, root);
  398. if (root.isNull() || root["data"].isNull())
  399. return false;
  400. m_token = root["data"].asString();
  401. return true;
  402. }
  403. string QueryTokenHTTPReq::ToJson() {
  404. CSimpleString businessId_str = CSimpleString::Format("{\"installVersion\":\"%s\",\"terminalNo\":\"%s\"}", installVersion.c_str(), businessId.c_str());
  405. Json::Value root;
  406. root["channelId"] = channelId;
  407. root["clientSecret"] = tokenSecret;
  408. root["businessId"] = businessId_str.GetData();
  409. Json::FastWriter writer;
  410. std::string json_str = writer.write(root);
  411. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("QueryTokenHTTPReq:%s", json_str.c_str());
  412. return json_str;
  413. }
  414. string TerminalVerUpdateReq::ToJson() {
  415. Json::Value root;
  416. root["terminal_no"] = terminal_no;
  417. root["center_config_version"] = center_config_version;
  418. root["root_config_version"] = root_config_version;
  419. root["terminal_update_time"] = terminal_update_time;
  420. root["shell_config_version"] = shell_config_version;
  421. Json::FastWriter writer;
  422. std::string json_str = writer.write(root);
  423. return json_str;
  424. }
  425. bool TerminalVerUpdateRet::Parse(string strData) {
  426. Json::Value root;
  427. Json::Reader reader;
  428. reader.parse(strData, root, false);
  429. if (root["code"].isString())
  430. {
  431. std::string t_code = root["code"].asString();
  432. if (t_code != "SUC0000")
  433. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Can not get TerminalVerUpdateRet info , code:%d, data:%s", t_code.c_str(), strData.c_str());
  434. }
  435. if (root["success"].isBool())
  436. m_result = root["success"].asBool();
  437. return m_result;
  438. }
  439. DWORD getTerminalCfgInfoThread(LPVOID param)
  440. {
  441. TerminalCfgReq* req = (TerminalCfgReq*)param;
  442. IHttpFunc* http_client = create_http(LogCallback);
  443. if (http_client != NULL) {
  444. bool ret = http_client->Post(*req, req->ret);
  445. http_client->Destory();
  446. if (!ret)
  447. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("getTerminalCfgInfoThread failed, url:%s, terminalNo:%s, center_version:%s, root_version:%s",
  448. req->m_url.c_str(), req->terminalNo.c_str(), req->center_version.c_str(), req->root_version.c_str());
  449. else
  450. return req->ret.m_result ? 0 : -1;
  451. }
  452. Sleep(QUERY_TERMINAL_MAX_WAIT_TIME);//触发timeout
  453. return -1;
  454. }
  455. DWORD getVTMErrMsgCfgInfoThread(LPVOID param)
  456. {
  457. VTMErrMsgCfgReq* req = (VTMErrMsgCfgReq*)param;
  458. IHttpFunc* http_client = create_http(LogCallback);
  459. if (http_client != NULL) {
  460. bool ret = http_client->Post(*req, req->ret);
  461. http_client->Destory();
  462. if (!ret)
  463. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("getVTMErrMsgCfgInfoThread failed, url:%s, terminalNo:%s, page_num:%d",
  464. req->m_url.c_str(), req->terminal_no.c_str(), req->page_num);
  465. else
  466. return req->ret.m_result ? 0 : -1;
  467. }
  468. Sleep(QUERY_TERMINAL_MAX_WAIT_TIME);//触发timeout
  469. return -1;
  470. }
  471. DWORD getTokenThread(LPVOID param)
  472. {
  473. QueryTokenHTTPReq* req = (QueryTokenHTTPReq*)param;
  474. IHttpFunc* http_client = create_http(LogCallback);
  475. if (http_client != NULL) {
  476. bool ret = http_client->Post(*req, req->ret);
  477. http_client->Destory();
  478. if (ret && req->ret.m_token.length() > 0)
  479. {
  480. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("update token success"/*, req->ret.m_token.c_str()*/);
  481. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("update token success, %s", req->ret.m_token.c_str());
  482. return 0;
  483. }
  484. else
  485. {
  486. Sleep(10000);//触发timeout
  487. return -1;
  488. }
  489. }
  490. Sleep(10000);//触发timeout
  491. return -1;
  492. }
  493. std::pair<bool, std::string> refreshToken(std::string terminalNo, std::string installVersion,std::string channelId, std::string tokenSecret, std::string commonUrl)
  494. {
  495. //只要调用这个接口,就会获取新的token
  496. //判断是否应该刷新,在其他逻辑中判断
  497. CSimpleString tmpUrl = commonUrl.c_str();
  498. auto urlArr = tmpUrl.Split('|');
  499. static std::vector<QueryTokenHTTPReq> reqArr;//避免函数结束被析构
  500. reqArr.clear();
  501. for (int i = 0; i < urlArr.GetCount(); i++)
  502. {
  503. CSimpleString curUrl = urlArr[i];
  504. if (curUrl.GetLength() == 0)
  505. {
  506. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("QueryToken error, pos:%d, %s", i, tmpUrl.GetData());
  507. continue;
  508. }
  509. QueryTokenHTTPReq req;
  510. req.channelId = channelId;
  511. req.tokenSecret = tokenSecret;
  512. req.businessId = terminalNo;
  513. req.installVersion = installVersion;
  514. req.m_url = curUrl.GetData();
  515. req.m_url.append("/api/auth/v2/token");
  516. req.m_headers.emplace(std::make_pair("Content-Type", "application/json"));
  517. reqArr.emplace_back(req);
  518. }
  519. std::vector<HANDLE> threadArr;//创建多个线程获取token
  520. for (int i = 0; i < reqArr.size(); i++)
  521. threadArr.push_back(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&getTokenThread, &(reqArr[i]), 0, NULL));
  522. bool t_isGetTokenSuccess = false;
  523. auto tokenRet = WaitForMultipleObjects(threadArr.size(), threadArr.data(), false, 10000);
  524. if (tokenRet >= WAIT_OBJECT_0 && tokenRet <= WAIT_OBJECT_0 + threadArr.size())
  525. {
  526. DWORD exitCode = INT_MAX;
  527. GetExitCodeThread(threadArr[tokenRet - WAIT_OBJECT_0], &exitCode);
  528. if (exitCode == 0)
  529. {
  530. t_isGetTokenSuccess = true;
  531. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("total getToken success from url %s", reqArr[tokenRet - WAIT_OBJECT_0].m_url.c_str());
  532. Token_Save::channelId = channelId.c_str();
  533. Token_Save::token = reqArr[tokenRet - WAIT_OBJECT_0].ret.m_token;
  534. return std::make_pair(true, reqArr[tokenRet - WAIT_OBJECT_0].ret.m_token);
  535. }
  536. }
  537. LogWarn(Severity_Low, Error_Bug, GET_TOKEN_ERR, "total getToken failed");
  538. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("refreshToken").setLogCode("QLR0402Z10A00003")("total getToken failed");
  539. return std::make_pair(false, "");
  540. }
  541. std::pair<bool, VTMErrMsgCfgRet> GetVTMErrMsgCfgFromUrl(CSimpleString url, const std::string& terminalNo)
  542. {
  543. bool ret = false;
  544. VTMErrMsgCfgRet dst;
  545. std::string rightUrl;
  546. auto urlArr = generateUrlArr(url, "/api/unify/config/query/error");
  547. if (urlArr.GetCount() == 0)
  548. {
  549. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetTerminalCfgFromUrl::urlArr is null");
  550. return std::make_pair(false, dst);
  551. }
  552. static std::vector<VTMErrMsgCfgReq> reqArr;
  553. reqArr.clear(); //每次需清理,避免多次范文
  554. for (int i = 0; i < urlArr.GetCount(); i++)
  555. {
  556. auto curUrl = urlArr[i];
  557. if (curUrl.GetLength() == 0)
  558. {
  559. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetVTMErrMsgCfgFromUrl::urlArr may be wrong, pos:%d, %s", i, url.GetData());
  560. continue;
  561. }
  562. VTMErrMsgCfgReq req;
  563. req.m_url = curUrl;
  564. req.terminal_no = terminalNo;
  565. req.page_num = 1;//the first time ,get the first page of VTM err msg list.
  566. req.m_timeOut = QUERY_TERMINAL_MAX_WAIT_TIME;
  567. reqArr.push_back(req);
  568. }
  569. std::vector<HANDLE> threadArr;//创建多个线程访问
  570. for (int i = 0; i < reqArr.size(); i++)
  571. threadArr.push_back(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&getVTMErrMsgCfgInfoThread, &(reqArr[i]), 0, NULL));
  572. auto grayRet = WaitForMultipleObjects(threadArr.size(), threadArr.data(), false, QUERY_TERMINAL_MAX_WAIT_TIME);
  573. if (grayRet >= WAIT_OBJECT_0 && grayRet <= WAIT_OBJECT_0 + threadArr.size())
  574. {
  575. DWORD exitCode = INT_MAX;
  576. GetExitCodeThread(threadArr[grayRet - WAIT_OBJECT_0], &exitCode);
  577. if (exitCode == 0)
  578. {
  579. ret = true;
  580. dst = reqArr[grayRet - WAIT_OBJECT_0].ret;
  581. rightUrl = reqArr[grayRet - WAIT_OBJECT_0].m_url;
  582. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetVTMErrMsgCfgFromUrl success from url %s", reqArr[grayRet - WAIT_OBJECT_0].m_url.c_str());
  583. }
  584. }
  585. for (auto it = threadArr.begin(); it != threadArr.end(); it++)
  586. CloseHandle(*it);
  587. //after first time get page 2, then get the other pages
  588. for (int i = 2; i <= dst.page_total; i++)
  589. {
  590. VTMErrMsgCfgReq req;
  591. req.m_url = rightUrl;
  592. req.terminal_no = terminalNo;
  593. req.page_num = i;
  594. req.m_timeOut = QUERY_TERMINAL_MAX_WAIT_TIME;
  595. IHttpFunc* http_client = create_http(LogCallback);
  596. if (http_client != NULL) {
  597. ret = http_client->Post(req, req.ret);
  598. http_client->Destory();
  599. if (!ret)
  600. {
  601. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("getVTMErrMsgCfgInfoThread failed, url:%s, terminalNo:%s, page_num:%d",
  602. req.m_url.c_str(), req.terminal_no.c_str(), req.page_num);
  603. break;
  604. }
  605. dst.descriptionArr.insert(dst.descriptionArr.end(), req.ret.descriptionArr.begin(), req.ret.descriptionArr.end());
  606. dst.errorCodeArr.insert(dst.errorCodeArr.end(), req.ret.errorCodeArr.begin(), req.ret.errorCodeArr.end());
  607. dst.remarkArr.insert(dst.remarkArr.end(), req.ret.remarkArr.begin(), req.ret.remarkArr.end());
  608. }
  609. }
  610. return std::make_pair(ret, dst);
  611. }
  612. std::pair<bool, TerminalCfgRet> GetTerminalCfgFromUrl(CSimpleString url, const std::string& terminalNo,
  613. const std::string& center_version, const std::string& root_version, const std::string& shell_version,
  614. const std::map<std::string, std::map<std::string, std::string>>& tmp_centerConfig,
  615. const std::map<std::string, std::map<std::string, std::string>>& tmp_rootConfig,
  616. const std::map<std::string, std::map<std::string, std::string>>& tmd_shellConfig)
  617. {
  618. bool ret = false;
  619. TerminalCfgRet dst;
  620. auto urlArr = generateUrlArr(url, "/api/unify/config/query");
  621. if (urlArr.GetCount() == 0)
  622. {
  623. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetTerminalCfgFromUrl::urlArr is null");
  624. return std::make_pair(false, dst);
  625. }
  626. static std::vector<TerminalCfgReq> reqArr;
  627. reqArr.clear(); //每次需清理,避免多次范文
  628. for (int i = 0; i < urlArr.GetCount(); i++)
  629. {
  630. auto curUrl = urlArr[i];
  631. if (curUrl.GetLength() == 0)
  632. {
  633. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetTerminalCfgFromUrl::urlArr may be wrong, pos:%d, %s", i, url.GetData());
  634. continue;
  635. }
  636. TerminalCfgReq req;
  637. req.m_url = curUrl;
  638. req.terminalNo = terminalNo;
  639. req.center_version = center_version;
  640. req.root_version = root_version;
  641. req.shell_version = shell_version;
  642. req.center_config = tmp_centerConfig;
  643. req.root_config = tmp_rootConfig;
  644. req.shell_config = tmd_shellConfig;
  645. req.m_timeOut = QUERY_TERMINAL_MAX_WAIT_TIME;
  646. reqArr.emplace_back(req);
  647. }
  648. std::vector<HANDLE> threadArr;//创建多个线程访问
  649. for (int i = 0; i < reqArr.size(); i++)
  650. threadArr.push_back(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&getTerminalCfgInfoThread, &(reqArr[i]), 0, NULL));
  651. auto grayRet = WaitForMultipleObjects(threadArr.size(), threadArr.data(), false, QUERY_TERMINAL_MAX_WAIT_TIME);
  652. if (grayRet >= WAIT_OBJECT_0 && grayRet <= WAIT_OBJECT_0 + threadArr.size())
  653. {
  654. DWORD exitCode = INT_MAX;
  655. GetExitCodeThread(threadArr[grayRet - WAIT_OBJECT_0], &exitCode);
  656. if (exitCode == 0)
  657. {
  658. ret = true;
  659. dst = reqArr[grayRet - WAIT_OBJECT_0].ret;
  660. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetTerminalCfgFromUrl success from url %s, update:%d",
  661. reqArr[grayRet - WAIT_OBJECT_0].m_url.c_str(), dst.update);
  662. }
  663. }
  664. for(auto it = threadArr.begin(); it != threadArr.end(); it++)
  665. CloseHandle(*it);
  666. return std::make_pair(ret, dst);
  667. }
  668. DWORD uploadTerminalVersionThread(LPVOID param)
  669. {
  670. TerminalVerUpdateReq* req = (TerminalVerUpdateReq*)param;
  671. TerminalVerUpdateRet dst;
  672. IHttpFunc* http_client = create_http(LogCallback);
  673. if (http_client != NULL) {
  674. bool ret = http_client->Post(*req, dst);
  675. http_client->Destory();
  676. if (!ret)
  677. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uplaodTerminalVersionThread failed, url:%s, terminalNo:%s, rootVer:%s, centerVer:%s",
  678. req->m_url.c_str(), req->terminal_no.c_str(), req->root_config_version.c_str(), req->center_config_version.c_str());
  679. else
  680. return dst.m_result ? 0 : -1;
  681. }
  682. Sleep(QUERY_TERMINAL_MAX_WAIT_TIME);//触发timeout
  683. return -1;
  684. }
  685. bool UploadTerminalVersionFromUrl(CSimpleString url, std::string terminalNo, std::string center_config_version, std::string root_config_version,
  686. std::string shell_config_version)
  687. {
  688. bool ret = false;
  689. auto urlArr = generateUrlArr(url, "/api/unify/config/add/version");
  690. if (urlArr.GetCount() == 0)
  691. {
  692. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("UploadTerminalVersionFromUrl::urlArr is null");
  693. return false;
  694. }
  695. static std::vector<TerminalVerUpdateReq> reqArr;
  696. reqArr.clear(); //每次需清理,避免多次
  697. auto getTimeStr = []() -> std::string {
  698. std::time_t now = std::time(nullptr);
  699. std::tm local_time = *std::localtime(&now);
  700. // 将时间格式化为字符串
  701. std::ostringstream oss;
  702. oss << std::put_time(&local_time, "%Y-%m-%d %H:%M:%S");
  703. std::string local_time_str = oss.str();
  704. return local_time_str;
  705. };
  706. for (int i = 0; i < urlArr.GetCount(); i++)
  707. {
  708. auto curUrl = urlArr[i];
  709. if (curUrl.GetLength() == 0)
  710. {
  711. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("UploadTerminalVersionFromUrl::urlArr may be wrong, pos:%d, %s", i, url.GetData());
  712. continue;
  713. }
  714. TerminalVerUpdateReq req;
  715. req.m_url = curUrl;
  716. req.terminal_no = terminalNo;
  717. req.center_config_version = center_config_version;
  718. req.root_config_version = root_config_version;
  719. req.shell_config_version = shell_config_version;
  720. req.terminal_update_time = getTimeStr();
  721. reqArr.emplace_back(req);
  722. }
  723. std::vector<HANDLE> threadArr;//创建多个线程访问
  724. for (int i = 0; i < reqArr.size(); i++)
  725. threadArr.push_back(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&uploadTerminalVersionThread, &(reqArr[i]), 0, NULL));
  726. auto grayRet = WaitForMultipleObjects(threadArr.size(), threadArr.data(), false, QUERY_TERMINAL_MAX_WAIT_TIME);
  727. if (grayRet >= WAIT_OBJECT_0 && grayRet <= WAIT_OBJECT_0 + threadArr.size())
  728. {
  729. DWORD exitCode = INT_MAX;
  730. GetExitCodeThread(threadArr[grayRet - WAIT_OBJECT_0], &exitCode);
  731. if (exitCode == 0)
  732. {
  733. ret = true;
  734. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("UploadTerminalVersionFromUrl success from url %s", reqArr[grayRet - WAIT_OBJECT_0].m_url.c_str());
  735. }
  736. }
  737. for (auto it = threadArr.begin(); it != threadArr.end(); it++)
  738. CloseHandle(*it);
  739. return ret;
  740. }
  741. int ConvertStrToVTMErrMsg(std::string input, CAutoArray<CSimpleStringA>& strErrorCodeArr
  742. , CAutoArray<CSimpleStringA>& strDescriptionArr, CAutoArray<CSimpleStringA>& strRemarkArr)
  743. {
  744. // 解析为Json::Value
  745. Json::Reader reader;
  746. Json::Value jsonValue;
  747. bool success = reader.parse(input, jsonValue);
  748. if (!success)
  749. return Error_Param;
  750. if (!jsonValue[VTMERRMSG_CONFIG_CONFIG].isArray())
  751. return Error_NotSupport;
  752. const Json::Value &config = jsonValue[VTMERRMSG_CONFIG_CONFIG];
  753. std::vector<CSimpleString> errorCodeArr, descriptionArr, remarkArr;
  754. for (auto it = config.begin(); it != config.end(); it++)
  755. {
  756. CSimpleString errorCode = (*it)[VTMERRMSG_CONFIG_ERRORCODE].asString().c_str();
  757. CSimpleString description = (*it)[VTMERRMSG_CONFIG_DESCRIPETION].asString().c_str();
  758. CSimpleString remark = SP::Utility::ToLower((*it)[VTMERRMSG_CONFIG_REMARK].asString()).c_str();
  759. errorCodeArr.push_back(errorCode);
  760. descriptionArr.push_back(description);
  761. remarkArr.push_back(remark);
  762. }
  763. strErrorCodeArr.Init(errorCodeArr.size());
  764. strDescriptionArr.Init(errorCodeArr.size());
  765. strRemarkArr.Init(errorCodeArr.size());
  766. for (int i = 0; i < errorCodeArr.size(); i++)
  767. {
  768. strErrorCodeArr[i] = errorCodeArr[i];
  769. strDescriptionArr[i] = descriptionArr[i];
  770. strRemarkArr[i] = remarkArr[i];
  771. }
  772. return Error_Succeed;
  773. }
  774. std::pair<bool, std::string> ConvertStrToDeviceConfigMap(std::string input, std::map<std::string, std::map<std::string, std::string>>& m_deviceConfig)
  775. {
  776. // 解析为Json::Value
  777. Json::Reader reader;
  778. Json::Value jsonValue;
  779. bool success = reader.parse(input, jsonValue);
  780. if (!success)
  781. return std::make_pair(false,
  782. CSimpleStringA::Format("ConvertStrToDeviceConfig Failed to parse input: %s", reader.getFormattedErrorMessages().c_str()).GetData());
  783. // 转换为std::map
  784. m_deviceConfig.clear();
  785. Json::Value::Members outer_members = jsonValue.getMemberNames();
  786. for (Json::Value::Members::iterator outer_it = outer_members.begin(); outer_it != outer_members.end(); ++outer_it) {
  787. const std::string& outer_key = *outer_it;
  788. const Json::Value& inner_value = jsonValue[outer_key];
  789. std::map<std::string, std::string> inner_map;
  790. Json::Value::Members inner_members = inner_value.getMemberNames();
  791. for (Json::Value::Members::iterator inner_it = inner_members.begin(); inner_it != inner_members.end(); ++inner_it) {
  792. const std::string& inner_key = *inner_it;
  793. const std::string& inner_value = jsonValue[outer_key][inner_key].asString();
  794. inner_map.insert(std::make_pair(inner_key, inner_value));
  795. }
  796. m_deviceConfig.insert(std::make_pair(outer_key, inner_map));
  797. }
  798. // 输出结果
  799. return std::make_pair(true, "");
  800. }
  801. /*
  802. std::pair<bool, std::string> readTerminalNo_byHttpServer()
  803. {
  804. httplib::Server server;
  805. std::string terminalNo;
  806. server.Post("/set_terminal", (httplib::Server::Handler)[&](const httplib::Request& req, httplib::Response& res) {
  807. if (req.headers.find("Content-Type") != req.headers.end() &&
  808. req.headers.find("Content-Type")->second == "application/json") {
  809. // Parse JSON payload
  810. terminalNo = req.body.c_str();
  811. server.stop();
  812. return;
  813. }
  814. // Respond with an error if parsing or validation fails
  815. res.status = 400;
  816. res.set_content("Invalid JSON or missing terminalNo", "text/plain");
  817. });
  818. server.listen("0.0.0.0", 8080);
  819. return std::make_pair(true, terminalNo);
  820. }
  821. */