• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Не передаются данные по UDP

KAJbMAP

New member
Делаю проект: датчик температуры и влажности, соединённый с платой Nodemcu v3, которая шлёт данные по UDP на локальный ноутбук. Проблема в том, что плата не хочет ничего отправлять, пока не отослать ей какие-нибудь данные. Может кто знает что-нибудь про это? Код предоставляю ниже. Делаю всё в среде ArduinoCore.
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include "DHT.h"

#define DHTPIN 13
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

char ssid[] = "RosTelekom-WIFI";          //  your network SSID (name)
char pass[] = "odin2tri4";   // your network password

WiFiUDP Udp;
unsigned int remoteUdpPort = 25565;
char remoteIp[] = "192.168.1.100";


void setup()
{
  // initialize serial:
  Serial.begin(9600);
  Serial.println("Attempting to connect to WPA network...");
  Serial.print("SSID: ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  Serial.print("Connecting to WIFI");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected to wifi. My address: ");
  IPAddress myAddress = WiFi.localIP();
  Serial.println(myAddress);
 
  if (!Udp.begin(remoteUdpPort))
  {
    Serial.println("Failed to bin port");
  }
  Serial.print("Start listening port: ");
  Serial.println(remoteUdpPort);
  dht.begin();
  delay(5000);
}

void loop()
{
  byte data[2];
 
  data[0] = dht.readTemperature();
  data[1] = dht.readHumidity();
 
  if (isnan(data[0]) || isnan(data[1]))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  Serial.print("Temp: ");
  Serial.print(data[0]);
  Serial.print("    Humidity: ");
  Serial.println(data[1]);
 
  Udp.beginPacket(remoteIp, remoteUdpPort);
  Udp.write(data,2);
  Udp.endPacket();
  delay(2000);
}
 

CodeNameHawk

Moderator
Команда форума
Делаю всё в среде ArduinoCore.
Это че?
Для начала правильно используйте типы данных в программе
Код:
  virtual int beginPacket(IPAddress ip, uint16_t port);
  // Start building up a packet to send to the remote host specific in host and port
  // Returns 1 if successful, 0 if there was a problem resolving the hostname or port
  virtual int beginPacket(const char *host, uint16_t port);
тут
Код:
 Udp.write(data,2);
тоже вольности

Arduino IDE и ESP8266. Тип данных: int, unsigned, word. | Амперка / Форум
 

KAJbMAP

New member
Это че?
Для начала правильно используйте типы данных в программе
Код:
  virtual int beginPacket(IPAddress ip, uint16_t port);
  // Start building up a packet to send to the remote host specific in host and port
  // Returns 1 if successful, 0 if there was a problem resolving the hostname or port
  virtual int beginPacket(const char *host, uint16_t port);
тут
Код:
 Udp.write(data,2);
тоже вольности

Arduino IDE и ESP8266. Тип данных: int, unsigned, word. | Амперка / Форум
Программы для Nodemcu по дефолту пишутся на lua в виде скриптов и уже потом при помощи небольшой утилиты загружаются в саму плату. Есть так-же способ делать всё в среде Arduino IDE, на оф. сайте esp8266 в документации это называется Arduino Core. На счёт типов данных:
1) в функции beginPacket(IPAddress ip, uint16_t port); изначально и пытался IP адрес обернуть в класс IPAddress, но по какой-то неведомой причине это не работает.
2) Udp.write(data,2); может не совсем правильно, но работает.
Эти недочёты - это мелочи, они никак не влияют на работу. У меня всё работает корректно, плата шлёт данные на ноутбук, но только после того, как ей после перезагрузки отправить любое сообщение.
 

CodeNameHawk

Moderator
Команда форума
Есть так-же способ делать всё в среде Arduino IDE, на оф. сайте esp8266 в документации это называется Arduino Core.
Что как делается я знаю и что среда это Arduino IDE, но среда Arduino Core это что то новое.
1) в функции beginPacket(IPAddress ip, uint16_t port); изначально и пытался IP адрес обернуть в класс IPAddress, но по какой-то неведомой причине это не работает.
У вас unsigned int remoteUdpPort = 25565; а надо uint16_t port может она (среда) умная и сама возьмет то что надо, а может и не возьмет.
В ардуиноиде для есп unsigned int == uint32_t.
 

KAJbMAP

