Daten aus Arduino Webserver auslesen (unsupported URL Scheme)

Hallo Zusammen,

ich habe mir soeben eine einfach Druckmessung zusammengefrickelt, dazu nutze ich einen Arduino UNO mit Ethernet-Shield und einen Sensor der bei 0-5bar(g) ein Signal von 0,5-4,5V ausspuckt.
Die Umrechnung erfolgt im Arduino und dieser stellt die Werte auf einer „Website“ dar.
Dabei wollte ich eigentlich per WWW_Reader & Parser die passenden Teile ausschneiden.
Leider bekomme ich nur „unsupported URL-Scheme“ zurück.

Die Seite ist natürlich möglichst knapp gehalten und zeigt zuerst den Druck in bar(g), dann die einzelnen Analog-Eingänge an. (Der Sensor ist auf A0)
Hier der kpl. HTML Quellcode:


<!DOCTYPE HTML>
<html>
Druck:1.41bar(g)<br />
analog input 0 is 323<br />
analog input 1 is 335<br />
analog input 2 is 330<br />
analog input 3 is 337<br />
analog input 4 is 313<br />
analog input 5 is 315<br />
</html>

Hat jemand eine Idee wie ich an den Druck komme und ihn in eine Variable schreiben kann?
Gruß,
Maeffjus

Lass den Webserver doch ein JSON File bereitstellen, das kannst du dann in ein Array lesen und einfach weiterverarbeiten.

Dein HTML ist nicht korrekt, ein reines Textile mit den Zeilen und Linefeed als Zeilenumbruch müsste auch gehen.

Warum sendest Du die Daten nicht gleich vom Arduino an IPS, dann kannst Du Dir das Abfragen sparen.

Senden ist natürlich viel besser, Serversocket in IPS und rüber mit den Daten.

Und hier mal eine Lösung aus dem Forum.

https://www.symcon.de/forum/threads/24522-Daten-vom-Arduino-an-IPS-%C3%BCbermitteln-Ethernet?p=224350#post224350

Hallo Zusammen,

danke für die Ideen & Antworten.
Also ich bin der Meinung, dass senden vom Arduino völliger Murks ist - allerdings aus Netzwerk-Sicht.
Wieso? Der Arduino hat keinen ARP-Cache und das führt dazu, dass er bei jeder Übermittlung wie bescheuert ARP-Requests durch das ganze Netz broadcastet. Ich habe zwar im ganzen Haus Gbit-LAN liegen, ich finde es aber trotzdem absoult unnütz.
Daher wäre es mir lieber, wenn mein Server jede Minute zielgerichtet Anfragen an den Arduino stellt.

Mit JSON & Arrays kenne ich mich überhaupt nicht aus - ehrlich gesagt gibts zwar ein paar Beispiele, aber ich bin nicht so ganz befähigt die zu entschlüsseln. Kann mir da mal jemand „zur Hand“ gehen?
Ist es nicht so, dass IPS quasi die gleiche Seite als JSON nur anders interpretieren würde?
Das wäre nämlich am einfachsten. Oder seht Ihr eine Möglichkeit das was der Arduino ausspuckt zu interpretieren (ggf. mit einer anderen Methode als mit Parsen).

Später kämen auch ggf. noch 3 weitere Werte von US-Sensoren dazu.
Gruß,
Matthias

Ich kann Dir heute Abend mal ein Beispiel von mir reinstellen.

Ist so ungefähr wie saß Beispiel aus dem Link, nur mit dem Unterschied, dass ich am Arduino einen kompletten json String zusammen baue.

Grund: Habe 8 Arduinos und brauch mit meiner Variante nur 1x Serversocket, 1x Splitter und 1x RegisterVariable und ein kleines Skript.

Meine Arduinos senden die Daten im 5 Minuten Intervall.

Die Variante das IPS die Daten zyklisch vom Arduino holt ist auch möglich über http anfragen.

Gesendet von meinem D6633 mit Tapatalk

