DeviceSimulator.h 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. #pragma once
  2. //用于定义实现一些模拟器通用的函数功能
  3. #include <iostream>
  4. #include <string>
  5. #include <cstdlib>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <fstream>
  9. #include <map>
  10. #include <limits.h>
  11. #include "DeviceBaseClass.h"
  12. #include "path.h"
  13. #include "json/json.h"
  14. #include "CommSimulatorRestful.hpp"
  15. #include "RestfulFunc.h"
  16. #ifdef _MSC_VER
  17. #include <windows.h>
  18. #include <WinSock2.h>
  19. #include <direct.h>
  20. #define FindLibName "cmblog4vendor.dll"
  21. #else
  22. #include <dlfcn.h>
  23. #include <arpa/inet.h> //ntohl
  24. #include <unistd.h> // Linux系统中
  25. #include <netdb.h>
  26. #include <net/if.h>
  27. #include <arpa/inet.h>
  28. #include <sys/ioctl.h>
  29. #include <sys/types.h>
  30. #include <sys/socket.h>
  31. #include <netinet/in.h>
  32. #endif
  33. #include <SpBase.h>
  34. using namespace std;
  35. #define DEFAULT_DATA_URL "http://emulator.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData"
  36. //获取模拟器库文件所在目录
  37. string GetCurrentDirectory() {
  38. #ifdef _MSC_VER
  39. HMODULE hModule = GetModuleHandle(FindLibName);
  40. char path[MAX_PATH];
  41. GetModuleFileName(hModule, path, MAX_PATH);
  42. string fullPath(path);
  43. size_t pos = fullPath.find_last_of("\\/");
  44. return fullPath.substr(0, pos);
  45. #else
  46. Dl_info dlInfo;
  47. dladdr((void*)GetCurrentDirectory, &dlInfo);
  48. char* path = realpath(dlInfo.dli_fname, NULL);
  49. string fullPath(path);
  50. free(path);
  51. size_t pos = fullPath.find_last_of("/");
  52. return fullPath.substr(0, pos);
  53. #endif
  54. }
  55. //读取配置文件功能类
  56. class iniReader
  57. {
  58. public:
  59. iniReader()
  60. {
  61. }
  62. ~iniReader()
  63. {
  64. }
  65. bool ReadConfig(const string& filename)
  66. {
  67. settings_.clear();
  68. ifstream infile(filename.c_str());//构造默认调用open,所以可以不调用open
  69. //ifstream infile;
  70. //infile.open(filename.c_str());
  71. //bool ret = infile.is_open()
  72. if (!infile) {
  73. return false;
  74. }
  75. string line, key, value, section;
  76. map<string, string> k_v;
  77. map<string, map<string, string> >::iterator it;
  78. while (getline(infile, line))
  79. {
  80. if (AnalyseLine(line, section, key, value))
  81. {
  82. it = settings_.find(section);
  83. if (it != settings_.end())
  84. {
  85. k_v[key] = value;
  86. it->second = k_v;
  87. }
  88. else
  89. {
  90. k_v.clear();
  91. settings_.insert(make_pair(section, k_v));
  92. }
  93. }
  94. key.clear();
  95. value.clear();
  96. }
  97. infile.close();
  98. return true;
  99. }
  100. string ReadString(const char* section, const char* item, const char* default_value)
  101. {
  102. string tmp_s(section);
  103. string tmp_i(item);
  104. string def(default_value);
  105. map<string, string> k_v;
  106. map<string, string>::iterator it_item;
  107. map<string, map<string, string> >::iterator it;
  108. it = settings_.find(tmp_s);
  109. if (it == settings_.end())
  110. {
  111. //printf("111");
  112. return def;
  113. }
  114. k_v = it->second;
  115. it_item = k_v.find(tmp_i);
  116. if (it_item == k_v.end())
  117. {
  118. //printf("222");
  119. return def;
  120. }
  121. return it_item->second;
  122. }
  123. int ReadInt(const char* section, const char* item, const int& default_value)
  124. {
  125. string tmp_s(section);
  126. string tmp_i(item);
  127. map<string, string> k_v;
  128. map<string, string>::iterator it_item;
  129. map<string, map<string, string> >::iterator it;
  130. it = settings_.find(tmp_s);
  131. if (it == settings_.end())
  132. {
  133. return default_value;
  134. }
  135. k_v = it->second;
  136. it_item = k_v.find(tmp_i);
  137. if (it_item == k_v.end())
  138. {
  139. return default_value;
  140. }
  141. return atoi(it_item->second.c_str());
  142. }
  143. float ReadFloat(const char* section, const char* item, const float& default_value)
  144. {
  145. string tmp_s(section);
  146. string tmp_i(item);
  147. map<string, string> k_v;
  148. map<string, string>::iterator it_item;
  149. map<string, map<string, string> >::iterator it;
  150. it = settings_.find(tmp_s);
  151. if (it == settings_.end())
  152. {
  153. return default_value;
  154. }
  155. k_v = it->second;
  156. it_item = k_v.find(tmp_i);
  157. if (it_item == k_v.end())
  158. {
  159. return default_value;
  160. }
  161. return atof(it_item->second.c_str());
  162. }
  163. private:
  164. bool IsSpace(char c)
  165. {
  166. if (' ' == c || '\t' == c)
  167. return true;
  168. return false;
  169. }
  170. bool IsCommentChar(char c)
  171. {
  172. switch (c)
  173. {
  174. case '#':
  175. return true;
  176. default:
  177. return false;
  178. }
  179. }
  180. void Trim(string& str)
  181. {
  182. if (str.empty())
  183. {
  184. return;
  185. }
  186. int i, start_pos, end_pos;
  187. for (i = 0; i < str.size(); ++i) {
  188. if (!IsSpace(str[i])) {
  189. break;
  190. }
  191. }
  192. if (i == str.size())
  193. {
  194. str = "";
  195. return;
  196. }
  197. start_pos = i;
  198. for (i = str.size() - 1; i >= 0; --i) {
  199. if (!IsSpace(str[i])) {
  200. break;
  201. }
  202. }
  203. end_pos = i;
  204. str = str.substr(start_pos, end_pos - start_pos + 1);
  205. }
  206. bool AnalyseLine(const string& line, string& section, string& key, string& value)
  207. {
  208. if (line.empty())
  209. return false;
  210. int start_pos = 0, end_pos = line.size() - 1, pos, s_startpos, s_endpos;
  211. if ((pos = line.find("#")) != -1)
  212. {
  213. if (0 == pos)
  214. {
  215. return false;
  216. }
  217. end_pos = pos - 1;
  218. }
  219. if (((s_startpos = line.find("[")) != -1) && ((s_endpos = line.find("]"))) != -1)
  220. {
  221. section = line.substr(s_startpos + 1, s_endpos - 1);
  222. return true;
  223. }
  224. string new_line = line.substr(start_pos, start_pos + 1 - end_pos);
  225. if ((pos = new_line.find('=')) == -1)
  226. return false;
  227. key = new_line.substr(0, pos);
  228. value = new_line.substr(pos + 1, end_pos + 1 - (pos + 1));
  229. Trim(key);
  230. if (key.empty()) {
  231. return false;
  232. }
  233. Trim(value);
  234. if ((pos = value.find("\r")) > 0)
  235. {
  236. value.replace(pos, 1, "");
  237. }
  238. if ((pos = value.find("\n")) > 0)
  239. {
  240. value.replace(pos, 1, "");
  241. }
  242. return true;
  243. }
  244. private:
  245. //map<string, string> settings_;
  246. map<string, map<string, string> >settings_;
  247. };
  248. //获取硬件模拟器数据服务地址
  249. string GetSimulatorUrl()
  250. {
  251. string depCfgPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "cmbsz.ini";
  252. iniReader iniRead;
  253. bool ret = iniRead.ReadConfig(depCfgPath);
  254. if (!ret)
  255. {
  256. return DEFAULT_DATA_URL;
  257. }
  258. string urlStr = iniRead.ReadString("server", "url", "");
  259. if (urlStr.length() <= 0)
  260. {
  261. urlStr = DEFAULT_DATA_URL;
  262. }
  263. return urlStr;
  264. }
  265. //读取本地IP功能函数
  266. string GetLocalIP()
  267. {
  268. #ifdef _MSC_VER
  269. hostent* ent = gethostbyname(NULL);
  270. if (ent && ent->h_addr_list[0] != NULL)
  271. {
  272. int i = 0;
  273. for (; ent->h_addr_list[i] != NULL; ++i)
  274. {
  275. struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
  276. if (in->S_un.S_un_b.s_b1 == 99 || in->S_un.S_un_b.s_b1 == 10)
  277. break;
  278. }
  279. if (ent->h_addr_list[i] == NULL)
  280. i = 0;
  281. auto in = (struct in_addr*)ent->h_addr_list[i];
  282. char xIP[64] = {};
  283. sprintf(xIP, "%d.%d.%d.%d", in->S_un.S_un_b.s_b1, in->S_un.S_un_b.s_b2, in->S_un.S_un_b.s_b3, in->S_un.S_un_b.s_b4);
  284. //LOG4VTM(INFO, ("ip:%s", xIP));
  285. return string(xIP);
  286. }
  287. return "";
  288. #else
  289. string re = "";
  290. int sfd, intr;
  291. struct ifreq buf[16];
  292. struct ifconf ifc;
  293. sfd = socket(AF_INET, SOCK_DGRAM, 0);
  294. if (sfd < 0)
  295. return "wrong 1: get ip socket failed";
  296. ifc.ifc_len = sizeof(buf);
  297. ifc.ifc_buf = (caddr_t)buf;
  298. if (ioctl(sfd, SIOCGIFCONF, (char*)&ifc))
  299. return "wrong 2: get ip ioctl failed";
  300. intr = ifc.ifc_len / sizeof(struct ifreq);
  301. while (intr-- > 0 && ioctl(sfd, SIOCGIFADDR, (char*)&buf[intr]));
  302. close(sfd);
  303. unsigned long ip = ntohl(((struct sockaddr_in*)(&buf[intr].ifr_addr))->sin_addr.s_addr);
  304. char* str = new char[1024];
  305. sprintf(str, "%u.%u.%u.%u", ip >> 24 & 0xFF, ip >> 16 & 0xFF, ip >> 8 & 0xFF, ip >> 0 & 0xFF);
  306. re = str;
  307. return re;
  308. #endif
  309. }
  310. ///////////////以下为模拟器通用http访问实现////////////////////
  311. typedef struct SimulatorCommonReq
  312. {
  313. string ip;
  314. string entityName;
  315. string adapterInterName;
  316. JSONCONVERT2OBJECT_MEMEBER_REGISTER(ip, entityName, adapterInterName)
  317. }SimulatorCommonReq;
  318. typedef struct SimulatorDevCategoryAns
  319. {
  320. int errNum;
  321. string szType; //device type sth like "CMB.Printer.HP1234"
  322. string szModel; //device model
  323. string szVendor; //device vendor
  324. int eState; //device status
  325. struct DevSoftVersion
  326. {
  327. int wMajor; //release major version
  328. int wMinor; //release minor version
  329. int wRevision; //bug repair version with the major and minor version remains the same
  330. int wBuild; //compile version
  331. JSONCONVERT2OBJECT_MEMEBER_REGISTER(wMajor, wMinor, wRevision, wBuild)
  332. }version; //software version
  333. JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, szType, szModel, szVendor, eState, version)
  334. }SimulatorDevCategoryAns;
  335. typedef struct SimulatorDevErrInfoAns
  336. {
  337. int errNum;
  338. int dwErrMsgLen;
  339. string szErrMsg;
  340. JSONCONVERT2OBJECT_MEMEBER_REGISTER(errNum, dwErrMsgLen, szErrMsg)
  341. }SimulatorDevErrInfoAns;
  342. ErrorCodeEnum SimulatorHttpFunction(string entityName, string devFuncName)
  343. {
  344. ErrorCodeEnum err = Error_NotImpl;
  345. SimulatorCommonReq simulatorCommonReq;
  346. simulatorCommonReq.ip = GetLocalIP();
  347. simulatorCommonReq.entityName = entityName;
  348. simulatorCommonReq.adapterInterName = devFuncName;
  349. HttpClientResponseResult result;
  350. HttpClientRequestConfig config(HttpRequestMethod::POST, GetSimulatorUrl().c_str(), NULL);
  351. SP::Simulator::Restful::FulfillRequestJsonBody(&config, simulatorCommonReq);
  352. RestfulClient client = RestfulClient::getInstance();
  353. config.PreDo();
  354. client.Do(&config, &result, NULL);
  355. if (result.ResponseOK()) {
  356. SP::Simulator::Restful::CommSimulatorRes commRes;
  357. SP::Simulator::Restful::GetStatusFromDebranchResponse(result.content, commRes);
  358. err = (ErrorCodeEnum)commRes.errNum;
  359. }
  360. else {
  361. err = Error_NetBroken;
  362. }
  363. return err;
  364. }
  365. template <typename T>
  366. ErrorCodeEnum SimulatorHttpFunction(string entityName, string devFuncName, T& obj)
  367. {
  368. ErrorCodeEnum err = Error_NotImpl;
  369. SimulatorCommonReq simulatorCommonReq;
  370. simulatorCommonReq.ip = GetLocalIP();
  371. simulatorCommonReq.entityName = entityName;
  372. simulatorCommonReq.adapterInterName = devFuncName;
  373. HttpClientResponseResult result;
  374. HttpClientRequestConfig config(HttpRequestMethod::POST, GetSimulatorUrl().c_str(), NULL);
  375. SP::Simulator::Restful::FulfillRequestJsonBody(&config, simulatorCommonReq);
  376. RestfulClient client = RestfulClient::getInstance();
  377. config.PreDo();
  378. client.Do(&config, &result, NULL);
  379. if (result.ResponseOK()) {
  380. SP::Simulator::Restful::CommSimulatorRes commRes;
  381. SP::Simulator::Restful::GetStatusFromDebranchResponse(result.content, commRes);
  382. err = (ErrorCodeEnum)commRes.errNum;
  383. if (err == Error_Succeed)
  384. {
  385. bool res = SP::Simulator::Restful::ExtractDataFromDebranchResponse(result.content, obj);
  386. //DEBUG
  387. if (!res)
  388. {
  389. err = Error_Bug;
  390. }
  391. }
  392. }
  393. else {
  394. err = Error_NetBroken;
  395. }
  396. return err;
  397. }