0
0
Fork 0
wireless-proxy-esp32/project_components/wifi_manager/wifi_api.c

151 lines
4.4 KiB
C

#include "wifi_api.h"
#include "wifi_manager.h"
#include "wifi_configuration.h"
#include "wifi_storage.h"
#include <esp_wifi.h>
void wifi_api_sta_get_ap_info(wifi_api_ap_info_t *ap_info)
{
wifi_ap_record_t ap_record = {0};
int err;
esp_wifi_sta_get_ap_info(&ap_record);
strncpy(ap_info->ssid, (char *)ap_record.ssid, sizeof(ap_info->ssid));
strncpy(ap_info->mac, (char *)ap_record.bssid, sizeof(ap_info->mac));
ap_info->rssi = ap_record.rssi;
ap_info->password[0] = '\0';
esp_netif_t *sta_netif = wifi_manager_get_sta_netif();
esp_netif_ip_info_t ip_info;
esp_netif_get_ip_info(sta_netif, &ip_info);
ip4_addr_set(&ap_info->ip, &ip_info.ip);
ip4_addr_set(&ap_info->gateway, &ip_info.gw);
ip4_addr_set(&ap_info->netmask, &ip_info.netmask);
esp_netif_dns_info_t dns_info;
err = esp_netif_get_dns_info(wifi_manager_get_sta_netif(),
ESP_NETIF_DNS_MAIN, &dns_info);
if (err) {
ap_info->dns_main.addr = ap_info->gateway.addr;
} else {
ap_info->dns_main.addr = dns_info.ip.u_addr.ip4.addr;
}
err = esp_netif_get_dns_info(wifi_manager_get_sta_netif(),
ESP_NETIF_DNS_BACKUP, &dns_info);
if (err) {
ap_info->dns_backup.addr = ap_info->gateway.addr;
} else {
ap_info->dns_backup.addr = dns_info.ip.u_addr.ip4.addr;
}
}
void wifi_api_ap_get_info(wifi_api_ap_info_t *ap_info)
{
wifi_credential_t credential;
int err = wifi_data_get_ap_credential(&credential);
if (err) {
strncpy(ap_info->ssid, WIFI_DEFAULT_AP_SSID, strlen(WIFI_DEFAULT_AP_SSID)+1);
strncpy(ap_info->password, WIFI_DEFAULT_AP_PASS, strlen(WIFI_DEFAULT_AP_PASS)+1);
} else {
strncpy(ap_info->ssid, credential.ssid, sizeof(ap_info->ssid));
strncpy(ap_info->password, credential.password, sizeof(ap_info->password));
}
esp_wifi_get_mac(WIFI_IF_AP, (uint8_t *) &ap_info->mac);
IP4_ADDR_EXPAND(&ap_info->ip, WIFI_DEFAULT_AP_IP);
IP4_ADDR_EXPAND(&ap_info->gateway, WIFI_DEFAULT_AP_GATEWAY);
IP4_ADDR_EXPAND(&ap_info->netmask, WIFI_DEFAULT_AP_NETMASK);
ap_info->rssi = 0;
esp_netif_dns_info_t dns_info;
err = esp_netif_get_dns_info(wifi_manager_get_ap_netif(),
ESP_NETIF_DNS_MAIN, &dns_info);
if (err) {
ap_info->dns_main.addr = ap_info->gateway.addr;
} else {
ap_info->dns_main.addr = dns_info.ip.u_addr.ip4.addr;
}
err = esp_netif_get_dns_info(wifi_manager_get_ap_netif(),
ESP_NETIF_DNS_BACKUP, &dns_info);
if (err) {
ap_info->dns_backup.addr = ap_info->gateway.addr;
} else {
ap_info->dns_backup.addr = dns_info.ip.u_addr.ip4.addr;
}
}
static int rssi_comp(const void *a, const void *b)
{
const wifi_api_ap_scan_info_t *r1 = a;
const wifi_api_ap_scan_info_t *r2 = b;
return r2->rssi - r1->rssi;
}
/**
* @brief blocking function
*/
int wifi_api_get_scan_list(uint16_t *number, wifi_api_ap_scan_info_t *ap_info)
{
wifi_ap_record_t *records;
int err;
records = malloc(*number * sizeof(wifi_ap_record_t));
if (records == NULL) {
return ESP_ERR_NO_MEM;
}
err = wifi_manager_get_scan_list(number, records);
if (err) {
printf("get scan list err\n");
free(records);
return err;
}
for (int i = 0; i < *number; ++i) {
printf("%d %d %s\n", i, records[i].rssi, records[i].ssid);
strncpy(ap_info[i].ssid, (char *) records[i].ssid, sizeof(ap_info[i].ssid));
strncpy(ap_info[i].mac, (char *) records[i].bssid, sizeof(ap_info[i].mac));
ap_info[i].rssi = records[i].rssi;
}
free(records);
qsort(ap_info, *number, sizeof(wifi_api_ap_scan_info_t), rssi_comp);
return 0;
}
static wifi_api_scan_done_cb scan_done_cb;
static void wifi_manager_scan_done(uint16_t ap_found, wifi_ap_record_t *records, void *arg)
{
wifi_api_ap_scan_info_t *ap_info;
ap_info = malloc(ap_found * sizeof(wifi_api_ap_scan_info_t));
for (int i = 0; i < ap_found; ++i) {
strncpy(ap_info[i].ssid, (char *) records[i].ssid, sizeof(ap_info[i].ssid));
strncpy(ap_info[i].mac, (char *) records[i].bssid, sizeof(ap_info[i].mac));
ap_info[i].rssi = records[i].rssi;
}
printf("wifi api scan done\n");
scan_done_cb(ap_found, ap_info, arg);
}
int wifi_api_connect(const char *ssid, const char *password)
{
return wifi_manager_connect(ssid, password);
}
int wifi_api_disconnect(void)
{
return wifi_manager_disconnect();
}
int wifi_api_sta_set_static_conf(wifi_api_sta_ap_static_info_t *static_info)
{
int err = wifi_manager_sta_set_static_conf(static_info);
if (err) {
return err;
}
return wifi_data_save_static(static_info);
}