@Manni:
Das wäre wirklich toll!
Ich brauche eigentlich nur den Teil wo der JSON-String erstellt wird plus die Zeilen die das ganze wieder auslesen (wenn Du noch kurz reinkommentierst was wor gemacht wird wäre das dann ggf. auch Idiotensicher :-))
Aber hast Du mal mit Wireshark „gehört“ was die 8 Arduinos dann durch dein Netzwerk „schreien“?
Gruß,
Maeffjus

Will ich das? :smiley:

Versteht das mit dem arp eh nicht so ganz.
Ip- Adresse und Port von IPS werden doch angegeben und dahin wird die Verbindung aufgebaut.
Ist doch direkt, oder nicht?
Bin kein Nerzwerk Spezi, eher einer mit tötlichem halbwissen :wink:

Heute Abend wenn ich wieder im Hotel bin, schreib ich mal zusammen was ich habe.

Gesendet von meinem D6633 mit Tapatalk

Arp ist für die Auflösung der IP Adresse zur MAC Adresse, weil sonst kann kein Netzwerkpaket versendet werden.
Mein WizNet hat aber imho einen Cache für die ARP-Tabelle, gegengeprüft habe ich das aber nicht.
Zumal ARP ja immer benötigt wird beim senden, egal wer die TCP Verbindung aufbaut. Somit muss, bei der Aussage er Cached das nicht, auch beim auf/abbauen der ankommenden TCP Verbindung der Arduino immer jedesmal einen ARP-Request versenden.
Michael

Ja, der Bahnhof ich gleich um die Ecke :slight_smile:
Das muss ich mir noch ein paar mal durchlesen um es vielleicht zu verstehen.

Aber eines habe ich schon kapiert, das der Arduino selbstständig an IPS sendet ist eher suboptimal.

Dann verlege ich ein Starkstromkabel, dann haben mehr arp Paket Platz :slight_smile:

Ma heut kann ichs wieda…
Gibt eindeutif zuviel gratis Cola bei Coca Cola in Gent [emoji1]

Gesendet von meinem D6633 mit Tapatalk

Ich arbeite da mit gefährlichem 3/4 Wissen:

Das es generell über die IP geht ist klar, aber die IP gehört ja zu einer Mac-Adresse. Soweit mir bekannt läuft das so:

Der Sender „schreit“ einen Broadcast durchs Netz (also es geht an alle Ports von allen Switches), dabei ruft er nach einer IP. Das betreffende Gerät meldet sich und sagt quasi „Hallo, hier ist 192.168.1.123, meine Mac-Adresse ist 47-11-ab-cd-ef“.
Das speichert der Sender im ARP-Cache. Beim nächsten Senden schickt er die Daten an die IP zusammen mit der MAC-Adresse, die Switches wissen welche MAC wo angeschlossen ist und „leiten“ das Paket an genau den richtigen Anschluss.
Alle anderen Geräte bekommen das dann nur bedingt mit und haben Ruhe vor Datenverkehr der für sie nicht interessant ist.
Das unterscheidet Switches von Hubs, bei einem Hub ist alles ein Broadcast an alle Ports, der Switch hat einen Cache und leitet es dahin wo es hin muss.

Beim Arduino ist das Ganze gleich, ausser eines - er merkt sich die MAC nicht und fragt jedes Mal nach. Das bedeutet, dass jeder neue Transfer nach einem ARP-Brodacast erfolgt.

Normal sendet ein Gerät schon periodisch ARP-requests, der Cache muss ja auch aktuell bleiben. Aber halt bei weitem nicht immer.

Ich habe vor längerer Zeit schonmal in einem Arduino-Forum gefragt (siehe hier: Arduino constantly „screams“ ARP broadcast) - dort gab es nur die Antwort, dass das typische W5100 Shield keinen ARP-Cache hat.
Daher frage ich lieber mit dem Server an den Arduino - der hat nämlich sehr wohl einen Cache.
Zudem kann ich so verhindern, dass mehrere Arduinos zeitgleich senden. Mein Server kann hier schön der Reihe nach bzw. rundum eine Abfrage starten.
Gruß,
Maeffjus

