Ошибка Udp.endPacket

Я пытаюсь отправить измерения по UDP, но функция Udp.endPacket постоянно дает сбой.

Я использую Arduino Uno WiFi rev 2, библиотеку WiFiNINA версии 1.4.0 и прошивку WiFiNINA версии 1.2.1, которая кажется последней доступной.

Настройка соединения WiFi работает, получен правильный IP-адрес в сети 192.168.3.0/24.

Это фрагмент моего кода:

const char* udpDestIP = "192.168.3.126";
const int udpDestPort = 1844;
WiFiUDP Udp;

void loop() {
  // устанавливаем переменные для результата расстояния:
  long cm;

  // выполнить измерение
  cm = measureDistance();

  // проверить ложные измерения и повторить при необходимости
  if(minDist < cm && cm < maxDist) {
    Serial.print(cm);
    Serial.print(" cm");
    Serial.println();

    // Проверяем соединение WiFi и при необходимости переподключаемся
    if (WiFi.status() != WL_CONNECTED) {
      connectToWifi();
    }

    // Отправить по UDP
    //если(!Udp.beginPacket("192.168.3.255", udpDestPort)) {
    if(!Udp.beginPacket(udpDestIP, udpDestPort)) {
      Serial.println("beginPacket fail");
    }
    String msg = "water_distance:";
    msg += cm;
    byte size = Udp.write(msg.c_str(), msg.length());
    if(DEBUG){
      Serial.print("Sending this message over UDP: ");
      Serial.println(msg);
      Serial.print("udp write: ");
      Serial.println(size);
    }
    if(!Udp.endPacket()) Serial.println("endPacket fail");

    delay(delayTime);
  }
}

Вывод терминала выглядит следующим образом:

151 cm
Sending this message over UDP: water_distance:151
udp write: 18
endPacket fail
151 cm
Sending this message over UDP: water_distance:151
udp write: 18
endPacket fail
33 cm
Sending this message over UDP: water_distance:33
udp write: 17
endPacket fail
34 cm
Sending this message over UDP: water_distance:34
udp write: 17
endPacket fail
153 cm
Sending this message over UDP: water_distance:153
udp write: 18
endPacket fail

Это заставляет меня сделать вывод, что функции beginPacket и udp.write выполняются правильно, но я не вижу причин, по которым функция endPacket продолжает сбоить. У кого-нибудь есть идея? Большое спасибо.

, 👍0

Обсуждение

добавьте Udp.begin() в setup(). если получится напишу ответ с объяснением, @Juraj

Это работает, большое спасибо! Поскольку UDP является протоколом без установления соединения, есть ли причина, по которой нужно открывать порт для прослушивания входящих пакетов UDP, в то время как устройство действует только как клиент, испускающий фрагменты UDP?, @PeterD

Пакеты UDP должны *откуда-то поступать*. Они не появляются из ниоткуда. Как кран должен существовать и быть включенным, чтобы из него потекла вода., @Majenko

Функция UDP.begin() требует в качестве аргумента исходный порт. Для простой отправки пакетов UDP не имеет значения, с какого порта приходят пакеты, ОС может просто выбрать случайный неиспользуемый порт. Так же, как это делается в Python или Java. Есть ли способ заставить UDP.begin() использовать случайный неиспользуемый порт в качестве источника?, @PeterD

UDP.begin(случайный(1024, 65536));, @Majenko


1 ответ


1

В реализации библиотеки Arduino Ethernet и WiFi необходимо указать исходящий порт с помощью UDP.begin(port) перед вызовом UDP.beginPacket().

Но UDP.begin(port) также начинает прослушивать сообщения UDP на этом порту, так что это не чистый API. Вызовите UDP.end(), чтобы прекратить прослушивание входящих сообщений.

,

Топ ответ, спасибо., @PeterD

Вы можете принять ответ, чтобы отметить вопрос как решенный, @Juraj