New member
Что как делается я знаю и что среда это Arduino IDE, но среда Arduino Core это что то новое.
Возможно я неправильно выразился, назвав это "средой", но я изначально хотел сказать, что пишу код и прошиваю плату через ArduinoIDE. На сайте ESP8266 - документация к этой среде называется Arduino Core.
Welcome to ESP8266 Arduino Core’s documentation! — ESP8266 Arduino Core 2.4.0 documentation
У вас unsigned int remoteUdpPort = 25565; а надо uint16_t port может она (среда) умная и сама возьмет то что надо, а может и не возьмет.
В ардуиноиде для есп unsigned int == uint32_t.
И всё же, это не является причиной того, что плата не хочет первой слать данные
 
Последнее редактирование:

Алексей.

Active member
Проверял на есп-01
Взял пример, закоментил то что про датчики (потому как нету их) и в setup-e лишний Udp.begin(remoteUdpPort), поменял remoteIp на ip своего бука.
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
//#include "DHT.h"
//#define DHTPIN 13
//#define DHTTYPE DHT11
//DHT dht(DHTPIN, DHTTYPE);
char ssid[] = "D2531g";          //  your network SSID (name)
char pass[] = "1234567890";   // your network password
WiFiUDP Udp;
unsigned int remoteUdpPort = 25565;
char remoteIp[] = "192.168.11.50";
void setup()
{
  // initialize serial:
  Serial.begin(9600);
  Serial.println("Attempting to connect to WPA network...");
  Serial.print("SSID: ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  Serial.print("Connecting to WIFI");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected to wifi. My address: ");
  IPAddress myAddress = WiFi.localIP();
  Serial.println(myAddress);
//  if (!Udp.begin(remoteUdpPort))
//  {
//    Serial.println("Failed to bin port");
//  }
//  Serial.print("Start listening port: ");
//  Serial.println(remoteUdpPort);
//  dht.begin();
//  delay(5000);
}
void loop()
{
  byte data[2];
  data[0] = 0x12; //dht.readTemperature();
  data[1] = 0x34; //dht.readHumidity();
  if (isnan(data[0]) || isnan(data[1]))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Temp: ");
  Serial.print(data[0]);
  Serial.print("    Humidity: ");
  Serial.println(data[1]);
  Udp.beginPacket(remoteIp, remoteUdpPort);
  Udp.write(data,2);
  Udp.endPacket();
  delay(2000);
}
Смотрю вывод в последовательный порт
Код:
Connecting to WIFI...
Connected to wifi. My address: 192.168.11.135
Temp: 18    Humidity: 52
Temp: 18    Humidity: 52
Temp: 18    Humidity: 52
Принимать пакеты было нечем, поэтому взял то что всегда под рукой ;-)
Код:
alex@hp-envy13:~$ sudo tcpdump -netqx port 25565
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp1s0, link-type EN10MB (Ethernet), capture size 262144 bytes
5c:cf:7f:b2:3f:33 > 60:6d:c7:e5:23:fb, IPv4, length 44: 192.168.11.135.49153 > 192.168.11.50.25565: UDP, length 2
   0x0000:  4500 001e 00c3 0000 ff11 2302 c0a8 0b87
   0x0010:  c0a8 0b32 c001 63dd 000a 31bd 1234
5c:cf:7f:b2:3f:33 > 60:6d:c7:e5:23:fb, IPv4, length 44: 192.168.11.135.49153 > 192.168.11.50.25565: UDP, length 2
   0x0000:  4500 001e 00c4 0000 ff11 2301 c0a8 0b87
   0x0010:  c0a8 0b32 c001 63dd 000a 31bd 1234
5c:cf:7f:b2:3f:33 > 60:6d:c7:e5:23:fb, IPv4, length 44: 192.168.11.135.49153 > 192.168.11.50.25565: UDP, length 2
   0x0000:  4500 001e 00c5 0000 ff11 2300 c0a8 0b87
   0x0010:  c0a8 0b32 c001 63dd 000a 31bd 1234
^C
3 packets captured
переведу с русского на русский
0x0000: 4500 001e 00c5 0000 ff11 2300 c0a8 0b87
0x0010: c0a8 0b32 c001 63dd 000a 31bd 1234
цветом выделил
Заголовок IP
Заголовок UDP
Данные UDP - те что отправили с есп-01

Как то так, может
не предназначен для приема пакетов?
 
Последнее редактирование:

KAJbMAP

