Vielleich hat jemand von euch eine Idee oder Hinweis.
Ich möchte per AJAX die aktuellen Daten meines Arduino+Ethernet einbinden.
Ein direkter Zugriff per Browser klappt.
Ein xml testfile von meinen host per AJAX klappt auch
XML Daten von von Arduion per AJAX liefert mit Status=0 (quasi nix)
an was kann es liegen (ev. am Access-Control-Allow-Origin - erlaubt ajax direkten zugriff auf externen host)
Vieleicht verrätst Du noch etwas mehr? Welcher Browser, welches OS, wie genau kann man das nachstellen? HastDu schon mal mit den üblichen Debugtools Firebug, Fiddler2 und was es sonst so gibt schon mal nachgeschaut?
Das müsstest du via Java, PHP, C# .... parsen um etwas ertägliches damit anfangen zu können. Dazu hast du es nicht als Datei vorliegen und ich befürchte das kostet dich deine letzten Haare.
In der Internetwelt schreiben wir sowas mal eben auf eine Terrabyte Platte, aber so ein kleines Arduinchen ist dann doch Matsche
Das ist nur ein Testbeispiel. Das Ergebnis sind dynamische XML Daten, und kein starres XML File. (Sensorwerte werden in einer klaren XML Struktur an den Browser geschickt).
Warum AJAX: HTML5 Template wird aufgebaut und jede Sekunde werden die neuen Daten von Arduino abgefragt. Es sollte nicht jedesmal die komplette Bildschirmmaske aufgebaut werden, sonder nur die Position mit den Sensorwerten.
Selber habe ich das immer so gelöst, dass per AJAX ein lokales Script (PHP z.B.) aufgerufen wird, dieses lädt die XML Daten (ich ziehe JSON vor, ist weniger aufwändig) des Arduinos und reicht diese weiter.
Per PHP ist es problemlos. Ich möchte ohne apache und php auskommen (absoluter minimalismus).
Das Template wir zuerst von der SD Card gelesen, dann erfolgt die Datenaktuallisierung per ajax.
Ziel: Board an LAN anstecken - Browser starten - IP eingeben - losgehts....
um eine möglichst kleine Seite zu schreiben und den Speicher des Ardu zu entlasten, habe ich auf dem Ardu eine Funktion, die den PIN entgegen nimmt und als Text den Status zurück sendet.
Die Webseite hat eine Schleife, die dann alle relevanten Pins abfragt und schicke Ein/Aus-Schalter anzeigt, bzw. den aktuellen Wert des Analog pins.
Etwas Trickreich war eigentlich nur, das die Seite die Antwort des Ardu nicht als weitere Seite anzeigt, sondern richtig verarbeitet.
Das geht dann in etwa so:
// the file to be read
pageURL = new java.net.URL("www.MeinArdu.dyndns.oder.so");
// step 1, open the URL
var openConnection = pageURL.openConnection;
theConnection = openConnection();
// step 2, connect to server
var t=theConnection.connect;
t();
// step 3, read the file using HTTP protocol
var getContent = theConnection.getContent;
var theURLStream = getContent();
// step 4, get an handle and fetch the content length
var readStream = theURLStream.read;
var gcl = theConnection.getContentLength;
gcLen = gcl();
// and finally, read into a variable
theText =""
for (i = 1; i <gcLen; i++)
{
theText += new java.lang.Character(readStream())
}
Der Code ist noch etwas veraltet. Habe die aktuellen Sourcen gerade nicht da.
Firebug AddOn installieren => Netzwerk Tab => Entsprechenden Request aufklappen => Antwort Tab
Dann kannst Du erstmal sehen was und wie valide die ankommenden Daten sind.
Wenn Speicherplatz nicht das Problem ist, würde ich persönlich ein Framework wie jquery vorziehen. JSON ist für Ajax (trotz des Namens) durchaus auch gängiger und dürfte schon alleine wegen der geringeren Datenmenge einfacher mit dem Arduino zu generieren sein (letzendlich aber Geschmacksache).
Glaube ich fast nicht, sollte nicht der Content-Type: text/xml ausreichen
Der Content-Type ist höchstens ein Hinweis an den Browser, was er denn von dem Dokument halten soll. Wenn Du ein JPEG mit XML Content Type versendest, wird der XML-Parser schließlich auch nichts damit anfangen können.
(Edit: PS: Und XML-Parser sind schon bei allerkleinsten Fehlern ziemlich zickig...)
@mr_sol: Du schreibst "... glaube ich nicht ...". Hast Du es ausprobiert? Dein Program funktioniert nicht. Debuggen bedeutet systematisch Fehler auszuschliessen. Wie auch andere schon angemerkt haben sind XML Parser häufig sehr penibel.
<html>
<body>
<script type="text/javascript">
var xmlhttp;
var xmlDoc;
function callback(xhr)
{
xmlDoc = xhr.responseXML;
alert(xmlDoc);
}
if (window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
else
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", "http://192.168.0.12/", true);
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState != 4) return;
if (xmlhttp.status != 200 && xmlhttp.status != 304) {
alert(xmlhttp.status);
return;
}
callback(xmlhttp);
};
xmlhttp.send(null);
</script>
</body>
</html>
Leider Liefert ajax eine Status 0 Meldung (statt 200). Rufe ich Arduino direkt per BrowserURL auf klappt es einwandfrei (an der Firewall kann es nicht liegen)
<html>
<body>
<script type="text/javascript">
var xmlhttp;
var xmlDoc;
function callback(xhr)
{
xmlDoc = xhr.responseXML;
alert(xmlDoc);
}
if (window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
else
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET", "http://192.168.0.12/", true);
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState != 4) return;
if (xmlhttp.status != 200 && xmlhttp.status != 304) return;
callback(xmlhttp);
};
xmlhttp.send(null);
</script>
</body>
</html>
Der Code liefert in der function callback(xhr) ein xml Object zurück, dieses kann ausgewertet werden. Zu Testzecken FireBUG Netzwerk>alle>GET....>XML aufrufen hier sollte der XML Baum erscheinen.