porcesscore.cpp 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. #include "porcesscore.h"
  2. #include "../ytUserInfoProcess/userinfo.h"
  3. #include "../DataPrecessDog/dataprecess.h"
  4. #include "rtu.h"
  5. #define UN_REFERENCED_PARAMETER(x) {(x) = (x);}
  6. PorcessCore::PorcessCore(QObject *parent) : QObject(parent)
  7. {
  8. mqttIdx = 1;
  9. mqttinfoIdx =1;
  10. statusIdx = 1;
  11. alarmData = "";
  12. statusStr = "";
  13. timer = new QTimer(this);
  14. logThread = new LogThread(this);
  15. dbThread = new DatabaseThread(this);
  16. logThread->start();
  17. for(quint16 i=0;i<16;i++){
  18. wxThreads[1][i] = new WechartThreads(this,i,"47.98.201.73","/ytapi/admin/order/longhudata");
  19. wxThreads[0][i] = new WechartThreads(this,i,"47.98.201.73","/jdxf/wxapp2.php/Home/GeneralPush/voice_alarm");
  20. connect(wxThreads[1][i],&WechartThreads::wxchart,this,&PorcessCore::wxchart);
  21. connect(wxThreads[0][i],&WechartThreads::wxchart,this,&PorcessCore::wxchart);
  22. repThread[i] = new ttsThreads(this,i,"127.0.0.1","/report",55335);
  23. connect(repThread[i],&ttsThreads::ttslog,this,&PorcessCore::repLog);
  24. wssThread[i] = new ttsThreads(this,i,"47.98.201.73","/report",55125);
  25. connect(wssThread[i],&ttsThreads::ttslog,this,&PorcessCore::repLog);
  26. wxThreads[1][i]->start();
  27. wxThreads[0][i]->start();
  28. repThread[i]->start();
  29. wssThread[i]->start();
  30. }
  31. wxcur = 0;
  32. repcur = 0;
  33. connect(timer, &QTimer::timeout, this, &PorcessCore::timeout);
  34. connect(dbThread, &DatabaseThread::AlarmReport, this, &PorcessCore::AlarmReport);
  35. connect(dbThread,&DatabaseThread::TableReport,this,&PorcessCore::TableReport);
  36. connect(dbThread, &DatabaseThread::SqlLog, this, &PorcessCore::SqlLog);
  37. connect(dbThread, &DatabaseThread::MqttInfo, this, &PorcessCore::MqttConnect);
  38. dbThread->start();
  39. rCore = new RtuCore(this);
  40. connect(rCore,&RtuCore::ecommdata,this,&PorcessCore::commdata);
  41. connect(rCore,&RtuCore::CommData,this,&PorcessCore::CommData);
  42. connect(rCore,&RtuCore::egetOnLine,this,&PorcessCore::getOnLine);
  43. connect(rCore,&RtuCore::egetIOValue,this,&PorcessCore::getIOValue);
  44. connect(rCore,&RtuCore::egetIoReport,this,&PorcessCore::getIoReport);
  45. connect(rCore,&RtuCore::egetAnalogValue,this,&PorcessCore::getAnalogValue);
  46. connect(rCore,&RtuCore::egetAnalogReport,this,&PorcessCore::getAnalogReport);
  47. connect(rCore,&RtuCore::egetWarnReport,this,&PorcessCore::getWarnReport);
  48. connect(rCore,&RtuCore::ertuInfo,this,&PorcessCore::rtuInfo);
  49. wssServer = new WssServer(this);
  50. wssServer->start();
  51. timer->start(1000);
  52. netAccessManager = new QNetworkAccessManager(this);
  53. connect(netAccessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(finishedSlot(QNetworkReply*)));
  54. }
  55. PorcessCore::~PorcessCore()
  56. {
  57. dbThread->stop();
  58. logThread->stop();
  59. }
  60. void PorcessCore::start()
  61. {
  62. rCore->start();
  63. }
  64. void PorcessCore::finishedSlot(QNetworkReply *reply)
  65. {
  66. QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
  67. if(status_code==200){
  68. if(reply->error()==QNetworkReply::NoError){
  69. QString bak_info = QString::fromUtf8(reply->readAll());
  70. wxchart(2,QDateTime::currentDateTime(),bak_info,false);
  71. }else{
  72. wxchart(2,QDateTime::currentDateTime(),"error",false);
  73. }
  74. }else{
  75. wxchart(2,QDateTime::currentDateTime(),"fail",false);
  76. }
  77. reply->abort();
  78. reply->deleteLater();
  79. }
  80. void PorcessCore::timeout()
  81. {
  82. uint t = QDateTime::currentDateTime().toTime_t();
  83. dataProcessShm->processStatus[13].upTime[0].Enabled = 0x01;
  84. dataProcessShm->processStatus[13].upTime[0].t_time = t;
  85. for(int i=0;i<10240;i++){
  86. if(rtuList->rtus[i].Enabled==0x01){
  87. if((t-rtuList->rtus[i].LastCommtime)>86400){
  88. rtuList->rtus[i].LastCommtime = QDateTime::currentDateTime().toTime_t();
  89. if(rtuList->rtus[i].Online_Flag!=0x00){
  90. rtuList->rtus[i].Online_Flag = 0x00;
  91. if((m_client->connectionState()==QMQTT::STATE_DISCONNECTED)||(m_client->connectionState()==QMQTT::STATE_INIT)){
  92. m_client->connectToHost();
  93. }
  94. if(m_client->connectionState()==QMQTT::STATE_CONNECTED){
  95. alarmData.append(QString("{\"devId\":\"%1\",\"connType\":\"G\",\"deviceName\":\"%2\",\"alarams\":[{\"dp\":[{\"property\":\"离线\",\"serial\":\"\",\"value\":\"\",\"status\":\"0\",\"type\":\"44\"}],\"deviceName\":\"%3\",\"timeStamp\":\"%4\",\"deviceModel\":\"\",\"deviceType\":\"%5\",\"devId\":\"%6\"}],\"type\":\"ALARM\",\"timeStamp\":\"%7\"}")
  96. .arg(rtuList->rtus[i].Device_Code).arg(QString(rtuList->rtus[i].Device_Name)).arg(QString(rtuList->rtus[i].Device_Name)).arg(QDateTime::currentDateTime().toTime_t()).arg(rtuList->rtus[i].Device_Type).arg(rtuList->rtus[i].Device_Code).arg(QDateTime::currentDateTime().toTime_t()));
  97. QString topic = QString("/usky/ytDP0006/%1/%2/alarm").arg(rtuList->rtus[i].Company_Code).arg(rtuList->rtus[i].Device_Code);
  98. m_client->publish(QMQTT::Message(mqttIdx++,topic,alarmData.toUtf8()));
  99. alarmData.clear();
  100. if(mqttIdx>9999)
  101. mqttIdx = 1;
  102. }
  103. dbThread->appendSql(QString("update sp_devices_status set devicestatus=%1, true_status=%1, statustime='%2' where deviceid='%3'")
  104. .arg(75).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(rtuList->rtus[i].Device_Code));
  105. dbThread->appendSql(QString("insert into sp_rtu2017 (id, device_code, time, status, data2, data4) values (NULL, '%1', '%2', 44, '%3', '%4')")
  106. .arg(QString::fromUtf8(rtuList->rtus[i].Device_Code)).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"))
  107. .arg(QString::fromUtf8("离线")).arg(QString::fromUtf8(rtuList->rtus[i].Device_Name)));
  108. //dbThread->appendSql(QString("insert into sp_d%1 (id, device_code, time, status, data2, data4) values (NULL, '%1', '%2', 44, '%3', '%4')")
  109. // .arg(QString::fromUtf8(rtuList->rtus[i].Device_Code)).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"))
  110. // .arg(QString::fromUtf8("离线")).arg(QString::fromUtf8(rtuList->rtus[i].Device_Name)));
  111. QString sql = QString("insert into sp_d%1 (id, device_code, time, status, data2, data4) values (NULL, '%1', '%2', 44, '%3', '%4')")
  112. .arg(QString::fromUtf8(rtuList->rtus[i].Device_Code)).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"))
  113. .arg(QString::fromUtf8("离线")).arg(QString::fromUtf8(rtuList->rtus[i].Device_Name));
  114. dbThread->appendTable(ApTable(QString::fromUtf8(rtuList->rtus[i].Device_Code),sql,QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"),"44","","","","",QString("%1 %2").arg(QString::fromUtf8("离线")).arg(QString::fromUtf8(rtuList->rtus[i].Device_Name))));
  115. }
  116. if((m_client->connectionState()==QMQTT::STATE_DISCONNECTED)||(m_client->connectionState()==QMQTT::STATE_INIT)){
  117. m_client->connectToHost();
  118. }
  119. if(m_client->connectionState()==QMQTT::STATE_CONNECTED){
  120. statusStr.append(QString("{\"devId\":\"%1\",\"devicestatus\":75,\"type\":\"STATUS\",\"timestamp\":\"%2\"}").arg(rtuList->rtus[i].Device_Code).arg(QDateTime::currentDateTime().toTime_t()));
  121. QString topic1 = QString("/usky/ytDP0006/%1/%2/status").arg(rtuList->rtus[i].Company_Code).arg(rtuList->rtus[i].Device_Code);
  122. m_client->publish(QMQTT::Message(statusIdx++,topic1,statusStr.toUtf8()));
  123. statusStr.clear();
  124. if(statusIdx>9999)
  125. statusIdx = 1;
  126. }
  127. }
  128. }
  129. }
  130. }
  131. void PorcessCore::rtuInfo(QString infoTopic,QString infoData)
  132. {
  133. if((m_client->connectionState()==QMQTT::STATE_DISCONNECTED)||(m_client->connectionState()==QMQTT::STATE_INIT)){
  134. m_client->connectToHost();
  135. }
  136. if(m_client->connectionState()==QMQTT::STATE_CONNECTED){
  137. m_client->publish(QMQTT::Message(mqttinfoIdx++,infoTopic,infoData.toUtf8()));
  138. if(mqttinfoIdx>9999)
  139. mqttinfoIdx = 1;
  140. }
  141. }
  142. void PorcessCore::MqttConnect(QString ip,QString port,QString name,QString passwd)
  143. {
  144. printf("mqtt init\n");
  145. printf("ip = %s, port = %s, name = %s, passwd = %s\n",ip.toUtf8().data(),port.toUtf8().data(),name.toUtf8().data(),passwd.toUtf8().data());
  146. m_client = new QMQTT::Client(QHostAddress(ip), static_cast<quint16>(port.toInt()), this);
  147. m_client->setUsername(name);
  148. m_client->setPassword(passwd.toLatin1());
  149. connect(m_client,&QMQTT::Client::connected,this,&PorcessCore::mqconnected);
  150. m_client->connectToHost();
  151. }
  152. void PorcessCore::mqconnected()
  153. {
  154. printf("mqtt connected\n");
  155. }
  156. void PorcessCore::getAnalogReport(int devIdx, int port, QByteArray data, float value, bool flag, QDateTime t)
  157. {
  158. QString Dat = "";
  159. for(int i=0;i<data.length();i++)
  160. Dat.append(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0')).toUpper());
  161. QString alarmName = "";
  162. switch (rtuList->rtus[devIdx].Port[port].PortType) {
  163. case 0x01:
  164. if(value>static_cast<float>(rtuList->rtus[devIdx].Port[port].PortMax)||value<static_cast<float>(rtuList->rtus[devIdx].Port[port].PortMin)){
  165. alarmName = QString::fromUtf8("设备异常");
  166. }else{
  167. if(flag)
  168. alarmName = QString::fromUtf8("高压");
  169. else
  170. alarmName = QString::fromUtf8("低压");
  171. }
  172. break;
  173. case 0x02:
  174. if(value>static_cast<float>(rtuList->rtus[devIdx].Port[port].PortMax)||value<static_cast<float>(rtuList->rtus[devIdx].Port[port].PortMin)){
  175. alarmName = QString::fromUtf8("设备异常");
  176. }else{
  177. if(flag)
  178. alarmName = QString::fromUtf8("高水位");
  179. else
  180. alarmName = QString::fromUtf8("低水位");
  181. }
  182. break;
  183. case 0x03:
  184. if(value>static_cast<float>(rtuList->rtus[devIdx].Port[port].PortMax)||value<static_cast<float>(rtuList->rtus[devIdx].Port[port].PortMin)){
  185. alarmName = QString::fromUtf8("设备异常");
  186. }else{
  187. if(flag)
  188. alarmName = QString::fromUtf8("高温");
  189. else
  190. alarmName = QString::fromUtf8("低温");
  191. }
  192. break;
  193. case 0x04:
  194. if(value>static_cast<float>(rtuList->rtus[devIdx].Port[port].PortMax)||value<static_cast<float>(rtuList->rtus[devIdx].Port[port].PortMin)){
  195. alarmName = QString::fromUtf8("设备异常");
  196. }else{
  197. if(flag)
  198. alarmName = QString::fromUtf8("高湿度");
  199. else
  200. alarmName = QString::fromUtf8("低湿度");
  201. }
  202. break;
  203. }
  204. QString portname = QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName);
  205. QString pnumber =QString("%1").arg(port&0x0f,2,16,QChar('0'));
  206. dbThread->appendAlarm(AlarmRep(QString(rtuList->rtus[devIdx].Device_Code),
  207. QString("insert into sp_rtu2017 (id, port, device_code, time, status, address, ncmd, data1, data2, data3, data4) values (NULL, 'E6', '%1', '%2', '01', '%3', '%4', %5, '%6', '', '%7' )")
  208. .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(Dat).arg(port&0x0f,2,10,QChar('0')).arg(QString::number(static_cast<double>(value),10,2)).arg(alarmName).arg(portname),
  209. QString("%1 %2").arg(portname).arg(alarmName),t.toString("yyyy-MM-dd HH:mm:ss"),"E6",pnumber));
  210. //dbThread->appendSql(QString("insert into sp_d%1 (id, device_code, port, time, address, ncmd, data1, data2, data3, data4, status) values (NULL, '%1', 'E6', '%2', '%3', '%4', %5, '%6', '%7', '%8', '01')")
  211. // .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(Dat).arg(port&0x0f,2,10,QChar('0')).arg(QString::number(static_cast<double>(value),10,2)).arg(alarmName).arg("").arg(portname));
  212. QString sql = QString("insert into sp_d%1 (id, device_code, port, time, address, ncmd, data1, data2, data3, data4, status) values (NULL, '%1', 'E6', '%2', '%3', '%4', %5, '%6', '%7', '%8', '01')")
  213. .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(Dat).arg(port&0x0f,2,10,QChar('0')).arg(QString::number(static_cast<double>(value),10,2)).arg(alarmName).arg("").arg(portname);
  214. // dbThread->appendSql(QString("update sp_owner_status set point_data=%1, data_time='%2', content='%3' where device_id='%4' and point_code=%5")
  215. // .arg(QString::number(static_cast<double>(value),10,2)).arg(t.toString("yyyy-MM-dd HH:mm:ss"))
  216. // .arg(QString::fromUtf8("%1 %2").arg(alarmName).arg(portname)).arg(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code)).arg(port));
  217. dbThread->appendTable(ApTable(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code),sql,t.toString("yyyy-MM-dd HH:mm:ss"),"01","E6",QString("%1").arg(port&0x0f,2,10,QChar('0')),portname,QString::number(static_cast<double>(value),10,2),QString("%1 %2").arg(alarmName).arg(portname)));
  218. QString point;
  219. switch (port&0x0f) {
  220. case 1:point="665";break;
  221. case 2:point="666";break;
  222. case 3:point="667";break;
  223. case 4:point="668";break;
  224. case 5:point="669";break;
  225. case 6:point="670";break;
  226. case 7:point="671";break;
  227. case 8:point="672";break;
  228. default:break;
  229. }
  230. if((m_client->connectionState()==QMQTT::STATE_DISCONNECTED)||(m_client->connectionState()==QMQTT::STATE_INIT)){
  231. m_client->connectToHost();
  232. }
  233. if(m_client->connectionState()==QMQTT::STATE_CONNECTED){
  234. alarmData.append(QString("{\"devId\":\"%1\",\"connType\":\"G\",\"deviceName\":\"%2\",\"alarams\":[{\"dp\":[{\"property\":\"%3\",\"serial\":\"%4\",\"value\":\"%5\",\"status\":\"0\",\"type\":\"01\",\"port\":\"E6\",\"stuname\":\"%6\"}],\"deviceName\":\"%7\",\"timeStamp\":\"%8\",\"deviceModel\":\"\",\"deviceType\":\"%9\",\"devId\":\"%10\"}],\"type\":\"ALARM\",\"timeStamp\":\"%11\"}").arg(rtuList->rtus[devIdx].Device_Code).arg(QString(rtuList->rtus[devIdx].Device_Name)).arg(portname).arg(point).arg(QString::number(static_cast<double>(value),10,2)).arg(alarmName).arg(QString(rtuList->rtus[devIdx].Device_Name)).arg(QDateTime::currentDateTime().toTime_t()).arg(rtuList->rtus[devIdx].Device_Type).arg(rtuList->rtus[devIdx].Device_Code).arg(QDateTime::currentDateTime().toTime_t()));
  235. QString topic = QString("/usky/ytDP0006/%1/%2/alarm").arg(rtuList->rtus[devIdx].Company_Code).arg(rtuList->rtus[devIdx].Device_Code);
  236. m_client->publish(QMQTT::Message(mqttIdx++,topic,alarmData.toUtf8()));
  237. alarmData.clear();
  238. if(mqttIdx>9999)
  239. mqttIdx = 1;
  240. }
  241. }
  242. void PorcessCore::getAnalogValue(int devIdx, int port, QByteArray data, float value, QDateTime t)
  243. {
  244. if(rtuList->rtus[devIdx].Enabled!=0x01)
  245. return;
  246. QString Dat = "";
  247. for(int i=0;i<data.length();i++)
  248. Dat.append(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0')).toUpper());
  249. //dbThread->appendSql(QString("insert into sp_d%1 (id, device_code, port, time, address, ncmd, data1, data2, data3, data4, status) values (NULL, '%1', 'E6', '%2', '%3', '%4', %5, '%6', '%7', '%8', '00')")
  250. //.arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(Dat).arg(port&0x0f,2,10,QChar('0')).arg(QString::number(static_cast<double>(value),10,2)).arg(QString::fromUtf8("正常")).arg("").arg(rtuList->rtus[devIdx].Port[port].PortName));
  251. // dbThread->appendSql(QString("update sp_owner_status set point_data=%1, data_time='%2' where device_id='%3' and point_code=%4")
  252. // .arg(QString::number(static_cast<double>(value),10,2)).arg(t.toString("yyyy-MM-dd HH:mm:ss"))
  253. // .arg(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code)).arg(port));
  254. QString sql = QString("insert into sp_d%1 (id, device_code, port, time, address, ncmd, data1, data2, data3, data4, status) values (NULL, '%1', 'E6', '%2', '%3', '%4', %5, '%6', '%7', '%8', '00')")
  255. .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(Dat).arg(port&0x0f,2,10,QChar('0')).arg(QString::number(static_cast<double>(value),10,2)).arg(QString::fromUtf8("正常")).arg("").arg(rtuList->rtus[devIdx].Port[port].PortName);
  256. dbThread->appendTable(ApTable(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code),sql,t.toString("yyyy-MM-dd HH:mm:ss"),"00","E6",QString("%1").arg(port&0x0f,2,10,QChar('0')),QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName),QString::number(static_cast<double>(value),10,2),QString("%1 %2").arg(QString::fromUtf8("正常")).arg(rtuList->rtus[devIdx].Port[port].PortName)));
  257. if(QString::compare(QString(rtuList->rtus[devIdx].Company_Code),"10318")==0){
  258. QByteArray post_data;
  259. //设置发送的数据
  260. post_data.append(QString("device_code=%1&").arg(QString(rtuList->rtus[devIdx].Device_Code)));
  261. post_data.append(QString("device_value=%1&").arg(QString::number(static_cast<double>(value),10,2)));
  262. post_data.append(QString("port=%1&").arg(port));
  263. post_data.append(QString("port_name=%1&").arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName)));
  264. post_data.append(QString("user_from=%1&").arg("xingYueHuiRtuWater"));
  265. QNetworkRequest *req = new QNetworkRequest();
  266. req->setUrl(QUrl("http://iot.usky.cn/ytapi/admin/order/longhudata"));
  267. req->setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
  268. req->setHeader(QNetworkRequest::ContentLengthHeader, post_data.length());
  269. QNetworkReply *reply = netAccessManager->post(*req,post_data);
  270. // QString data = QString("device_code=%1&device_value=%2&port=%3&port_name=%4&user_from=xingYueHuiRtuWater").arg(QString(rtuList->rtus[devIdx].Device_Code)).arg(QString::number(static_cast<double>(value),10,2)).arg(port).arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName))
  271. // .replace(",","%2C").replace(":","%3A").replace(" ","+");
  272. // wxThreads[1][wxcur&0x0f]->appendData(data);//龙湖定时数据推送
  273. // wxcur++;
  274. // wxcur &= 0x0f;
  275. }
  276. }
  277. void PorcessCore::getWarnReport(int devIdx, int port, QString type, QByteArray data, QDateTime t)
  278. {
  279. if(rtuList->rtus[devIdx].Enabled!=0x01)
  280. return;
  281. QString Dat = "";
  282. for(int i=0;i<data.length();i++)
  283. Dat.append(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0')).toUpper());
  284. QString portname = QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName);
  285. dbThread->appendAlarm(AlarmRep(QString(rtuList->rtus[devIdx].Device_Code),
  286. QString("insert into sp_rtu2017 (id, device_code, port, time, status, address, ncmd, data2, data4) values (NULL, '%1', 'E9', '%2', '%3', '%4', '%5', '%6', '%7')")
  287. .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg("33").arg(Dat).arg(port&0x0f,2,10,QChar('0'))
  288. .arg(type)
  289. .arg(portname),QString("%1 %2").arg(portname).arg(type),t.toString("yyyy-MM-dd HH:mm:ss")));
  290. dbThread->appendSql(QString("insert into sp_d%1 (id, device_code, port, time, status, address, ncmd, data2, data4) values (NULL, '%1', 'E9', '%2', '%3', '%4', '%5', '%6', '%7')")
  291. .arg(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code)).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg("33").arg(Dat).arg(port&0x0f,2,10,QChar('0'))
  292. .arg(type)
  293. .arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName)));
  294. }
  295. void PorcessCore::getIoReport(int devIdx, int port, QByteArray data, int value, QDateTime t)
  296. {
  297. if(rtuList->rtus[devIdx].Enabled!=0x01)
  298. return;
  299. QString Dat = "";
  300. for(int i=0;i<data.length();i++)
  301. Dat.append(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0')).toUpper());
  302. QString d4 = QString::fromUtf8(value==1?rtuList->rtus[devIdx].Port[port].NameOfIOon:rtuList->rtus[devIdx].Port[port].NameOfIOOff);
  303. // if(d4.length()==0){
  304. // d4 = (value==1)?QString::fromUtf8("接线"):QString::fromUtf8("拆线");
  305. // }
  306. //屏蔽未配置的端口报告信息,2020-10-19,姚强
  307. if(d4.length()>0){
  308. QString pnumber =QString("%1").arg(port&0x0f,2,16,QChar('0'));
  309. QString portname = QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName);
  310. dbThread->appendAlarm(AlarmRep(QString(rtuList->rtus[devIdx].Device_Code),
  311. QString("insert into sp_rtu2017 (id, device_code, port, time, status, address, ncmd, data2, data4) values (NULL, '%1', 'E3', '%2', '%3', '%4', '%5', '%6', '%7')")
  312. .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(value==0?"00":"01").arg(Dat).arg(port,2,10,QChar('0'))
  313. .arg(d4)
  314. .arg(portname),QString("%1 %2").arg(portname).arg(d4),t.toString("yyyy-MM-dd HH:mm:ss"),"E3",pnumber));
  315. // dbThread->appendSql(QString("insert into sp_d%1 (id, device_code, port, time, status, address, ncmd, data2, data4) values (NULL, '%1', 'E3', '%2', '%3', '%4', '%5', '%6', '%7')")
  316. // .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(value==0?"00":"01").arg(Dat).arg(port,2,10,QChar('0'))
  317. // .arg(d4)
  318. // .arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName)));
  319. QString sql = QString("insert into sp_d%1 (id, device_code, port, time, status, address, ncmd, data2, data4) values (NULL, '%1', 'E3', '%2', '%3', '%4', '%5', '%6', '%7')")
  320. .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(value==0?"00":"01").arg(Dat).arg(port,2,10,QChar('0'))
  321. .arg(d4)
  322. .arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName));
  323. // dbThread->appendSql(QString("update sp_owner_status set point_data='%1', data_time='%2', content='%3' where device_id='%4' and point_code=%5")
  324. // .arg(value==0?"00":"01").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(QString("%1 %2").arg(d4).arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName)))
  325. // .arg(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code)).arg(port));
  326. if(rtuList->rtus[devIdx].Port[port].OffSet > 0){
  327. dbThread->appendTable(ApTable(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code),sql,t.toString("yyyy-MM-dd HH:mm:ss"),value==0?"1":"0","E3",QString("%1").arg(port,2,10,QChar('0')),portname,"",QString("%1 %2").arg(d4).arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName))));
  328. }else{
  329. dbThread->appendTable(ApTable(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code),sql,t.toString("yyyy-MM-dd HH:mm:ss"),value==0?"0":"1","E3",QString("%1").arg(port,2,10,QChar('0')),portname,"",QString("%1 %2").arg(d4).arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName))));
  330. }
  331. QString point;
  332. switch (port&0x0f) {
  333. case 1:point="665";break;
  334. case 2:point="666";break;
  335. case 3:point="667";break;
  336. case 4:point="668";break;
  337. case 5:point="669";break;
  338. case 6:point="670";break;
  339. case 7:point="671";break;
  340. case 8:point="672";break;
  341. default:break;
  342. }
  343. if((m_client->connectionState()==QMQTT::STATE_DISCONNECTED)||(m_client->connectionState()==QMQTT::STATE_INIT)){
  344. m_client->connectToHost();
  345. }
  346. if(m_client->connectionState()==QMQTT::STATE_CONNECTED){
  347. alarmData.append(QString("{\"devId\":\"%1\",\"connType\":\"G\",\"deviceName\":\"%2\",\"alarams\":[{\"dp\":[{\"property\":\"%3\",\"serial\":\"%4\",\"value\":\"%5\",\"status\":\"0\",\"type\":\"%6\",\"port\":\"E3\",\"stuname\":\"%7\"}],\"deviceName\":\"%8\",\"timeStamp\":\"%9\",\"deviceModel\":\"\",\"deviceType\":\"%10\",\"devId\":\"%11\"}],\"type\":\"ALARM\",\"timeStamp\":\"%12\"}").arg(rtuList->rtus[devIdx].Device_Code).arg(QString(rtuList->rtus[devIdx].Device_Name)).arg(portname).arg(point).arg(value==0?"00":"01").arg(value==0?"00":"01").arg(d4).arg(QString(rtuList->rtus[devIdx].Device_Name)).arg(QDateTime::currentDateTime().toTime_t()).arg(rtuList->rtus[devIdx].Device_Type).arg(rtuList->rtus[devIdx].Device_Code).arg(QDateTime::currentDateTime().toTime_t()));
  348. QString topic = QString("/usky/ytDP0006/%1/%2/alarm").arg(rtuList->rtus[devIdx].Company_Code).arg(rtuList->rtus[devIdx].Device_Code);
  349. m_client->publish(QMQTT::Message(mqttIdx++,topic,alarmData.toUtf8()));
  350. alarmData.clear();
  351. if(mqttIdx>9999)
  352. mqttIdx = 1;
  353. }
  354. }
  355. }
  356. void PorcessCore::getIOValue(int devIdx, int port, QByteArray data, int value, QDateTime t)
  357. {
  358. if(rtuList->rtus[devIdx].Enabled!=0x01)
  359. return;
  360. QString Dat = "";
  361. for(int i=0;i<data.length();i++)
  362. Dat.append(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0')).toUpper());
  363. // dbThread->appendSql(QString("insert into sp_d%1 (id, device_code, port, time, status, address, ncmd, data2, data4) values (NULL, '%1', 'E3', '%2', '%3', '%4', '%5', '%6', '%7')")
  364. // .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(value==0?"00":"01").arg(Dat).arg(port,2,10,QChar('0'))
  365. // .arg(QString::fromUtf8(value==1?rtuList->rtus[devIdx].Port[port].NameOfIOon:rtuList->rtus[devIdx].Port[port].NameOfIOOff))
  366. // .arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName)));
  367. QString sql = QString("insert into sp_d%1 (id, device_code, port, time, status, address, ncmd, data2, data4) values (NULL, '%1', 'E3', '%2', '%3', '%4', '%5', '%6', '%7')")
  368. .arg(rtuList->rtus[devIdx].Device_Code).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(value==0?"00":"01").arg(Dat).arg(port,2,10,QChar('0'))
  369. .arg(QString::fromUtf8(value==1?rtuList->rtus[devIdx].Port[port].NameOfIOon:rtuList->rtus[devIdx].Port[port].NameOfIOOff))
  370. .arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName));
  371. if(rtuList->rtus[devIdx].Port[port].OffSet > 0){
  372. dbThread->appendTable(ApTable(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code),sql,t.toString("yyyy-MM-dd HH:mm:ss"),value==0?"1":"0","E3",QString("%1").arg(port,2,10,QChar('0')),QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName),"",QString("%1 %2").arg(QString::fromUtf8(value==1?rtuList->rtus[devIdx].Port[port].NameOfIOon:rtuList->rtus[devIdx].Port[port].NameOfIOOff)).arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName))));
  373. }else{
  374. dbThread->appendTable(ApTable(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code),sql,t.toString("yyyy-MM-dd HH:mm:ss"),value==0?"0":"1","E3",QString("%1").arg(port,2,10,QChar('0')),QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName),"",QString("%1 %2").arg(QString::fromUtf8(value==1?rtuList->rtus[devIdx].Port[port].NameOfIOon:rtuList->rtus[devIdx].Port[port].NameOfIOOff)).arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName))));
  375. }
  376. // dbThread->appendSql(QString("update sp_owner_status set point_data='%1', data_time='%2', content='%3' where device_id='%4' and point_code=%5")
  377. // .arg(value==0?"00":"01").arg(t.toString("yyyy-MM-dd HH:mm:ss"))
  378. // .arg(QString::fromUtf8("%1 %2").arg(value==1?rtuList->rtus[devIdx].Port[port].NameOfIOon:rtuList->rtus[devIdx].Port[port].NameOfIOOff).arg(QString::fromUtf8(rtuList->rtus[devIdx].Port[port].PortName)))
  379. // .arg(QString::fromUtf8(rtuList->rtus[devIdx].Device_Code)).arg(port));
  380. }
  381. void PorcessCore::TableReport(QString deviceid,quint64 insertid,QString time,QString status,QString port,QString ncmd,QString pname,QString data1,QString content)
  382. {
  383. if(status.compare("44")==0){
  384. dbThread->appendSql(QString("insert into sp_owner_sync_data (id, native_id, device_id, point_code, point_data, data_time, content) values (NULL,%1,'%2','%3','%4','%5','%6')")
  385. .arg(insertid).arg(deviceid).arg(0).arg(1).arg(time).arg(content));
  386. dbThread->appendSql(QString::fromUtf8("update sp_owner_status set point_data='%1', data_time='%2', content='%3', point_name='通信报警',dwtype=%4 where device_id='%5' and point_code='%6';")
  387. .arg(0).arg(time).arg(content).arg(6).arg(deviceid).arg(0));
  388. }else{
  389. if(port.length()>0){
  390. if(port.compare("E3")==0){
  391. // int tmpIdx = ncmd.toInt(nullptr,16);
  392. int tmpIdx = ncmd.toInt();
  393. if(tmpIdx>0){
  394. dbThread->appendSql(QString("insert into sp_owner_sync_data (id, native_id, device_id, point_code, point_data, data_time, content) values (NULL,%1,'%2','%3','%4','%5','%6')")
  395. .arg(insertid).arg(deviceid).arg(tmpIdx).arg(status).arg(time).arg(content));
  396. dbThread->appendSql(QString::fromUtf8("update sp_owner_status set point_data='%1', data_time='%2', content='%3', point_name='%4',dwtype=%5 where device_id='%6' and point_code='%7';")
  397. .arg(status).arg(time)
  398. .arg(content).arg(pname)
  399. .arg(6).arg(deviceid).arg(tmpIdx));
  400. }
  401. }else if(port.compare("E6")==0){
  402. int tempIdx = ncmd.toInt();
  403. dbThread->appendSql(QString("insert into sp_owner_sync_data (id, native_id, device_id, point_code, point_data, data_time, content) values (NULL,%1,'%2','%3','%4','%5','%6')")
  404. .arg(insertid).arg(deviceid).arg(tempIdx+64).arg(data1)
  405. .arg(time)
  406. .arg(content));
  407. if(tempIdx > 0){
  408. dbThread->appendSql(QString::fromUtf8("update sp_owner_status set point_data='%1', data_time='%2', content='%3',dwtype=%4 where device_id='%5' and point_code='%6';")
  409. .arg(data1)
  410. .arg(time)
  411. .arg(content)
  412. .arg(6)
  413. .arg(deviceid)
  414. .arg(tempIdx+64));
  415. }
  416. }
  417. }
  418. }
  419. }
  420. void PorcessCore::CommData(QString DevicID,int dir,QString data)
  421. {
  422. logThread->appendData(data.toUpper());
  423. wssServer->subReport(DevicID,dir,false,false,data);
  424. }
  425. void PorcessCore::commdata(QString data)
  426. {
  427. logThread->appendData(data.toUpper());
  428. }
  429. void PorcessCore::getOnLine(int devIdx, bool sta)
  430. {
  431. if(rtuList->rtus[devIdx].Enabled!=0x01)
  432. return;
  433. if(sta){
  434. rtuList->rtus[devIdx].LastCommtime = QDateTime::currentDateTime().toTime_t();
  435. if(rtuList->rtus[devIdx].Online_Flag!=0x01){
  436. rtuList->rtus[devIdx].Online_Flag = 0x01;
  437. dbThread->appendSql(QString("update sp_devices_status set devicestatus=%1, true_status=%1, statustime='%2', lastcommtime='%2' where deviceid='%3'")
  438. .arg(0).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(rtuList->rtus[devIdx].Device_Code));
  439. }
  440. if((m_client->connectionState()==QMQTT::STATE_DISCONNECTED)||(m_client->connectionState()==QMQTT::STATE_INIT)){
  441. m_client->connectToHost();
  442. }
  443. if(m_client->connectionState()==QMQTT::STATE_CONNECTED){
  444. statusStr.append(QString("{\"devId\":\"%1\",\"devicestatus\":0,\"type\":\"STATUS\",\"timestamp\":\"%2\"}").arg(rtuList->rtus[devIdx].Device_Code).arg(QDateTime::currentDateTime().toTime_t()));
  445. QString topic1 = QString("/usky/ytDP0006/%1/%2/status").arg(rtuList->rtus[devIdx].Company_Code).arg(rtuList->rtus[devIdx].Device_Code);
  446. m_client->publish(QMQTT::Message(statusIdx++,topic1,statusStr.toUtf8()));
  447. statusStr.clear();
  448. if(statusIdx>9999)
  449. statusIdx = 1;
  450. }
  451. }
  452. }
  453. void PorcessCore::repLog(quint16 idx, QDateTime t, QString data, bool dirflag)
  454. {
  455. UN_REFERENCED_PARAMETER(idx);
  456. logThread->appendData(QString("[ %1 47.98.201.73 (rep) %2 ] %3")
  457. .arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz"))
  458. .arg(dirflag?">>>":"<<<")
  459. .arg(data.replace('\n',"\\n").replace('\r',"\\r")));
  460. }
  461. void PorcessCore::wxchart(quint16 idx, QDateTime t, QString data, bool dirflag)
  462. {
  463. UN_REFERENCED_PARAMETER(idx);
  464. logThread->appendData(QString("[ %1 47.98.201.73 (wx) %2 ] %3")
  465. .arg(t.toString("yyyy-MM-dd HH:mm:ss.zzz"))
  466. .arg(dirflag?">>>":"<<<")
  467. .arg(data.replace('\n',"\\n").replace('\r',"\\r")));
  468. }
  469. void PorcessCore::AlarmReport(QString addr, quint64 insertid, QString type, QString time, QString ptype, QString pnumber)
  470. {
  471. // UN_REFERENCED_PARAMETER(insertid);
  472. UN_REFERENCED_PARAMETER(time);
  473. QString phonelist = "";
  474. QString companyCode = "";
  475. for(int i=0;i<10240;i++){
  476. if(QString::compare(QString(rtuList->rtus[i].Device_Code),addr)==0){
  477. companyCode = QString(rtuList->rtus[i].Company_Code);
  478. break;
  479. }
  480. }
  481. QString rep = QString("{\"SubType\":6,\"DeviceId\":\"%1\",\"InsertId\":%2,\"Confirmed\":false}").arg(addr).arg(insertid);
  482. QString rep2 = QString("{\"SubType\":6,\"DeviceId\":\"%1\",\"InsertId\":%2,\"Confirmed\":0,\"CompanyCode\":\"%3\",\"evt_name\":\"%4\",\"evt\":0,\"alarm_time\":\"%5\"}")
  483. .arg(addr).arg(insertid).arg(companyCode).arg(type).arg(time);
  484. repThread[repcur]->appendData(rep);
  485. wssThread[repcur++]->appendData(rep2);
  486. repcur &= 0x0f;
  487. QString phone;
  488. if(companyCode.length()>0){
  489. for(int i=0;i<102400;i++){
  490. if(companyCode.compare(QString(sysConfShm->userInfo[i].CompanyCode))==0){
  491. phone = QString(sysConfShm->userInfo[i].CellPhone);
  492. if(phone.trimmed().length()>0){
  493. if(phonelist.length()==0)
  494. phonelist = phone;
  495. else
  496. phonelist.append(","+phone);
  497. }
  498. }
  499. }
  500. if(phonelist.length()>0){
  501. for(int i=0;i<10240;i++){
  502. if(QString::compare(QString(rtuList->rtus[i].Device_Code),addr)==0){
  503. if(QString::compare(QString(rtuList->rtus[i].Device_Type),"1")==0){
  504. QString data1 = QString("device_code=%1&evt_name=%2&time=%3&phone=%4&insert_id=%5").arg(addr).arg(type).arg(time).arg(phonelist).arg(insertid)
  505. .replace(",","%2C").replace(":","%3A").replace(" ","+");
  506. wxThreads[0][wxcur&0x0f]->appendData(data1);
  507. break;
  508. }
  509. }
  510. }
  511. QString unique_number = QString("%1%2%3").arg(addr).arg(ptype).arg(pnumber);
  512. QString data = QString("id=%1&types=%2&insert_id=%3&phone=%4&time=%5&unique_number=%6&api_type=%7").arg(addr).arg(type).arg(insertid).arg("15122423833").arg(time).arg(unique_number).arg("rtu_form");
  513. QByteArray post_data;
  514. //设置发送的数据
  515. post_data.append(QString("id=%1&").arg(addr));
  516. post_data.append(QString("types=%1&").arg(type));
  517. post_data.append(QString("insert_id=%1&").arg(insertid));
  518. post_data.append(QString("phone=%1&").arg("15122423833"));
  519. post_data.append(QString("time=%1&").arg(time));
  520. post_data.append(QString("unique_number=%1&").arg(unique_number));
  521. post_data.append(QString("api_type=%1").arg("rtu_form"));
  522. QNetworkRequest *req = new QNetworkRequest();
  523. req->setUrl(QUrl("http://iot.usky.cn/jdxf/wxapp2.php/Home/Rtuwarn/message_sendalarm"));
  524. req->setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
  525. req->setHeader(QNetworkRequest::ContentLengthHeader, post_data.length());
  526. QNetworkReply *reply = netAccessManager->post(*req,post_data);
  527. wxchart(1,QDateTime::currentDateTime(),data,true);
  528. // wxThreads[1][wxcur&0x0f]->appendData(data);
  529. wxcur++;
  530. wxcur &= 0x0f;
  531. }
  532. }
  533. }
  534. void PorcessCore::SqlLog(QString log)
  535. {
  536. logThread->appendData(log);
  537. // printf("%s\n",log.toUtf8().data());
  538. }