New member
Проверял на есп-01
Взял пример, закоментил то что про датчики (потому как нету их) и в setup-e лишний Udp.begin(remoteUdpPort), поменял remoteIp на ip своего бука.
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
//#include "DHT.h"
//#define DHTPIN 13
//#define DHTTYPE DHT11
//DHT dht(DHTPIN, DHTTYPE);
char ssid[] = "D2531g";          //  your network SSID (name)
char pass[] = "1234567890";   // your network password
WiFiUDP Udp;
unsigned int remoteUdpPort = 25565;
char remoteIp[] = "192.168.11.50";
void setup()
{
  // initialize serial:
  Serial.begin(9600);
  Serial.println("Attempting to connect to WPA network...");
  Serial.print("SSID: ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  Serial.print("Connecting to WIFI");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected to wifi. My address: ");
  IPAddress myAddress = WiFi.localIP();
  Serial.println(myAddress);
//  if (!Udp.begin(remoteUdpPort))
//  {
//    Serial.println("Failed to bin port");
//  }
//  Serial.print("Start listening port: ");
//  Serial.println(remoteUdpPort);
//  dht.begin();
//  delay(5000);
}
void loop()
{
  byte data[2];
  data[0] = 0x12; //dht.readTemperature();
  data[1] = 0x34; //dht.readHumidity();
  if (isnan(data[0]) || isnan(data[1]))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  Serial.print("Temp: ");
  Serial.print(data[0]);
  Serial.print("    Humidity: ");
  Serial.println(data[1]);
  Udp.beginPacket(remoteIp, remoteUdpPort);
  Udp.write(data,2);
  Udp.endPacket();
  delay(2000);
}
Смотрю вывод в последовательный порт
Код:
Connecting to WIFI...
Connected to wifi. My address: 192.168.11.135
Temp: 18    Humidity: 52
Temp: 18    Humidity: 52
Temp: 18    Humidity: 52
Принимать пакеты было нечем, поэтому взял то что всегда под рукой ;-)
Код:
alex@hp-envy13:~$ sudo tcpdump -netqx port 25565
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp1s0, link-type EN10MB (Ethernet), capture size 262144 bytes
5c:cf:7f:b2:3f:33 > 60:6d:c7:e5:23:fb, IPv4, length 44: 192.168.11.135.49153 > 192.168.11.50.25565: UDP, length 2
   0x0000:  4500 001e 00c3 0000 ff11 2302 c0a8 0b87
   0x0010:  c0a8 0b32 c001 63dd 000a 31bd 1234
5c:cf:7f:b2:3f:33 > 60:6d:c7:e5:23:fb, IPv4, length 44: 192.168.11.135.49153 > 192.168.11.50.25565: UDP, length 2
   0x0000:  4500 001e 00c4 0000 ff11 2301 c0a8 0b87
   0x0010:  c0a8 0b32 c001 63dd 000a 31bd 1234
5c:cf:7f:b2:3f:33 > 60:6d:c7:e5:23:fb, IPv4, length 44: 192.168.11.135.49153 > 192.168.11.50.25565: UDP, length 2
   0x0000:  4500 001e 00c5 0000 ff11 2300 c0a8 0b87
   0x0010:  c0a8 0b32 c001 63dd 000a 31bd 1234
^C
3 packets captured
переведу с русского на русский
0x0000: 4500 001e 00c5 0000 ff11 2300 c0a8 0b87
0x0010: c0a8 0b32 c001 63dd 000a 31bd 1234
цветом выделил
Заголовок IP
Заголовок UDP
Данные UDP - те что отправили с есп-01

Как то так, может не предназначен для приема пакетов?
Очень странно, какое-то неопределённое поведение о_О PacketSender может как отправлять пакеты, так и принимать, только, насколько я понял, он не прослушивает трафик, а запускает UDP сервер, что в моём случае по своей сути не особо важно. Да и явно, проблема не в нём, т.к. поведение PacketSender и моей собственной программы абсолютно схожи.
 

KAJbMAP

New member
Очень странно о_О Попробовал скачать другую программу, прослушивающая UDP трафик, запустил, смотрю, вроде всё работает плата отправляет данные. Попробовал перезагрузить плату, т.к. именно после перезагрузки или отключения питания всё переставало работать, пока снова не отправишь данные на плату, но плата всё равно отправляла данные. Попробовал заново загрузить прошивку в плату и даже так всё работало. Протестировал работу с PacketSender и моей программой - результат положительный. Даже не могу представить что поменялось. Код тот-же, настройки роутера или ноутбука не менял, но всё чудесным образом заработало. Попробую потестировать ещё, чуть позже отпишусь о результатах
 
Последнее редактирование:
Сверху Снизу