Как большинство людей оценивает качество сигнала 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 и местных точек доступа. Работает.