78 lines
2.3 KiB
C++
78 lines
2.3 KiB
C++
#include "WiFi.hpp"
|
|
#include "esp_wifi.h"
|
|
#include "esp_event.h"
|
|
#include "cJSON.h" // Native replacement for ArduinoJson
|
|
#include "BLE.hpp"
|
|
|
|
void init_wifi() {
|
|
// 1. Init Network Interface
|
|
ESP_ERROR_CHECK(esp_netif_init());
|
|
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
|
esp_netif_create_default_wifi_sta();
|
|
|
|
// 2. Init WiFi Driver
|
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
|
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
|
|
|
|
// 3. Set Mode to Station (Client)
|
|
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
|
|
ESP_ERROR_CHECK(esp_wifi_start());
|
|
}
|
|
|
|
void scanAndUpdateSSIDList() {
|
|
printf("Starting WiFi Scan...\n");
|
|
|
|
// 1. Start Scan (Blocking Mode = true)
|
|
// In blocking mode, this function waits here until scan is done (~2 seconds)
|
|
wifi_scan_config_t scan_config = {
|
|
.ssid = NULL,
|
|
.bssid = NULL,
|
|
.channel = 0,
|
|
.show_hidden = false
|
|
};
|
|
esp_err_t err = esp_wifi_scan_start(&scan_config, true);
|
|
|
|
if (err != ESP_OK) {
|
|
printf("Scan failed!\n");
|
|
return;
|
|
}
|
|
|
|
// 2. Get the results
|
|
uint16_t ap_count = 0;
|
|
esp_wifi_scan_get_ap_num(&ap_count);
|
|
|
|
// Limit to 10 networks to save RAM/BLE MTU space
|
|
if (ap_count > 10) ap_count = 10;
|
|
|
|
wifi_ap_record_t *ap_list = (wifi_ap_record_t *)malloc(sizeof(wifi_ap_record_t) * ap_count);
|
|
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&ap_count, ap_list));
|
|
|
|
// 3. Build JSON using cJSON
|
|
cJSON *root = cJSON_CreateArray();
|
|
|
|
for (int i = 0; i < ap_count; i++) {
|
|
cJSON *item = cJSON_CreateObject();
|
|
// ESP-IDF stores SSID as uint8_t, cast to char*
|
|
cJSON_AddStringToObject(item, "ssid", (char *)ap_list[i].ssid);
|
|
cJSON_AddNumberToObject(item, "rssi", ap_list[i].rssi);
|
|
// Add encryption type if you want (optional)
|
|
cJSON_AddNumberToObject(item, "auth", ap_list[i].authmode);
|
|
|
|
cJSON_AddItemToArray(root, item);
|
|
}
|
|
|
|
// 4. Convert to String
|
|
char *json_string = cJSON_PrintUnformatted(root); // Compact JSON
|
|
printf("JSON: %s\n", json_string);
|
|
|
|
// 5. Update BLE
|
|
if (ssidListChar != nullptr) {
|
|
ssidListChar->setValue(std::string(json_string));
|
|
ssidListChar->notify();
|
|
}
|
|
|
|
// 6. Cleanup Memory (CRITICAL in C++)
|
|
free(ap_list);
|
|
cJSON_Delete(root); // This deletes all children (items) too
|
|
free(json_string); // cJSON_Print allocates memory, you must free it
|
|
} |