sp_httpDefine.cpp 32 KB

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