maincontrol.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "maincontrol.h"
  2. #include "readmodulefromredis.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. std::string loadContent(std::string szFilename)
  11. {
  12. szFilename = QString::fromLocal8Bit(szFilename.c_str()).toLocal8Bit().toStdString();
  13. std::ifstream inStream(szFilename.c_str(),std::ios::in | std::ios::binary);
  14. if( inStream.is_open() != true )
  15. {
  16. return "";
  17. }
  18. return std::string((std::istreambuf_iterator<char>(inStream)),std::istreambuf_iterator<char>());
  19. }
  20. maincontrol::maincontrol() : QObject()
  21. {
  22. m_pRedis = nullptr;
  23. m_pTDengine = nullptr;
  24. m_mpItems.clear();
  25. }
  26. void maincontrol::OnData(std::string name,QVariant val)
  27. {
  28. // 传出来的设备命令需要发送给redis(module->oneitem->maincontrol)
  29. m_pRedis->hset("devicecommand",name.c_str(),val.toString());
  30. }
  31. void maincontrol::sltSubData(const std::string topic, const std::string msg)
  32. {
  33. // td过来的数据往模块里发, maincontrol->oneitem->module
  34. std::multimap<std::string,oneitem*>::iterator it = this->m_mpItems.find(topic);
  35. if(it != this->m_mpItems.end())
  36. {
  37. //找到了
  38. //输出multimap 中的同一键的多个值
  39. //方法一 通过比较key ,循环判断 推荐使用
  40. for(; it != this->m_mpItems.end(); it++)
  41. {
  42. if((*it).first == topic)
  43. {
  44. (*it).second->OnSubData(topic,msg);
  45. }
  46. else
  47. {
  48. break;
  49. }
  50. }
  51. }
  52. }
  53. void maincontrol::loadConfig(std::string szFile,std::map<QString,QString>& mps)
  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. foreach (QString item, keys)
  60. {
  61. mps[item] = json[item].toString();
  62. }
  63. }
  64. void maincontrol::Startup()
  65. {
  66. // merge file name
  67. QString szWorkDir = qApp->applicationDirPath();
  68. if( szWorkDir.right(1).contains("/") == false && szWorkDir.right(1).contains("\\") == false)
  69. {
  70. szWorkDir += "/";
  71. }
  72. std::string szFile = szWorkDir.toLocal8Bit().toStdString() + "config/server.json";
  73. // load server config
  74. std::map<std::string,tagSetup> mpConfig;
  75. std::string cfg = loadContent(szFile);
  76. QJsonDocument jsonDoc(QJsonDocument::fromJson(cfg.c_str()));
  77. QJsonArray ja = jsonDoc.array();
  78. for(auto i : ja)
  79. {
  80. QJsonObject json = i.toObject();
  81. QStringList items = json.keys();
  82. if( items.contains("ignore",Qt::CaseInsensitive) && json["ignore"].type() == QJsonValue::Bool && json["ignore"].toBool())
  83. {
  84. continue;
  85. }
  86. tagSetup ts;
  87. ts.addr = json["addr"].toString().toLocal8Bit().toStdString();
  88. ts.user = json["user"].toString().toLocal8Bit().toStdString();
  89. ts.password = json["password"].toString().toLocal8Bit().toStdString();
  90. ts.db = json["database"].toString().toLocal8Bit().toStdString();
  91. ts.port = json["port"].toInt();
  92. std::string szName = json["name"].toString().toLocal8Bit().toStdString();
  93. mpConfig[szName] = ts;
  94. }
  95. m_pRedis = new RedisAgent();
  96. m_pRedis->Connect(mpConfig["redis"]); // redis
  97. m_pTDengine = new TDAgent();
  98. m_pTDengine->Connect(mpConfig["tdengine"]); // td
  99. // server.id
  100. std::map<QString,QString> mps;
  101. this->loadConfig(szWorkDir.toLocal8Bit().toStdString() + "config/lpintelligentcontrol.json",mps);
  102. // 从redis里找到所有的智能控制实例(当前服务器管理的)
  103. readmodulefromredis instance(m_pRedis);
  104. std::list<ModuleInfo> modules = instance.loadModules(mps["serverid"]);
  105. std::list<ModuleInfo>::iterator itr;
  106. for( itr = modules.begin();itr!= modules.end();++itr)
  107. {
  108. ModuleInfo moduleInfo = *itr;
  109. oneitem *poneitem = new oneitem();
  110. poneitem->regConsumer(this);
  111. poneitem->createmodule(moduleInfo);
  112. m_pTDengine->Subscribe(moduleInfo.lstInputs);
  113. std::list<std::string>::iterator itrI;
  114. for( itrI = moduleInfo.lstInputs.begin(); itrI != moduleInfo.lstInputs.end(); ++itrI )
  115. {
  116. this->m_mpItems.insert(std::pair<std::string,oneitem*>((*itrI), poneitem));
  117. }
  118. }
  119. qRegisterMetaType<std::string>("std::string");
  120. connect(m_pTDengine,SIGNAL(sigEvent(const std::string, const std::string)),this,SLOT(sltSubData(const std::string, const std::string)));
  121. }