clientthread.cpp 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include "clientthread.h"
  2. ClientThread::ClientThread(qintptr socketDescriptor, QObject *parent) : QThread(parent)
  3. {
  4. this->SocketDescriptor = socketDescriptor;
  5. }
  6. ClientThread::~ClientThread()
  7. {
  8. deleteLater();
  9. }
  10. void ClientThread::close_self(QTcpSocket *so)
  11. {
  12. so->abort();
  13. keepcomm = false;
  14. }
  15. void ClientThread::setAppPDataList(QList<AppPData> list){
  16. AppPDataList.clear();
  17. AppPDataList.append(list);
  18. }
  19. bool ClientThread::chkversion(QByteArray body, QTcpSocket *so){
  20. if(body.length()>4){
  21. quint16 hashLen = static_cast<quint16>(((body.at(1)&0x00ff)<<8)|(body.at(2)&0x00ff));
  22. if((body.length()==(hashLen+4))&&(hashLen>0)){
  23. QString AppHash = QString(body.mid(3,hashLen));
  24. printf("AppPDataList.length() [%d]\n",AppPDataList.length());
  25. if(AppPDataList.length()>0){
  26. printf("test2444444\n");
  27. for(int i=0;i<AppPDataList.length();i++){
  28. AppPData pData = AppPDataList.at(i);
  29. printf("AppHash [%s] ,static_cast<const QString>(pData.AppId()) [%s] \n",AppHash.toUtf8().data(),static_cast<const QString>(pData.AppId()).toUtf8().data());
  30. if(QString::compare(AppHash,static_cast<const QString>(pData.AppId()))==0){
  31. QDateTime currenttime = QDateTime::currentDateTime();
  32. quint8 MajroVersion = static_cast<quint8>(pData.majroVersion()&0xff);
  33. quint8 MinroVersion = static_cast<quint8>(pData.minroVersion()&0xff);
  34. uint ProgramLength = static_cast<uint>(pData.programLength());
  35. QByteArray Checksum = pData.chksum().toUtf8();
  36. uint uptime = pData.upTime();
  37. quint16 rtnLen = (17+hashLen+Checksum.length())&0xffff;
  38. QByteArray ret = QByteArray(rtnLen+14,0x00);
  39. int cur = 0, crc = 0;
  40. ret[cur++] = static_cast<char>(0x7e);
  41. ret[cur++] = static_cast<char>(0x01);
  42. ret[cur++] = static_cast<char>((rtnLen>>8)&0xff);
  43. ret[cur++] = static_cast<char>(rtnLen&0xff);
  44. ret[cur++] = static_cast<char>(0x85&0xff);
  45. ret[cur++] = static_cast<char>(0x85);
  46. ret[cur++] = static_cast<char>(0x83);
  47. ret[cur++] = static_cast<char>(0x75);
  48. ret[cur++] = static_cast<char>(0x89);
  49. ret[cur++] = static_cast<char>(0x73);
  50. ret[cur++] = static_cast<char>(0x79);
  51. ret[cur++] = static_cast<char>(0x84);
  52. ret[cur++] = static_cast<char>(0x01);
  53. ret[cur++] = body.at(1);
  54. ret[cur++] = body.at(2);
  55. for(int i=0;i<hashLen;i++)
  56. ret[cur++] = body.at(3+i);
  57. ret[cur++] = static_cast<char>(0x00);
  58. ret[cur++] = static_cast<char>(MajroVersion);
  59. ret[cur++] = static_cast<char>(MinroVersion);
  60. ret[cur++] = static_cast<char>((ProgramLength>>24)&0xff);
  61. ret[cur++] = static_cast<char>((ProgramLength>>16)&0xff);
  62. ret[cur++] = static_cast<char>((ProgramLength>>8)&0xff);
  63. ret[cur++] = static_cast<char>(ProgramLength&0xff);
  64. ret[cur++] = static_cast<char>((Checksum.length()>>8)&0xff);
  65. ret[cur++] = static_cast<char>(Checksum.length()&0xff);
  66. for(int i=0;i<Checksum.length();i++)
  67. ret[cur++] = Checksum.at(i);
  68. ret[cur++] = static_cast<char>(0x00);
  69. ret[cur++] = static_cast<char>((uptime>>24)&0xff);
  70. ret[cur++] = static_cast<char>((uptime>>16)&0xff);
  71. ret[cur++] = static_cast<char>((uptime>>8)&0xff);
  72. ret[cur++] = static_cast<char>(uptime&0xff);
  73. ret[cur] = static_cast<char>(0x00);
  74. ret[cur+1] = static_cast<char>(0xe7&0xff);
  75. for(int i=1;i<cur;i++)
  76. crc += static_cast<int>(ret[i]&0xff);
  77. ret[cur] = static_cast<char>(crc&0xff);
  78. so->write(ret);
  79. emit commlog(ret,false);
  80. return true;
  81. }
  82. }
  83. }
  84. }
  85. }
  86. return false;
  87. }
  88. bool ClientThread::getversion(QByteArray body, QTcpSocket *so){
  89. if(body.length()>8){
  90. quint16 hashLen = static_cast<quint16>(((body.at(1)&0x00ff)<<8)|(body.at(2)&0x00ff));
  91. if((body.length()==(hashLen+8))&&(hashLen>0)){
  92. QString AppHash = QString(body.mid(3,hashLen));
  93. quint8 MajroVersion = body.at(hashLen+4)&0xff;
  94. quint8 MinroVersion = body.at(hashLen+5)&0xff;
  95. quint16 PakIdx = static_cast<quint16>(((body.at(hashLen+6)&0x00ff)<<8)|(body.at(hashLen+7)&0x00ff));
  96. for(int i=0;i<AppPDataList.length();i++){
  97. AppPData pData = AppPDataList.at(i);
  98. if((QString::compare(AppHash,static_cast<const QString>(pData.AppId()))==0)
  99. &&(MajroVersion==pData.majroVersion())&&(MinroVersion==pData.minroVersion())){
  100. if(PakIdx<pData.Size()){
  101. PData data = pData.DataAt(PakIdx);
  102. QByteArray pdata =data.data();
  103. quint16 dLen = pdata.length()&0xffff;
  104. quint16 subSum =data.check();
  105. QDateTime currenttime = QDateTime::currentDateTime();
  106. quint16 rtnLen = 13+hashLen+dLen;
  107. QByteArray ret = QByteArray(13+rtnLen,0x00);
  108. int cur = 0, crc = 0;
  109. ret[cur++] = static_cast<char>(0x7e);
  110. ret[cur++] = static_cast<char>(0x01);
  111. ret[cur++] = static_cast<char>((rtnLen>>8)&0xff);
  112. ret[cur++] = static_cast<char>(rtnLen&0xff);
  113. ret[cur++] = static_cast<char>(0x85&0xff);
  114. ret[cur++] = static_cast<char>(0x85);
  115. ret[cur++] = static_cast<char>(0x83);
  116. ret[cur++] = static_cast<char>(0x75);
  117. ret[cur++] = static_cast<char>(0x89);
  118. ret[cur++] = static_cast<char>(0x73);
  119. ret[cur++] = static_cast<char>(0x79);
  120. ret[cur++] = static_cast<char>(0x84);
  121. ret[cur++] = static_cast<char>(0x02);
  122. ret[cur++] = body.at(1);
  123. ret[cur++] = body.at(2);
  124. for(int i=0;i<hashLen;i++)
  125. ret[cur++] = body.at(3+i);
  126. ret[cur++] = static_cast<char>(0x00);
  127. ret[cur++] = body.at(hashLen+4);
  128. ret[cur++] = body.at(hashLen+5);
  129. ret[cur++] = body.at(hashLen+6);
  130. ret[cur++] = body.at(hashLen+7);
  131. ret[cur++] = static_cast<char>((dLen>>8)&0xff);
  132. ret[cur++] = static_cast<char>(dLen&0xff);
  133. for(int i=0;i<dLen;i++)
  134. ret[cur++] = pdata.at(i);
  135. ret[cur++] = 0x00;
  136. ret[cur++] = static_cast<char>((subSum>>8)&0xff);
  137. ret[cur++] = static_cast<char>(subSum&0xff);
  138. ret[cur] = 0x00;
  139. ret[cur+1] = static_cast<char>(0xe7&0xff);
  140. for(int i=1;i<cur;i++)
  141. crc += static_cast<int>(ret[i]&0xff);
  142. ret[cur] = static_cast<char>(crc&0xff);
  143. so->write(ret);
  144. emit commlog(ret,false);
  145. return true;
  146. }
  147. }
  148. }
  149. }
  150. }
  151. return false;
  152. }
  153. bool ClientThread::readData(QTcpSocket *so)
  154. {
  155. QByteArray cmd = so->readAll();
  156. emit commlog(cmd,true);
  157. if(((cmd.at(0)&0xff)==0x7e)&&((cmd.at(1)&0x0f)==0x01)&&((cmd.at(4)&0x0f)==0x05)&&((cmd.at(cmd.length()-1)&0xff)==0xe7)&&(cmd.length()>13)){
  158. quint16 datalen = static_cast<quint16>(((cmd.at(2)&0x00ff)<<8)|(cmd.at(3)&0x00ff));
  159. quint8 crc = 0x00;
  160. if(cmd.length()==(datalen+14)){
  161. for(int i=1;i<(cmd.length()-2);i++)
  162. crc += static_cast<quint8>(cmd.at(i)&0xff);
  163. if(static_cast<quint8>(cmd.at(cmd.length()-2)&0xff)==static_cast<quint8>(crc)){
  164. if(datalen>0){
  165. switch (cmd.at(12)&0xff) {
  166. case 0x01:
  167. return chkversion(cmd.mid(12,datalen),so);
  168. case 0x02:
  169. return getversion(cmd.mid(12,datalen),so);
  170. }
  171. }else
  172. emit datalog(QString("datalen err %1").arg(datalen,4,16,QChar('0')));
  173. }else
  174. emit datalog(QString("crc err %1:%2").arg(crc,2,16,QChar('0')).arg(cmd.at(cmd.length()-2)&0xff,2,16,QChar('0')));
  175. }else
  176. emit datalog(QString("len err %1:%2").arg(datalen+14).arg(cmd.length()));
  177. }else{
  178. emit datalog(QString("frame err"));
  179. }
  180. return false;
  181. }
  182. void ClientThread::run()
  183. {
  184. QTcpSocket *so = new QTcpSocket;
  185. if(!so->setSocketDescriptor(this->SocketDescriptor))
  186. {
  187. so->abort();
  188. return;
  189. }
  190. keepcomm = true;
  191. while (keepcomm) {
  192. if(so->state()!=QTcpSocket::ConnectedState){
  193. close_self(so);
  194. return;
  195. }
  196. if(so->waitForReadyRead()){
  197. if(!readData(so)){
  198. close_self(so);
  199. return;
  200. }
  201. }
  202. }
  203. so->abort();
  204. }