Sensor Aggregation in Netzwerken (1) (PD Stefan Bosse) |
In dieser Übung soll ein erster Prototyp eine Sensor Monitors programmiert werden
terminal> lvm luas
Linux: Optional ./lvm
in dem Verzeichnis ausführen wo lvmÜ gespeichert wurde da es schon ein Systemprogramm lvm gibt!
LuaOS im WEB Browser und in der nativen Plattform sind naehzu identisch in der API.
Es soll ein einfacher HTTP Server gebaut werden der mittels eines HTTP basierten RPC Sensordaten von Sensorknoten empfängt und diese in einem weiteren WEB HTTP-HTML Service textuell darstellt. Also zweimal HTTP mit dem gleichen IP Port:
LusOS bietet die http
Klasse um einen HTTP Server zu erzeugen (nur native Plattform, im WEB Browser nicht möglich):
local hs = http:new()
hs:service(22223, function (method,url,peername,params,body)
...
return response -- Text!
end)
Die Parameter des HTTP Request Handlers:
"GET"/"PUT"
Einfache HTML Seiten können mit der LuaOS html
Klasse erzeugt werden:
local H = html:new()
local htmltext = H:html(
H:head(),
H:body({
H:h1("text"),
H:h2("text"),
H:p("text"),
H:ol({
H:li("text"),
H:li("text"),
..
}),
H:table({
{ "text", "text", .. },
{ "text", "text", .. },
...
})
})
)
date()
).Im nächsten Schritt soll ein Sensor Service programmiert werden der folgende Aufgaben erfüllen soll:
Alle eingehenden Sensordaten (PUT Request) im Format {sensor:string,time:number, data:string,unit:string} sollen in einer dynamisch wachsenden Tabelle eingbaut werden. Wenn das Sensordatenrekord keinen Zeitstempel enthält muss im Server einer hinzugefügt werden. Die (Lua) Tabelle enthält direkt die emfpangenen Sensordatenrekords.
Es soll eine Coroutine geben die in periodischen Abständen alte Einträge entfernt (Zeitstempel verwenden). Der Timeout soll konfigurierbar sein.
Es sollen Mittelwerte aktueller Sensordaten berechntet werden (nur numerische Sensoren wie Geo/GPS) oder Verteilungen bei kategorischen Werten (siehe 6.). Der Geo Sensor liefert eine Tabelle mit numerischen lon und lat Feldern. Wichtig: Die Sensordaten werden im JSON Textformat übertragen und müssen in ein Lua Datentyp mittels JSON.decode(textdata)
konvertiert werden.
Der Server soll eine dynamische HTML Seite erzeugen die alle Sensoreinträge als HTML Tabelle listet und eine weitere Tabelle mit Sensormittelwerten (+ Standardabweichung der Werte) oder beo kategorischen Werten eine Verteilung
Es soll aus dem Agententext das Betriebssystem (Linux, Windows, MacOS) und die Plattform (Browser/lvm) mit String Funktionen LUA Strings und LUA String Operationen sowie LUA Patterns bestimmt und als eigenständige Sensor eingetragen werden.
Die Programmierung erfolgt in der LuaOS WEB IDE, der Programmcode soll schliesslich hier in die Übung kopiert werden.
▸
|
✗
≡
|
Jeder Klient (Sensorknoten genannt) kann auf eigene Sensoren über die generische Sensorklasse zugreifen. Dabei stehen je nach Plattform verschiedene Sensorunterklassen zur Verfügung die mittels der sensor:all
Methode abgefragt werden können. Im WEB Browser werden es nur wenige sein, u.A. geo der die GPS Koordinaten des Standortes über die IP Adresse liefert (sehr ungenau) sowie agent der Informationen über die Plattform als String ausgibt. Ein Sensor muss von der generischen Klasse durch s=sensor:new("class")
erzeugt werden:
local available = sensor:all()
local geo1 = sensor:new("geo")
geo1:start()
Ein Sensor muss i.A. gestartet werden (genauer das periodische Sampling). Mittels der s:read()
Methode wird der aktuelle Wert gelesen. Dieser kann aus einem bereits erfolgten Samplingvorgang stammen (z.B. in einer Smartphone App) oder direkt erfasst werden.
local geo1 = sensor:new("geo")
geo1:start()
sleep(1000) -- Die initiale Geo Erfassung dauert eine kurze Zeit
local sample = geo1:read()
print(sample)
Der Klient soll direkt im WEB Browser mit der LuaVM.js UND auch in einer Version in einem nativen LuaOS laufen
Ein HTTP PUT Request kann über die http Klasse erzeugt werden:
local hc = http:new()
local url = "localhost:22223"
local sata = { sensor="test",time=time(), data=0, unit="integer" }
local response,header,error = hc:put(url,JSON.encode(data))
Der Sensor Server muss natürlich zuerst auf der lvm gestartet werden (über die LuaOS WEB IDE)!
Der HTTP PUT Request liefert eine (textuelle) Rückantwort des Servers (hier z.B. einfach "OK").
Zwei Sensoren sollen ausgelesen werden: agent und geo.
Die Sensorwerte sollen (einmalig) zum Sensor Server im JSON Format gesendet werden (JSON.encode(request)
). Dabei ist ein Sensordatenwert eine Lua Tabelle {sensor:string, time:number, data:table|string|number, unit:table|string}
die im JSON Format übertragen wird. Das Feld sensor enthält den Klassennamen des Sensors.
Teste die Ausgabe der Sensoren im Klientencode und dann nach der Versendung auf dem Server über das WEB Interface
▸
|
✗
≡
|