NodeMCU UDP

Moin,

ich nutze beim NodeMCU die WiFiUdp library.

Wenn ich in Udp.write() z.b. "Hello World" eintrage, empfange ich am anderen ende auch "Hello World". Packe ich jetzt aber ein byte array mit 3 ints rein, empfange ich z.b. wenn ich 26780 32 995 sende, folgendes: 236 32 227

Der Sendercode auf dem NodeMCU

byte message[] = {int(t), int(h), int(p)};

  Udp.beginPacket(UDP_REMOTE_HOST, UDP_REMOTE_PORT);
  Udp.write(message, 3);
  Udp.endPacket();

Der Empfänger ist ein Arduino Mega mit Ethernetshield

byte udpmessage[3] = {0, 0, 0};

Udp.read(udpmessage, 3);
    Serial.println(udpmessage[0]);
    Serial.println(udpmessage[1]);
    Serial.println(udpmessage[2]);

Kennt sich damit wer aus? Oder besser gesagt, wie kann ich meine 3 ints am besten Senden? Vielleicht mach ich ja einfach was falsch?

Danke!

Edit:

Fehler beseitigt...

Dennoch, kann ich auch Zahlen über 255 einfach senden?

Das Konstrukt kommt mir etwas komisch vor. Ich würde es so machen:

int intarr[] = {333,444,555};


Udp.beginPacket(UDP_REMOTE_HOST, UDP_REMOTE_PORT);
Udp.write(intarr, sizeof(intarr));
Udp.endPacket();


Empfang: 

int empfarr[3];
Udp.read(empfarr, sizeof(empfarr));

Wenn Du komplexere oder verschiedene Sachen senden willst, musst Du Dir ein Protokoll bauen.

Gruß Tommy

Edit: Mit einem Protokoll habe ich hier mal gespielt #32.

Die Funktionen funktionieren aber soweit.

Wäre sicherlich schöner die größe mit sizeof() zu definieren.

Mein eigentliches Problem war ja, dass ich einfach größere Zahlen als 255 in das bytearray schreiben wollte.

Jetzt Teile ich meinen Zahlenwert durch 5, sende ihn, und auf der anderen Seite multipliziere ich ihn wieder mit 5. Funktioniert einwandfrei, da er durch das durch 5 Teilen, niemals über 255 kommt.

Zufrieden bin ich mit der Lösung nicht wirklich

Mit dem Beispielcode kann man aber größere Zahlen senden, auch als Array.

Gruß Tommy

Tommy56: Mit dem Beispielcode kann man aber größere Zahlen senden, auch als Array.

Auch beliebige Strukturen. Mit allen verfügbaren Datentypen. Es gibt keinen Grund, sich auf Byte zu beschränken.

Schlimmer noch: Es ist eine völlig unsinnige Einschränkung.

UDP hat die Einschränkung nicht.

Ändere ich den Code aber zu ner long, wie ich es auch bei den nrf24l01 modulen sende,

kommt immer "no matching function for call to 'WiFiUDP::write(long int [4], int)'"

Und makiert mit dann "Udp.write(message, 4);"

Dann mal die ganze Funktion incl. der Deklaration von message rein setzen.
Wieso brauchst Du long, wenn /5 Byte ergibt? Irgendwie sind Deine Angaben in sich unlogisch.

Gruß Tommy

Edit: Da hat sich bei mir ein Gedankenfehler eingeschlichen. Ich habe noch mal in meinen Code geschaut und mache es doch etwas anders.

int test[3] = {333,444,555};
byte puffer[10];
...
memcopy(puffer,test,sizeof(test));
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(puffer, sizeof(test));
Udp.endPacket();

Wenn ich deinen Codeschnipsel bei mir teste, kommt nur

"memcopy' was not declared in this scope"

das o muss raus. memcpy Man sollte halt doch kopieren und nicht frei Hand schreiben ;)

Gruß Tommy

memcpy

Ist allerdings überhaupt nicht nötig, jedenfalls nicht in dem gezeigten Schnipsel.

int test[3] = {333,444,555};
...
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write((byte*)test, sizeof(test));
Udp.endPacket();

Ja, der Typecast geht auch. Im originalen Sketch bei mir werden einige Sachen im Puffer zusammen gestellt, der Inhalt ist also nicht konstant. Deshalb das memcpy. Da ist z.B. davor ein Kennbyte, was für Daten kommen, danach eine Prüfsumme (in Planung), evtl. auch noch ein Längenbyte.

meisterQ kann sich ja für eine Version entscheiden.

Gruß Tommy

