Skip to content

Commit 506f493

Browse files
[ESP32]: Update WiFi Scan Network Implementation for New API (#36714)
* esp32: Optimize WiFi Scan Handling with Single AP Record API * esp32: add separate ScanResponseIterator for new API changes * esp32: enable ESPScanResponseIterator for compatible IDF versions * esp32: add call for clear ap scan list, used single name for iterator * esp32: move iterator release call outside, code refactoring * esp32: relocate iternum variable for iterator compatibility with older IDF versions * Make SetApData() method private
1 parent 75ab4c9 commit 506f493

File tree

2 files changed

+58
-12
lines changed

2 files changed

+58
-12
lines changed

src/platform/ESP32/NetworkCommissioningDriver.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,29 @@ void ESPWiFiDriver::OnScanWiFiNetworkDone()
387387
return;
388388
}
389389

390+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 3)
391+
if (CHIP_NO_ERROR == DeviceLayer::SystemLayer().ScheduleLambda([ap_number]() {
392+
ESPScanResponseIterator iter(ap_number);
393+
if (GetInstance().mpScanCallback)
394+
{
395+
GetInstance().mpScanCallback->OnFinished(Status::kSuccess, CharSpan(), &iter);
396+
GetInstance().mpScanCallback = nullptr;
397+
}
398+
else
399+
{
400+
ChipLogError(DeviceLayer, "can't find the ScanCallback function");
401+
}
402+
iter.Release();
403+
}))
404+
{
405+
}
406+
else
407+
{
408+
ChipLogError(DeviceLayer, "can't schedule the scan result processing");
409+
mpScanCallback->OnFinished(Status::kUnknownError, CharSpan(), nullptr);
410+
mpScanCallback = nullptr;
411+
}
412+
#else
390413
// Since this is the dynamic memory allocation, restrict it to a configured limit
391414
ap_number = std::min(static_cast<uint16_t>(CHIP_DEVICE_CONFIG_MAX_SCAN_NETWORKS_RESULTS), ap_number);
392415

@@ -430,6 +453,7 @@ void ESPWiFiDriver::OnScanWiFiNetworkDone()
430453
mpScanCallback->OnFinished(Status::kUnknownError, CharSpan(), nullptr);
431454
mpScanCallback = nullptr;
432455
}
456+
#endif // ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 3)
433457
}
434458

435459
void ESPWiFiDriver::OnNetworkStatusChange()

src/platform/ESP32/NetworkCommissioningDriver.h

+34-12
Original file line numberDiff line numberDiff line change
@@ -36,34 +36,56 @@ BitFlags<WiFiSecurityBitmap> ConvertSecurityType(wifi_auth_mode_t authMode);
3636
class ESPScanResponseIterator : public Iterator<WiFiScanResponse>
3737
{
3838
public:
39+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 3)
40+
ESPScanResponseIterator(const size_t size) : mSize(size) {}
41+
#else
3942
ESPScanResponseIterator(const size_t size, const wifi_ap_record_t * scanResults) : mSize(size), mpScanResults(scanResults) {}
43+
#endif // ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 3)
4044
size_t Count() override { return mSize; }
45+
4146
bool Next(WiFiScanResponse & item) override
4247
{
48+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 3)
49+
wifi_ap_record_t ap_record;
50+
VerifyOrReturnValue(esp_wifi_scan_get_ap_record(&ap_record) == ESP_OK, false);
51+
SetApData(item, ap_record);
52+
#else
4353
if (mIternum >= mSize)
4454
{
4555
return false;
4656
}
47-
48-
item.security = ConvertSecurityType(mpScanResults[mIternum].authmode);
49-
static_assert(chip::DeviceLayer::Internal::kMaxWiFiSSIDLength <= UINT8_MAX, "SSID length might not fit in item.ssidLen");
50-
item.ssidLen = static_cast<uint8_t>(
51-
strnlen(reinterpret_cast<const char *>(mpScanResults[mIternum].ssid), chip::DeviceLayer::Internal::kMaxWiFiSSIDLength));
52-
item.channel = mpScanResults[mIternum].primary;
53-
item.wiFiBand = chip::DeviceLayer::NetworkCommissioning::WiFiBand::k2g4;
54-
item.rssi = mpScanResults[mIternum].rssi;
55-
memcpy(item.ssid, mpScanResults[mIternum].ssid, item.ssidLen);
56-
memcpy(item.bssid, mpScanResults[mIternum].bssid, 6);
57-
57+
SetApData(item, mpScanResults[mIternum]);
5858
mIternum++;
59+
#endif // ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 3)
5960
return true;
6061
}
61-
void Release() override {}
62+
63+
void Release() override
64+
{
65+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 3)
66+
esp_wifi_clear_ap_list();
67+
#endif // ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 3)
68+
}
6269

6370
private:
6471
const size_t mSize;
72+
#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 1, 3)
6573
const wifi_ap_record_t * mpScanResults;
6674
size_t mIternum = 0;
75+
#endif // ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 1, 3)
76+
77+
void SetApData(WiFiScanResponse & item, wifi_ap_record_t ap_record)
78+
{
79+
item.security = ConvertSecurityType(ap_record.authmode);
80+
static_assert(chip::DeviceLayer::Internal::kMaxWiFiSSIDLength <= UINT8_MAX, "SSID length might not fit in item.ssidLen");
81+
item.ssidLen = static_cast<uint8_t>(
82+
strnlen(reinterpret_cast<const char *>(ap_record.ssid), chip::DeviceLayer::Internal::kMaxWiFiSSIDLength));
83+
item.channel = ap_record.primary;
84+
item.wiFiBand = chip::DeviceLayer::NetworkCommissioning::WiFiBand::k2g4;
85+
item.rssi = ap_record.rssi;
86+
memcpy(item.ssid, ap_record.ssid, item.ssidLen);
87+
memcpy(item.bssid, ap_record.bssid, sizeof(item.bssid));
88+
}
6789
};
6890

6991
class ESPWiFiDriver final : public WiFiDriver

0 commit comments

Comments
 (0)