2016-06-09 9 views
0

So habe ich vor kurzem eine NodeMCU Lua V1, ich startete es mit meinem WiFi verbunden, und lud den Standard-HTTP-Server von https://en.wikipedia.org/wiki/NodeMCU#HTTP_server. Aufgeregt habe ich einen Port nach vorne auf meinem ADSL-Router und bat Freunde, eine Verbindung herzustellen, um meine Hallo Welt Antwort zu sehen. Meine Freunde, die Apple-Geräte (iPhone/iPad) haben, konnten die Website nicht laden. Wo Freunde mit Android-Geräten oder Computern keine Probleme hatten, die Website zu sehen. Ich habe versucht, mein iPad zu verwenden, das sich im selben WLAN-Netzwerk befindet. Es hatte auch dieses Verhalten. Um herauszufinden, was los ist, habe ich verschiedene Browser auf dem iPad ausprobiert. Ich machte einen Wireshark-Trace und sah die NodeMCU die Antwort an das iPad senden. Aber das iPad zeigte entweder einen Verbindungsfehler oder eine Offline-Nachricht an. Denken, es könnte HTML-Header, die ich fehlt die Antwort änderte sich die nodeMCU zu sendet:iOS ignorieren NodeMCU http Server Antwort und Browser zeigt keine Verbindung

<!DOCTYPE html><html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html> 

Immer noch das iPad die gleiche Botschaft zeigte.

Also meine Frage ist, warum verhält sich iOS so, was blockiert es und macht den Browser denken, dass es keine Internetverbindung hat? Verhält sich der Browser auf iOS so oder tut das Betriebssystem etwas seltsam? Was müsste ich tun, damit ein iOS-Gerät die Webseite sehen kann?

Antwort

1

Oh Mann, dieser Wikipedia-Artikel ist wirklich schrecklich (siehe auch https://github.com/nodemcu/nodemcu-firmware/issues/832). Ich habe dieses Codebeispiel oft gesehen, aber nie realisiert, woher es stammt.

Zunächst sollten Sie nicht die alten 0.9.x-Binaries verwenden, mit denen Ihr NodeMCU-Modul wahrscheinlich geladen wird. Sie werden nicht mehr unterstützt und enthalten viele Fehler. Build a custom firmware aus dem Zweig dev oder master. Zweitens, überprüfen Sie die offizielle Dokumentation auf socket:send(), um zu lernen, wie man das richtig macht.

Das eigentliche Problem ist jedoch conn:send("<h1> Hello, NodeMcu.</h1>"), da diese Nachricht keine gültige HTTP-Antwort ist. Sie müssen das mit HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n voranstellen.

Ähnliche Fragen & Antworten sind here und here.

+0

Vielen Dank für die Lösung, es funktioniert jetzt, warum, obwohl es nur iOS-Geräte, die dies ablehnen als keine gültige Antwort ist? Es scheint, dass der iOS-Netzwerkstapel die Nachricht ablehnt und versucht, das TCP-Paket noch zweimal zu erhalten. Warum löst das Hinzufügen von HTTP/1.0 ... das Problem, das nur auf iOS-Geräten auftritt? –

+0

Sie müssten Apple fragen ... Ich kann nur raten, dass andere Browser ein bisschen "nachsichtiger" und fehlerverzeihender sind, wenn sie Antworten verarbeiten. IMO das ist eigentlich schlechtes Verhalten, weil es grundlegende Fehler maskiert. –