maincontrol.cpp 4.5 KB

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