akWorker.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "akWorker.h"
  2. #include <QUdpSocket>
  3. #include <QNetworkInterface>
  4. #include <QHostInfo>
  5. #include "../../airkiss.h"
  6. #include <QFile>
  7. #include <QTextStream>
  8. #include <stdio.h>
  9. static int msgprint(const char *format, ...)
  10. {
  11. char buf[80];
  12. int i;
  13. va_list vlist;
  14. va_start(vlist, format);
  15. i = vsprintf(buf, format, vlist);
  16. va_end(vlist);
  17. qDebug(buf);
  18. return i;
  19. }
  20. akWorker::akWorker()
  21. {
  22. isrun = true;
  23. lenOut = false;
  24. cmpExit = true;
  25. }
  26. akWorker::~akWorker()
  27. {
  28. isrun = false;
  29. wait();
  30. }
  31. void akWorker::start(QString file, bool nossid, short port)
  32. {
  33. _file = file;
  34. _nossid = nossid;
  35. _port = port;
  36. QThread::start();
  37. }
  38. int akWorker::getframe(QString &str, QByteArray &fm)
  39. {
  40. QStringList list;
  41. int len;
  42. fm.clear();
  43. list = str.split(":");
  44. if (list.count() == 1)
  45. {
  46. len = list.at(0).toInt();
  47. }
  48. else
  49. {
  50. QByteArray tmp;
  51. tmp = list.at(0).toStdString().c_str();
  52. fm = fm.fromHex(tmp);
  53. len = list.at(1).toInt();
  54. }
  55. return len;
  56. }
  57. void akWorker::fromfile()
  58. {
  59. QFile fd;
  60. airkiss_context_t ac;
  61. airkiss_config_t acfg = {0,0,0,0};
  62. int status;
  63. int len;
  64. QString data;
  65. QTextStream in;
  66. QByteArray fm;
  67. fd.setFileName(_file);
  68. if (!fd.open(QIODevice::ReadOnly))
  69. {
  70. emit showMsg("open file fail");
  71. return;
  72. }
  73. in.setDevice(&fd);
  74. acfg.printf = msgprint;
  75. airkiss_init(&ac, &acfg);
  76. while (isrun)
  77. {
  78. char *pf = NULL;
  79. data = in.readLine();
  80. if (data.size() == 0)
  81. break;
  82. len = getframe(data, fm);
  83. if (len == 0)
  84. break;
  85. if (fm.size() > 0)
  86. pf = fm.data();
  87. if (_nossid)
  88. status = airkiss_recv_nossid(&ac, pf, len);
  89. else
  90. status = airkiss_recv(&ac, pf, len);
  91. if (status == AIRKISS_STATUS_COMPLETE)
  92. {
  93. airkiss_result_t res;
  94. QString str;
  95. airkiss_get_result(&ac, &res);
  96. if (_nossid)
  97. str = str.sprintf("ssidcrc: %X, pwd: %s\n", res.ssid_crc, res.pwd);
  98. else
  99. str = str.sprintf("ssid: %s, pwd: %s\n", res.ssid, res.pwd);
  100. emit showMsg(str);
  101. break;
  102. }
  103. else if (status == AIRKISS_STATUS_CHANNEL_LOCKED)
  104. {
  105. emit showMsg("锁定通道");
  106. }
  107. msleep(1);
  108. }
  109. }
  110. void akWorker::fromudp_bc()
  111. {
  112. QUdpSocket *ser;
  113. char buf[1024];
  114. airkiss_context_t ac;
  115. int status = -1;
  116. airkiss_config_t acfg = {0,0,0,0};
  117. ser = new QUdpSocket;
  118. if (!ser->bind(QHostAddress::AnyIPv4, _port, QUdpSocket::ShareAddress))
  119. {
  120. emit showMsg("bind fail");
  121. goto _out;
  122. }
  123. acfg.printf = msgprint;
  124. airkiss_init(&ac, &acfg);
  125. while (isrun)
  126. {
  127. int len;
  128. if (ser->hasPendingDatagrams())
  129. {
  130. len = ser->pendingDatagramSize();
  131. ser->readDatagram(buf, len);
  132. if (lenOut)
  133. {
  134. QString s;
  135. qDebug("%X", len);
  136. s = s.sprintf("%X", len);
  137. emit showMsg(s);
  138. }
  139. if (_nossid)
  140. status = airkiss_recv_nossid(&ac, NULL, len);
  141. else
  142. status = airkiss_recv(&ac, NULL, len);
  143. if (status == AIRKISS_STATUS_COMPLETE)
  144. {
  145. airkiss_result_t res;
  146. QString str;
  147. airkiss_get_result(&ac, &res);
  148. if (_nossid)
  149. str = str.sprintf("ssidcrc: %X, pwd: %s\n", res.ssid_crc, res.pwd);
  150. else
  151. str = str.sprintf("ssid: %s, pwd: %s\n", res.ssid, res.pwd);
  152. emit showMsg(str);
  153. airkiss_change_channel(&ac);
  154. if (cmpExit)
  155. break;
  156. }
  157. }
  158. }
  159. _out:
  160. delete ser;
  161. }
  162. void akWorker::run()
  163. {
  164. if (_file.isEmpty())
  165. fromudp_bc();
  166. else
  167. fromfile();
  168. emit showMsg("退出解析");
  169. }
  170. QString akWorker::genDataSeq(QString pwd, QString r, QString ssid, int baselen)
  171. {
  172. QString ret;
  173. return ret;
  174. }