Naja, dann sollen meine Arduinos ein bisschen im Netz rumbrüllen [emoji1]

Ich bin nach wie vor ein Befürworter von Pushen, nicht Pollen [emoji1]

Mein IPS ist mittlerweile so gewachsen, dass ich froh bin über jeden Timer, den ich nicht brauche.
Vorallem dann wenn die dahinter liegenden Skripte hängen bleiben

Die Laufzeiten, wenn einer meiner Arduinos sendet liegen vom Eingang am Serversocket bis zun Beschreiben der Variablen irgendwo bei nicht messbar [emoji1]
Und gleichzeitige Eingänge sind auch noch kein Problem gewesen.

PS. Könnte man dem Arduino diesen arp Cache im Sketch einbauen? Im Prinzip muss sich das Ding ja nur die Adresse vom IPS-Server merken.

Gesendet von meinem D6633 mit Tapatalk

Ja ich glaube es ist auch nicht ganz tragisch wenn die das machen. Ich hatte aber irgendwann mal Probleme mit einem Stream oder mit einer relativ großen Datenmenge (Ich glaube ich hatte da 2tb durchs Netz gedrückt)
Dabei ist mir aufgefallen, dass das immer periodisch war - und ganz zufüllig genau dann wenn der Arduino wie ein Kleinkind nach seiner Mutter schreiend durch mein Netz jammerte :slight_smile:

Ich benutze das aktuell für eine andere Anwendung immer noch - möchte aber gerne alles als Server umstellen.

