DataEngine.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. #include "DataEngine.h"
  2. #include "DeviceManagerProxy.h"
  3. #include <QJsonArray>
  4. #include <QJsonObject>
  5. #include <QJsonDocument>
  6. #include <fstream>
  7. #include <QtCore/QVariant>
  8. #include <QtCore/QDebug>
  9. #include <QtWidgets/QApplication>
  10. extern std::string loadContent(std::string szFilename);
  11. DataEngine::DataEngine()
  12. :QObject()
  13. {
  14. m_pRedis = nullptr;
  15. m_pTDengine = nullptr;
  16. m_mpDevControler.clear();
  17. }
  18. void DataEngine::OnData(std::string name,QVariant val)
  19. {
  20. // if( m_pRedis != nullptr )
  21. // {
  22. // m_pRedis->Publish(name, val);
  23. // }
  24. // else
  25. // {
  26. // qCritical() << __FILE__ << __LINE__ << " " << "no publisher.";
  27. // }
  28. if( m_pTDengine != nullptr )
  29. {
  30. // m_pTDengine->Publish(name, val);
  31. }
  32. else
  33. {
  34. qCritical() << __FILE__ << __LINE__ << " " << "no publisher.";
  35. }
  36. if( m_pMqtt != nullptr )
  37. {
  38. m_pMqtt->Publish(name, val);
  39. }
  40. else
  41. {
  42. qCritical() << __FILE__ << __LINE__ << " " << "no publisher.";
  43. }
  44. }
  45. void DataEngine::sltSubData_td(const std::string topic, const std::string msg)
  46. {
  47. if(m_mpDevControler.find(topic) == m_mpDevControler.end())
  48. {
  49. return;
  50. }
  51. std::list<DeviceController*>::iterator itr;
  52. for( itr = m_mpDevControler[topic].begin(); itr != m_mpDevControler[topic].end(); ++itr)
  53. {
  54. DeviceController* pControler = *itr;
  55. if( pControler != nullptr )
  56. {
  57. pControler->OnSubData(topic,msg);
  58. }
  59. }
  60. }
  61. void DataEngine::sltSubData_mqtt(const std::string topic, const std::string msg)
  62. {
  63. }
  64. void loadConfig(std::string szFile,Config& config)
  65. {
  66. std::string cfg = loadContent(szFile);
  67. QJsonDocument jsonDoc(QJsonDocument::fromJson(cfg.c_str()));
  68. QJsonObject json = jsonDoc.object();
  69. QStringList keys = json.keys();
  70. if( keys.contains("serverid",Qt::CaseInsensitive))
  71. {
  72. config.serverId = json["serverid"].toString().toLocal8Bit().toStdString();
  73. }
  74. if( keys.contains("module",Qt::CaseInsensitive))
  75. {
  76. config.appName = json["module"].toString().toLocal8Bit().toStdString();
  77. }
  78. }
  79. void DataEngine::startup_DataAlarm(DeviceInfo di)
  80. {
  81. if( di.ModuleInfo.vSettings.begin() == di.ModuleInfo.vSettings.end() )
  82. {
  83. return;
  84. }
  85. std::list<std::string> lstTopics;
  86. std::vector<Setting>::iterator itr;
  87. for( itr = di.ModuleInfo.vSettings.begin(); itr != di.ModuleInfo.vSettings.end(); ++itr )
  88. {
  89. std::string table = itr->Name;
  90. DeviceInfo ditem = di;
  91. ditem.ModuleInfo.vSettings.clear();
  92. ditem.ModuleInfo.vSettings.push_back(*itr);
  93. DeviceController* pControler = new DeviceController();
  94. pControler->regConsumer(this);
  95. pControler->CreateDevice(ditem);
  96. lstTopics.push_back(table);
  97. m_mpDevControler[table].push_back(pControler);
  98. }
  99. if( lstTopics.begin() != lstTopics.end())
  100. {
  101. m_pTDengine->Subscribe(lstTopics);
  102. }
  103. }
  104. void DataEngine::startup_CommAlarm(DeviceInfo di)
  105. {
  106. if( di.ModuleInfo.vSettings.begin() == di.ModuleInfo.vSettings.end() )
  107. {
  108. return;
  109. }
  110. DeviceController* pControler = new DeviceController();
  111. pControler->regConsumer(this);
  112. pControler->CreateDevice(di);
  113. std::list<std::string> lstTopics;
  114. std::vector<Setting>::iterator itr;
  115. for( itr = di.ModuleInfo.vSettings.begin(); itr != di.ModuleInfo.vSettings.end(); ++itr )
  116. {
  117. Setting oSet = *itr;
  118. QJsonDocument jsonDoc(QJsonDocument::fromJson(oSet.qValue.toString().toLocal8Bit()));
  119. QJsonArray json = jsonDoc.array();
  120. for(auto i : json)
  121. {
  122. std::string topic = i.toString().toLocal8Bit().toStdString();
  123. lstTopics.push_back(topic);
  124. m_mpDevControler[topic].push_back(pControler);
  125. }
  126. }
  127. if( lstTopics.begin() != lstTopics.end())
  128. {
  129. m_pTDengine->Subscribe(lstTopics);
  130. }
  131. }
  132. void DataEngine::startup_AlarmMgr(DeviceInfo di)
  133. {
  134. DeviceController* pControler = new DeviceController();
  135. pControler->regConsumer(this);
  136. pControler->CreateDevice(di);
  137. std::list<std::string> lstTopics;
  138. std::vector<Setting>::iterator itr;
  139. for( itr = di.ModuleInfo.vSettings.begin(); itr != di.ModuleInfo.vSettings.end(); ++itr )
  140. {
  141. Setting oSet = *itr;
  142. QJsonDocument jsonDoc(QJsonDocument::fromJson(oSet.qValue.toString().toLocal8Bit()));
  143. QJsonArray json = jsonDoc.array();
  144. for(auto i : json)
  145. {
  146. std::string topic = i.toString().toLocal8Bit().toStdString();
  147. lstTopics.push_back(topic);
  148. m_mpDevControler[topic].push_back(pControler);
  149. }
  150. }
  151. if( lstTopics.begin() != lstTopics.end())
  152. {
  153. m_pMqtt->Subscribe(lstTopics);
  154. }
  155. }
  156. void DataEngine::Startup()
  157. {
  158. // merge file name
  159. QString szWorkDir = qApp->applicationDirPath();
  160. if( szWorkDir.right(1).contains("/") == false && szWorkDir.right(1).contains("\\") == false)
  161. {
  162. szWorkDir += "/";
  163. }
  164. std::string szFile = szWorkDir.toLocal8Bit().toStdString() + "config/server.json";
  165. // load server config
  166. std::map<std::string,tagSetup> mpConfig;
  167. std::string cfg = loadContent(szFile);
  168. QJsonDocument jsonDoc(QJsonDocument::fromJson(cfg.c_str()));
  169. QJsonArray ja = jsonDoc.array();
  170. for(auto i : ja)
  171. {
  172. QJsonObject json = i.toObject();
  173. QStringList items = json.keys();
  174. if( items.contains("ignore",Qt::CaseInsensitive) && json["ignore"].type() == QJsonValue::Bool && json["ignore"].toBool())
  175. {
  176. continue;
  177. }
  178. tagSetup ts;
  179. ts.addr = json["addr"].toString().toLocal8Bit().toStdString();
  180. ts.user = json["user"].toString().toLocal8Bit().toStdString();
  181. ts.password = json["password"].toString().toLocal8Bit().toStdString();
  182. ts.db = json["database"].toString().toLocal8Bit().toStdString();
  183. ts.port = json["port"].toInt();
  184. std::string szName = json["name"].toString().toLocal8Bit().toStdString();
  185. mpConfig[szName] = ts;
  186. }
  187. m_pRedis = new RedisAgent();
  188. m_pRedis->Connect(mpConfig["redis"]); // redis
  189. m_pTDengine = new TDAgent();
  190. m_pTDengine->Connect(mpConfig["tdengine"]); // td
  191. qRegisterMetaType<std::string>("std::string");
  192. connect(m_pTDengine,SIGNAL(sigEvent(const std::string, const std::string)),this,SLOT(sltSubData_td(const std::string, const std::string)));
  193. m_pMqtt = new MQTTAgent();
  194. m_pMqtt->Connect(mpConfig["mqtt"]); // mqtt
  195. connect(m_pMqtt,SIGNAL(sigEvent(const std::string, const std::string)),this,SLOT(sltSubData_mqtt(const std::string, const std::string)));
  196. // server.id
  197. DeviceManagerProxy dm(m_pRedis);
  198. DeviceInfo da = dm.loadDataAlarm("alarmrule", "plugins/AlarmRecognition.dll");
  199. startup_DataAlarm(da);
  200. DeviceInfo ca = dm.loadCommAlarm("alarmruledevicestatus", "plugins/CommRecognition.dll");
  201. startup_CommAlarm(ca);
  202. /* 这里是想向mqtt订阅,在另外的模块里,实现对数据库操作
  203. std::list<std::string> lstTopics;
  204. DeviceInfo am = dm.loadAlarmMgr("alarmrule", "plugins/AlarmMgr.dll");
  205. std::list<DataItem>::iterator itr;
  206. for( itr = da.ModuleInfo.Properties.begin(); itr != da.ModuleInfo.Properties.end(); ++itr )
  207. {
  208. lstTopics.push_back(da.ModuleInfo.Code + "_" + itr->Code);
  209. }
  210. if( lstTopics.begin() != lstTopics.end())
  211. {
  212. m_pMqtt->Subscribe(lstTopics);
  213. }
  214. */
  215. }