Linkit en servering JSONP sensordata (batteriet exempel) (3 / 4 steg)
Steg 3: Kod genomgång
När du är klar bör du kunna gå till din linkit en IP-adress och se något liknande vad avbildas för detta steg.
#include < LTask.h >
#include < LWifi.h >
#include < LWifiServer.h >
#include < LWifiClient.h >
#include < LBattery.h >
Detta är de mediatek bibliotek. Jag minns inte vad gör. Wifi hjälp med wifi och batteriet en erbjuder två enkla funktioner. En att kontrollera batterinivån och något att berätta om det är att vara laddade eller urladdat.
Konfiguration av WiFi AP inställningar.
#define WIFI_AP "foo"
#define WIFI_PASSWORD "bar"
LWIFI_OPEN, LWIFI_WPA eller LWIFI_WEP.
#define WIFI_AUTH LWIFI_WPA
Lägger AP informationen här (detta är typ av sak som i en finare skiss du skulle sätta i egenskaperna för en fil på den lagring delen av styrelsen och läsa här).
Konfigurera timeout för en http-begäran (ms).
CONST uint32_t requestTimeout = 1000;
Globala variabler
LWiFiServer server(80);
röding buff [256];
Self förklarande globala variabler. Servern port det vad att 80 är.
void setup()
{
LTask.begin();
LWiFi.begin();
Serial.BEGIN(115200);
Delay(2000);
}
Jag tog ut den försening som fanns i den ursprungliga skissen. Om du vill veta varför förseningar är onda checka ut det här: https://www.sparkfun.com/news/1940
yadda yadda... det finns några kod som kontrollerar wifi status och spammar det till seriekonsoll. Jag kommer inte att gå över den här. Det är bra för att snabbt räkna ut vilken IP-adress din linkit en har fått från AP. Det andra sättet du kan göra att det genom att gå till administratörssidan av din AP och titta på DHCP tabell för posten med matchande MAC-adressen (titta på klistermärket på undersidan av din styrelse).
samtidigt (client.connected())
{
om (client.available())
{
Vi i princip ignorerar klientbegäran, men vänta HTTP begäran slutet
int c = client.read();
lastReceptionTime = millis();
Serial.Print((Char)c);
om (c == '\n' & & currentLineIsBlank)
{
Serial.println ("Skicka svar");
Skicka ett standard http-svarshuvud
client.println ("HTTP/1.1 200 OK");
client.println ("Content-Type: application/json");
client.println ("anslutning: Stäng"); anslutningen kommer att stängas efter slutförandet av svar
client.println ("Access-kontroll-tillåta-ursprung: *");
client.println();
client.Print("{\"batteryLevel\":\"");
client.Print(LBattery.level());
client.Print ("\", \"chargingStatus\":\ "");
client.Print(LBattery.isCharging());
client.Print("\"}");
client.println();
bryta;
}
om (c == "\n")
{
du börjar en ny rad
currentLineIsBlank = sant;
}
annars om (c! = '\r')
{
du har fått ett tecken på den aktuella raden
currentLineIsBlank = false;
}
}
annat
{
om (millis() - lastReceptionTime > requestTimeout)
{
Serial.println ("fel - client timeout, släppa anslutning...");
bryta;
}
}
}
de web webbläsare möjlighet att ta emot data
Delay(500);
stänga anslutningen:
Serial.println ("nära samband");
client.stop();
Serial.println ("klienten kopplas från");
}
Denna bit är korrekt webbservern. Det hand tar om allt från när en klient träffar det med en HTTP GET till den grad att anslutningen sker.
Viktiga saker händer i dessa rader:
client.println ("Content-Type: application/json");
Raden anger MIME-typen för returen till json, som förstås av många "IoT enablers" som ubidots, fribord, etc.
client.Print("{\"batteryLevel\":\"");
client.Print(LBattery.level());
client.Print ("\", \"chargingStatus\":\ "");
client.Print(LBattery.isCharging());
LBattery.level() är det mycket enkel metod jag hänvisade till tidigare som bara returnerar batterinivån. Tyvärr det är inte mycket finkornigt och ger endast 0, 33, 66 och 100.
Det är ganska enkelt att ersätta denna kod med din egen och har tjänat någon sensor värden som json data för lätt konsumtion. Ersätt batteryLevel med din deskriptor och funktionsanropet med ett funktionsanrop som hämtar data från din sensor val. Du kan också expandera dessa utskrift rader i samma mönster att bygga mer struktur i det. För mer information om json och vad json ser ut kolla in: http://www.w3schools.com/json/