waterServer4.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "waterserver4.h"
  2. #include <string.h>
  3. #include "../ytUserInfoProcess/userinfo.h"
  4. #include "../DataPrecessDog/dataprecess.h"
  5. //#include "water.h"
  6. #define UN_REFERENCED_PARAMETER(x) {(x) = (x);}
  7. WaterServer4::WaterServer4(QObject *parent) :
  8. QObject(parent)
  9. {
  10. timer = new QTimer(this);
  11. connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
  12. svr = new QTcpServer(this);
  13. connect(svr, SIGNAL(newConnection()),this,SLOT(new_incomming()));
  14. }
  15. void WaterServer4::start(){
  16. if(!svr->listen(QHostAddress::Any,55222)){
  17. printf("55222 listen failed\n");
  18. exit(-1);
  19. }
  20. timer->start(1000);
  21. }
  22. void WaterServer4::timeout()
  23. {
  24. uint t = QDateTime::currentDateTime().toTime_t();
  25. // dataProcessShm->processStatus[14].upTime[0].Enabled = 0x01;
  26. // dataProcessShm->processStatus[14].upTime[0].t_time = t;
  27. }
  28. void WaterServer4::new_incomming(){
  29. QTcpSocket *so = svr->nextPendingConnection();
  30. connect(so,SIGNAL(readyRead()),this,SLOT(read_data()));
  31. }
  32. quint8 WaterServer4::hexstr_to_byte(QString dat)
  33. {
  34. quint8 tmp[2];
  35. QByteArray Dat = dat.toLower().toLatin1();
  36. quint8 temp;
  37. temp = Dat.at(0)&0xff;
  38. if((temp>=0x30)&&(temp<=0x39))
  39. tmp[0] = temp-0x30;
  40. else
  41. tmp[0] = temp-0x37;
  42. temp = Dat.at(1)&0xff;
  43. if((temp>=0x30)&&(temp<=0x39))
  44. tmp[1] = temp-0x30;
  45. else
  46. tmp[1] = temp-0x37;
  47. return static_cast<quint8>(((tmp[0]&0x0f)<<4)|(tmp[1]&0x0f));
  48. }
  49. void WaterServer4::check_framedata(QString data, QString etime, QString ip)
  50. {
  51. UN_REFERENCED_PARAMETER(etime);
  52. if((data.length()%2)==0){
  53. int len = data.length()/2;
  54. QByteArray Dat = QByteArray(len,0x00);
  55. for(int i=0;i<len;i++)
  56. Dat[i] = static_cast<char>(hexstr_to_byte(data.mid(i*2,2))&0xff);
  57. if(((Dat[0]&0xff)==0x7e)&&((Dat[len-1]&0xff)==0x7e)&&((Dat[1]&0xff)==0x01)&&((Dat[10]&0xff)==0x01)){
  58. QDateTime stime = QDateTime::fromTime_t(static_cast<uint>(((Dat[2]&0x000000ff)<<24)|((Dat[3]&0x000000ff)<<16)|((Dat[4]&0x000000ff)<<8)|(Dat[5]&0x000000ff)));
  59. quint16 bodyLen = static_cast<quint16>(((Dat[8]&0x00ff)<<8)|(Dat[9]&0x00ff));
  60. if(len==(bodyLen+15)){
  61. int cur = 0;
  62. QByteArray Body = Dat.mid(12,bodyLen);
  63. quint64 device_id=0;
  64. double wsignal=0;
  65. quint8 vbattery=0;
  66. quint16 vsmoke=0;
  67. quint8 alarm=0;
  68. qint8 temp=0;
  69. while(cur<(bodyLen-1)){
  70. quint8 type = Body.at(cur)&0xff;
  71. int dLen = static_cast<int>(Body.at(cur+1)&0xff);
  72. if(bodyLen>=(cur+2+dLen)){
  73. if((type==0x03)||(type==0x16))
  74. return;
  75. if((type==0x65)&&(dLen==0x08)){
  76. for(int i=0;i<8;i++){
  77. device_id =device_id*100+ ((Body.at(cur+2+i)>>4)&0x0f)*10+(Body.at(cur+2+i)&0x0f);
  78. }
  79. }else if((type==0x6c)&&(dLen==0x02)){
  80. wsignal = (static_cast<qint16>(((Body.at(cur+2)&0x00ff)<<8)|(Body.at(cur+3)&0x00ff)))*0.1;
  81. }else if((type==0x24)&&(dLen==0x01)){
  82. vbattery = Body.at(cur+2)&0xff;
  83. }else if((type==0x0b)&&(dLen==0x01)){
  84. temp = static_cast<qint8>(Body.at(cur+2)&0xff);
  85. }else if((type==0x14)&&(dLen==0x02)){
  86. vsmoke = static_cast<quint16>(((Body.at(cur+2)&0x00ff)<<8)|(Body.at(cur+3)&0x00ff));
  87. }else if((type==0x01)&&(dLen==0x01)&&((Body.at(cur+2)&0xff)==0x01)){
  88. alarm = 0x01;
  89. }else if((type==0x19)&&(dLen==0x01)&&((Body.at(cur+2)&0xff)==0x01)){
  90. alarm =0x01;
  91. }
  92. }else
  93. return;
  94. cur += dLen+2;
  95. }
  96. }
  97. }
  98. }
  99. }
  100. void WaterServer4::check_smokedata(QString data, QString ip){
  101. QJsonParseError json_error;
  102. QString jEventTime="",jPayload="";
  103. QJsonDocument jsonDoc(QJsonDocument::fromJson(data.toUtf8(),&json_error));
  104. if(json_error.error==QJsonParseError::NoError){
  105. QJsonObject root = jsonDoc.object();
  106. if((!root.value("service").isUndefined())&&(!root.value("service").isNull())&&(root.value("service").isObject())){
  107. QJsonObject jService = root.value("service").toObject();
  108. if((!jService.value("eventTime").isUndefined())&&(!jService.value("eventTime").isNull())&&(jService.value("eventTime").isString()))
  109. jEventTime = jService.value("eventTime").toString();
  110. if((!jService.value("data").isUndefined())&&(!jService.value("data").isNull())&&(jService.value("data").isObject())){
  111. QJsonObject jData = jService.value("data").toObject();
  112. if((!jData.value("payload").isUndefined())&&(!jData.value("payload").isNull())&&(jData.value("payload").isString()))
  113. jPayload = jData.value("payload").toString();
  114. }
  115. }
  116. }
  117. if((jPayload.length()>0)&&(jEventTime.length()>0)){
  118. check_framedata(jPayload,jEventTime,ip);
  119. }
  120. }
  121. void WaterServer4::check_serverdata(QString data, QString ip){
  122. QDateTime dt = QDateTime::currentDateTime();
  123. QStringList dataList = data.split("\r\n");
  124. for(int i=0;i<dataList.length();i++){
  125. if(dataList.at(i).indexOf("\"notifyType\":\"deviceDataChanged\"")>0){
  126. check_smokedata(dataList.at(i), ip);
  127. }
  128. }
  129. }
  130. void WaterServer4::read_data(){
  131. QTcpSocket *so = static_cast<QTcpSocket *>(sender());
  132. QString data = QString(so->readAll());
  133. emit getCommData(QString("[ %1 %2 <<< ] %3").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz").arg(so->peerAddress().toString()).arg(data)));
  134. so->write("HTTP/1.1 200 OK\r\nAccess-Control-Allow-Origin: *\r\nContent-type: text/plain\r\n\r\n");
  135. so->close();
  136. check_serverdata(data, so->peerAddress().toString());
  137. }