rtt_airkiss.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #ifdef RT_USING_WIFI
  4. #ifdef RT_WLAN_MANAGE_ENABLE
  5. #include <sys/socket.h>
  6. #include "airkiss.h"
  7. #include <stdlib.h>
  8. #define DBG_TAG "wlan.airkiss"
  9. #define DBG_LVL DBG_INFO
  10. #include <rtdbg.h>
  11. typedef struct rtt_airkiss_ctx
  12. {
  13. airkiss_context_t ac;
  14. airkiss_result_t result;
  15. uint32_t lock_chn;
  16. } rtt_airkiss_ctx_t;
  17. static rtt_airkiss_ctx_t* rak_ctx;
  18. static airkiss_callback airkiss_cb;
  19. static void prom_callback(struct rt_wlan_device *device, void *d, int s);
  20. static void airkiss_send_notification(uint8_t random);
  21. static void airkiss_send_notification(uint8_t random)
  22. {
  23. int sock = -1;
  24. int udpbufsize = 2;
  25. struct sockaddr_in UDPBCAddr, UDPBCServerAddr;
  26. sock = socket(AF_INET, SOCK_DGRAM, 0);
  27. if (sock < 0)
  28. {
  29. LOG_W("notify create socket error!");
  30. goto _exit;
  31. }
  32. UDPBCAddr.sin_family = AF_INET;
  33. UDPBCAddr.sin_port = htons(10000);
  34. UDPBCAddr.sin_addr.s_addr = htonl(0xffffffff);
  35. rt_memset(&(UDPBCAddr.sin_zero), 0, sizeof(UDPBCAddr.sin_zero));
  36. UDPBCServerAddr.sin_family = AF_INET;
  37. UDPBCServerAddr.sin_port = htons(10000);
  38. UDPBCServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  39. rt_memset(&(UDPBCServerAddr.sin_zero), 0, sizeof(UDPBCServerAddr.sin_zero));
  40. if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &udpbufsize, sizeof(int)) != 0)
  41. {
  42. LOG_W("notify socket setsockopt error");
  43. goto _exit;
  44. }
  45. if (bind(sock, (struct sockaddr *)&UDPBCServerAddr, sizeof(UDPBCServerAddr)) != 0)
  46. {
  47. LOG_W("notify socket bind error");
  48. goto _exit;
  49. }
  50. for (int i = 0; i <= 50; i++)
  51. {
  52. int ret = sendto(sock, (char *)&random, 1, 0, (struct sockaddr *)&UDPBCAddr, sizeof(UDPBCAddr));
  53. rt_thread_mdelay(10);
  54. }
  55. _exit:
  56. if (sock >= 0)
  57. {
  58. closesocket(sock);
  59. }
  60. }
  61. static void prom_callback(struct rt_wlan_device *device, void *d, int s) {
  62. int8_t ret;
  63. if (rak_ctx == RT_NULL)
  64. return;
  65. //if (s < 24 || airkiss_filter(d, s)) {
  66. // return;
  67. //}
  68. ret = airkiss_recv(&(rak_ctx->ac), d, s);
  69. if (ret == AIRKISS_STATUS_CHANNEL_LOCKED) {
  70. rak_ctx->lock_chn = 1;
  71. }
  72. else if (ret == AIRKISS_STATUS_COMPLETE) {
  73. rt_wlan_dev_exit_promisc(device);
  74. rt_enter_critical();
  75. int8_t err = airkiss_get_result(&(rak_ctx->ac), &(rak_ctx->result));
  76. rt_exit_critical();
  77. if (err == 0) {
  78. LOG_I("Airkiss DONE!! ssid=%s passwd=%s", rak_ctx->result.ssid, rak_ctx->result.pwd);
  79. }
  80. else {
  81. LOG_W("Airkiss airkiss_get_result err=%d", err);
  82. }
  83. }
  84. }
  85. void airkiss_set_callback(airkiss_callback cb) {
  86. airkiss_cb = cb;
  87. }
  88. static void do_airkiss_configwifi(void)
  89. {
  90. struct rt_wlan_device *dev;
  91. int n;
  92. //int round = 120;
  93. //int re = -1;
  94. //int chns = 12;
  95. rtt_airkiss_ctx_t _ctx;
  96. airkiss_config_t acfg =
  97. {
  98. (airkiss_memset_fn)&rt_memset,
  99. (airkiss_memcpy_fn)&rt_memcpy,
  100. (airkiss_memcmp_fn)&rt_memcmp,
  101. (airkiss_printf_fn)&rt_kprintf
  102. };
  103. rt_memset(&_ctx, 0, sizeof(rtt_airkiss_ctx_t));
  104. rak_ctx = &_ctx;
  105. LOG_I("airkiss thread start");
  106. airkiss_init(&(rak_ctx->ac), &acfg);
  107. rt_wlan_config_autoreconnect(0);
  108. if (rt_wlan_is_connected())
  109. rt_wlan_disconnect();
  110. dev = (struct rt_wlan_device *)rt_device_find(RT_WLAN_DEVICE_STA_NAME);
  111. rt_wlan_dev_set_promisc_callback(dev, prom_callback);
  112. rt_wlan_dev_enter_promisc(dev);
  113. for (size_t i = 0; i < 120; i++)
  114. {
  115. for (size_t j = 0; j < 12; j++)
  116. {
  117. rt_thread_mdelay(100);
  118. if (_ctx.result.ssid_length > 0) {
  119. i = 9999;
  120. break;
  121. }
  122. if (!_ctx.lock_chn) {
  123. rt_wlan_dev_set_channel(dev, j);
  124. airkiss_change_channel(&(_ctx.ac));
  125. }
  126. }
  127. }
  128. rt_wlan_dev_exit_promisc(dev);
  129. LOG_I("airkiss main loop exit");
  130. if (_ctx.result.ssid_length > 0) {
  131. rt_err_t err = rt_wlan_connect(_ctx.result.ssid, _ctx.result.pwd);
  132. if (err == RT_EOK) {
  133. LOG_I("airkiss autoconnect success");
  134. rt_wlan_config_autoreconnect(1);
  135. LOG_I("airkiss wait wifi ready");
  136. for (size_t i = 0; i < 50; i++)
  137. {
  138. if (rt_wlan_is_ready()) {
  139. break;
  140. }
  141. rt_thread_mdelay(100);
  142. }
  143. LOG_I("airkiss send notification");
  144. airkiss_send_notification(_ctx.result.random);
  145. }
  146. else {
  147. LOG_W("airkiss auto connect FAIL");
  148. }
  149. }
  150. if (airkiss_cb != NULL) {
  151. LOG_D("calling airkiss_cb");
  152. airkiss_cb(_ctx.result.ssid_length ? 0 : 1, _ctx.result.ssid, _ctx.result.pwd);
  153. }
  154. rak_ctx = RT_NULL;
  155. LOG_I("airkiss thread exit");
  156. }
  157. static void airkiss_thread(void *p)
  158. {
  159. do_airkiss_configwifi();
  160. }
  161. int airkiss_start(void)
  162. {
  163. rt_thread_t tid;
  164. int ret = -1;
  165. tid = rt_thread_create("airkiss",
  166. airkiss_thread,
  167. 0,
  168. 2048,
  169. 22,
  170. 20);
  171. if (tid)
  172. {
  173. ret = rt_thread_startup(tid);
  174. }
  175. else {
  176. LOG_E("airkiss thread fail to start");
  177. }
  178. return ret == 0 ? 1 : 0;
  179. }
  180. // 几个
  181. #endif
  182. #endif