33 ESPWifi(
const char *wifiSsid =
nullptr,
34 const char *wifiPassword =
nullptr,
35 unsigned char *ip =
nullptr)
36 :
Wifi(wifiSsid, wifiPassword, ip) {
40 bool isReady()
override {
41 return WiFi.status() == WL_CONNECTED;
44 static void printConnectionDetails() {
45 SUPLA_LOG_INFO(
"Connected BSSID: %s", WiFi.BSSIDstr().c_str());
46 SUPLA_LOG_INFO(
"local IP: %s", WiFi.localIP().toString().c_str());
47 SUPLA_LOG_INFO(
"subnetMask: %s", WiFi.subnetMask().toString().c_str());
48 SUPLA_LOG_INFO(
"gatewayIP: %s", WiFi.gatewayIP().toString().c_str());
49 int rssi = WiFi.RSSI();
50 SUPLA_LOG_INFO(
"Signal strength (RSSI): %d dBm", rssi);
53 void setup()
override {
58 if (!wifiConfigured) {
60 WiFi.setHostname(hostname);
61 wifiConfigured =
true;
62#ifdef ARDUINO_ARCH_ESP8266
64 WiFi.onStationModeGotIP([](
const WiFiEventStationModeGotIP &event) {
66 ESPWifi::printConnectionDetails();
68 disconnectedEventHandler = WiFi.onStationModeDisconnected(
69 [](
const WiFiEventStationModeDisconnected &event) {
71 SUPLA_LOG_INFO(
"WiFi station disconnected");
74 WiFiEventId_t event_gotIP = WiFi.onEvent(
75 [](WiFiEvent_t event, WiFiEventInfo_t info) {
76 Supla::InputNoiseGuard::NotifyWifiStaConnected();
77 ESPWifi::printConnectionDetails();
79 WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP);
83 WiFiEventId_t event_disconnected = WiFi.onEvent(
84 [](WiFiEvent_t event, WiFiEventInfo_t info) {
85 SUPLA_LOG_INFO(
"WiFi Station disconnected");
87 Supla::InputNoiseGuard::NotifyWifiStaDisconnected();
88 if (mode != Supla::DEVICE_MODE_CONFIG) {
92 WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
94 (void)(event_disconnected);
97 if (mode == Supla::DEVICE_MODE_CONFIG) {
98 Supla::InputNoiseGuard::NotifyWifiTransition();
99 WiFi.mode(WIFI_MODE_AP);
101 Supla::InputNoiseGuard::NotifyWifiTransition();
102 WiFi.mode(WIFI_MODE_STA);
104 SUPLA_LOG_INFO(
"WiFi: resetting WiFi connection");
105 DisconnectProtocols();
106 Supla::InputNoiseGuard::NotifyWifiTransition();
110 if (mode == Supla::DEVICE_MODE_CONFIG) {
111 SUPLA_LOG_INFO(
"WiFi: enter config mode with SSID: \"%s\"", hostname);
112 Supla::InputNoiseGuard::NotifyWifiTransition();
113 WiFi.mode(WIFI_AP_STA);
114 Supla::InputNoiseGuard::NotifyWifiTransition();
115 WiFi.softAP(hostname,
nullptr, 6);
116 startConfigModeScan();
119 SUPLA_LOG_INFO(
"WiFi: establishing connection with SSID: \"%s\"", ssid);
120 Supla::InputNoiseGuard::NotifyWifiTransition();
121 WiFi.mode(WIFI_MODE_STA);
122 if (hasStaticIpConfig()) {
123 const auto &cfg = getNetifConfig();
124 IPAddress localIp = toArduinoIpAddress(cfg.ip);
125 IPAddress gateway = toArduinoIpAddress(cfg.gateway);
126 IPAddress subnet = toArduinoIpAddress(cfg.netmask);
127 IPAddress dns1 = toArduinoIpAddress(cfg.dns1);
128 IPAddress dns2 = toArduinoIpAddress(cfg.dns2);
129 if (!WiFi.config(localIp, gateway, subnet, dns1, dns2)) {
130 SUPLA_LOG_WARNING(
"WiFi static IP config failed, continuing");
133 Supla::InputNoiseGuard::NotifyWifiTransition();
134 WiFi.begin(ssid, password);
136 WiFi.setHostname(hostname);
143 bool iterate()
override {
144 if (!configModeScanInProgress) {
145 return Supla::Wifi::iterate();
148 int scanResult = WiFi.scanComplete();
149 if (scanResult == WIFI_SCAN_RUNNING) {
153 configModeScanInProgress =
false;
154 auto cache = Supla::WifiScanResultCache::Instance();
155 cache->beginUpdate();
157 if (scanResult >= 0) {
158 for (
int i = 0; i < scanResult; i++) {
159 cache->addOrUpdate(WiFi.SSID(i).c_str(), WiFi.RSSI(i), WiFi.channel(i));
161 cache->finishUpdate(millis());
162 SUPLA_LOG_INFO(
"WiFi: config mode scan completed (%d networks)",
166 SUPLA_LOG_WARNING(
"WiFi: config mode scan failed (%d)", scanResult);
170 return Supla::Wifi::iterate();
173 void startConfigModeScan()
override {
174 if (mode != Supla::DEVICE_MODE_CONFIG || configModeScanInProgress) {
179 int scanResult = WiFi.scanNetworks(
true,
true);
180 configModeScanInProgress = (scanResult == WIFI_SCAN_RUNNING);
181 if (!configModeScanInProgress && scanResult >= 0) {
182 auto cache = Supla::WifiScanResultCache::Instance();
183 cache->beginUpdate();
184 for (
int i = 0; i < scanResult; i++) {
185 cache->addOrUpdate(WiFi.SSID(i).c_str(), WiFi.RSSI(i), WiFi.channel(i));
187 cache->finishUpdate(millis());
189 SUPLA_LOG_INFO(
"WiFi: config mode scan completed (%d networks)",
191 }
else if (!configModeScanInProgress) {
192 SUPLA_LOG_WARNING(
"WiFi: config mode scan start failed (%d)",
195 SUPLA_LOG_INFO(
"WiFi: config mode scan started");
199 void disable()
override {
204 allowDisable =
false;
205 configModeScanInProgress =
false;
206 SUPLA_LOG_DEBUG(
"[%s] disabling WiFi connection", getIntfName());
207 DisconnectProtocols();
209 Supla::InputNoiseGuard::NotifyWifiTransition();
210 WiFi.softAPdisconnect(
true);
211 Supla::InputNoiseGuard::NotifyWifiTransition();
212 WiFi.disconnect(
true);
213 Supla::InputNoiseGuard::NotifyWifiTransition();
218 void enableSSL(
bool value) {
219 setSSLEnabled(value);
223 channelState->Fields |= SUPLA_CHANNELSTATE_FIELD_IPV4 |
224 SUPLA_CHANNELSTATE_FIELD_MAC |
225 SUPLA_CHANNELSTATE_FIELD_WIFIRSSI |
226 SUPLA_CHANNELSTATE_FIELD_WIFISIGNALSTRENGTH;
227 channelState->IPv4 = WiFi.localIP();
228 getMacAddr(channelState->MAC);
229 int rssi = WiFi.RSSI();
230 channelState->WiFiRSSI = rssi;
231 channelState->WiFiSignalStrength = Supla::rssiToSignalStrength(rssi);
234 bool getMacAddr(uint8_t *out)
override {
235#ifdef ARDUINO_ARCH_ESP8266
236 WiFi.macAddress(out);
238#ifdef ESP_ARDUINO_VERSION_MAJOR
239#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0)
241 ::Network.macAddress(out);
244 WiFi.macAddress(out);
251 void uninit()
override {
255 uint32_t getIP()
override {
256 return WiFi.localIP();
259 const char *getIntfName()
const override {
264 bool wifiConfigured =
false;
265 bool configModeScanInProgress =
false;
266 bool allowDisable =
false;
268#ifdef ARDUINO_ARCH_ESP8266
269 WiFiEventHandler gotIpEventHandler, disconnectedEventHandler;
272 bool isConfigModeScanInProgress()
const override {
273 return configModeScanInProgress;