Ich habe damals in dem verlinkten Beitrag schonmal gefragt ob man den Cache irgendwie „nachrüsten“ kann (z.b. die MAC fest in den Sketch schreiben. Im Arduino-Forum meinte niemand das es funktioniert…

Frage:

So, that means in fact that the W5100 will broadcast the ARP request everytime it connects to any ip?

And my second idea (however this could work - you are the expert(s)), to supply the mac-address in advance - so in fact (in human language) say to the w5100:

Contact 192.168.1.248, it has the mac-address ab-cd-ef-12...

Antwort:

I don’t know of a way to specify the mac address in advance.

Im Datenblatt vom W5500 (den nutze ich) steht nichts zu einem ARP-Cache, aber da ich Force ARP abschalten kann, teste ich das nachher mal :slight_smile:
Michael

Du meinst Force ARP = erzwungene ARP-Anfrage? Order Force ARP abschalten = ARP-Cache abschalten?

Hör dem Ding mal mit Wireshark zu…

Zuerst dachte ich damit ist das gleiche gemeint.

In Force ARP mode, It forces on sending ARP Request whenever data is sent.

In meiner Lib für den W5500 (nicht Arduino), ist das deaktiv. Also werden die Anfragen gecached… dachte ich.

Ich habe eben mal mitgeschnitten:
Wenn Ich vom WizNet die Verbindung aufbaue und das Ziel ist offline, kommt alle 10 Sekunden ein ARP-Request per Broadcast.
Sobald das Ziel online ist, kommt genau eine.
Anschließend nur noch zielgerichtet Requests, diese erfolgen dann ca. alle 30 Sekunden.

Einen W5100, welche diese Option nicht hat, habe ich nicht zum gegenprüfen.
Hatte mich schon vorher auf den W5500 festgelegt, da dieser 8 Sockets bedienen kann :smiley:

Ich habe dann mal das BIT ‚Force ARP mode‘ auf 1 gesetzt, leider konnte ich kein anderes Verhalten feststellen :confused:

Da meine Verbindungen aber immer bestehen bleiben und ich keine original Ardunio-Lib nutze, war das jetzt nicht vergleichbar.

Also mal ein Testaufbau und in einem Loop immer eine Verbindung aufbauen und beenden. Und schon hat er jedes mal einen ARP-Request als Broadcast versendet. :mad:

Ich habe mal etwas weiter geforscht. Die Destination MAC wird pro Socket in einem 6 Byte großen Register festgehalten.
Verwende ich immer den gleichen Socket, dann funktioniert auch mein Flag ‚Force ARP mode‘ wie erwartet.
Ein ARP wird nur gesendet wenn sich die Ziel-IP im Register des Socket ändert oder ich ‚Force ARP mode‘ gesetzt habe.

Es gibt also keinen Cache in dem Sinne und auch keine ARP-Tabelle , sondern nur pro Slot die eine Adresse

Wühlt man etwas tiefer im Code der Arduino-Lib, stellt man fest dass die Sockets der Reihe nach neu belegt werden.
Wenn also jetzt in einem Loop immer wieder eine Verbindung vom WizNet zu IPS aufgebaut wird, wird auch immer ein ARP versendet, um das Register dieses Slot zu füllen.

Dies betrifft alle Anwendungen wo in einem loop jedesmal ein tcpclient.connect vorkommt.
Ändern kann man dies nicht… naja schon, aber dann müßte man wohl die halbe Library umbauen und versuchen je nach Ziel-IP den gleichen Slot zu nutzen und somit die schon vorhandene MAC im Register.
Oder direkt die Sockets im Chip ansprechen und nicht die Klassen EthernetClient und EthernetServer nutzen. Ist aber ordentlich Arbeit.

Alternativ bleibt natürlich das umbauen auf einen TCP-Server, hier erfolgt tatsächlich kein ARP-Request wenn sich ein Client auf den Wiznet verbindet, da die MAC des Absendes gleich im Register des Socket landet.

Michael

PS: Auf jeden Fall bin ich froh, dass ich dieses Problem nicht habe. Sonst hätte ich den Chip rausgeworfen :smiley:

Also alles umstellen auf W5500 [emoji1]

Gesendet von meinem D6633 mit Tapatalk

Naja - ich bin der Meinung mit meiner W5100 ist das irgendwie Subotimal :wink:
ich habe übrigens eben mal flott was auf den Arduino geflasht - jetzt spuckt er folgendes aus:


arduinoEthernetComCallback('{"A0": 303,"A1": 320,"A2": 320,"A3": 328,"A4": 309,"A5": 309}')

Ich habe das 1:1 aus dem WWW genommen, ich rechne dann in IPS um.
Dafür brauche ich aber gewaltig Hilfe:

  1. Wie bekomme ich den String eingelesen? Ich habe was mit JSON rumgesucht - finde aber einfach nichts was mir wirklich hilft. Evtl. (nein, mit Sicherheit!) habe ich einfach zu wenig Ahnung.
    Ich brauche hauptsächlich A0 - das ist die Spannung in 10bit.

  2. Spannung bekomme ich noch ausgerechnet (sind ja 0,488mV-Schritte), aber das jetzt zum Druck machen?
    Beim Arduino hatte ich das mit „map“ gemacht.
    Das Problem: 0,5V = 0 bar(g), 4,5V = 5bar(g) - der Rest dazwischen ist linear.

Wenn mir jemand jetzt noch einen Schubs (besser Tritt) in die richtige Richtung gibt habe ich es fast hinter mir :wink:

Danach werde ich mal die Wassertemp. im Vergleich zum Druck loggen (der schwankt ja je nach Temperatur kräftig zw. 1,3 bar(g) und ~1,8 bar(g) und versuchen den Temperaturanteil zu kompensieren. Damit sollte ich dann einen gelichmäßigen Temperaturkompensierten Druck erhalten.

Gruß,
Matthias

@manni:
Nein, das behebt das Problem nicht.
Permanente Verbindungen oder ServerSocket auf Arduino-Seite ist die einfache Lösung.
@Matthias
Kannst du die Werte nicht erst berechnen und dann in JSON verpacken?
Es gibt da eine Library, nennt sich AJson.

Michael