Ich spiele gerade mit einem ESP8266 / NodeMCU und der ArduinoIDE.
HTTP und UDP funktionieren wunderbar.
Ich suche eine Möglichkeit IP-Pakete (kein TCP), die an die IP-Adresse
des ESP8266 gesendet werden, (am besten mit Header) zu empfangen, zu
analytischen Zwecken über die Serielle auszugeben und an eine andere
IP-Adresse weiter zu schicken.
Mehrere Stunden WWW-umgraben haben bis jetzt nichts funktionierendes zu
Tage befördert. Mir ist bekannt, dass beim ESP8266 der TCP/IP protocol
stack integriert ist.
Hat jemand eine Idee, wie man trotzdem an die untere Schicht des
Datenverkehrs ran kommt?
Hallo,
die Sourcen und Headerdateien des lwip-Stacks sind doch im SDK dabei und
müßte prinzipiell auch aus der Arduino-IDE auf die Funktionen zugreifen
können. Bei anderen Systemfunktionen des SDK geht das ja auch, eben
darauf achten, daß das alles C ist was man da einbindet.
Auf die Strukturen in ip.h müßte man zumindest lesend ohne unlösbare
Probleme zugreifen können.
Ist aber nicht direkt meine Baustelle, zu lange her, daß mich IP-Header
mal interessiert haben...
Gruß aus Berlin
Michael
Hallo Michael,
lwip-Stack war das Stichwort, danke.
Ich habe auf:
https://yoursunny.com/t/2018/PacketDump/
ein funktionierendes Beispiel gefunden, das alle Pakete abgreift, die
durch den Äther fliegen.
Meine Hobbyprogrammierkünste stoßen gerade an ihre Grenzen :-)
Ich versuche über die raw_rec()-Funktion der lwIP-lib an die rohen
Ethernet Pakete zu gelangen.
Dazu habe ich auch ein schönes Beispiel gefunden:
https://www.arduinolibraries.info/libraries/esp8266-ping
Hier wird raw_rec() innerhalb der class Pinger so aufgerufen:
1
// When LWIP detects a packet corresponding to specified protocol control
2
// block, the PingReceivedStatic callback is executed
3
raw_recv(
4
m_IcmpProtocolControlBlock,
5
PingReceivedStatic,
6
(void*)this);
Ich würde jetzt gerne raw_recv() ausserhalb von Pinger in meiner
setup-function aufrufen:
Da ich jetzt nicht mehr innerhalb einer class bin, funktioniert 'this'
nicht:
invalid use of 'this' in non-member function
Wie muss ich raw_recv() aufrufen? Was muss da anstatt (void *)this rein?
Function prototype for raw pcb receive callback functions.
4
5
Parameters
6
arg user supplied argument (raw_pcb.recv_arg)
7
pcb the raw_pcb which received data
8
p the packet buffer that was received
9
addr the remote IP address from which the packet was received
10
Returns
11
1 if the packet was 'eaten' (aka. deleted), 0 if the packet lives on If returning 1, the callback is responsible for freeing the pbuf if it's not used any more.
Aus der Doxygendoku von lwIp - diesen Callback musst Du implementieren.
arg ist dann einfach NULL (bzw. nullptr).
Hallo,
Stefanus F. schrieb:> Das Arduino Framework behandelt IP Verbindungen als Stream. Das> Versenden oder Empfangen von Paketen ist bei Arduino nur mit UDP> vorgesehen.
meinst Du damit, mein Bekannter hätte z.B. sowas garnicht machen dürfen?
Beitrag "Re: Esp32 Bluetooth Audio"
ESP32 BT ist im Arduino Framework bisher nämlich fast garnicht
eingebaut...
Gruß aus Berlin
Michael
devzero schrieb:> Einfach NULL wenn Du keine Daten uebergeben moechtest.> Er uebergibt im Beispiel den this-pointer, damit er im Callback auf das> Objekt zugreifen kann.
Super, hat mich ein Stückchen weiter gebracht!
Jetzt bin ich hier:
da darf natuerlich nicht NULL stehen, schreib da mal void* arg hin.
arg zeigt dann auf die Adresse, die Du im raw_recv() uebergibts (in
diesem Fall NULL)
Also:
Das ist der funktionierende Sketch.
Er muss mit lwIP Variant V2 kompiliert werden!
Kann man in der Arduino-IDE unter "Werkzeuge" einstellen.
... hatte V1.4 eingestellt, mit der geht's nicht.
Jetzt sehe ich im seriellen Monitor für jeden Ping:
packedReceived Funktionsaufruf
Hurra! Jetzt kann ich weiter forschen :-)