Не удается отправить UDP-пакеты с ESP8266 Wemos D1.

Я пытаюсь отправить данные датчика с устройства с батарейным питанием, используя протокол UDP. Цель состоит в том, чтобы отправить дейтаграмму сразу после того, как станция Wi-Fi выйдет из спящего режима, а затем сразу же вернуться в спящий режим после записи дейтаграммы на заданный IP-адрес или имя хоста.

Я могу отправлять данные в API Thingspeak, используя их библиотеку, поэтому я знаю, что устройство работает, но при попытке использовать библиотеку WiFiUDP для отправки дейтаграммы на IP-адрес в той же локальной сети ничего не происходит. Мое устройство подключается к Wi-Fi, и команда udp.endPacket() завершается успешно, но я не получаю пакеты на сервер. Я знаю, что сервер работает, потому что я могу использовать nc для отправки UDP-пакетов с других компьютеров в локальной сети.

Вот мой набросок с отредактированными ненужными фрагментами.

// https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-class.html
#include <ESP8266WiFi.h>
// https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/udp-examples.html
#include <WiFiUdp.h>

// Создаем экземпляр класса udp
WiFiUDP udp;

void setup() {
  Serial.begin(115200);
  Serial.print("Connecting to WiFi");
  WiFi.mode(WIFI_STA);
  WiFi.hostname(hostname);
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.print("SSID:\t");
  Serial.println(WiFi.SSID());
  
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());

  Serial.print("Gateway:\t");
  Serial.println(WiFi.gatewayIP());

  uint8_t buffer[50] = "hello world";
  char message[] = "hello world 2";

  IPAddress staticIP(192, 168, 1, 118);
  udp.beginPacket(staticIP, 3381);
  udp.write(buffer, 11);
  //udp.write(сообщение);
  udp.endPacket();

  // Рассчитываем необходимое время сна и идем спать
  long sleepTime = measurementInterval - millis(); // в миллисекундах
  if (sleepTime < 100) sleepTime = 100; // установить минимальное время сна 0,1 секунды
  Serial.print ("Going to sleep now for ");
  Serial.print((float)sleepTime / 1000, 3);
  Serial.println (" seconds.");
  Serial.print ("Time going to sleep=");
  Serial.print ((float)millis() / 1000, 3);
  ESP.deepSleep(sleepTime * 5000); // конвертируем в микросекунды
}

И мой сервер узла, чтобы быть полным здесь:

const dgram = require('dgram')
const server = dgram.createSocket('udp4')

server.on('error', (err) => {
  console.log(`server error:\n${err.stack}`)
  server.close()
})

server.on('message', (msg, rinfo) => {
  console.log(`got message from ${rinfo.address}:${rinfo.port} - ${msg}`)
})

server.on('listening', () => {
  const address = server.address()
  console.log(`server listening ${address.address}:${address.port}`)
})

server.bind(3381)

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

, 👍0

Обсуждение

Я не вижу udp.begin(). Некоторые библиотеки Arduino требуют его даже для отправки., @Juraj

запустите wireshark на своем сервере или на любом компьютере в вашей локальной сети ... посмотрите, что отправляется, @jsotola

@Juraj udp.begin() предназначен для прослушивания, но я попробовал и не увидел разницы., @rubyuser1357796

@jsotola wireshark не собирает информацию с IP-адреса устройства esp8266, udp или иным образом., @rubyuser1357796

вы должны отправлять пакеты на IP-адрес ПК, на котором работает wireshark, @jsotola

@jsotola это то, что я пробовал. Я думаю, что это может быть проблема с клиентским программным обеспечением, я просто не знаю, что., @rubyuser1357796


1 ответ


Лучший ответ:

0

В соответствии с сабреддитом esp8266 вам необходимо добавить достаточную delay() в 50–100 миллисекунд (не микросекунд) перед переходом в спящий режим, поскольку ни одна из функций udp не блокируется.

,