FluxDC/managed_components/78__esp-wifi-connect/include/wifi_station.h
2025-03-14 13:42:15 +08:00

64 lines
1.9 KiB
C++

#ifndef _WIFI_STATION_H_
#define _WIFI_STATION_H_
#include <string>
#include <vector>
#include <functional>
#include <esp_event.h>
#include <esp_timer.h>
#include <esp_wifi_types_generic.h>
struct WifiApRecord {
std::string ssid;
std::string password;
int channel;
wifi_auth_mode_t authmode;
uint8_t bssid[6];
};
class WifiStation {
public:
static WifiStation& GetInstance();
void AddAuth(const std::string &&ssid, const std::string &&password);
void Start();
void Stop();
bool IsConnected();
bool WaitForConnected(int timeout_ms = 10000);
int8_t GetRssi();
std::string GetSsid() const { return ssid_; }
std::string GetIpAddress() const { return ip_address_; }
uint8_t GetChannel();
void SetPowerSaveMode(bool enabled);
void OnConnect(std::function<void(const std::string& ssid)> on_connect);
void OnConnected(std::function<void(const std::string& ssid)> on_connected);
void OnScanBegin(std::function<void()> on_scan_begin);
private:
WifiStation();
~WifiStation();
WifiStation(const WifiStation&) = delete;
WifiStation& operator=(const WifiStation&) = delete;
EventGroupHandle_t event_group_;
esp_timer_handle_t timer_handle_ = nullptr;
esp_event_handler_instance_t instance_any_id_ = nullptr;
esp_event_handler_instance_t instance_got_ip_ = nullptr;
std::string ssid_;
std::string password_;
std::string ip_address_;
int reconnect_count_ = 0;
std::function<void(const std::string& ssid)> on_connect_;
std::function<void(const std::string& ssid)> on_connected_;
std::function<void()> on_scan_begin_;
std::vector<WifiApRecord> connect_queue_;
void HandleScanResult();
void StartConnect();
static void WifiEventHandler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data);
static void IpEventHandler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data);
};
#endif // _WIFI_STATION_H_