123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- #include "interface/wifi_interface.h"
- #include "log/esp_log.h"
- #include "esp_common.h"
- static const char* TAG = "WiFi Interface";
- static wifi_config_t wifi_config;
- static struct bss_info *bss_link, *head_bss_link;
- static bool ICACHE_FLASH_ATTR destory_linked_list(void)
- {
- if(head_bss_link != NULL)
- {
- while(head_bss_link != NULL)
- {
- bss_link = head_bss_link;
- head_bss_link = head_bss_link->next.stqe_next;
- os_free(bss_link);
- }
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
- static struct bss_info* ICACHE_FLASH_ATTR copy_linked_list(struct bss_info *ptr_original_node)
- {
- struct bss_info *ptr_new_head, *ptr_new_node;
- if(ptr_original_node != NULL)
- {
- ptr_new_head = (struct bss_info *)os_malloc(sizeof(struct bss_info));
- if (ptr_new_head == NULL)
- {
- ESP_LOGE(TAG, "no RAM!");
- return NULL;
- }
- }
- else
- return NULL;
- os_memcpy(ptr_new_head, ptr_original_node, sizeof(struct bss_info));
- ptr_original_node = ptr_original_node->next.stqe_next;
- ptr_new_node = ptr_new_head;
- while(ptr_original_node != NULL)
- {
- ptr_new_node->next.stqe_next = (struct bss_info *)os_malloc(sizeof(struct bss_info));
- ptr_new_node = ptr_new_node->next.stqe_next;
- os_memcpy(ptr_new_node, ptr_original_node, sizeof(struct bss_info));
- if (ptr_new_node == NULL)
- {
- ESP_LOGE(TAG, "No RAM!");
- while(ptr_new_head != NULL)
- {
- ptr_new_node = ptr_new_head;
- ptr_new_head = ptr_new_head->next.stqe_next;
- os_free(ptr_new_node);
- }
- ESP_LOGE(TAG, "deleted linked list");
- return NULL;
- }
- ptr_original_node = ptr_original_node->next.stqe_next;
- }
- return ptr_new_head;
- }
- static void ICACHE_FLASH_ATTR wifi_timeout_cb(void)
- {
- ESP_LOGI(TAG, "wifi connection timed out");
- wifi_config.wifi_process = false;
- if (wifi_config.fail_cb != NULL)
- wifi_config.fail_cb(WIFI_TIMEOUT_FAILURE);
- }
- static void ICACHE_FLASH_ATTR wifi_event_handler_cb(System_Event_t *evt)
- {
- switch (evt->event)
- {
- case EVENT_STAMODE_CONNECTED:
- {
- wifi_config.ap_flag = true;
- ESP_LOGD(TAG, "connected to ssid %s, channel %d",
- evt->event_info.connected.ssid,
- evt->event_info.connected.channel);
- break;
- }
- case EVENT_STAMODE_DISCONNECTED:
- {
- wifi_config.ap_flag = false;
- wifi_config.ip_flag = false;
- ESP_LOGD(TAG, "disconnected from ssid %s, reason %d",
- evt->event_info.disconnected.ssid,
- evt->event_info.disconnected.reason);
- if (wifi_config.wifi_process == false)
- {
- wifi_station_disconnect();
- if (wifi_config.fail_cb != NULL)
- wifi_config.fail_cb(WIFI_AP_DISCONNECTED);
- }
- break;
- }
- case EVENT_STAMODE_AUTHMODE_CHANGE:
- {
- wifi_config.ap_flag = false;
- wifi_config.ip_flag = false;
- ESP_LOGD(TAG, "mode: %d -> %d",
- evt->event_info.auth_change.old_mode,
- evt->event_info.auth_change.new_mode);
- if (wifi_config.wifi_process == false)
- {
- if (wifi_config.fail_cb != NULL)
- wifi_config.fail_cb(WIFI_AP_AUTHMODE_CHANGE);
- }
- break;
- }
- case EVENT_STAMODE_GOT_IP:
- {
- wifi_config.ip_flag = true;
- os_timer_disarm(&wifi_config.timeout_timer);
- ESP_LOGD(TAG, "ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR,
- IP2STR(&evt->event_info.got_ip.ip),
- IP2STR(&evt->event_info.got_ip.mask),
- IP2STR(&evt->event_info.got_ip.gw));
- wifi_config.wifi_process = false;
- if (wifi_config.success_cb != NULL)
- wifi_config.success_cb();
- break;
- }
- default:
- {
- ESP_LOGD(TAG, "unknown Wi-Fi failure code");
- break;
- }
- }
- }
- static ICACHE_FLASH_ATTR wifi_process(void)
- {
- uint8_t ssid[33];
- uint8_t ap_index;
- struct station_config stationConfig[5];
-
- uint8_t num = wifi_station_get_ap_info(stationConfig);
- if (num == 0)
- {
- if (wifi_config.fail_cb != NULL)
- wifi_config.fail_cb(WIFI_NO_STORED_APS_FAILURE);
- return;
- }
-
- ESP_LOGD(TAG, "searching stored access points")
- while(bss_link != NULL)
- {
-
- system_soft_wdt_feed();
-
- os_memset(ssid, 0, 33);
- if (os_strlen(bss_link->ssid) <= 32)
- {
- os_memcpy(ssid, bss_link->ssid, os_strlen(bss_link->ssid));
- }
- else
- {
- os_memcpy(ssid, bss_link->ssid, 32);
- }
-
-
- for (ap_index=0;ap_index<num;ap_index++)
- {
- ESP_LOGV(TAG, "comparing aps \"%s\" and \"%s\"", ssid, stationConfig[ap_index].ssid);
- if (!strcmp(ssid, stationConfig[ap_index].ssid))
- {
- ESP_LOGD(TAG, "access point located: %s", ssid);
- wifi_config.ap_found = true;
- os_timer_arm(&wifi_config.timeout_timer, wifi_config.timeout_delay, false);
- wifi_station_ap_change(ap_index);
- wifi_station_connect();
- break;
- }
- }
- bss_link = bss_link->next.stqe_next;
-
-
- if (wifi_config.ap_found)
- {
- break;
- }
- }
- if (!wifi_config.ap_found)
- {
- if (wifi_config.fail_cb != NULL)
- wifi_config.fail_cb(WIFI_NO_AVAILABLE_APS_FAILURE);
- ESP_LOGD(TAG, "access point not found")
- }
- destory_linked_list();
- }
- static void ICACHE_FLASH_ATTR wifi_scan_done(void *arg, STATUS status)
- {
- uint8_t ssid[33];
- uint8_t bssid[6];
- if (status == OK)
- {
- bss_link = (struct bss_info *)arg;
- struct bss_info *bss_link_next, *bss_link_curr, *bss_link_prev, *bss_link_head;
- uint32_t i,numAP,j;
- if (bss_link == NULL)
- {
- if (wifi_config.fail_cb != NULL)
- wifi_config.fail_cb(WIFI_NO_AVAILABLE_APS_FAILURE);
- return;
- }
-
- bss_link = copy_linked_list(bss_link);
- bss_link_head = bss_link;
-
- numAP=0;
- while(bss_link != NULL)
- {
- numAP++;
- bss_link = bss_link->next.stqe_next;
- }
- ESP_LOGD(TAG, "number of APs found: %d", numAP);
- bss_link = bss_link_head;
-
- for(i=0;i<numAP-1;i++)
- {
- bss_link_prev = NULL;
- bss_link_curr = bss_link;
- bss_link_next = bss_link->next.stqe_next;
- for(j=0; j<numAP-1-i; j++)
- {
- system_soft_wdt_feed();
- if (bss_link_next->rssi > bss_link_curr->rssi) {
- if (bss_link_prev == NULL) {
-
- bss_link_curr->next.stqe_next = bss_link_next->next.stqe_next;
- bss_link_next->next.stqe_next = bss_link_curr;
- bss_link = bss_link_next;
- bss_link_prev = bss_link_next;
- bss_link_next = bss_link_curr->next.stqe_next;
- } else {
-
- bss_link_prev->next.stqe_next = bss_link_next;
- bss_link_curr->next.stqe_next = bss_link_next->next.stqe_next;
- bss_link_next->next.stqe_next = bss_link_curr;
- bss_link_prev = bss_link_next;
- bss_link_next = bss_link_curr->next.stqe_next;
- }
- } else {
-
- bss_link_prev = bss_link_curr;
- bss_link_curr = bss_link_next;
- bss_link_next = bss_link_next->next.stqe_next;
- }
- }
- }
- bss_link_head = bss_link;
-
- while (bss_link != NULL) {
- os_memset(ssid, 0, 33);
- os_memset(bssid, 0, 6);
- if (os_strlen(bss_link->ssid) <= 32) {
- os_memcpy(ssid, bss_link->ssid, os_strlen(bss_link->ssid));
- } else {
- os_memcpy(ssid, bss_link->ssid, 32);
- }
- ESP_LOGD(TAG, "(%d,\"%s\",%x, %d)", bss_link->authmode, ssid, bssid, bss_link->rssi);
- bss_link = bss_link->next.stqe_next;
- }
- bss_link = bss_link_head;
- head_bss_link = bss_link_head;
- wifi_set_event_handler_cb(wifi_event_handler_cb);
- wifi_process();
- }
- else
- {
- ESP_LOGD(TAG, "scan failed");
- if (wifi_config.fail_cb != NULL)
- wifi_config.fail_cb(WIFI_SCAN_FAILURE);
- wifi_config.wifi_process = false;
- }
- }
- void ICACHE_FLASH_ATTR WiFi_Initialize(void)
- {
- wifi_set_opmode(STATION_MODE);
- wifi_station_ap_number_set(5);
- wifi_station_disconnect();
- wifi_station_set_auto_connect(false);
- wifi_config.fail_cb = NULL;
- wifi_config.success_cb = NULL;
- }
- void ICACHE_FLASH_ATTR WiFi_Disconnect(void)
- {
- wifi_config.ip_flag = false;
- wifi_config.ap_flag = false;
- wifi_station_disconnect();
- }
- void ICACHE_FLASH_ATTR WiFi_SetCallbacks(wifi_success_function_t success_cb, wifi_fail_function_t fail_cb)
- {
- wifi_config.success_cb = success_cb;
- wifi_config.fail_cb = fail_cb;
- }
- void ICACHE_FLASH_ATTR WiFi_Connect(uint32_t timeout_delay)
- {
- wifi_config.timeout_delay = timeout_delay;
- wifi_config.ip_flag = false;
- wifi_config.ap_flag = false;
- wifi_config.ap_found = false;
- wifi_config.wifi_process = true;
- wifi_set_event_handler_cb(NULL);
- os_timer_disarm(&wifi_config.timeout_timer);
- os_timer_setfn(&wifi_config.timeout_timer, (os_timer_func_t *)wifi_timeout_cb, NULL);
-
-
- ESP_LOGI(TAG, "starting Wi-Fi scan");
- wifi_station_scan(NULL, wifi_scan_done);
- }
|