electdata171.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #include "electdata171.h"
  2. #include "wgelectricshm.h"
  3. extern WGDevList *wgdev;
  4. static QString digital171[16] = {
  5. "commState",
  6. "busLive",
  7. "highVoltageAlarm",
  8. "lowVoltageAlarm",
  9. "busLackPhase",
  10. "analog1Alarm",
  11. "analog2Alarm",
  12. "analog3Alarm",
  13. "analog4Alarm",
  14. "analog5Alarm",
  15. "digitalReserved1",
  16. "digitalReserved2",
  17. "digitalReserved3",
  18. "digitalReserved4",
  19. "digitalReserved5",
  20. "digitalReserved6"
  21. };
  22. static QString analogInfoTable171[20] = {
  23. "voltageA",
  24. "voltageB",
  25. "voltageC",
  26. "voltageAB",
  27. "voltageBC",
  28. "voltageCA",
  29. "frequency",
  30. "analog1",
  31. "analog2",
  32. "analog3",
  33. "analog4",
  34. "analog5",
  35. "voltageATHD",
  36. "voltageBTHD",
  37. "voltageCTHD",
  38. "voltageSagTimes",
  39. "voltageSwellTimes",
  40. "voltageInterruptionTimes",
  41. "voltageUnbalanceFactor",
  42. "analogReserved"
  43. };
  44. static QString digitalDesc171[16] = {
  45. "通信状态",
  46. "母线带电",
  47. "电压越上限",
  48. "电压越下限",
  49. "缺相",
  50. "直流量告警1",
  51. "直流量告警2",
  52. "直流量告警3",
  53. "直流量告警4",
  54. "直流量告警5",
  55. "预留1",
  56. "预留2",
  57. "预留3",
  58. "预留4",
  59. "预留5",
  60. "预留6"
  61. };
  62. Electdata171::Electdata171(QObject *parent) : QThread(parent)
  63. {
  64. keep = false;
  65. DevMsgList.clear();
  66. }
  67. void Electdata171::run()
  68. {
  69. keep = true;
  70. while(keep){
  71. if(DevMsgList.length()>0){
  72. DevData171 dev = DevMsgList.first();
  73. this->arraydataToJson(dev.topic,dev.message);
  74. DevMsgList.removeFirst();
  75. }
  76. usleep(10000);
  77. }
  78. }
  79. void Electdata171::stop()
  80. {
  81. keep = false;
  82. }
  83. void Electdata171::DevMessage(DevData171 dev)
  84. {
  85. DevMsgList.append(dev);
  86. }
  87. void Electdata171::arraydataToJson(QString topic,QByteArray data)
  88. {
  89. QByteArray devBData;
  90. QJsonDocument dev_doc;
  91. QJsonObject devdata;
  92. QJsonObject paradata;
  93. QJsonObject objdata;
  94. QString sql;
  95. int startpos=0,Idx = 0;
  96. QString deviceCode = (topic.split("/")).at(5);
  97. printf("deviceCode = %s\n",deviceCode.toUtf8().data());
  98. QString commData;
  99. for(int i=0;i<data.length();i++){
  100. commData.append(QString(" %1").arg(data.at(i)&0xff,2,16,QChar('0')));
  101. }
  102. QByteArray dat = data.mid(2,data.length()-4);
  103. QString column,valueData,setValue;
  104. quint16 crc = chk_sum(dat,static_cast<quint16>(dat.length()));
  105. if(((data.at(data.length()-1)&0xff)==((crc>>8)&0xff))&&((data.at(data.length()-2)&0xff)==(crc&0xff))){
  106. printf("crc enter\n");
  107. QDateTime starttime = QDateTime::currentDateTime();
  108. qint64 datetime = starttime.toMSecsSinceEpoch();
  109. devdata.insert("id",QString::number(datetime,10));
  110. devdata.insert("version","1.0");
  111. if((data.at(4)&0xff)==0x03){
  112. switch (data.at(5)&0xff) {
  113. case 0x01://遥信
  114. {
  115. devdata.insert("method","thing.event.property.post") ;
  116. for(int i=0;i<102400;i++){
  117. if(wgdev->devs[i].Enabled == 0x01){
  118. if(deviceCode.compare(wgdev->devs[i].deviceCode)==0){
  119. Idx = i;
  120. wgdev->devs[i].LastCommtime=starttime.toTime_t();
  121. break;
  122. }
  123. }
  124. }
  125. quint16 start = static_cast<quint16>(((data.at(11)&0x00ff)<<8)|(data.at(10)&0x00ff));
  126. quint16 num = static_cast<quint16>(((data.at(13)&0x00ff)<<8)|(data.at(12)&0x00ff));
  127. startpos = 14;
  128. for(int i=0;i<num;i++){
  129. paradata.insert(digital171[start+i],static_cast<quint8>(data.at(startpos)&0xff));
  130. column.append(digital171[start+i]).append(",");
  131. valueData.append(QString("%1").arg(static_cast<quint8>(data.at(startpos)&0xff))).append(",");
  132. setValue.append(digital171[start+i]).append("=").append(QString("%1").arg(static_cast<quint8>(data.at(startpos)&0xff))).append(",");
  133. wgdev->devs[Idx].alarm[start+i].digitalvalue = static_cast<quint8>(data.at(startpos)&0xff);
  134. startpos += 1;
  135. }
  136. sql.append(QString("insert into ht_switch_171_data(id,deviceName,%1dataTime)values(NULL,'%2',%3'%4');").arg(column).arg(deviceCode).arg(valueData).arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd HH:mm:ss")));
  137. emit appendSql(sql);
  138. sql.clear();
  139. column.clear();
  140. valueData.clear();
  141. sql.append(QString("update rt_switch_171_data set %1dataTime='%2' where deviceName = '%3';").arg(setValue).arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd HH:mm:ss")).arg(deviceCode));
  142. emit appendSql(sql);
  143. sql.clear();
  144. setValue.clear();
  145. }
  146. break;
  147. case 0x10://遥测
  148. {
  149. devdata.insert("method","thing.event.analog.post");
  150. quint16 count = static_cast<quint16>(((data.at(7)&0x00ff)<<8)|(data.at(6)&0x00ff));
  151. quint16 start = static_cast<quint16>(((data.at(9)&0x00ff)<<8)|(data.at(8)&0x00ff));
  152. qint64 timestamp = static_cast<qint64>(((static_cast<long int>(data.at(15)&0x00000000000000ff))<<40)|((static_cast<long int>(data.at(14)&0x00000000000000ff))<<32)|((static_cast<long int>(data.at(13)&0x00000000000000ff))<<24)|((static_cast<long int>(data.at(12)&0x00000000000000ff))<<16)|((static_cast<long int>(data.at(11)&0x00000000000000ff))<<8)|(static_cast<long int>(data.at(10)&0x00000000000000ff)));
  153. devdata.insert("id",QString::number(timestamp,10));
  154. startpos = 16;
  155. for(int i=0;i<count;i++){
  156. //4位十六进制转浮点数 BEGIN
  157. QString str;
  158. str.append(QString("%1%2%3%4").arg(data.at(startpos+3)&0xff,2,16,QChar('0')).arg(data.at(startpos+2)&0xff,2,16,QChar('0')).arg(data.at(startpos+1)&0xff,2,16,QChar('0')).arg(data.at(startpos)&0xff,2,16,QChar('0')));
  159. int hex = str.toUInt(0,16);
  160. float value = *(float*)&hex;
  161. //4位十六进制转浮点数 END
  162. objdata.insert("value",QJsonValue(value));
  163. objdata.insert("time",QJsonValue(timestamp));
  164. paradata.insert(analogInfoTable171[start+i],objdata);
  165. column.append(analogInfoTable171[start+i]).append(",");
  166. valueData.append(QString("%1").arg(value)).append(",");
  167. setValue.append(analogInfoTable171[start+i]).append("=").append(QString("%1").arg(value)).append(",");
  168. startpos += 4;
  169. }
  170. paradata.insert("freezingTime",QString::number(timestamp,10));
  171. QDateTime t = QDateTime::fromMSecsSinceEpoch(timestamp);
  172. sql.append(QString("insert into ht_analog_171_data(id,deviceName,%1freezingTime,dataTime) values (NULL,'%2',%3'%4','%5');").arg(column).arg(deviceCode).arg(valueData).arg(t.toString("yyyy-MM-dd")).arg(t.toString("yyyy-MM-dd HH:mm:ss")));
  173. emit appendSql(sql);
  174. sql.clear();
  175. column.clear();
  176. valueData.clear();
  177. sql.append(QString("update rt_analog_171_data set %1freezingTime='%2',dataTime='%3' where deviceName = '%4';").arg(setValue).arg(t.toString("yyyy-MM-dd")).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(deviceCode));
  178. emit appendSql(sql);
  179. sql.clear();
  180. setValue.clear();
  181. for(int i=0;i<102400;i++){
  182. if(wgdev->devs[i].Enabled == 0x01){
  183. if(deviceCode.compare(wgdev->devs[i].deviceCode)==0){
  184. wgdev->devs[i].LastCommtime=starttime.toTime_t();
  185. break;
  186. }
  187. }
  188. }
  189. }
  190. break;
  191. case 0x11:
  192. {
  193. devdata.insert("method","thing.event.SOERecord.post");
  194. qint16 digitalNo = static_cast<qint16>(((data.at(7)&0x00ff)<<8)|(data.at(6)&0x00ff));
  195. paradata.insert("measName",digital171[digitalNo]);
  196. qint8 digitalValue = static_cast<qint8>(data.at(8)&0xff);
  197. paradata.insert("digitalValue",QJsonValue(digitalValue));
  198. QString mDesc;
  199. qint64 timestamp = static_cast<qint64>((static_cast<long int>(data.at(14)&0x00000000000000ff)<<40)|(static_cast<long int>(data.at(13)&0x00000000000000ff)<<32)|(static_cast<long int>(data.at(12)&0x00000000000000ff)<<24)|(static_cast<long int>(data.at(11)&0x00000000000000ff)<<16)|(static_cast<long int>(data.at(10)&0x00000000000000ff)<<8)|static_cast<long int>(data.at(9)&0x00000000000000ff));
  200. if(digitalValue == 1){
  201. mDesc.append(digitalDesc171[digitalNo]).append("动作");
  202. paradata.insert("measDesc",mDesc);
  203. sql.append(QString("insert into alarm_power(id,device_code,alarm_name,sending_time,alarm_type,meas_name,digital_value,meas_desc,soe_time,handling_status) values (NULL,'%1','时间顺序记录','%2','alert','%3',%4,'%5','%6',0);").arg(deviceCode).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(digital171[digitalNo]).arg(digitalValue).arg(mDesc).arg((QDateTime::fromMSecsSinceEpoch(timestamp)).toString("yyyy-MM-dd HH:mm:ss")));
  204. emit appendAlarm(deviceCode,sql,(QDateTime::fromMSecsSinceEpoch(timestamp)).toString("yyyy-MM-dd HH:mm:ss"),mDesc,QString("%1").arg(digitalValue),digital171[digitalNo]);
  205. sql.clear();
  206. }else{
  207. mDesc.append(digitalDesc171[digitalNo]).append("复归");
  208. paradata.insert("measDesc",mDesc);
  209. sql.append(QString("insert into alarm_power(id,device_code,alarm_name,sending_time,alarm_type,meas_name,digital_value,meas_desc,soe_time,handling_status) values (NULL,'%1','时间顺序记录','%2','alert','%3',%4,'%5','%6',2);").arg(deviceCode).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(digital171[digitalNo]).arg(digitalValue).arg(mDesc).arg((QDateTime::fromMSecsSinceEpoch(timestamp)).toString("yyyy-MM-dd HH:mm:ss")));
  210. emit appendAlarm(deviceCode,sql,(QDateTime::fromMSecsSinceEpoch(timestamp)).toString("yyyy-MM-dd HH:mm:ss"),mDesc,QString("%1").arg(digitalValue),digital171[digitalNo]);
  211. sql.clear();
  212. sql.append(QString("update alarm_power set handling_time = '%1',handling_status = 3 where device_code = '%2' and meas_name = '%3' and digital_value = 1 and handling_status = 0;")
  213. .arg((QDateTime::fromMSecsSinceEpoch(timestamp)).toString("yyyy-MM-dd HH:mm:ss")).arg(deviceCode).arg(digital171[digitalNo]));
  214. emit appendAlarm(deviceCode,sql,(QDateTime::fromMSecsSinceEpoch(timestamp)).toString("yyyy-MM-dd HH:mm:ss"),mDesc,QString("%1").arg(digitalValue),digital171[digitalNo]);
  215. sql.clear();
  216. }
  217. paradata.insert("soeTime",QString::number(timestamp));
  218. }
  219. break;
  220. default:
  221. break;
  222. }
  223. devdata.insert("params",paradata);
  224. dev_doc.setObject(devdata);
  225. devBData=dev_doc.toJson(QJsonDocument::Compact);
  226. }
  227. }
  228. emit sendLog(topic,commData,devBData);
  229. }
  230. quint16 Electdata171::chk_sum(QByteArray buff,quint16 len)
  231. {
  232. quint16 crc = 0x0000;
  233. for(int i=0;i<len;i++){
  234. crc += static_cast<quint16>(buff.at(i)&0x00ff);
  235. }
  236. return crc;
  237. }