Ricezione UDP su Wemos D1

Salve, premetto che non sono ferratissimo sull’argomento e quello che ho fatto e’ frutto di ricerche e scopiazzamenti.
Ho un sistema cablato con Arduino uno+ Ethernet Shield W5100 che trasmette un numero (49,50, etc…) con un protocollo UDP. Ci sono 6 schede uguali sempre cablate che ricevono questo numero , e tutto funziona; quando vado a leggere lo stesso dato con un Wemos D1 mini non ci riesco. Riesco a riconoscere in rete e sul monitor seriale del PC il Wemos in questione perche’ mi dice che e’ in ascolto con un certo IP su una certa porta senza pero’ riuscire a vedere il dato come faccio con le altre schede .Aggiungo che il dato viene trasmesso dallo stesso Arduino uno cablato insieme agli altri.
Ho visto decine di siti ed i listati sono sempre molto simili
Trasmissione_UDP.ino (2.3 KB) Ricevitore_UDP_Arduino_uno.ino (1.1 KB) Ricevitore_UDP_Wemos_d1.ino (1.5 KB)

Ma quei codici sono i tuoi ?
Perchè Ricevitore_UDP_wmos_d1.ino non compila.

Penso sia successo qualcosa quando ho fatto l’Upload del programma; prima di caricarlo l’ho ricontrollato e lo compila regolarmente.
Scusate
Ricevitore_UDP_Wemos_d1.ino (1.5 KB)

L’unica cosa che vedo è che l’IP del Wemos non è tra quelli a cui trasmetti…

L’ Udp.begin(localUdpPort); basta una volta dopo il while di attesa connessione.

Ma invece di trasmette in sequenza lo stesso messaggio, perché non fai un broadcast?
In questo modo non devi conoscere a priori l’indirizzo dei device.

Ho provato ad utilizzare questo sketch in broadcast e devo dire che la trasmissione funziona bene sulle schede cablate ma non ricevo niente su l Wemos neppure con questa opzioneTrasmissione_UDP_Broadcast_2021-04-30.ino (773 Bytes)

L’indirizzo IP broadcast della tua rete è 192,168,1,255

No, cosi non funziona, funziona solo se metto come ho trovato su un sito 255.255.255.255

NO, l’indirizzo di broadcast in UDP è quello che indica Claudio, ovvero deve avere 255 nella parte host … se la tua reste ha netmask 255.255.255.0 ed è identificata da 192.168.1.x allora il 255 va al posto della x. Poi, il fatto che alcune reti accetino anche il 255.255.255.255 è un’altro paio di maniche, considera però che alcuni produttori di apparati bloccano quest’indirizzo e che comunque NON è in grado di superare un router.

Sicuro del netmask e dell’indirizzo di subnet della tua rete?

Guglielmo

Adesso ho provato a mettere 192.168.1.255 e la parte cablata funziona lo stesso.
Comunque navigando qua’ e la’ ho visto che per il multicast bisogna modificare il udp.beginPacket(addr, port) con udp.beginPacketMulticast(addr, port, WiFi.localIP()), multicast packets, sostituire udp.begin(port) con udp.beginMulticast(WiFi.localIP(), multicast_ip_addr, port).
Bene, ho provato anche questo e non funziona. Allora ho letto che questo problema e’ risaputo ed alcuni lo hanno risolto aggiungendo:

#include "user_interface.h"

e dopo

WiFi.mode(WIFI_STA);

wifi_set_sleep_type(NONE_SLEEP_T); //LIGHT_SLEEP_T and MODE_SLEEP_T.
Peccato ma non ho risolto neppure in questo modo.
Sembra che mi sia infilato in un problema molto diffuso e complicato!

Un’altra cosa (a parte l’uso di String che su un piccolo microcontroller dovrebbe essere evitato, ma non è questo per ora a dare problemi) riguarda la scrittura del buffer. Io specificherei anche la quantità effettiva di byte trasmessi:

void loop() 
{
  int x = digitalRead(5);
  int y = digitalRead(4);
  int z = digitalRead(3);
  sprintf(charBuf, "%d,%d,%d\0",  x, y, z);
  Serial.println(charBuf);
  Udp.beginPacket(remoteIP, remotePort);
  Udp.write(charBuf, strlen(charBuf)+1);
  Udp.endPacket();
  delay(50);    
}

ho effettuato le modifiche e devo dire che tutto sta funzionando (la parte cablata) bene. Quando ho modificato il ricevitore Wemos con le istruzioni che ho trovato per il Multicast mi ha funzionato una sola volta poi non sono riuscito a farlo ripartire quindi vuol dire che siamo vicini alla soluzione

Il multicast non dovrebbe servire, nel senso che con il broadcast dovrebbe funzionare benissimo lo stesso.

Le mie Wemos sono inizializzate così:

    WiFi.persistent(false);
    WiFi.mode(WIFI_OFF);
    delay(500);
    WiFi.mode(WIFI_STA);
    WiFi.setOutputPower(TXPOWER);
    WiFi.config(IPLOCALE, GATEWAY, SUBNET);
    WiFi.begin(ssid, PASSWORD);
    Udp.begin(UDPPORT);

dove TXPOWER è un valore compreso tra 0.0 e 20.5

Ho effettuato le modifiche e se resetto la scheda ogni tanto al reset parte (diciamo una volta su 4/5) e riceve mentre tutte le altre volte si connette e basta.
Allego lo sketch definitivo con tutte le modifiche apportate
Ricevitore_Wemos-d1-2021-04-30-3x.ino (1.5 KB)