[ESP32S3 Undocumented] ESP32 WiFi и оценка качества связи

Как большинство людей оценивает качество сигнала WiFi или какой-нибудь LoRa?

Очень просто - по RSSI. Чем больше число - тем лучше.

Используют обычно библиотеку WiFi Library для этих дел - библиотека умеет сканировать и получать список доступных сетей и их RSSI. Смотрим на RSSI и принимаем решение коннектиться или нет.

Этот подход - не совсем правильный.

RSSI показывает уровень сигнала, но ничегошеньки не говорит об уровне шума. А именно отношение сигнал\шум и определяет качество связи.

К счастью, в ESP32, ESP32-S3 и ESP32-S2 (остальные не проверял) есть внутренняя функция (зашита в ROM), которая замеряет RF Noise Floor. Функция отсутствует в заголовочных файлах, но ничего страшного, вот она:

extern "C" {
  int rom_check_noise_floor(void);
};

Возвращаемый результат - в четвертях dBm; Если WiFi не инициализирован, то функция возвращает значения >0.

Теперь, для более точной оценки качества связи можно использовать такой псевдокод\правило:

int rssi = ...                        // читаем RSSI откуда-нибудь
int nf = rom_check_noise_floor() / 4; // читаем Noise Floor

int snr = rssi - nf;                  // вычисляем отношение сигнал\шум 

Полученный SNR сравнивается с табличкой:

| SNR      | качество       |
+ -------- + -------------- +
| 25–40 dB | отлично        |
| 20 dB    | нормально      |
| 10–15 dB | уже плохо      |
| < 10 dB  | граница работы |

Все вышеописанное было протестированно на ESP32-S3, на каком-то скетче-примере от библиотеки WiFi и местных точек доступа. Работает.

4 лайка

Я правильно понимаю, что этот уровень зависит не от конкретной сети, а только от обстановки в точке приема?
То есть что с учетом шумов, что без - лучшая сеть для коннекта всегда та, у которой больше RSSI ?

Не знаю, кчли честно.

Но если хочется сделать палочки-деления уровня принимаемого сигнала (как в смарфоне, например), то лучше шум учитывать.