
本文共 9224 字,大约阅读时间需要 30 分钟。
������������������Airkiss���������������������������
������
������������������������Airkiss���������������������������������������������������������������������������������������������������������������������������������SSID������������������������������������������������������������������������������������������������������
������������������
1. Airkiss������������
Airkiss���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Length���������������������������������������������������������������������������������������������������������������������������������������������������������������Airkiss���������length������������������������������������������������������������������������������������������������
2. Airkiss������������
Airkiss���������������������������������������
������������������
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
���������������������������������
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���������
������
������������������������������
������������
������������
������
���������������������������������������������
- ���������������������������������������������������������������������������
- ������������������������������������������������������������������������������������������
- ������������������������������������������������������������������������������
���������������������������������������������������������������������������������������
���������������������������������������������������������������������������������������������
发表评论
最新留言
关于作者
