Ошибка 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 продолжает сбоить. У кого-нибудь есть идея? Большое спасибо.
@PeterD, 👍0
Обсуждение1 ответ
В реализации библиотеки Arduino Ethernet и WiFi необходимо указать исходящий порт с помощью UDP.begin(port) перед вызовом UDP.beginPacket().
Но UDP.begin(port) также начинает прослушивать сообщения UDP на этом порту, так что это не чистый API. Вызовите UDP.end(), чтобы прекратить прослушивание входящих сообщений.
Топ ответ, спасибо., @PeterD
Вы можете принять ответ, чтобы отметить вопрос как решенный, @Juraj
- Подключение к API 8Base с помощью TLS на Arduino Uno Wifi Rev2
- Обнаружение ESP8266 в сети
- Плата Arduino 4G LTE
- Использование AysncUDPMessage для ESP32 для отправки строковых данных
- Ошибка при загрузке кода в esp8266 через arduino (FatalError('Failed to connect to %s: %s' % (self.CHIP_NAME, last_error)))
- Arduino Ethernet shield server и клиент одновременно
- Подключение Arduino к Philips Hue
- Как создать сервер сокетов Arduino для получения сообщений
добавьте
Udp.begin()
в setup(). если получится напишу ответ с объяснением, @JurajЭто работает, большое спасибо! Поскольку UDP является протоколом без установления соединения, есть ли причина, по которой нужно открывать порт для прослушивания входящих пакетов UDP, в то время как устройство действует только как клиент, испускающий фрагменты UDP?, @PeterD
Пакеты UDP должны *откуда-то поступать*. Они не появляются из ниоткуда. Как кран должен существовать и быть включенным, чтобы из него потекла вода., @Majenko
Функция UDP.begin() требует в качестве аргумента исходный порт. Для простой отправки пакетов UDP не имеет значения, с какого порта приходят пакеты, ОС может просто выбрать случайный неиспользуемый порт. Так же, как это делается в Python или Java. Есть ли способ заставить UDP.begin() использовать случайный неиспользуемый порт в качестве источника?, @PeterD
UDP.begin(случайный(1024, 65536));
, @Majenko