DataEngine.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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(const std::string topic, const std::string msg)
  46. {
  47. if(m_mpDevControler.find(topic) == m_mpDevControler.end())
  48. {
  49. return;
  50. }
  51. m_mpDevControler[topic]->OnSubData(topic,msg);
  52. }
  53. void loadConfig(std::string szFile,Config& config)
  54. {
  55. std::string cfg = loadContent(szFile);
  56. QJsonDocument jsonDoc(QJsonDocument::fromJson(cfg.c_str()));
  57. QJsonObject json = jsonDoc.object();
  58. QStringList keys = json.keys();
  59. if( keys.contains("serverid",Qt::CaseInsensitive))
  60. {
  61. config.serverId = json["serverid"].toString().toLocal8Bit().toStdString();
  62. }
  63. if( keys.contains("module",Qt::CaseInsensitive))
  64. {
  65. config.appName = json["module"].toString().toLocal8Bit().toStdString();
  66. }
  67. }
  68. void DataEngine::Startup()
  69. {
  70. // merge file name
  71. QString szWorkDir = qApp->applicationDirPath();
  72. if( szWorkDir.right(1).contains("/") == false && szWorkDir.right(1).contains("\\") == false)
  73. {
  74. szWorkDir += "/";
  75. }
  76. std::string szFile = szWorkDir.toLocal8Bit().toStdString() + "config/server.json";
  77. // load server config
  78. std::map<std::string,tagSetup> mpConfig;
  79. std::string cfg = loadContent(szFile);
  80. QJsonDocument jsonDoc(QJsonDocument::fromJson(cfg.c_str()));
  81. QJsonArray ja = jsonDoc.array();
  82. for(auto i : ja)
  83. {
  84. QJsonObject json = i.toObject();
  85. QStringList items = json.keys();
  86. if( items.contains("ignore",Qt::CaseInsensitive) && json["ignore"].type() == QJsonValue::Bool && json["ignore"].toBool())
  87. {
  88. continue;
  89. }
  90. tagSetup ts;
  91. ts.addr = json["addr"].toString().toLocal8Bit().toStdString();
  92. ts.user = json["user"].toString().toLocal8Bit().toStdString();
  93. ts.password = json["password"].toString().toLocal8Bit().toStdString();
  94. ts.db = json["database"].toString().toLocal8Bit().toStdString();
  95. ts.port = json["port"].toInt();
  96. std::string szName = json["name"].toString().toLocal8Bit().toStdString();
  97. mpConfig[szName] = ts;
  98. }
  99. m_pRedis = new RedisAgent();
  100. m_pRedis->Connect(mpConfig["redis"]); // redis
  101. m_pTDengine = new TDAgent();
  102. m_pTDengine->Connect(mpConfig["tdengine"]); // td
  103. m_pMqtt = new MQTTAgent();
  104. m_pMqtt->Connect(mpConfig["mqtt"]); // mqtt
  105. // server.id
  106. Config config;
  107. loadConfig(szWorkDir.toLocal8Bit().toStdString() + "config/alarm.json",config);
  108. DeviceManagerProxy dm(m_pRedis);
  109. std::list<DeviceInfo> lstDevices = dm.loadDevices(config.serverId, config.appName);
  110. std::list<DeviceInfo>::iterator itr;
  111. for( itr = lstDevices.begin();itr!= lstDevices.end();++itr)
  112. {
  113. DeviceInfo di = *itr;
  114. DeviceController* pControler = new DeviceController();
  115. pControler->regConsumer(this);
  116. pControler->CreateDevice(di);
  117. std::list<std::string> lstTopics;
  118. std::vector<Setting>::iterator itrT;
  119. for( itrT = di.ModuleInfo.vSettings.begin(); itrT != di.ModuleInfo.vSettings.end(); ++itrT )
  120. {
  121. std::string szTopic = "topic_" + itrT->Name;
  122. lstTopics.push_back(szTopic);
  123. m_mpDevControler[szTopic] = pControler;
  124. }
  125. m_pTDengine->Subscribe(lstTopics);
  126. qRegisterMetaType<std::string>("std::string");
  127. connect(m_pTDengine,SIGNAL(sigEvent(const std::string, const std::string)),this,SLOT(sltSubData(const std::string, const std::string)));
  128. }
  129. }