Gruppenkommunikation in Sensornetzwerken (PD Stefan Bosse)

Gruppenkommunikation in Sensornetzwerken

Gruppenkommunikation in Sensornetzwerken
Der Router
Start Router Service
Die LuaOS Route Klasse
Kommunikation
Gruppen
Garbage Collector
LuaOS Koroutinen
Aufgabe
Wahle eines Leaders (Zeitserver)
Uhrensynchronisation

In dieser Übung soll ein erster Prototyp einer kanalbasierten Sensorkommunikation über Gruppen programmiert werden

Der Router

Der Sensor Router ermöglicht die Verbidung von Sensorknoten für kanalbasierte Kommunikation.

Der Sensor Router (Program luaosrouter) stellt folgende Dienste zur Verfügung:

  1. Gruppenverwaltung
  2. Kommunikationsports für externe Verbindung
  3. Virtuelle Schaltungen (Virtual Circuit VC, interne Verbindungen zwischen Router Ports)
  4. Sicherhiet über Capabilities (fehlt noch)

Der Sensor Route nutzt zwei verschiedene Kommunikationsprotokolle:

  1. HTTP für Sensorknoten-Router Interaktion (RPC)
  2. WebSockets (als Upgrade einer HTTP Verbindung) für kanalbasierte Kommunikation zwischen Sensorknoten über den Router

Welche Nachteile hat diese Kommunikationsarchitektur in Hinblick auf Robustheit und Skalierbarkeit (Anzahl Sensorknoten)?

Start Router Service

Es wird benötigt:

> lvm luaosrouter -h
usage: luaosrouter [-v -h] [-host IP/URL/?] [-port NUM] [-portHTTP NUM] [-portWS NUM]
> lvm luaosrouter
# Oder zum Testen
> lvm luaos.out service.lua

Je nach Betriebssystem kann es wichtig sein eine Host IP Adresse anzugeben. Wenn keine IP adresse des Rechners bekannt ist (intern, nicht öffentlich!) dann kann mit -host ? eine ermittelt werden (kann aber muss nicht richtig sein - kontrollieren!)

Die LuaOS Route Klasse

Jede Kommunikation mit dem Router und dann auch mit Peers (Sensorknoten) findet über eine Route Instanz statt:

local <route> = route:new(url:string)

Nur der HTTP Port des Routers muss bekannt sein und bei der Ezuegung des Routeobjekts angegeben werden.

local result = <route>:ping()

Kommunikation

local <port> = <route>:connect()
local result = <port>:connect(uuid:string,bidirectional:boolen)

Wenn das Argument bidirectional auf false gesetzt wird (oder nicht vorhanden ist) werden nachrichten von diesem Port nur an die Zielknoten gesendet. Die Zielknoten können keine Antwort zurück schicken (da sie noch nicht mit diesem Peer verbunden sind). Wenn das Argument bidirectional auf true gesetzt wird gibt es auch einen Rückkanal.

<port>:write(string|table,destination?:string)
local data,err = <port>:read()
local co = coroutine.create(function ()
  while <port>.state == "OPEN" do
    local data = <port>:read();
    -- Process data
  end
end)
coroutine.resume(co)

Gruppen

local status = <route>:create(grouip:string)
local members = <router>:ask(groupid:string)
local status = <route>:join(grouid:string,peerid:string)
local status = <route>:unjoin(grouid:string,peerid:string)

Garbage Collector

Der Router stellt auch einen Garbage Collector Service zur Verfügung. Dieser wird in periodischen Abständen ausgeführt:

  1. Alle leeren Gruppen werden nach einem Timeout (z.B. 60s) gelöscht
  2. Alle Peers in Gruppen die keinen aktiven Port mehr haben werden aus den Gruppen entfernt
  3. Alle Peers die noch einen (scheinbaren) aktiven Port haben werden in Abständen mit einer internen ping Nachricht getestet. Wenn es keine Rückantwort gibt dann 2.

Der Garbage Colelctor wird automatisch gestartet.

LuaOS Koroutinen

Aufgabe

Vorbereitung: Wähle einen rechner aus auf dem der LuasOS Router läuft. Dann wähle möglich viele Rechner im lokalen oNetzwerk oder über das Internet aus auf den über den Browser und über die Konsole und lvm Skripte ausgeführt werden können.

  1. Baue eine Gruppe "MISS" auf.
  2. Jeder Knoten wird Mitglied in der Gruppe und jeder Knoten verbindet sich unidirektional mit allen anderen Knoten (Ports)
  3. Erzeuge eine Clock Funktion die mit der milli Funktion + einem einmalig gewählten randomisierten Offset von ± 1000ms eine interne Knotenzeit zur Verfügung stellt. Die Uhr soll synchronisierbar sein, d.h., später durch einen Deltawert verstellbar sein
  4. Alle Knoten der Gruppe "MISS" wählen einen Leader aus der seine Zeitreferenz im Netzwerk zur Verfügung stellt (Zeitserver)
  5. Alle Knoten sollen ihre Uhren synchronisieren (mit Zeitreferenz vom ausgewählten Zeitserver)

Welche Netzwerkarchitektur wird in diesem Beispiel erzeugt?

Wahle eines Leaders (Zeitserver)

Naiver Ansatz:

Init: Jeder Knoten hat eine ID (UUIDv4) und eine zufällig
      erzeugte Priorität im Bereich {0,1,..,65535} (Es kann Dopplung geben!!)
1. Jeder Knoten sendet allen anderen Knoten das Tupel <UUID,PRIO> 
   als Nachricht "REQ <UUID,PRIO> "
2. Jeder Knoten empfängt in einem Zeitintervall [t0,t1] die 
   Nachrichten "REQ" beginnend mit der ersten Nachricht
3. Jeder Knoten wählt dann einen Leaderknoten aus wenn es einen einzigen 
   Knoten mit der größten PRIO gibt
4. Wenn ein Knoten einen Leader ausgewählt hat sendet er eine "ACK" Nachricht
   an alle anderen Knoten ("ACK <UUID>")
5. Wenn ein Knoten alle "ACK" Nachrichten erhalten hat steht der Leader fest
6. Ansonsten (nach einer Wartezeit [t1,t2]) startet eine neue Runde bis ein Leader gefunden wurde

Hinweis: Eine Nachricht wird über den Kanal als Tabelle versendet. Z.B. im Format:

local msg = { tag="ACK", id=1234 }
<port>:write(msg)
Programmcode Leaderwahl

 ▸ 
 ✗ 
 ≡ 

Uhrensynchronisation

Wie könnte man die Zeitdifferenz δ schätzen bzw. hinzurechnen?

Bei der Anfrage wird die eigene Zeit vermerkt, ebenso die Zeit beim Eintreffen der Antwort.

#clocksync01

Programmcode Lokale Uhr und Uhrensynchronisation

 ▸ 
 ✗ 
 ≡ 



Hilfe



Einreichung (Assignment #03-36598)



Prüfen



Bewerten (Lehrer)




Created by the NoteBook Compiler Ver. 1.16.1 (c) Dr. Stefan Bosse (Thu Dec 16 2021 19:18:01 GMT+0100 (CET))