WIFI模块开发教程之W600网络篇6:Airkiss配网
发布日期:2021-05-15 00:02:30 浏览次数:21 分类:精选文章

本文共 9224 字,大约阅读时间需要 30 分钟。

������������������Airkiss���������������������������

������

������������������������Airkiss���������������������������������������������������������������������������������������������������������������������������������SSID������������������������������������������������������������������������������������������������������

������������������

1. Airkiss������������

Airkiss���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Length���������������������������������������������������������������������������������������������������������������������������������������������������������������Airkiss���������length������������������������������������������������������������������������������������������������

2. Airkiss������������

Airkiss���������������������������������������

  • ���������������������������������������������������������������������
  • ������������������������������������������������������������������������������������
  • ���������������������������������������������������������������������������������������������SSID������������
  • ������������������������������������������������������������������������������
  • ������������������

    1. ������������

    1.1 ������������������
    static void airkiss_switch_channel(void *parameter)  {      g_current_channel++;      if (g_current_channel > MAX_CHANNEL_NUM)      {          g_current_channel = 1;      }      rt_wlan_set_channel(g_wlan_device, g_current_channel);      airkiss_change_channel(ak_contex);      AIRKISS_PRINTF("Switch channel %d \n", g_current_channel);  }
    1.2 ���������������������������
    static void airkiss_monitor_callback(uint8_t *data, int len, void *user_data)  {      airkiss_recv_ret = airkiss_recv(ak_contex, data, len);      if (airkiss_recv_ret == AIRKISS_STATUS_CHANNEL_LOCKED)      {          rt_timer_stop(g_switch_timer);          AIRKISS_PRINTF("Lock channel in %d \n", g_current_channel);          rt_timer_start(g_doing_timer);      }      else if (airkiss_recv_ret == AIRKISS_STATUS_COMPLETE)      {          rt_timer_stop(g_doing_timer);          rt_sem_release(g_cfg_done_sem);          AIRKISS_PRINTF("AIRKISS_STATUS_COMPLETE \n");      }  }
    1.3 ������������������������random���������APP������������
    static void airkiss_send_notification_thread(void *parameter)  {      int sock = -1;      int udpbufsize = 2;      uint8_t random = (uint32_t)parameter;      struct sockaddr_in g_stUDPBCAddr, g_stUDPBCServerAddr;      sock = socket(AF_INET, SOCK_DGRAM, 0);      if (sock < 0)      {          AIRKISS_PRINTF("notify create socket error!\n");          goto _exit;      }      g_stUDPBCAddr.sin_family = AF_INET;      g_stUDPBCAddr.sin_port = htons(10000);      g_stUDPBCAddr.sin_addr.s_addr = htonl(0xffffffff);      rt_memset(&g_stUDPBCAddr.sin_zero, 0, sizeof(g_stUDPBCAddr.sin_zero));      g_stUDPBCServerAddr.sin_family = AF_INET;      g_stUDPBCServerAddr.sin_port = htons(10000);      g_stUDPBCServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);      rt_memset(&g_stUDPBCServerAddr.sin_zero, 0, sizeof(g_stUDPBCServerAddr.sin_zero));      if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &udpbufsize, sizeof(int)) != 0)      {          AIRKISS_PRINTF("notify socket setsockopt error\n");          goto _exit;      }      if (bind(sock, (struct sockaddr *)&g_stUDPBCServerAddr, sizeof(g_stUDPBCServerAddr)) != 0)      {          AIRKISS_PRINTF("notify socket bind error\n");          goto _exit;      }      for (int i = 0; i <= 20; i++)      {          int ret = sendto(sock, (char *)&random, 1, 0, (struct sockaddr *)&g_stUDPBCAddr, sizeof(g_stUDPBCAddr));          rt_thread_delay(10);      }      AIRKISS_PRINTF("airkiss notification thread exit!\n");  _exit:      if (sock >= 0)      {          close(sock);      }  }
    1.4 ������������������
    static void airkiss_thread_entry(void *parameter)  {      int result;      g_switch_timer = rt_timer_create("switch_channel", airkiss_switch_channel, RT_NULL, AIRKISS_SWITCH_TIMER, RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC);      if (!g_switch_timer)      {          rt_kprintf("Create airkiss swtich channel timer failed \n");          goto _exit;      }      g_doing_timer = rt_timer_create("doing_timeout", airkiss_doing_timeout, RT_NULL, AIRKISS_DOING_TIMER, RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);      if (!g_doing_timer)      {          rt_kprintf("Create airkiss doing timeout timer failed \n");          goto _exit;      }      g_cfg_done_sem = rt_sem_create("tlink", 0, RT_IPC_FLAG_FIFO);      if (!g_cfg_done_sem)      {          rt_kprintf("Create  airkiss config done sem failed! \n");          goto _exit;      }      ak_contex = (airkiss_context_t *)rt_malloc(sizeof(airkiss_context_t));      if (!ak_contex)      {          rt_kprintf("Malloc memory for airkiss context \n");          goto _exit;      }      result = airkiss_init(ak_contex, &ak_conf);      if (result != RT_EOK)      {          rt_kprintf("Airkiss init failed!!\r\n");          goto _exit;      }      AIRKISS_PRINTF("Airkiss version: %s\r\n", airkiss_version());      g_wlan_device = (struct rt_wlan_device *)rt_device_find(WIFI_DEVICE_STA_NAME);      if (g_wlan_device == RT_NULL)      {          rt_kprintf("Device not found\n");          return;      }      g_current_channel = 1;      rt_wlan_set_channel(g_wlan_device, g_current_channel);      rt_wlan_set_monitor_callback(g_wlan_device, airkiss_monitor_callback);      rt_wlan_cfg_monitor(g_wlan_device, WIFI_MONITOR_START);      rt_timer_start(g_switch_timer);      if (rt_sem_take(g_cfg_done_sem, rt_tick_from_millisecond(1000 * 90)) != RT_EOK)      {          AIRKISS_PRINTF("Wait semaphore timeout \n");      }      if (airkiss_recv_ret == AIRKISS_STATUS_COMPLETE)      {          int8_t err;          int8_t tick = 0;          airkiss_result_t result;          err = airkiss_get_result(ak_contex, &result);          if (err == 0)          {              AIRKISS_PRINTF("airkiss_get_result() ok!\n");              AIRKISS_PRINTF(" ssid = %s \n pwd = %s \n, ssid_length = %d \n pwd_length = %d \n, random = 0x%02x\r\n",                            result.ssid, result.pwd, result.ssid_length, result.pwd_length, result.random);          }          rt_wlan_cfg_monitor(g_wlan_device, WIFI_MONITOR_STOP);          rt_wlan_set_monitor_callback(g_wlan_device, RT_NULL);          station_connect(result.ssid, result.pwd);          do          {              tick++;              rt_thread_delay(rt_tick_from_millisecond(1000));              if (tick >= 30)              {                  rt_kprintf("GET IP Time Out!!! \n");                  goto _exit;              }          }          while (!get_wifi_status(g_wlan_device->parent.netif));          {              rt_thread_t tid;              tid = rt_thread_create("air_echo", airkiss_send_notification_thread, (void *)result.random, 1536, RT_THREAD_PRIORITY_MAX - 3, 20);              if (tid != RT_NULL)              {                  rt_thread_startup(tid);              }          }      }  _exit:      if (g_switch_timer != RT_NULL)      {          rt_timer_stop(g_switch_timer);          rt_timer_delete(g_switch_timer);      }      if (g_doing_timer != RT_NULL)      {          rt_timer_stop(g_doing_timer);          rt_timer_delete(g_doing_timer);      }      if (ak_contex != RT_NULL)      {          rt_free(ak_contex);          ak_contex = RT_NULL;      }      if (g_cfg_done_sem != RT_NULL)      {          rt_sem_delete(g_cfg_done_sem);          g_cfg_done_sem = RT_NULL;      }  }

    2. ������

    ������������������������������
  • ������smartconfig���������GitHub���������������
  • ���smartconfig������������������������ BSP.Publish Ginger PA6/PA6X ������������������
  • ������ rtconfig.h ������������������������������������������������
  • #define RT_CFG_USE_AIRKISS 1  #define RT_CFG_AIRKISS_TX_CHANNEL 6  #define RT_CFG_AIRKISS_RX_CHANNEL 7  #define RT_CFG_AIRKISS_FEATURE_LOG 1
    ���������������������������������
  • ������������������������������ SConscript ��������������� 2-net/6-config_airkiss ������������
  • ���������������
  • Import('RTT_ROOT')Import('rtconfig')  from building import *  cwd = GetCurrentDir()  src = Glob('2-net/6-config_airkiss/*.c')  CPPPATH = [cwd]  group = DefineGroup('Applications', src, depend = [''])  CPPPATH = CPPPATH + [group.CPPPATH]  Return('group')

    ���������������������

    ������

    ������ancode build��������������������� rtthread_1M.FLS Bin���������

    ������

    ������������������������������

    ������������

  • ���������������������
  • ���APP������������������������
  • ���������������������������������������������������������������������UDP������������������������������APP���������������
  • ������������

    ������

  • ���������������������������������������������

    • ���������������������������������������������������������������������������
    • ������������������������������������������������������������������������������������������
    • ������������������������������������������������������������������������������
  • ���������������������������������������������������������������������������������������

  • ���������������������������������������������������������������������������������������������

    上一篇:RISC-V单片机快速入门07-板载LCD显示ESP8266数据
    下一篇:WIFI模块开发教程之W600网络篇3:STA模式下TCP Client通信

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月27日 23时32分03秒