dmpcommthread.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. #include "dmpcommthread.h"
  2. #include "datashm.h"
  3. union FC {
  4. float f;
  5. unsigned char c[4];
  6. };
  7. DMPCommThread::DMPCommThread(qintptr socketDescriptor,QObject *parent) : QThread(parent)
  8. {
  9. DeviceID = "";
  10. keepcomm = false;
  11. this->SocketDescriptor = socketDescriptor;
  12. }
  13. DMPCommThread::~DMPCommThread()
  14. {
  15. deleteLater();
  16. }
  17. quint16 DMPCommThread::chk_crcc(QByteArray buff, quint16 len)
  18. {
  19. quint16 default_data = 0xa001;
  20. quint16 crc = 0xffff;
  21. for(quint16 j=0;j<(len-2);j++)
  22. {
  23. crc ^= static_cast<quint8>(buff[j]&0xff);
  24. for(int i=0;i<8;i++)
  25. {
  26. if(crc&0x01)
  27. {
  28. crc >>= 1;
  29. crc ^= default_data;
  30. }else
  31. crc >>= 1;
  32. }
  33. }
  34. return crc;
  35. }
  36. void DMPCommThread::run()
  37. {
  38. QTcpSocket *so = new QTcpSocket;
  39. if(!so->setSocketDescriptor(this->SocketDescriptor)){
  40. so->abort();
  41. return;
  42. }
  43. int day = 255;
  44. keepcomm = true;
  45. while (keepcomm) {
  46. if(so->state()!=QTcpSocket::ConnectedState){
  47. close_self(so);
  48. return;
  49. }
  50. if(so->waitForReadyRead(1000)){
  51. readData(so);
  52. }else if(day!=QDate::currentDate().day()){
  53. day=QDate::currentDate().day();
  54. QByteArray cmd = mk_settime();
  55. so->write(cmd);
  56. }
  57. usleep(200000);
  58. }
  59. so->abort();
  60. }
  61. QByteArray DMPCommThread::mk_settime()
  62. {
  63. int i, cur=0, crc=0;
  64. QDateTime t = QDateTime::currentDateTime();
  65. QByteArray DevId = DeviceID.toUtf8();
  66. int year = t.date().year();
  67. int mon = t.date().month();
  68. int day = t.date().day();
  69. int hour = t.time().hour();
  70. int min = t.time().minute();
  71. int sec = t.time().second();
  72. int devLen = DevId.length();
  73. int bodyLen = devLen+11;
  74. QByteArray cmd = QByteArray(14+bodyLen,0x00);
  75. cmd[cur++] = static_cast<char>(0x7e);
  76. cmd[cur++] = static_cast<char>(0x01);
  77. cmd[cur++] = static_cast<char>((bodyLen>>8)&0xff);
  78. cmd[cur++] = static_cast<char>(bodyLen&0xff);
  79. cmd[cur++] = static_cast<char>(0x83);
  80. cmd[cur++] = static_cast<char>(0x85);
  81. cmd[cur++] = static_cast<char>(0x83);
  82. cmd[cur++] = static_cast<char>(0x75);
  83. cmd[cur++] = static_cast<char>(0x89);
  84. cmd[cur++] = static_cast<char>(0x73);
  85. cmd[cur++] = static_cast<char>(0x79);
  86. cmd[cur++] = static_cast<char>(0x84);
  87. cmd[cur++] = static_cast<char>(0x0b);
  88. cmd[cur++] = static_cast<char>((devLen>>8)&0xff);
  89. cmd[cur++] = static_cast<char>(devLen&0xff);
  90. for(i=0;i<devLen;i++)
  91. cmd[cur++] = DevId.at(i);
  92. cmd[cur++] = 0x00;
  93. cmd[cur++] = static_cast<char>((((year/1000)&0x0f)<<4)|(((year%1000)/100)&0x0f));
  94. cmd[cur++] = static_cast<char>(((((year%100)/10)&0x0f)<<4)|((year%10)&0x0f));
  95. cmd[cur++] = static_cast<char>((((mon/10)&0x0f)<<4)|((mon%10)&0x0f));
  96. cmd[cur++] = static_cast<char>((((day/10)&0x0f)<<4)|((day%10)&0x0f));
  97. cmd[cur++] = static_cast<char>((((hour/10)&0x0f)<<4)|((hour%10)&0x0f));
  98. cmd[cur++] = static_cast<char>((((min/10)&0x0f)<<4)|((min%10)&0x0f));
  99. cmd[cur++] = static_cast<char>((((sec/10)&0x0f)<<4)|((sec%10)&0x0f));
  100. for(i=1;i<cur;i++)
  101. crc += cmd[i]&0xff;
  102. cmd[cur++] = static_cast<char>(crc&0xff);
  103. cmd[cur] = static_cast<char>(0xe7);
  104. return cmd;
  105. }
  106. QByteArray DMPCommThread::mk_rtn(quint8 type, quint16 sn){
  107. int i,cur=0,crc=0;
  108. QByteArray rtn = QByteArray(17,0x00);
  109. rtn[cur++] = static_cast<char>(0x7e);
  110. rtn[cur++] = static_cast<char>(0x01);
  111. rtn[cur++] = static_cast<char>(0x00);
  112. rtn[cur++] = static_cast<char>(0x03);
  113. rtn[cur++] = static_cast<char>(0x83);
  114. rtn[cur++] = static_cast<char>(0x85);
  115. rtn[cur++] = static_cast<char>(0x83);
  116. rtn[cur++] = static_cast<char>(0x75);
  117. rtn[cur++] = static_cast<char>(0x89);
  118. rtn[cur++] = static_cast<char>(0x73);
  119. rtn[cur++] = static_cast<char>(0x79);
  120. rtn[cur++] = static_cast<char>(0x84);
  121. rtn[cur++] = static_cast<char>(type);
  122. rtn[cur++] = static_cast<char>((sn>>8)&0xff);
  123. rtn[cur++] = static_cast<char>(sn&0xff);
  124. for(i=1;i<cur;i++)
  125. crc += rtn[i]&0xff;
  126. rtn[cur++] = static_cast<char>(crc&0xff);
  127. rtn[cur] = static_cast<char>(0xe7);
  128. return rtn;
  129. }
  130. QByteArray DMPCommThread::mk_rtn(quint8 type){
  131. int i,cur=0,crc=0;
  132. QByteArray rtn = QByteArray(15,0x00);
  133. rtn[cur++] = static_cast<char>(0x7e);
  134. rtn[cur++] = static_cast<char>(0x01);
  135. rtn[cur++] = static_cast<char>(0x00);
  136. rtn[cur++] = static_cast<char>(0x01);
  137. rtn[cur++] = static_cast<char>(0x83);
  138. rtn[cur++] = static_cast<char>(0x85);
  139. rtn[cur++] = static_cast<char>(0x83);
  140. rtn[cur++] = static_cast<char>(0x75);
  141. rtn[cur++] = static_cast<char>(0x89);
  142. rtn[cur++] = static_cast<char>(0x73);
  143. rtn[cur++] = static_cast<char>(0x79);
  144. rtn[cur++] = static_cast<char>(0x84);
  145. rtn[cur++] = static_cast<char>(type);
  146. for(i=1;i<cur;i++)
  147. crc += rtn[i]&0xff;
  148. rtn[cur++] = static_cast<char>(crc&0xff);
  149. rtn[cur] = static_cast<char>(0xe7);
  150. return rtn;
  151. }
  152. QByteArray DMPCommThread::mk_heartbeat_rtn()
  153. {
  154. int i,cur=0,crc=0;
  155. QByteArray rtn = QByteArray(14,0x00);
  156. rtn[cur++] = static_cast<char>(0x7e);
  157. rtn[cur++] = static_cast<char>(0x01);
  158. rtn[cur++] = static_cast<char>(0x00);
  159. rtn[cur++] = static_cast<char>(0x00);
  160. rtn[cur++] = static_cast<char>(0x81);
  161. rtn[cur++] = static_cast<char>(0x85);
  162. rtn[cur++] = static_cast<char>(0x83);
  163. rtn[cur++] = static_cast<char>(0x75);
  164. rtn[cur++] = static_cast<char>(0x89);
  165. rtn[cur++] = static_cast<char>(0x73);
  166. rtn[cur++] = static_cast<char>(0x79);
  167. rtn[cur++] = static_cast<char>(0x84);
  168. for(i=1;i<cur;i++)
  169. crc += rtn[i]&0xff;
  170. rtn[cur++] = static_cast<char>(crc&0xff);
  171. rtn[cur] = static_cast<char>(0xe7);
  172. return rtn;
  173. }
  174. QByteArray DMPCommThread::mk_login_rtn()
  175. {
  176. int i,cur=0,crc=0;
  177. QByteArray rtn = QByteArray(15,0x00);
  178. rtn[cur++] = static_cast<char>(0x7e);
  179. rtn[cur++] = static_cast<char>(0x01);
  180. rtn[cur++] = static_cast<char>(0x00);
  181. rtn[cur++] = static_cast<char>(0x01);
  182. rtn[cur++] = static_cast<char>(0x83);
  183. rtn[cur++] = static_cast<char>(0x85);
  184. rtn[cur++] = static_cast<char>(0x83);
  185. rtn[cur++] = static_cast<char>(0x75);
  186. rtn[cur++] = static_cast<char>(0x89);
  187. rtn[cur++] = static_cast<char>(0x73);
  188. rtn[cur++] = static_cast<char>(0x79);
  189. rtn[cur++] = static_cast<char>(0x84);
  190. rtn[cur++] = static_cast<char>(0x40);
  191. for(i=1;i<cur;i++)
  192. crc += rtn[i]&0xff;
  193. rtn[cur++] = static_cast<char>(crc&0xff);
  194. rtn[cur] = static_cast<char>(0xe7);
  195. return rtn;
  196. }
  197. int DMPCommThread::getserviceidx(QString sn)
  198. {
  199. int ret = -1;
  200. for(int i=0;i<1024;i++){
  201. if((datashm->devinfo[i].Enabled&0x01)==0x01){
  202. if(QString::compare(sn.toLower(),QString(datashm->devinfo[i].DeviceCode).toLower())==0)
  203. {
  204. emit CommData(QString("51211 devicecode:%1").arg(sn));
  205. ret = i;
  206. emit DatabaseData(QString("update dmp_device_status set device_status=1,last_online_time='%1' where device_code = '%2'").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(sn));
  207. break;
  208. }
  209. }
  210. }
  211. if(ret<0){
  212. emit CommData(QString("51211 %1 no found").arg(sn));
  213. }
  214. return ret;
  215. }
  216. void DMPCommThread::readData(QTcpSocket *so)
  217. {
  218. int crc = 0;
  219. union FC fc;
  220. QByteArray data = so->readAll();
  221. QString temp = "";
  222. for(int i=0;i<data.length();i++){
  223. temp.append(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0')));
  224. }
  225. emit CommData(QString("readALL data: [%1]").arg(temp));
  226. QByteArray rtn;
  227. if(((data[0]&0xff)==0x7e)&&((data[1]&0xff)==0x01)&&((data[data.length()-1]&0xff)==0xe7)){
  228. int dLen = ((data[2]&0x00ff)<<8)|(data[3]&0x00ff);
  229. if(data.length()==(dLen+14)){
  230. for(int i=1;i<(data.length()-2);i++)
  231. crc += data[i]&0xff;
  232. if((data[data.length()-2]&0xff)==(crc&0xff)){
  233. if((data[4]&0xff)==0x01){
  234. rtn = mk_heartbeat_rtn();
  235. so->write(rtn);
  236. }else if((data[4]&0xff)==0x03){
  237. if((data[12]&0xff)==0x40){
  238. int IEMILen = ((data[13]&0x00ff)<<8)|(data[14]&0x00ff);
  239. int IMSILen = ((data[IEMILen+16]&0x00ff)<<8)|(data[IEMILen+17]&0x00ff);
  240. int DevLen = ((data[IEMILen+IMSILen+19]&0x00ff)<<8)|(data[IEMILen+IMSILen+20]&0x00ff);
  241. DeviceID = QString(data.mid(IEMILen+IMSILen+21,DevLen));
  242. printf("DeviceID: %s\n",DeviceID.toUtf8().data());
  243. rtn = mk_login_rtn();
  244. so->write(rtn);
  245. }else if((data[12]&0xff)==0x44){
  246. int IdLen = ((data[13]&0x00ff)<<8)|(data[14]&0x00ff);
  247. QString deviceID = QString(data.mid(15,IdLen));
  248. int idx = getserviceidx(deviceID);
  249. if(idx>=0){
  250. QString bstr="";
  251. QString pointstr="";
  252. bstr.append(QString("sp_d%1").arg(DeviceID)).append(",").append(QString("dev_type=%1").arg(datashm->devinfo[idx].DeviceType)).append(" ");
  253. QString tmp="";
  254. for(int i=0;i<data.length();i++){
  255. tmp.append(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0')));
  256. }
  257. bstr.append(QString("byte_array=\"%1\"").arg(tmp));
  258. for(int j=0;j<32;j++){
  259. for(int i=0;i<4;i++)
  260. fc.c[3-i] = data[IdLen+16+4*j+i]&0xff;
  261. float RealVal = fc.f;
  262. pointstr.append(QString("\"point%1\":%2").arg(j).arg(RealVal)).append(",");
  263. }
  264. pointstr=pointstr.left(pointstr.size()-1);
  265. QString jsonStr = QString("{\"device_id\":\"%1\",\"product_id\":\"%2\",\"timestamp\":\"%3\",\"tags\":{\"conn_type\":\"%4\",\"type\":\"%5\"},\"metrics\":{%6},\"device_type\":\"%7\"}").arg(DeviceID).arg("").arg(QDateTime::currentDateTime().toTime_t()).arg("").arg("").arg(pointstr).arg(QString("%1").arg(datashm->devinfo[idx].DeviceType));
  266. int year = ((data[IdLen+23]>>4)&0x0f)*1000+(data[IdLen+23]&0x0f)*100+((data[IdLen+24]>>4)&0x0f)*10+(data[IdLen+24]&0x0f);
  267. int mon = ((data[IdLen+25]>>4)&0x0f)*10+(data[IdLen+25]&0x0f);
  268. int day = ((data[IdLen+26]>>4)&0x0f)*10+(data[IdLen+26]&0x0f);
  269. int hour = ((data[IdLen+27]>>4)&0x0f)*10+(data[IdLen+27]&0x0f);
  270. int min = ((data[IdLen+28]>>4)&0x0f)*10+(data[IdLen+28]&0x0f);
  271. int sec = ((data[IdLen+29]>>4)&0x0f)*10+(data[IdLen+29]&0x0f);
  272. QDateTime ut = QDateTime(QDate(year,mon,day),QTime(hour,min,sec));
  273. emit getERealtimeValue(DeviceID,bstr,jsonStr,ut);
  274. }
  275. rtn = mk_rtn(data[12]&0xff);
  276. so->write(rtn);
  277. }
  278. }
  279. }
  280. }
  281. }
  282. }
  283. void DMPCommThread::close_self(QTcpSocket *so)
  284. {
  285. so->abort();
  286. keepcomm = false;
  287. }
  288. void DMPCommThread::stop()
  289. {
  290. keepcomm = false;
  291. }