48 ESPWifi(
const char *wifiSsid =
nullptr,
49 const char *wifiPassword =
nullptr,
50 unsigned char *ip =
nullptr)
51 : Wifi(wifiSsid, wifiPassword, ip) {
55 bool isReady()
override {
56 return WiFi.status() == WL_CONNECTED;
59 static void printConnectionDetails() {
60 SUPLA_LOG_INFO(
"Connected BSSID: %s", WiFi.BSSIDstr().c_str());
61 SUPLA_LOG_INFO(
"local IP: %s", WiFi.localIP().toString().c_str());
62 SUPLA_LOG_INFO(
"subnetMask: %s", WiFi.subnetMask().toString().c_str());
63 SUPLA_LOG_INFO(
"gatewayIP: %s", WiFi.gatewayIP().toString().c_str());
64 int rssi = WiFi.RSSI();
65 SUPLA_LOG_INFO(
"Signal strength (RSSI): %d dBm", rssi);
68 void setup()
override {
73 if (!wifiConfigured) {
75 WiFi.setHostname(hostname);
76 wifiConfigured =
true;
77#ifdef ARDUINO_ARCH_ESP8266
79 WiFi.onStationModeGotIP([](
const WiFiEventStationModeGotIP &event) {
81 ESPWifi::printConnectionDetails();
83 disconnectedEventHandler = WiFi.onStationModeDisconnected(
84 [](
const WiFiEventStationModeDisconnected &event) {
86 SUPLA_LOG_INFO(
"WiFi station disconnected");
89 WiFiEventId_t event_gotIP = WiFi.onEvent(
90 [](WiFiEvent_t event, WiFiEventInfo_t info) {
91 Supla::InputNoiseGuard::NotifyWifiStaConnected();
92 ESPWifi::printConnectionDetails();
94 WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
98 WiFiEventId_t event_disconnected = WiFi.onEvent(
99 [](WiFiEvent_t event, WiFiEventInfo_t info) {
100 SUPLA_LOG_INFO(
"WiFi Station disconnected");
102 Supla::InputNoiseGuard::NotifyWifiStaDisconnected();
103 if (mode != Supla::DEVICE_MODE_CONFIG) {
107 WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
109 (void)(event_disconnected);
112 if (mode == Supla::DEVICE_MODE_CONFIG) {
113 Supla::InputNoiseGuard::NotifyWifiTransition();
114 WiFi.mode(WIFI_MODE_AP);
116 Supla::InputNoiseGuard::NotifyWifiTransition();
117 WiFi.mode(WIFI_MODE_STA);
119 SUPLA_LOG_INFO(
"WiFi: resetting WiFi connection");
120 DisconnectProtocols();
121 Supla::InputNoiseGuard::NotifyWifiTransition();
125 if (mode == Supla::DEVICE_MODE_CONFIG) {
126 SUPLA_LOG_INFO(
"WiFi: enter config mode with SSID: \"%s\"", hostname);
127 Supla::InputNoiseGuard::NotifyWifiTransition();
128 WiFi.mode(WIFI_AP_STA);
129 Supla::InputNoiseGuard::NotifyWifiTransition();
130 WiFi.softAP(hostname,
nullptr, 6);
131 startConfigModeScan();
134 SUPLA_LOG_INFO(
"WiFi: establishing connection with SSID: \"%s\"", ssid);
135 Supla::InputNoiseGuard::NotifyWifiTransition();
136 WiFi.mode(WIFI_MODE_STA);
137 if (hasStaticIpConfig()) {
138 const auto &cfg = getNetifConfig();
139 IPAddress localIp = toArduinoIpAddress(cfg.ip);
140 IPAddress gateway = toArduinoIpAddress(cfg.gateway);
141 IPAddress subnet = toArduinoIpAddress(cfg.netmask);
142 IPAddress dns1 = toArduinoIpAddress(cfg.dns1);
143 IPAddress dns2 = toArduinoIpAddress(cfg.dns2);
144 if (!WiFi.config(localIp, gateway, subnet, dns1, dns2)) {
145 SUPLA_LOG_WARNING(
"WiFi static IP config failed, continuing");
148 Supla::InputNoiseGuard::NotifyWifiTransition();
149 WiFi.begin(ssid, password);
151 WiFi.setHostname(hostname);
158 bool iterate()
override {
159 if (!configModeScanInProgress) {
160 return Supla::Wifi::iterate();
163 int scanResult = WiFi.scanComplete();
164 if (scanResult == WIFI_SCAN_RUNNING) {
168 configModeScanInProgress =
false;
169 auto cache = Supla::WifiScanResultCache::Instance();
170 cache->beginUpdate();
172 if (scanResult >= 0) {
173 for (
int i = 0; i < scanResult; i++) {
174 cache->addOrUpdate(WiFi.SSID(i).c_str(), WiFi.RSSI(i), WiFi.channel(i));
176 cache->finishUpdate(millis());
177 SUPLA_LOG_INFO(
"WiFi: config mode scan completed (%d networks)",
181 SUPLA_LOG_WARNING(
"WiFi: config mode scan failed (%d)", scanResult);
185 return Supla::Wifi::iterate();
188 void startConfigModeScan()
override {
189 if (mode != Supla::DEVICE_MODE_CONFIG || configModeScanInProgress) {
194 int scanResult = WiFi.scanNetworks(
true,
true);
195 configModeScanInProgress = (scanResult == WIFI_SCAN_RUNNING);
196 if (!configModeScanInProgress && scanResult >= 0) {
197 auto cache = Supla::WifiScanResultCache::Instance();
198 cache->beginUpdate();
199 for (
int i = 0; i < scanResult; i++) {
200 cache->addOrUpdate(WiFi.SSID(i).c_str(), WiFi.RSSI(i), WiFi.channel(i));
202 cache->finishUpdate(millis());
204 SUPLA_LOG_INFO(
"WiFi: config mode scan completed (%d networks)",
206 }
else if (!configModeScanInProgress) {
207 SUPLA_LOG_WARNING(
"WiFi: config mode scan start failed (%d)",
210 SUPLA_LOG_INFO(
"WiFi: config mode scan started");
214 void disable()
override {
219 allowDisable =
false;
220 configModeScanInProgress =
false;
221 SUPLA_LOG_DEBUG(
"[%s] disabling WiFi connection", getIntfName());
222 DisconnectProtocols();
224 Supla::InputNoiseGuard::NotifyWifiTransition();
225 WiFi.softAPdisconnect(
true);
226 Supla::InputNoiseGuard::NotifyWifiTransition();
227 WiFi.disconnect(
true);
228 Supla::InputNoiseGuard::NotifyWifiTransition();
233 void enableSSL(
bool value) {
234 setSSLEnabled(value);
238 channelState->Fields |= SUPLA_CHANNELSTATE_FIELD_IPV4 |
239 SUPLA_CHANNELSTATE_FIELD_MAC |
240 SUPLA_CHANNELSTATE_FIELD_WIFIRSSI |
241 SUPLA_CHANNELSTATE_FIELD_WIFISIGNALSTRENGTH;
242 channelState->IPv4 = WiFi.localIP();
243 getMacAddr(channelState->MAC);
244 int rssi = WiFi.RSSI();
245 channelState->WiFiRSSI = rssi;
246 channelState->WiFiSignalStrength = Supla::rssiToSignalStrength(rssi);
249 bool getMacAddr(uint8_t *out)
override {
250#ifdef ARDUINO_ARCH_ESP8266
251 WiFi.macAddress(out);
253#ifdef ESP_ARDUINO_VERSION_MAJOR
254#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0)
259 WiFi.macAddress(out);
266 void uninit()
override {
270 uint32_t getIP()
override {
271 return WiFi.localIP();
274 const char *getIntfName()
const override {
279 bool wifiConfigured =
false;
280 bool configModeScanInProgress =
false;
281 bool allowDisable =
false;
283#ifdef ARDUINO_ARCH_ESP8266
284 WiFiEventHandler gotIpEventHandler, disconnectedEventHandler;
287 bool isConfigModeScanInProgress()
const override {
288 return configModeScanInProgress;