Superenkel dashboarding direkt på linkit en (1 / 2 steg)
Steg 1: En sida om misslyckande
Här är några saker jag provat... som inte fungerade. Detta är kanin hål som jag kom in och nästan fick mig att ge upp.
-Först försökte jag ladda alla fribord js sidor och alla dess beroenden normalt och bara mata dem direkt till klienten genom att återanvända wifiwebserver och kod från en välkänd arduino forummedlem, zoomkat. Detta ledde mig att komma med något liknande vad du ser här:
/ * Skriven för Linkit en
* En webserver som ser till index.html inne om rotfästa dir av onboard lagring
* och serverar den sidan...
* Jag använder detta för att testa hosting fribord för några projekt
* Tack till användaren zoomkat på arduino forum,
* och WifiWebServer och lagring exempelkod från linkit ett team
*/
#include < LTask.h >
#include < LWifi.h >
#include < LWifiClient.h >
#include < LWifiServer.h >
#include < LFlash.h >
#include < LSD.h >
#include < LStorage.h >
#define WIFI_AP "blah"
#define WIFI_PASSWORD "blah"
#define WIFI_AUTH LWIFI_WPA
#define Drv Kraaalj
LWiFiServer server(80);
Sträng readString, pos;
void setup() {
pinMode (10, OUTPUT);
Drv.BEGIN();
LWiFi.begin();
Serial.BEGIN(115200);
hålla försöker igen tills ansluten till AP
Serial.println ("ansluter till AP");
medan (0 == LWiFi.connect (WIFI_AP, LWiFiLoginInfo (WIFI_AUTH, WIFI_PASSWORD)))
{
Delay(1000);
}
printWifiStatus();
Serial.println ("starta Server");
Server.BEGIN();
Serial.println ("Server började");
}
int loopCount = 0;
void loop() {
sätta din huvudsakliga kod här, för att köra flera gånger:
Delay(500);
loopCount ++;
LWiFiClient klient = server.available();
om (klient)
{
Serial.println ("ny kund");
en http-förfrågan avslutas med en tom rad
booleska currentLineIsBlank = sant;
samtidigt (client.connected()) {
om (client.available()) {
Vi i princip ignorerar klientbegäran, men vänta HTTP begäran slutet
char c = client.read();
Läs röding av char HTTP-begäran
om (readString.length() < 100) {
lagra tecken till sträng
readString += c;
Serial.Print(c);
}
om HTTP-begäran har avslutats
om (c == "\n") {
Serial.println("ReadString");
Serial.println(readString);
om (readString.indexOf("freeboard") > = 0) {
client.println ("HTTP/1.1 200 OK"); Skicka ny sida
client.println ("Content-Type: text/html");
client.println();
LFile MinFil = Drv.open("index.html");
om (MinFil) {
samtidigt (myFile.available()) {
client.write(myfile.Read());
}
myFile.close();
}
}
annat {
om filen finns Fortsätt
Sträng filepath = readString.substring ((readString.indexOf("GET")+5),(readString.indexOf("HTTP")));
char fullpath [1024];
filepath.toCharArray(fullpath,1024);
Serial.println(filepath);
Sträng förlängning = filepath.substring (filepath.lastIndexOf("."));
Serial.println(Extension);
om (sant) {
Serial.println ("Skicka svar");
Skicka ett standard http-svarshuvud
client.println ("HTTP/1.1 200 OK");
om ((extension.indexOf("html") > = 0) || (extension.indexOf("htm") > = 0)) {
client.println ("Content-Type: text/html");
}
om (extension.indexOf("css") > = 0) {
client.println ("Content-Type: text/css");
}
om (extension.indexOf("js") > = 0) {
client.println ("Content-Type: application/javascript");
}
om (extension.indexOf("map") > = 0) {
client.println ("Content-Type: application/x-navimap");
}
om (extension.indexOf("png") > = 0) {
client.println ("Content-Type: image/png");
}
client.println();
LFile MinFil = Drv.open(fullpath);
om (MinFil) {
samtidigt (myFile.available()) {
client.write(myfile.Read());
}
myFile.close();
}
}
om filen inte finns borgen med 404
annat {
client.println ("HTTP/1.1 404");
client.println ("innehåll-Tyep: text/html");
client.println();
client.println ("404-filen hittades inte");
}
}
Delay(100);
stänga anslutningen:
Serial.println ("nära samband");
client.stop();
}
}
}
}
}
void printWifiStatus()
{
skriva ut SSID för nätverket du är ansluten till:
Serial.Print ("SSID:");
Serial.println(LWiFi.SSID());
skriva ut din WiFi shield's IP-adress:
IP-adress ip = LWiFi.localIP();
Serial.Print ("IP-adress:");
Serial.println(IP);
Serial.Print ("nätmask:");
Serial.println(LWiFi.subnetMask());
Serial.Print ("gateway IP:");
Serial.println(LWiFi.gatewayIP());
skriva ut mottagna signalstyrka:
långa rssi = LWiFi.RSSI();
Serial.Print ("signalstyrka (RSSI):");
Serial.Print(RSSI);
Serial.println ("dBm");
}
För nu kommer vi fokusera på denna del:
om (MinFil) {
samtidigt (myFile.available()) {
client.write(myfile.Read());
}
myFile.close();
}
}
Vad som händer här är att som filen stream kommer bort av minnesutrymme på linkit en det får placeras i en stream buffert i RAM och sedan från denna buffert dumpad i utgående nätverk stack köerna. Detta presenterar två frågor:
Den första bufferten är faktiskt ganska liten och läsa en fil från ROM är inte särskilt snabb. Så, vad du sluta med är mycket långsamma lastning sidor. Ibland de tiden ut eller göra andra konstiga saker. Jag wiresharked (https://www.wireshark.org/) anslutningen och det ser ut som det bara spottar ut små paket av omkring 50 byte (senare började det meningsfullt för mig som det buffert som används när läsa filer i är förmodligen om att storleken). Fribord har faktiskt ett gäng av beroenden som behövs för att ladda. Några av dessa göra samtidiga saker och ladda dynamiskt saker. Detta fungerar inte i en enkel linjär program. Det finns nog sätt att göra detta arbete på en arduino men inte lätt (en början skulle vara att titta här: https://learn.adafruit.com/multi-tasking-the-ardu... .
Jag försökte med olika metoder att läsa filen i och att se till att bufferten var nästan full innan du skickar mer data till klienten. men fick inte särskilt långt. Jag försökte också readUntil och dess varianter. Ingen av dessa gjorde susen
Några blandade länkar jag läst under denna kanin hål utforskning:
http://forum.Arduino.cc/index.php?topic=279849.msg...
http://Playground.Arduino.cc/Code/WebServerST
http://forum.Arduino.cc/index.php?topic=279849.msg...
https://www.Arduino.cc/en/reference/StreamReadStr...
Slutligen jag sönder och såg för något mycket lätt att uppfylla min önskan om en grafisk representation av data tillsammans med json exponeringen av data. Vad jag kom med rellies på html 5 "meter" eller "progress" element. Dessa är i huvudsak små diagram som renderar utan extern JS innehåller eller heavyweight styling. Detta är nakna ben.
Sid-koden jag kom med såg ut ungefär så här (och lästes av något liknande till listningen ovan men med ett tillägg att presentera de batteri avläsningarna som json på /bat):
<! DOCTYPE html >
< html >
< body >
< h3 > enkel Sensor mäter Demo < /p >
< p > batteri (med mätaren element): < mätaren id = "bat" min = "0" max = "100" value = "0" >< / meter >< /p >
< p > batteri (med framsteg element): < framsteg-id = "batp" max = "100" value = "0" >< / meter >< /p >
< p > laddning: < h3-id = "laddning" >< / h3 >< /p >
< script >
funktion Get(yourUrl) {
var Httpreq = ny XMLHttpRequest(); en ny begäran
Httpreq.Open("get",yourUrl,false);
Httpreq.send();
återvända Httpreq.responseText;
}
funktion updateMeters() {
var jsonBat = JSON.parse(Get("/bat"));
window.Alert(jsonBat);
document.getElementById("bat").value = jsonBat.batteryLevel;
document.getElementById("batp").value = jasonBat.batteryLevel;
document.getElementById("charging").innerHTML = jsonBat.chargingStatus;
}
updateMeters();
setInterval(updateMeters,5000);
< / script >
< / body >
< / html >
Dock sprang jag in i en annan fråga med min kod...
Om jag skulle läsa in skulle en HTML-sida och HTML-sidan försöka göra en HTTP GET på något på linkit en därefter ingenting skulle hända. Jag blev förvirrad tills jag räknat ut. Koden var enda gängade och blockerar. Så, var det att vänta tills den första sidan gjordes lastning ladda nästa sida. Detta hänt aldrig och så den fastnade.