Uno Wifi rev2 - после долгого времени отключается

У вас есть Arduino Uno Wifi Rev2 с этим небольшим Wi-Fi-модулем U-blox NINA.

Все отлично работает, однако через долгое время (точнее сказать не могу, но мы говорим здесь о неделях, если не месяцах) вдруг отключается.

Эта плата находится без присмотра, и единственный способ восстановить ее — перезагрузить Arduino.

Вот мой код:

WiFiServer server(PORT);

void setup() {
  connectToWifi();
  server.begin();
}

void connectToWifi() {
  // попытка подключения к сети Wi-Fi:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:
    status = WiFi.begin(ssid, pass);
    if (status == WL_CONNECTED) break;

    // ждем 10 секунд для соединения:
    delay(10000);
  }
}

void loop() {
  // проверить статус WiFi
  if (WL_CONNECTED != WiFi.status()) connectToWifi();

  WiFiClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        ... (other wifi-unrelated code)

        // закрыть соединение:
        client.stop();
      }
    }
  } 
}

Когда он отключается от Wi-Fi, консоль диспетчера dhcp маршрутизатора показывает его статус "ожидание".

Примечание: я единственный клиент, и в Arduino одновременно отправляется только один символ, после чего сокет закрывается. Очень маловероятно, что клиент зависнет, а плата застряла в цикле while.

Это известная проблема, или мне нужно больше разбираться в этом?

Спасибо!

, 👍0

Обсуждение

Вы используете новейшие версии прошивки и библиотеки?, @Juraj

Я обновил его в конце прошлого года. До тех пор он остается без присмотра, и это уже второй раз, когда такая ситуация. (после первого раза нам пришлось подать питание на плату). Поэтому я не уверен, что это последняя версия, и я не могу ее запросить, так как она находится далеко и потеряла связь., @Daniel


1 ответ


1

Поскольку вы не предоставили подробностей, необходимо кое-что проверить

  • ваша прошивка Nina > 1.2.4
  • Если нет, обновитесь до последней версии 1.3.0 с помощью WiFi101-FirmwareUpdater-Plugin 0.10. .10 входит в состав ArduinoIDE 1.8.12 или более поздней версии
  • Отключиться перед повторным подключением (в случае отключения маршрутизатора) и
  • Закройте все соединения перед отправкой/получением. Это освободит сокет на модуле Nina. Остановите клиент после выполнения необходимых действий с помощью client.stop();
  • Если в настройке есть какой-либо код подключения к серверу, его следует запустить в процедуре повторного подключения (поскольку вы не включили настройку) просто в качестве подсказки
  • Убедитесь, что по прошествии определенного времени while (status != WL_CONNECTED) и while (client.connected()) не работают, а тестирование ошибок выполняется поместите, например,
    if (status==WL_DISCONNECTED || status==WL_CONNECTION_LOST){.. сделайте что-нибудь, чтобы изменить это ..}

  • Если ничего не помогает, реализуйте процедуру, которая проверяет сигнал и перезапускает скетч, если маршрутизатор отключился (по какой-либо причине).

Код отключения:

void connectToWifi() {
    // Эта новая строка необходима для разрыва предыдущего соединения, иначе
    // он попытается использовать старое соединение и никогда не переподключится в случае сбоя соединения
    status = WiFi.disconnect();

    // попытка подключения к сети Wi-Fi:
    while (status != WL_CONNECTED) {
    .... REST of your code ...
    }
}

Подсказка (поскольку вы не показали настройки), если у вас есть что-то вроде

client.connect(server, 80);

переместите его в процедуру переподключения в виде

if (client.connect(server, 80)) {
    Serial.println("connecting...");
.... REST of reconnect ...
} 

Перезапустить код при потере сигнала Wi-Fi

void(* resetFunc) (void) = 0; // Объявить функцию сброса по адресу 0

void loop() {
  if (WiFi.RSSI() == 0) // Проверяет, не потерян ли сигнал Wi-Fi.
  { resetFunc(); // Вызывает сброс
  }
// Остальной код идет сюда.
}

Это в целом должно обеспечить долгую и стабильную работу клиента

,

Спасибо, пункты 1-2-3 могу проверить, когда вернусь к плате. client.stop(); на самом деле вызывается, я обновил Q. server.begin вызывается только один раз в настройке - Q обновляется. Мне нужно вызывать server.begin после каждого вызова connectToWifi?, @Daniel

Нет, не server.begin(), это нормально - пожалуйста, дайте информацию о вашей схеме сети. Есть ли клиенты, подключенные к UNO (server.begin указывает на это), и UNO действует как клиент для другого сервера. Или UNO единственный сервер? . Трудно работать с хлебными крошками (какие библиотеки вы используете, как называется String clas, что прикреплено к UNO, ... Чем больше информации, тем точнее ответы вы получите, @Codebreaker007

UNO работает как сервер. Один клиент очень редко (раз в неделю) подключается к нему, отправляет 1 символ в качестве команды, затем UNO отвечает client.print("response"); (всегда только 1 строка). Очень простая логика: UNO считывает какой-то GPIO и ставит его в ответ., @Daniel

У меня была версия 1.2.4 на NINA, теперь обновлена до 1.3.0. Также добавлена строка status = WiFi.disconnect(); в подпрограмму connectToWifi. Держу пальцы скрещенными., @Daniel