meisterQ: Jetzt Teile ich meinen Zahlenwert durch 5, sende ihn, und auf der anderen Seite multipliziere ich ihn wieder mit 5. Funktioniert einwandfrei, da er durch das durch 5 Teilen, niemals über 255 kommt.

Zufrieden bin ich mit der Lösung nicht wirklich

Damit hast Du aber folgendes Problem. Wenn der originale Wert nicht glatt durch 5 teilbar ist, bekommst Du bei einer integer Division und anschließendem Multiplizieren mit 5 ein anderes Ergebnis:

Beispiel

(int)(1200 / 5 )= 240 240 * 5 = 1200

(int)(1203 / 5) = 240 240 * 5 = 1200 -> != 1203

Da gebe ich dir recht mkl0815. Ich könnte ja auch einfach gut 800 Subtrahieren, und hinterher wieder aufaddieren.

Ist aber irgendwie Semiprofessionel..

Hab mir eure vorschläge durchgelesen. Danke dafür.

Ich werde es aber erstmal mit dem byte so belassen, bis ich "die nächste Entwicklungsstufe" erreiche.

Aktuell ist wichtig, dass überhaupt übertragen und empfangen wird.

Wisst ihr wie ich den Nodemcus noch eine Feste ip zuweise?

Mit

IPAddress ip(192, 168, 3, 170); 
IPAddress gateway(192, 168, 3, 1);
IPAddress subnet(255, 255, 255, 0);

und

WiFi.config(ip, gateway, subnet);

Ist es nicht getahn irgendwie.

Er kompiliert dann zwar vollständig, aber im Router wird das NodeMCU garnicht mehr angezeigt.

Wenn ich die Zeilen aber in einen einfachen Beispielsketch mache, z.b. den, wo man via "Link" den GPIO an und ausschalten kann, kann ich dem NodeMcu eine feste IP zuweisen.

meisterQ: Wisst ihr wie ich den Nodemcus noch eine Feste ip zuweise?

Mit

IPAddress ip(192, 168, 3, 170); 
IPAddress gateway(192, 168, 3, 1);
IPAddress subnet(255, 255, 255, 0);

und

WiFi.config(ip, gateway, subnet);

Ist es nicht getahn irgendwie.

Er kompiliert dann zwar vollständig, aber im Router wird das NodeMCU garnicht mehr angezeigt.

Wenn ich die Zeilen aber in einen einfachen Beispielsketch mache, z.b. den, wo man via "Link" den GPIO an und ausschalten kann, kann ich dem NodeMcu eine feste IP zuweisen.

Wie nun? Geht oder geht nicht? Nach meiner Meinung sollte es gehen. Evtl.noch den DNS-Server mit angeben, wenn Du nach draußen willst.

Ob es Dein Router anzeigt, ist erst mal uninteressant. Manche zeigen nur die Adressen an, die sie selbst per DHCP vergeben haben oder die als feste IP im Router hinterlegt sind.

Gruß Tommy

Nun,

in MEINEM Code, der den BME kram via UDP sendet, geht es nicht.

Im den Beispielcode, wo man die GPIOS via Http schalten kann, geht es.

Daher wundert mich das ja.

Mein Asusrouter hat eine CLientliste, da wird alles angezeigt. Pingen geht auch nicht.

Naja in DEINEM Code geht ja manches nicht, was bei anderen geht ;) Du setzt die IP doch nach dem Login im WLAN oder? Zumindest habe ich das testweise früher mal gemacht (nur die IP geändert) und ich konnte ihn dann darüber ansprechen

Gruß Tommy

Ja gut möglich. Es funktioniert aber alles bis auf die IP Zuweisung.

gib im dhcp Server an, dass er immer die gleiche ip an den nodemcu gibt und an kein anderes Gerät.

Ich konnte bisher über Code noch keine feste ip festlegen, wie z.b. beim Ethernet Shield.

Jo, das hab ich schon gemacht.

Wisst ihr ob UDP einen Arduino Mega erheblich "bremst" ?

Jedesmal wenn ich ein Paket via UDP von den NodeMCUs bekomme, bremst das den Stationären Mega mit Ethernetshield für kurz aus.

Wenn ich gerade auf meinem Nextion Display z.b. Buttons betätige, passiert nichts, dann wird die Aktion nach ablauf dieser Verzögerung ausgeführt.

Ohne UDP läufts Lagfrei.

Ich weiß nicht, wieviel Du über UDP sendest aber so bis 64 Byte sollte das nicht an einem Taster merkbar sein. Wenn ja, klemmt es wo anders, als am reinen UDP-Empfang.

Gruß Tommy