05.07.2013 Aufrufe

Diplomarbeit ? Konzeption und Evaluierung eines ... - CES

Diplomarbeit ? Konzeption und Evaluierung eines ... - CES

Diplomarbeit ? Konzeption und Evaluierung eines ... - CES

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Diplomarbeit</strong><br />

” <strong>Konzeption</strong> <strong>und</strong> <strong>Evaluierung</strong> <strong>eines</strong><br />

energieeffizienten Sensornetzwerks anhand realer<br />

Sensorknoten“<br />

Universität Karlsruhe (TH)<br />

Fakultät für Informatik<br />

Institut für Technische Informatik (ITEC)<br />

Lehrstuhl für Eingebettete Systeme (<strong>CES</strong>)<br />

Prof. Dr. Jörg Henkel<br />

Autor: Sebastian Kobbe<br />

Referent: Prof. Dr. Jörg Henkel<br />

Betreuer: Dipl.-Technoinf. Dominic Hillenbrand, Dipl.-Inform. Thomas Ebi<br />

15.04.2008 - 14.10.2008<br />

Chair for Embedded Systems


Ich versichere hiermit wahrheitsgemäß die Arbeit, bis auf die dem Aufgabensteller bereits<br />

bekannte Hilfe, selbständig angefertigt, alle benutzten Hilfsmittel vollständig <strong>und</strong><br />

genau angegeben <strong>und</strong> alles kenntlich gemacht zu haben, was aus Arbeiten anderer unverändert<br />

oder mit Abänderung entnommen wurde.<br />

Karlsruhe, 14.10.2008<br />

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

Ort, Datum (Sebastian Kobbe)


Danksagung<br />

An dieser Stelle möchte ich mich bei allen Personen bedanken, die mich bei der Erstellung<br />

dieser Arbeit direkt oder indirekt unterstützt haben.<br />

Mein Dank gilt hierbei Prof. Dr. Jörg Henkel für die Bereitstellung des spannenden<br />

<strong>und</strong> herausfordernden Themas dieser <strong>Diplomarbeit</strong>.<br />

Großer Dank gilt Herrn Frank Krause der ehemaligen Betty TV AG für die Bereitstellung<br />

der in dieser Arbeit verwendeten Hardwareplattform sowie meinem Betreuer,<br />

Dipl.-Technoinf. Dominic Hillenbrand, der mit viel Engagement <strong>und</strong> hilfreichen<br />

Ratschlägen meine <strong>Diplomarbeit</strong> betreut hat.<br />

Für die Unterstützung in der letzten Phase dieser Arbeit möchte ich mich besonders<br />

bedanken bei meiner Fre<strong>und</strong>in Monika, meiner Schwester Daniela, meinen Eltern sowie<br />

Heiko Reese <strong>und</strong> Dipl.- Inform. Thomas Ebi.<br />

I


Inhaltsverzeichnis<br />

Danksagung I<br />

1 Einleitung <strong>und</strong> Motivation 1<br />

1.1 Sensorknoten <strong>und</strong> Sensornetze . . . . . . . . . . . . . . . . . . . . . . . 1<br />

1.2 Ausgangssituation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.2.1 Vorgehensweise beim Entwurf . . . . . . . . . . . . . . . . . . . 2<br />

1.2.2 Gründe <strong>und</strong> Probleme dieser Vorgehensweise . . . . . . . . . . . 2<br />

1.2.3 Ansätze zur Verbesserung der Situation . . . . . . . . . . . . . . 4<br />

1.3 Zielsetzung dieser Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . 4<br />

1.3.1 Vorgehensweise . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

1.3.2 Stichwortartige Auflistung der Fähigkeiten <strong>und</strong> Funktionen des<br />

entworfenen Systems . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

1.3.3 Ähnliche Arbeiten . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />

1.4 Aufbau dieser Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />

2 Systemvision <strong>und</strong> Einsatzmöglichkeiten 9<br />

2.1 Systemvision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />

2.2 Einsatzmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />

2.2.1 Datensammlung . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.2.2 Bildübertragung . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

2.2.3 Positionsbestimmung . . . . . . . . . . . . . . . . . . . . . . . . 12<br />

3 Analyse <strong>und</strong> Anforderungsspezifikation 15<br />

3.1 Funktionale Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . 15<br />

3.2 Nicht-funktionale Anforderungen . . . . . . . . . . . . . . . . . . . . . 16<br />

3.3 Gegebenheiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />

3.3.1 Hardwareplattform . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />

3.3.2 Messung der Leistungsaufnahme . . . . . . . . . . . . . . . . . . 22<br />

3.3.3 Messung der Abstrahlcharakteristik . . . . . . . . . . . . . . . . 28<br />

3.3.4 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />

4 Systementwurf 31<br />

4.1 Softwarearchitektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />

4.1.1 Architektur der Firmware . . . . . . . . . . . . . . . . . . . . . 31<br />

4.1.2 Aufteilung des Speichers . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.1.3 Architektur der Anwendung . . . . . . . . . . . . . . . . . . . . 35<br />

III


4.2 Software Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />

4.2.1 Übertragung über die serielle Schnittstelle . . . . . . . . . . . . 44<br />

4.2.2 Übertragung per Funk . . . . . . . . . . . . . . . . . . . . . . . 44<br />

4.2.3 Bindeglied Firmware / Anwendung . . . . . . . . . . . . . . . . 44<br />

4.3 Netzwerkarchitektur <strong>und</strong> Protokolle . . . . . . . . . . . . . . . . . . . . 47<br />

4.3.1 Gr<strong>und</strong>legende Datenübertragung . . . . . . . . . . . . . . . . . 47<br />

4.3.2 Protokoll der kabellosen Softwareaktuallisierung . . . . . . . . . 49<br />

4.3.3 Nachbarschaftsbeziehung . . . . . . . . . . . . . . . . . . . . . . 54<br />

4.3.4 Signalisierung <strong>und</strong> Routenmanagement . . . . . . . . . . . . . . 55<br />

4.3.5 Netzweite Datenübertragung . . . . . . . . . . . . . . . . . . . . 62<br />

5 Implementierung <strong>und</strong> Testumgebung 69<br />

5.1 Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />

5.1.1 Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />

5.1.2 Ansteuerung des Funkchips . . . . . . . . . . . . . . . . . . . . 75<br />

5.1.3 Automatische Codeerzeugung für Anwendungsaustausch . . . . 76<br />

5.1.4 Software-Update Protokoll . . . . . . . . . . . . . . . . . . . . . 81<br />

5.1.5 Routenauswahl <strong>und</strong> -bewertung . . . . . . . . . . . . . . . . . . 84<br />

5.1.6 Nachrichtenbündelung . . . . . . . . . . . . . . . . . . . . . . . 88<br />

5.2 Testdurchführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93<br />

5.2.1 Behandlung von Fehlern auf dem Datenpfad . . . . . . . . . . . 95<br />

5.2.2 Zeitsynchronisierung . . . . . . . . . . . . . . . . . . . . . . . . 95<br />

5.2.3 Übertragungseffizienz <strong>und</strong> Belastbarkeit . . . . . . . . . . . . . 98<br />

5.2.4 Positionsbestimmung . . . . . . . . . . . . . . . . . . . . . . . . 101<br />

6 Zusammenfassung <strong>und</strong> Ausblick 103<br />

6.1 Erreichtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103<br />

6.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104<br />

IV


1 Einleitung <strong>und</strong> Motivation<br />

Durch den Fortschritt der Technik ist es heutzutage möglich, leistungsfähige <strong>und</strong> preiswerte<br />

Mikrocomputer zu produzieren. Werden diese mit Sensoren versehen <strong>und</strong> mit<br />

einer Kommunikationsschnittstelle ausgestattet, so spricht man von ” Sensorknoten“.<br />

Mehrere solcher Sensorknoten bilden – sofern sie untereinander vernetzt werden – ein<br />

” Sensornetz“.<br />

Werden Sensorknoten in andere – nicht unbedingt rechenorientierte – Objekte integriert,<br />

so spricht man von ” eingebetteten Systemen“ 1 . Als Beispiel hierfür sei ein in eine<br />

Kaffeetasse integrierter Sensorknoten genannt, welcher unter anderem die Temperatur<br />

des Inhalts der Tasse messen <strong>und</strong> diese anderen Geräten über eine Infrarotverbindung<br />

mitteilen kann[1].<br />

Schwerpunkt dieser Arbeit ist der Entwurf einer neuen Sensorknoten-Plattform aufgr<strong>und</strong><br />

einer gegeben Hardware-Plattform sowie die Kommunikation zwischen den einzelnen<br />

Knoten <strong>und</strong> der Aufbau einer selbstorganisierten, energieeffizienten Vernetzung.<br />

1.1 Sensorknoten <strong>und</strong> Sensornetze<br />

Es folgt eine kurze Einführung in das Thema Sensorknoten <strong>und</strong> -netze. Für eine tiefer<br />

gehende Vorstellung des Themas <strong>und</strong> eine Analyse der typischen Probleme, welche<br />

beim Entwurf <strong>und</strong> Einsatz auftreten, sei beispielsweise auf das Buch ” Wireless Sensor<br />

Networks“[2] verwiesen.<br />

1.1.1 Eigenschaften von Sensorknoten<br />

Ein klassischer Sensorknoten ist ein mit begrenzten Ressourcen ausgestattetes System.<br />

Eine besondere Eigenschaft <strong>eines</strong> Sensorknotens ist es, dass er sowohl über Sensoren<br />

Daten erfassen kann, als auch in einem Netzwerk mit anderen Sensorknoten in Verbindung<br />

steht. Er verfügt über eine endliche Energieversorgung, geringe Rechenleistung<br />

<strong>und</strong> beschränkte Speicherkapazität. Die Kommunikation erfolgt typischerweise kabellos.<br />

Die Herausforderung beim Entwurf <strong>eines</strong> solchen Sensorknotens liegt darin, die zur<br />

1 Nicht jeder Sensorknoten stellt ein eingebettetes System dar, ebenfalls muss nicht jedes eingebettete<br />

System ein Sensorknoten sein.<br />

1


Kapitel 1. Einleitung <strong>und</strong> Motivation<br />

Verfügung stehenden Ressourcen optimal zu nutzen, so dass sich unter Berücksichtigung<br />

der zu erfüllenden Aufgabe eine möglichst lange Laufzeit des Knotens ergibt.<br />

1.1.2 Eigenschaften von Sensornetzen<br />

Ein Sensornetzwerk besteht aus einer (größeren) Anzahl einzelner Sensorknoten. Diese<br />

Knoten sind über ein Netzwerk miteinander verb<strong>und</strong>en <strong>und</strong> ermöglichen es so –<br />

obwohl jeder einzelne Knoten an sich nicht mächtig ist – komplexe <strong>und</strong> räumlich verteilte<br />

Aufgaben zu lösen. Zu den wichtigsten Eigenschaften, welche beim Entwurf <strong>eines</strong><br />

Sensornetzwerkes berücksichtigt werden müssen, zählt die Energieeffizienz der Kommunikation<br />

sowie eine geschickte Aufteilung der Systemlast auf alle beteiligten Knoten, um<br />

so eine insgesamt möglichst optimale Leistung <strong>und</strong> Laufzeit des Systems zu erreichen.<br />

1.2 Ausgangssituation<br />

Die Beschreibung der Ausgangssituation soll zeigen, wie ein solches Sensornetz entworfen<br />

wird <strong>und</strong> welche Probleme hierbei auftreten können. Diese möglichen Probleme<br />

wiederum dienen als Motivation für die Zielsetzung <strong>und</strong> Vorgehensweise dieser Arbeit.<br />

1.2.1 Vorgehensweise beim Entwurf<br />

Oftmals wird ein Sensornetzwerk nur in einer hohen Abstraktionsebene entworfen. Es<br />

wird ein Modell der einzelnen Knoten, des Kommunikationsmediums sowie des gesamten<br />

Netzes angefertigt <strong>und</strong> diese Modelle werden dann entweder getrennt oder zeitgleich<br />

simuliert. Viele Arbeiten beschränken sich ausschließlich auf die Simulation von Protokollen<br />

<strong>und</strong> Sensornetzen. Teilweise werden Ergebnisse veröffentlicht, von denen nicht<br />

bekannt ist, ob diese in der Realität ebenfalls zutreffen. Abbildung 1.1 zeigt die Schritte<br />

<strong>eines</strong> solchen Entwurfs.<br />

1.2.2 Gründe <strong>und</strong> Probleme dieser Vorgehensweise<br />

Einer der Gründe für diese Vorgehensweise beim Entwurf ist der Aufwand, welcher mit<br />

der Fertigung, Programmierung <strong>und</strong> Platzierung von mehreren H<strong>und</strong>ert Sensorknoten<br />

verb<strong>und</strong>en ist. Ebenfalls können die unter Umständen nicht unerheblichen Kosten 2 für<br />

die benötigte Anzahl an Sensorknoten eingespart werden. Eine einfache Simulation ohne<br />

Berücksichtigung von spezifischen Eigenschaften der Zielhardware <strong>und</strong> Modellierung<br />

der Umgebung ist daher in der Regel schneller <strong>und</strong> einfacher, als eine reale Umsetzung.<br />

2 Ein MICA2[3]-Knoten kostet beispielsweise über 100e<br />

2


a) Messung <strong>und</strong> Modellparametrisierung<br />

1.2. Ausgangssituation<br />

b) Simulation c) Realität?<br />

?<br />

realer Knoten simulierter Knoten<br />

reale Umgebung<br />

Abbildung 1.1: Üblicher Entwurf <strong>eines</strong> Sensornetzes. a) Ein Modell der Knoten <strong>und</strong> der<br />

Umwelt wird angefertigt. Aufgr<strong>und</strong> von Messungen mit einigen Knoten<br />

wird dieses Modell parametrisiert. b) Aufgr<strong>und</strong> dieses Modells wird ein<br />

großes Sensornetz entworfen <strong>und</strong> simuliert. c) Nicht bekannt ist, ob das<br />

so entworfene Netz auch in der Realität funktioniert.<br />

Problematisch ist hierbei jedoch die Modellierung <strong>und</strong> Simulation der Funkschnittstelle,<br />

welche stark von der jeweiligen Umgebung abhängig ist. Ein einmal angefertigtes <strong>und</strong><br />

parametrisiertes Modell trifft nur auf genau die Umgebung <strong>und</strong> den Zeitpunkt zu,<br />

in der bzw. an dem das Modell angefertigt wurde. Objekte in der Umgebung, deren<br />

Materialeigenschaften <strong>und</strong> sogar Wettereinflüsse können die Resultate stark verändern.<br />

Insbesondere bei kabellosen Netzen ist es somit zwar möglich, ein in der Theorie gut<br />

funktionierendes System zu entwerfen, nicht bekannt ist jedoch, ob dieses dann in<br />

einer realen Implementierung mit sich laufend ändernden Eigenschaften der Umgebung<br />

ebenfalls noch zufriedenstellend seine Aufgabe erfüllen kann – bekannt ist nur, dass das<br />

Netz unter den zu einem bestimmten Zeitpunkt gemessenen Parametern <strong>und</strong> unter der<br />

Annahme <strong>eines</strong> bestimmten Modells funktioniert.<br />

Dies liegt in der Natur der drahtlosen Kommunikation begründet. Zwar sind die theoretischen<br />

<strong>und</strong> mathematischen Modelle zur Simulation der Ausbreitung von Funkwellen<br />

<strong>und</strong> deren Wechselwirkung mit der Umgebung bekannt, es ist jedoch nahezu unmöglich,<br />

ein exaktes Modell der sich ggf. ständig ändernden Umgebung abzubilden. Der Aufwand,<br />

ein solches Modell zu erstellen ist in etwa vergleichbar mit einer realen Implementierung<br />

<strong>und</strong> anschließender <strong>Evaluierung</strong> in der Zielumgebung.<br />

Es lassen sich hierbei in einem gewissen Rahmen Parallelen zum sog. Raytracing aus<br />

dem Bereich der Computergraphik ziehen. Hierbei müssen die von einer Kamera 3 aufgenommenen<br />

Lichtstrahlen 4 einzeln rückverfolgt <strong>und</strong> ggf. reflektiert, gestreut <strong>und</strong> absorbiert<br />

werden. Es lassen sich mit dieser Vorgehensweise fotorealistische Graphiken<br />

erzeugen, sofern genügend Rechenzeit zur Verfügung gestellt wird.<br />

3 Die Kamera entspricht dem Empfänger<br />

4 Funkwellen niedriger Frequenz verhalten sich zwar nicht exakt wie Lichtstrahlen, mathematische<br />

Modelle zur Berechnung der Wellenausbreitung existieren jedoch entsprechend.<br />

3


Kapitel 1. Einleitung <strong>und</strong> Motivation<br />

Die Berechnung einer korrekten Simulation der Funkwellen <strong>und</strong> eine zeitlich korrekte<br />

Simulation der Sensorknotenhardware ist – wie das Raytracing – sehr rechenaufwendig,<br />

was direkt zum nächsten Problem führt: zur Simulation der Knoten <strong>und</strong> der<br />

Kommunikation zwischen den Knoten steht nur eine begrenzte Zeit zur Verfügung. Um<br />

die Simulation zu beschleunigen werden oft vereinfachende Annahmen getroffen, welche<br />

in der Realität nicht zutreffen. Nur so wird die Simulation <strong>eines</strong> gesamten Netzes<br />

über eine längere Zeitspanne hinweg praktisch möglich. So wird beispielsweise die (eigentlich<br />

kontinuierliche) Zeit in diskrete Ereignisse unterteilt <strong>und</strong> statt einer mathematisch<br />

<strong>und</strong> physikalisch korrekten Simulation der Funkwellenausbreitung erfolgt nur eine<br />

Modellierung <strong>eines</strong> ggf. mit Störungen behafteten Kanals zwischen jeweils zwei Knoten.<br />

Diese Art der Simulation eignet sich gut für kabelgeb<strong>und</strong>ene Netze mit bekannten<br />

Eigenschaften, jedoch weniger für ein kabelloses Netzwerk mit unbekannten Wechselwirkungen<br />

der einzelnen Knoten untereinander <strong>und</strong> unerwarteten Störungen.[4, 5]<br />

1.2.3 Ansätze zur Verbesserung der Situation<br />

Netzwerksimulatoren wie ” OMNeT++“ <strong>und</strong> ” ns-2“ können über spezielle Sensornetzwerk-Erweiterungen<br />

wie z.B. ” Castalia“ einen (mit Störungen behafteten) Funkkanal<br />

nachbilden[6, 7, 8]. Die wirklichen Einflüsse der Sensorknoten untereinander, der<br />

Umgebung sowie die der Kommunikation auf unterschiedlichen Kanälen wird jedoch<br />

nicht korrekt dargestellt. Solche Erweiterungen <strong>eines</strong> Simulators für diskrete Ereignisse<br />

erhöhen zwar die Aussagekraft einer Simulation, können eine reale Implementierung<br />

jedoch nicht ersetzen. Die Autoren von Castalia gestehen in ihrem Paper ” From Simulation<br />

to Real Deployments in WSN and Back“ [9] ein, dass die Ergebnisse der<br />

Simulation von Castalia mit denen einer realen Implementierung nicht zufriedenstellend<br />

übereinstimmen. Zum Einsatz kamen im realen Test lediglich neun TelosB[10]<br />

Knoten, welche in einer 7000 m 2 großen Halle platziert wurden.<br />

1.3 Zielsetzung dieser Arbeit<br />

Zielsetzung dieser Arbeit ist es, eine zuverlässig außerhalb <strong>eines</strong> Simulators funktionierende<br />

Implementierung <strong>eines</strong> Sensornetzwerkes zu erstellen. Das Netzwerk besteht<br />

aus bis zu 200 identischen Knoten <strong>und</strong> soll verschiedene Szenarien (siehe Kapitel 2.2)<br />

erfolgreich absolvieren können. Hierzu zählt insbesondere, dass die Knoten ohne besonders<br />

vorgegebenes Wissen über die Umgebung eigenständig eine Vernetzung aufbauen<br />

sollen <strong>und</strong> eine energieeffiziente Kommunikation über einen längeren Zeitraum<br />

hinweg aufrecht erhalten sollen. Besonderheiten <strong>eines</strong> Sensornetzwerkes, wie beispielsweise<br />

der Ausfall von einzelnen Knoten <strong>und</strong> andere, unerwartete Störungen, sollen die<br />

Gesamtfunktionalität des Netzes nicht stärker als unbedingt notwendig beeinflussen.<br />

Die Leistungsfähigkeit der Implementierung soll protokolliert <strong>und</strong> dargestellt werden.<br />

4


1.3. Zielsetzung dieser Arbeit<br />

a) Gr<strong>und</strong>lagen b) Entwicklung c) Realität!<br />

realer Knoten reale Umgebung<br />

Abbildung 1.2: Ansatz in dieser Arbeit. a) Gr<strong>und</strong>lagen, wie ” Wake-on-Radio“, werden<br />

mit wenigen Knoten entwickelt. b) Gr<strong>und</strong>legende Protokolle werden<br />

mit einigen Knoten in einer realen Umgebung entworfen <strong>und</strong> getestet<br />

c) Erprobung <strong>und</strong> Verbesserung des Netzes mit vielen Knoten in einer<br />

realen Umgebung<br />

1.3.1 Vorgehensweise<br />

Da das Sensornetz einwandfrei außerhalb von Simulatoren funktionieren soll, wurde<br />

konsequent auf reale Hardware in natürlichen Umgebungen zurückgegriffen. Auf eine<br />

zusätzliche Simulation wurde – aus Zeitgründen – verzichtet. Abbildung 1.2 visualisiert<br />

in groben Schritten, wie vorgegangen wurde.<br />

Zunächst wurden gr<strong>und</strong>legende Funktionen (die Firmware zur Ansteuerung der Peripherie<br />

<strong>und</strong> insbesondere des Funkchips) entwickelt. Hierbei kam eine kleine Anzahl von<br />

Knoten zum Einsatz. Nachdem diese gr<strong>und</strong>legenden Funktionen einsatzbereit waren,<br />

wurde ein Multihop-Protokoll entworfen. Anhand einer größeren Anzahl von Knoten<br />

wurde dieses iterativ verbessert. Anschließend wurde aus einer großen Anzahl von Knoten<br />

ein Netz gebildet <strong>und</strong> die Parameter des Protokolls optimiert.<br />

Auf diesem finalen großen Netz wurden dann die bereits angesprochenen Anwendungsszenarien<br />

ausgeführt, protokolliert <strong>und</strong> ausgewertet. Alle in dieser Arbeit entstandenen<br />

Ergebnisse basieren also auf realen Messungen <strong>und</strong> Beobachtungen mit echter Hardware<br />

in natürlichen Umgebungen! Neben einigen anderen Kleinigkeiten ist dies der<br />

wesentliche Unterschied zu anderen, nur theoretisch beschriebenen Sensornetzen.<br />

1.3.2 Stichwortartige Auflistung der Fähigkeiten <strong>und</strong> Funktionen<br />

des entworfenen Systems<br />

Das Sensornetz, welches in dieser Arbeit entwickelt wurde <strong>und</strong> vorgestellt wird, beinhaltet<br />

einige Besonderheiten, welche es zum Teil in anderen Netzen in dieser Form<br />

nicht 5 gibt. Stichpunktartig werden diese hier vorgestellt:<br />

5


Kapitel 1. Einleitung <strong>und</strong> Motivation<br />

Auswahl der Route auf Anwendungsebene wählbar nach: vorhandenen Energiereserven,<br />

Latenz, Bandbreite 1<br />

Kommunikation auf mehreren Kanälen zur Reduzierung der Kollisionen während<br />

der Datenübertragung <strong>und</strong> dadurch mehr verfügbare Übertragunskapazität im<br />

Netz 2<br />

Dynamische Bewertung von Kanälen <strong>und</strong> Vermeidung von potentiell gestörten<br />

oder belegten Kanälen ( ” Blacklisting“) 3<br />

Adaptive Anpassung der Datenrate <strong>und</strong> Sendeleistung zwischen zwei Nachbarn<br />

zur Optimierung des Energieverbrauchs <strong>und</strong> der Zuverlässigkeit 4<br />

Selbstorganisierende, netzweite (Multihop) Kommunikation ohne zentrale Infrastruktur.<br />

Jeder Knoten im Netz ist gleichwertig 5<br />

Mehrere Routen zu verschiedenen Zielen mit automatischer Umgehung lokaler<br />

Störungen 6<br />

Vermeidung von Routen, welche über Knoten mit geringem Batterieladestand<br />

führen zur Optimierung der Gesamtlaufzeit 7<br />

Netzweit synchrone Zeit mit einer Genauigkeit besser als einer Sek<strong>und</strong>e 8<br />

Store- and Forward Nachrichtenweiterleitung mit automatischer Bündelung der<br />

Nachrichten 9<br />

Aufteilung der Systemsoftware in zwei Komponenten (Anwendung <strong>und</strong> Firmware),<br />

welche unabhängig voneinander weiter entwickelt werden können mit automatischer<br />

Erzeugung des Schnittstellencodes 10<br />

Gleichzeitige Software-Aktualisierung aller Knoten per Funk 11<br />

Automatische Protokollierung des Systemverhaltens 12<br />

1.3.3 Ähnliche Arbeiten<br />

Ein Vergleich dieser Arbeit mit anderen Veröffentlichungen ist schwer möglich. Zum<br />

Einen wird eine Hardwareplattform eingesetzt, welche zwar sehr kostengünstig <strong>und</strong><br />

leistungsfähig ist, in der Welt der Sensorknoten bisher jedoch nicht bekannt ist. Zum<br />

Anderen werden Sensornetze in der Regel für genau eine Aufgabe passend entworfen.<br />

Es gibt nicht ein Netz bzw. ein Protokoll, welches alle Probleme <strong>und</strong> Aufgaben lösen<br />

kann[11, 12, 13]. Vielmehr wurde in dieser Arbeit eine neue Basisinfrastruktur ( 10, 11,<br />

12) geschaffen, welche es ermöglicht, verschiedene Protokolle zu implementieren <strong>und</strong><br />

diese in Tests in einer echten, nicht simulierten, Umgebung miteinander zu vergleichen!<br />

6


1.4. Aufbau dieser Arbeit<br />

Das in dieser Arbeit entworfene <strong>und</strong> implementierte Routing- <strong>und</strong> Nachrichtenweiterleitungsprotokoll<br />

enthält einige neue 5 ( 1, 2, 3, 4, 9) <strong>und</strong> bereits in anderen<br />

Arbeiten implementierte ( 5, 6, 7) Ideen, welche die Leistungsfähigkeit <strong>und</strong> Effizienz<br />

<strong>eines</strong> Sensornetz verbessern können. Im Paper ” Routing Techniques in Wireless Sensor<br />

Networks: A Survey“[11] wird ein sehr guter Überblick über bestehende Protokolle für<br />

kabellose Sensornetze gegeben.<br />

1.4 Aufbau dieser Arbeit<br />

Der Aufbau dieser Arbeit soll es dem Leser ermöglichen, die getroffenen Entwurfsentscheidungen<br />

nachzuvollziehen <strong>und</strong> das entworfene System zu verstehen. Hierzu erfolgt<br />

zunächst eine grobe Beschreibung der Systemvision <strong>und</strong> der Einsatzszenarien (Kapitel<br />

2). Nachdem das Gesamtsystem vorgestellt wurde, folgt eine Analyse der Anforderungen<br />

<strong>und</strong> der Gegebenheiten (Kapitel 3). Der Systementwurf an sich soll zeigen, wie<br />

diese Anforderungen umgesetzt werden können <strong>und</strong> stellt die im Rahmen dieser Arbeit<br />

entstandenen Protokolle vor (Kapitel 4). Anschließend wird beschrieben, wie der Entwurf<br />

umgesetzt wurde. Es wird die Implementierung von Teilkomponenten vorgestellt,<br />

beschrieben wie das System getestet wurde <strong>und</strong> die Ergebnisse dieser Tests präsentiert<br />

(Kapitel 5). Abschließend folgt eine kurze Zusammenfassung des Erreichten sowie ein<br />

Ausblick auf das, was das System in Zukunft noch alles leisten könnte (Kapitel 6).<br />

5 Eine umfangreiche Literaturrecherche ergab, dass diese Konzepte bisher nicht verwendet werden.<br />

Aufgr<strong>und</strong> der Vielzahl von Veröffentlichungen zu Sensornetzen <strong>und</strong> der aktuell fortlaufenden Forschung<br />

kann natürlich nicht ausgeschlossen werden, dass es nicht auch andere Entwürfe mit diesen<br />

Ideen gibt.<br />

7


Kapitel 1. Einleitung <strong>und</strong> Motivation<br />

8


2 Systemvision <strong>und</strong><br />

Einsatzmöglichkeiten<br />

Nachdem in der Einleitung das Ziel dieser Arbeit bereits kurz angeschnitten wurde,<br />

folgt nun eine ausführlichere Beschreibung der Vision des gesamten Systems. Um<br />

zu zeigen, was das System leisten soll bzw. kann, werden mehrere verschiedene Einsatzmöglichkeiten<br />

vorgestellt. Diese werden im Verlauf der Arbeit immer wieder aufgegriffen<br />

<strong>und</strong> teilweise auch implementiert.<br />

2.1 Systemvision<br />

Vor dem eigentlichen Entwurf <strong>und</strong> der Implementierung steht die Vision für das gesamte<br />

Sensorknotennetzwerk. Ziel ist es, ein aus vielen identischen Knoten bestehendes,<br />

selbstorganisierendes <strong>und</strong> energieeffizientes Netzwerk aufzubauen. Die einzelnen Knoten<br />

könnten also beispielsweise von einem Flugzeug abgeworfen werden, sich zufällig<br />

verteilen <strong>und</strong> anschließend eigenständig vernetzen (Abbildung 2.1). Es wird – sofern<br />

möglich – Rücksicht darauf genommen, dass die Knoten nur über eine endliche Energieversorgung<br />

verfügen <strong>und</strong> eine möglichst lange Laufzeit erreicht werden soll. Das<br />

System soll in der Gr<strong>und</strong>version die Anforderungen von gängigen Einsatzszenarien für<br />

ein Sensorknotennetz erfüllen <strong>und</strong> sich über dies für Spezialfälle optimieren lassen.<br />

2.2 Einsatzmöglichkeiten<br />

Um zu zeigen, dass das in dieser Arbeit entwickelte System nicht nur eine theoretische<br />

Funktion erfüllt, soll an drei real existierenden Beispielen gezeigt werden, welche<br />

Aufgaben ein Sensornetz übernehmen kann.<br />

Das erste Beispiel ” Datensammlung“ ist das typische Szenario für ein Sensornetzwerk.<br />

Jeder einzelne Knoten sammelt Daten, verarbeitet diese <strong>und</strong> schickt sie durch das<br />

Netzwerk an eine zentrale oder ggf. mehrere Datensenken[14, 15].<br />

Etwas spezieller ist das zweite Beispiel ” Bildübertragung“. Hier sollen die von mit<br />

Kameras ausgestatteten Sensorknoten erzeugten <strong>und</strong> ggf. vorverarbeiteten Bilder mit<br />

möglichst hoher Bandbreite durch das Netz geschickt werden. Dieses Szenario könnte<br />

9


Kapitel 2. Systemvision <strong>und</strong> Einsatzmöglichkeiten<br />

Abbildung 2.1: Ein aus vielen identischen, zufällig verteilten Knoten bestehendes Netz.<br />

Beispielsweise könnten Knoten von einem Flugzeug abgeworfen werden<br />

(lila), sich zufällig verteilen <strong>und</strong> dann, nachdem sie gelandet sind, zu<br />

einem Netz zusammenschließen (rot).<br />

beispielsweise im Hyperion Netzwerk[16, 17, 18, 19], welches ebenfalls an der Universität<br />

Karlsruhe entworfen wurde, auftreten.<br />

Das dritte Beispiel ” Positionsbestimmung“, gibt den Knoten neben der reinen Datenverarbeitung<br />

<strong>und</strong> -weiterleitung eine weitere Funktionalität: Die Abschätzung der<br />

eigenen Position anhand der gemessenen Signalstärke anderer Knoten im Netz.<br />

2.2.1 Datensammlung<br />

Als erste Einsatzmöglichkeit wurde die Aufgabe gewählt, viele kleine Datenpakete (also<br />

beispielsweise Sensormesswerte) von vielen verschiedenen Knoten im Netz zu sammeln<br />

<strong>und</strong> zu einer zentralen Datensenke zu übertragen. Die Daten können <strong>und</strong>/oder sollen<br />

auf dem Weg von der Quelle zur Senke ggf. verarbeitet <strong>und</strong> zusammengefasst werden.<br />

Dies ist vielfach die Standardanforderung, welche mit einem Sensornetz in Verbindung<br />

gebracht wird. Dementsprechend gibt es viele Beispiele, bei denen eine solche Art von<br />

Netz benötigt wird.<br />

Ein Einsatzgebiet ist beispielsweise die Messung von Umweltdaten. Dies müssen nicht<br />

unbedingt nur einfache Temperaturwerte sein sondern können auch Messungen der<br />

seismischen Aktivität <strong>eines</strong> Vulkans sein[20]. Ebenfalls vorstellbar ist ein über eine<br />

ganze Stadt verteiltes Sensornetz[21], welches die Luftverschmutzung misst <strong>und</strong> diese<br />

Information an eine zentrale Verkehrsleitstelle oder öffentliche Informationstafeln weiterleitet.<br />

Auch für militärische Zwecke kommen Sensornetze dieser Art zum Einsatz.<br />

Hierbei geht es dann jedoch in der Regel weniger um reine Umweltdaten. Auch taktisch<br />

10


2%,'+%&6!,'+!%,&%!3%&8=%!?4'D.;+E=&3!-%'!I&%)3,%9%)4)8=D.'!-%)!9%)'D.,%-%&%&!M(07("<br />

&%&+%&!%,&%'!$%&'()*&(+%&'!=&%)2;''2,D.!NO,22PQRB!$(2D.%!S%''=&3%&!',&-!%,&!1%'%&+2,"<br />

D.%'!M),+%),=0!=0!4%,!-%)!?='18.2!9(&!M(07(&%&+%&6!?23(),+.0%&!=&-!-%)%&!T072%"<br />

2.2. Einsatzmöglichkeiten<br />

0%&+,%)=&3!4%EU32,D.!,.)%'!I&%)3,%9%)4)8=D.'6!-,%!V%4%&'E%,+!%,&%'!48++%),%4%+),%4%&%&!<br />

$%&'()'!E=!08W,0,%)%&B!<br />

!<br />

!<br />

Abbildung 2.2: Szenario Kamerasensorknotennetzwerk ?44,2-=&3!@"@!<br />

(aus [16])<br />

I,&!*80%)848',%)+%'!$%&'()&%+E1%)*!<br />

relevante J%,! -%0! Informationen 80! XY.8,)! YI$A! Infrastruktur ,&! -%)! I&+1,D*2=&3! erfasst <strong>und</strong> weitergeleitet<br />

4%


Kapitel 2. Systemvision <strong>und</strong> Einsatzmöglichkeiten<br />

Abbildung 2.3: Einsatzszenario ” Positionsbestimmung“ (aus [24])<br />

es, für zukünftige Sensorknoten, welche mehr als das Erfassen einfacher Umweltparameter<br />

wie z.B. der Temperatur leisten können, Entwurfsentscheidungen sowohl in Hardals<br />

auch in Software zu treffen <strong>und</strong> zu bewerten. Als ein mögliches Entwurfsszenario<br />

wurde ein Kamerasensorknotennetzwerk (Abbildung 2.2) zur automatischen, verteilten<br />

Überwachung <strong>eines</strong> sicherheitskritischen Bereichs vorgeschlagen. Alle hierzu notwendigen<br />

Komponenten (Kamera, leistungsfähige Hardware <strong>und</strong> ein Funkmodem) stehen zur<br />

Verfügung[19]. Da bei den Hyperion Sensorknoten der gleiche Funkchip verbaut wird<br />

wie in dieser Arbeit, bieten es sich an, die beiden Netze miteinander in Verbindung zu<br />

bringen. Die Hyperion Sensorknoten könnten in das in dieser Arbeit entwickelte Netz<br />

eingeb<strong>und</strong>en werden <strong>und</strong> als Datenquelle dienen.<br />

2.2.3 Positionsbestimmung<br />

Als drittes Beispiel für den Einsatz <strong>eines</strong> Sensornetzes wird ein ” Location Aware Disaster<br />

Aid Network“ vorgestellt[24]. Es handelt sich hierbei um ein selbstorganisierendes 1<br />

Sensornetz, welches beispielsweise in einem Katastrophenfall mit vielen Verletzten zum<br />

Einsatz kommen kann. Es soll es den Rettungskräften erleichtern, einen Überblick über<br />

die Situation zu bekommen <strong>und</strong> zu behalten. Ähnliches wird mit bereits existierenden<br />

Sensoren für Herzfrequenz, Blutsauerstoffgehalt <strong>und</strong> EKG 2 auch von der Havard Universität<br />

mit dem Projekt ” CodeBlue“ aufbauend auf den MICA2, MICAz <strong>und</strong> Telos<br />

1 außer der Platzierung der festen Knoten <strong>und</strong> die Bekanntgabe deren Position<br />

2 Elektrokardiogramm (EKG) heißt auf Deutsch Herzspannungskurve. Es zeigt die Kontraktionen<br />

des Herzmuskels an.<br />

12


Sensorknoten angestrebt.[25, 3, 26, 10]<br />

2.2. Einsatzmöglichkeiten<br />

Es werden einige wenige Knoten an bestimmten, bekannten <strong>und</strong> festen Positionen platziert,<br />

bei allen weiteren Knoten handelt es sich um mobile Knoten, welche beispielsweise<br />

an Patienten <strong>und</strong> Rettungskräften angebracht werden. Zusätzliche Routingknoten<br />

3 können die Verfügbarkeit des Netzes verbessern. Anhand der Signalstärke der<br />

Pakete der festen Knoten können bzw. sollen die mobilen Knoten ihre eigene Position<br />

abschätzen. Zusammen mit Vitalwerten (beispielsweise die Herzfrequenz, ...) wird die<br />

geschätzte Position der Patienten dann an die Knoten der Rettungskräften übermittelt.<br />

Diese können dann erkennen, welcher Patient in der Nähe ist bzw. dringend behandelt<br />

werden muss. Die Informationen werden ebenfalls an die Rettungszentrale weitergeleitet,<br />

welche dann notwendigen Entscheidungen über den Einsatz der zur Verfügung<br />

stehenden Kräfte <strong>und</strong> Resourcen treffen kann <strong>und</strong> muss. Abbildung 2.3 zeigt die verschiedenen<br />

Knotenarten <strong>und</strong> deren Zusammenspiel. Aufgr<strong>und</strong> zeitlicher <strong>und</strong> technischer<br />

Einschränkungen (siehe Kapitel 5.2.4) wurde diese Funktion in dieser Arbeit jedoch<br />

nicht umgesetzt.<br />

3 Knoten, welche keine andere Funktion zur Verfügung stellen als eine Verbindung zwischen zwei<br />

ansonsten zu weit auseinander liegenden Knoten zu ermöglichen<br />

13


Kapitel 2. Systemvision <strong>und</strong> Einsatzmöglichkeiten<br />

14


3 Analyse <strong>und</strong><br />

Anforderungsspezifikation<br />

Nachdem die Systemvision vorgestellt wurde, wird nun beschrieben, welche Anforderungen<br />

für eine erfolgreiche Umsetzung notwendig sind. Hierbei wird unterschieden in<br />

funktionale- <strong>und</strong> nicht-funktionale Anforderungen. Primäres Ziel ist die Umsetzung der<br />

funktionalen Anforderungen, wobei wo immer möglich auch versucht wird, die nichtfunktionalen<br />

Anforderungen zu berücksichtigen. Anschließend werden die Gegebenheiten<br />

vorgestellt. Hierbei handelt es sich um die Hardwareplattform, welche im Detail<br />

vorgestellt wird sowie um die eingesetzten Softwarekomponenten. Das nächste Kapitel<br />

zeigt, wie der Entwurf der Umsetzung dieser Anforderungen erfolgt ist.<br />

3.1 Funktionale Anforderungen<br />

Die funktionalen Anforderungen spezifizieren, was das gesamte System <strong>und</strong> jeder einzelne<br />

Knoten im Netz leisten können muss. Diese Anforderungen werden aus der Systemvision<br />

<strong>und</strong> den Einsatzszenarien abgeleitet.<br />

Autonome Vernetzung <strong>und</strong> Selbstorganisation<br />

Jeder Knoten ist, bis auf eine eindeutige Identifizierungsnummer, identisch. Es<br />

ist im Voraus nicht bekannt, welche Topologie das Netz haben wird noch welcher<br />

Knoten sich wo im Netz befindet. Das System muss folglich ohne externe Hilfe<br />

in der Lage sein, die Topologie zu erk<strong>und</strong>en <strong>und</strong> eine Vernetzung der Knoten<br />

untereinander zu organisieren. Gr<strong>und</strong>sätzlich kann jeder Knoten im Netz eine<br />

Datenquelle bzw. eine -senke sein.<br />

Multihop Kommunikation<br />

Aufgr<strong>und</strong> physikalischer Beschränkungen der Funkkommunikation kann im Normalfall<br />

– bei einer räumlich verteilten Topologie – nicht jeder Knoten jeden anderen<br />

Knoten direkt erreichen. Dennoch wird gefordert, dass jeder Knoten Nachrichten<br />

mit jedem anderen Knoten austauschen kann. Hierzu ist eine Weiterleitung<br />

der Nachrichten über einen oder ggf. mehrere Zwischenknoten (= ” Hops“) notwendig.<br />

Die möglichen Pfade durch das Netz sind im Voraus nicht bekannt <strong>und</strong><br />

15


Kapitel 3. Analyse <strong>und</strong> Anforderungsspezifikation<br />

müssen selbst gef<strong>und</strong>en werden. Das Netz soll in der Lage sein, Nachrichten, welche<br />

auf ihrem Pfad durch das Netz gleiche Teilstrecken zurücklegen, automatisch<br />

zusammenzufassen.<br />

Kabelloses Software Deployment<br />

Damit die Erprobung, Evaluation <strong>und</strong> Fehlerbehebung effizient erfolgen kann,<br />

ist es notwendig, dass die Anwendungssoftware geändert bzw. getauscht werden<br />

kann. Damit die – möglicherweise in einer Test- <strong>und</strong> Messumgebung untergebrachten<br />

– Knoten nicht einzeln an eine Basisstation angeschlossen werden müssen,<br />

soll dieser Austausch kabellos erfolgen können. Sofern möglich sollen hierbei viele<br />

Knoten gleichzeitig aktualisiert werden.<br />

Laufzeitprotokollierung<br />

Damit das Geschehen auf den einzelnen Knoten nach der Durchführung <strong>eines</strong><br />

Testaufbaus ausgewertet <strong>und</strong> überprüft werden kann, ist es notwendig, die relevanten<br />

Informationen während der Laufzeit zu sammeln <strong>und</strong> zu speichern, damit<br />

diese am Ende des Versuchs zur Verfügung stehen. Damit nicht jeder Knoten einzeln<br />

zum Auslesen der Informationen an eine Basisstation angeschlossen werden<br />

muss, soll dies auch über den Funkweg erfolgen können.<br />

Zeitsynchronisierung<br />

Insbesondere für die spätere Auswertung des Laufzeitprotokolls ist es wichtig,<br />

eine netzweit einheitliche Zeitbasis zu etablieren.<br />

3.2 Nicht-funktionale Anforderungen<br />

Bei den nicht-funktionalen Anforderungen handelt es sich um Eigenschaften, welche<br />

nicht auf den ersten Blick als Funktion wahrgenommen werden. Vielmehr handelt es<br />

sich hierbei um (wünschenswerte) Eigenschaften, welche das Verhalten des Systems<br />

beeinflussen.<br />

Ausfalltoleranz<br />

In einem Sensornetzwerk muss immer damit gerechnet werden, dass einzelne Knoten<br />

ausfallen. Das System muss hierauf reagieren können <strong>und</strong> solange es möglich<br />

ist die Funktion aufrecht erhalten bzw. schrittweise zurückfahren 1 .<br />

Energieeffizienz<br />

Ziel ist eine möglichst ungestörte Übertragung bei geringer Sendeleistung <strong>und</strong> hoher<br />

Datenrate, so dass nur wenige Übertragungswiederholungen erfolgen müssen<br />

1 Ein solches Verhalten wird auch als ” graceful degradation“, also in etwa ” sanfte Verschlechterung“<br />

bezeichnet.<br />

16


3.3. Gegebenheiten<br />

<strong>und</strong> die Zeit, in welcher Sender <strong>und</strong> Empfänger aktiv sind, kurz gehalten wird.<br />

Hierzu soll die zum Senden verwendete Datenrate <strong>und</strong> die Sendeleistung adaptiv<br />

angepasst werden. Potentiell gestörte Kanäle sollen bei der Übertragung vermieden<br />

werden. Bei der Wahl von Pfaden durch das Netz sollen Knoten bevorzugt<br />

werden, deren Energievorrat noch nicht erschöpft ist <strong>und</strong> zu denen eine gute Verbindung<br />

besteht. Wann immer ein Knoten nichts zur Gesamtfunktionalität des<br />

Systems beizutragen hat <strong>und</strong> auch keine internen Aufgaben zu erledigen hat, soll<br />

er in einen Energiesparmodus wechseln.<br />

3.3 Gegebenheiten<br />

Bereits gegeben war die Hardware, ursprünglich einmal eine interaktive Fernbedienung<br />

mit dem Namen ” Betty“[27]. Das Betty-Set war aus mehreren Teilkomponenten aufgebaut:<br />

Ein Adapter zum Anschluss an den Fernseher um zu erkennen, welcher Sender<br />

<strong>und</strong> welche Sendung gerade angesehen wird, ein Modem zum Anschluss an das Telefonnetz<br />

um Verbindung zum Betty-Server aufbauen zu können <strong>und</strong> natürlich die Fernbedienung<br />

selbst. Die Teilkomponenten standen per Funk miteinander in Verbindung.<br />

In dieser Arbeit wird nur die Fernbedienung selbst (die sog. ” Head Unit“) eingesetzt,<br />

da diese bereits für den Betrieb mit Akkus vorbereitet war. Sie steht vielen kommerziell<br />

angebotenen Sensorknotenplattformen in nichts nach <strong>und</strong> bietet ” Features“ – wie<br />

beispielsweise ein leistungsfähiges LCD – welche über das üblicherweise Vorhandene<br />

hinausgehen.<br />

Die Betty wurde von der Swisscom AG beworben als interaktive Fernbedienung. Die<br />

Markteinführung erfolgte 2006 (Schweiz) bzw. 2007 (Deutschland). Sie bot Quizspiele,<br />

Abstimmungen, Umfragen, Informationen <strong>und</strong> Werbung begleitend zum Fernsehprogramm<br />

einiger Fernsehsender. Leider verlief die Markteinführung nicht mit dem<br />

gewünschten Erfolg (nur etwa 100.000 verkaufte Exemplare statt den über 500.000<br />

geplanten). Der Geschäftsbetrieb wurde Ende 2007 eingestellt.<br />

Da die Betty Fernbedienung den gleichen Funkchip wie der am Institut entwickelte<br />

Hyperion Sensorknoten verwendet, bot es sich an, die Fernbedienungen zur Erweiterung<br />

des Hyperion-Netzes zu verwenden. Aufgr<strong>und</strong> einer Nachfrage beim (ehemaligen)<br />

deutschen Betreiber konnte eine komplette Palette mit etwa 200 Betty-Sets zu akademischen<br />

Zwecken zur Verfügung gestellt werden. Die Fernbedienung wurde zwar nicht<br />

dazu entworfen, als Sensorknoten zu dienen, aufgr<strong>und</strong> der verbauten Komponenten<br />

eignet sie sich hierfür jedoch gut. Details zur Hardware werden im Unterkapitel 3.3.1<br />

näher beschrieben. Als Gr<strong>und</strong>gerüst für die Software wurde die Open Source Firmware<br />

” Boop“[28] verwendet. Details hierzu folgen im Unterkapitel 3.3.4.<br />

17


Kapitel 3. Analyse <strong>und</strong> Anforderungsspezifikation<br />

Abbildung 3.1: Übersicht Hardwareplattform Diagramm<br />

Echtzeituhr<br />

Flash Speicher<br />

(2 MByte NOR)<br />

LCD<br />

(160x128 Pixel)<br />

i²c<br />

CPU<br />

(32 Bit ARM7)<br />

18<br />

Funkchip<br />

(Chipcon cc1100)<br />

pwm<br />

SPI<br />

UART<br />

GPIO<br />

JTAG<br />

Audio<br />

IR


Funk<br />

2,5 Volt<br />

Linearregler<br />

RTC<br />

Flash<br />

CPU<br />

Abbildung 3.2: Übersicht Hardwareplattform Foto<br />

Schaltregler<br />

IR<br />

Audio<br />

0,1 Ohm<br />

Messwid.<br />

19<br />

GPIO <strong>und</strong> UART<br />

3.3. Gegebenheiten<br />

LCD


Kapitel 3. Analyse <strong>und</strong> Anforderungsspezifikation<br />

3.3.1 Hardwareplattform<br />

Abbildung 3.1 zeigt ein Blockschaltbild der eingesetzten Hardwareplattform, Abbildung<br />

3.2 ein Foto von beiden Seiten der Platine. Es folgt nun eine kurze Vorstellung der<br />

einzelnen Komponenten:<br />

Prozessor 32Bit ARM (NXP LPC2220 - ARM7TDMI-S)<br />

Als Prozessor kommt der Microcontroller LPX2220 von NXP zum Einsatz. Er<br />

verfügt über 64kByte internes SRAM <strong>und</strong> ein externes Speicherinterface. Es handelt<br />

sich um eine 32bit ARM7 Architektur. Die Taktrate kann zwischen 10MHz<br />

bis 70Mhz 2 gewählt werden. Ein fest integrierter Bootloader ermöglicht es, Software<br />

über die serielle Schnittstelle einzuspielen. Die typische Peripherie (gängige<br />

Schnittstellen, JTAG 3 , Timer, Counter, PWM 4 , ...) <strong>eines</strong> Microcontrollers steht<br />

zur Verfügung. Um Energie zu sparen, können einzelne Komponenten des Controllers<br />

deaktiviert werden. Neben der Variation der Taktfrequenz kann der Chip<br />

in einen ” Idle“ <strong>und</strong> einen ” Power-Down“ Mode versetzt werden, um den Energiebedarf<br />

zu minimieren.<br />

Flash Speicher 2 Mbyte NOR (EON en29lv800)<br />

Als Festspeicher sind zwei Flashbausteine mit je 8 Mbit verbaut. Sie sind als<br />

512k*16Bit 5 organisiert <strong>und</strong> über einen parallelen Bus mit den Prozessor verb<strong>und</strong>en.<br />

Der Speicher ist in mehrere Sektoren eingeteilt, welche sich separat löschen<br />

lassen.<br />

Funkchip 433 Mhz, 500kbps, +10dBm Sendeleistung (TI/Chipcon CC1100)<br />

Der Funkchip CC1100 ist ein hoch integrierter Baustein mit vielen Funktionen,<br />

welche ihn für den Einsatz in einem Sensorknoten prädestinieren. Er enthält ein<br />

Modem <strong>und</strong> einen UHF Transceiver für die Frequenzbereiche 300-348 MHz, 400-<br />

464 MHz <strong>und</strong> 800-928 Mhz 6 . Die Datenrate kann bis zu 500kbps (kilo bits per second)<br />

betragen. Die Ausgangsleistung kann in einem großen Bereich von -30dBm<br />

bis +10dBm eingestellt werden. ” Pakethandling“ wird im gewissen Rahmen direkt<br />

von der Hardware unterstützt. Die Anbindung an den Prozessor erfolgt über<br />

SPI 7 . Der Funkchip verfügt neben einem ” Power-Down“ auch über einen ” Idle“<br />

2Im Rahmen dieser Arbeit wird zwischen 10MHz, 20MHz <strong>und</strong> 40MHz umgeschaltet – je nach Bedarf<br />

der Anwendung<br />

3JTAG steht für Joint Test Action Group“ <strong>und</strong> bezeichnet ein Standardinterface zum Testen <strong>und</strong><br />

”<br />

Debuggen von Hardware direkt in der Schaltung<br />

4Bei der Pulsweitenmodulation (engl. Pulse Width Modulation, abgekürzt PWM) wird die Ein- <strong>und</strong><br />

Ausschaltzeit <strong>eines</strong> Rechtecksignals bei fester Gr<strong>und</strong>frequenz variiert. Hierdurch lässt sich grob<br />

gesagt die während einer kurzen Periode abgegebene Energie steuern<br />

5512k*16Bit bedeutet 524288 einzeln adressierbare Wörter je 16Bit<br />

6Im Rahmen dieser Arbeit wurde das in Deutschland lizenzfrei zugelassene ISM Band von 433,05-<br />

434,79 MHz verwendet. ISM steht hierbei für Industrial, Scientific, and Medical<br />

7Serial Peripheral Interface – Serielles Bus-System (Motorola)<br />

20


3.3. Gegebenheiten<br />

<strong>und</strong> einen ” Wake-on-Radio“ Modus. Im Wake-on-Radio Modus lauscht der Funkchip<br />

vollautomatisch periodisch in den Kanal. Wenn er ein Paket empfängt weckt<br />

er über einen Interrupt den möglicherweise abgeschalteten Prozessor. Durch das<br />

Abschalten aller Komponenten der Plattform während dieses Modus kann der<br />

durchschnittliche Energiebedarf stark gesenkt werden.<br />

Echtzeituhr (Philips PCF8563)<br />

Obwohl im verwendete Microcontroller bereits eine Echtzeituhr integriert ist, ist<br />

ein separater Echtzeituhrenchip verbaut. Der Chip ist über den I 2 C 8 -Bus Dies<br />

bringt verschiedene Vorteile. Zu nennen sei hier beispielsweise die von der PLL<br />

des Controllers unabhängige Funktion. Es ist möglich, in regelmäßigen Intervallen<br />

oder zu bestimmten Zeitpunkten einen Interrupt auslösen zu lassen, beispielsweise<br />

um periodische Aktivitäten durchzuführen oder um den Microcontroller aus dem<br />

Power-Down Mode zu wecken. Dies hilft, öfter in den Power-Down Mode zu<br />

wechseln <strong>und</strong> trägt somit – obwohl der zusätzliche Chip mehrere 100W benötigt<br />

– zur Reduzierung des durchschnittlichen Energiebedarfs bei.<br />

LCD 160 x 128 Pixel (SSD1854)<br />

Als sehr hilfreich bei der Beobachtung <strong>und</strong> Tests des Netzes hat sich das kleine<br />

LCD an jedem der Knoten erwiesen. Im Vergleich zu den beschränkten Möglichkeiten<br />

9 der meisten kommerziell verfügbaren Sensorknoten macht es die Betty-<br />

Fernbedienung zum Luxusknoten. Es stellt 160x128 Pixel in vier Graustufen dar<br />

<strong>und</strong> verfügt über eine LED Hintergr<strong>und</strong>beleuchtung. Sowohl die Hintergr<strong>und</strong>beleuchtung<br />

als auch der Displaycontroller können vollständig deaktiviert werden,<br />

um keine unnötige Energie zu verbrauchen. Die Hintergr<strong>und</strong>beleuchtung kann<br />

auch zur einfachen Signalisierung von Betriebszuständen dienen (Blinken, An,<br />

Aus, ...).<br />

Audio über PWM 4<br />

Einer der PWM Ausgänge des Micocontrollers wird über einen Audioverstärker<br />

<strong>und</strong> -filter auf einen kleinen Lautsprecher ausgegeben. Es ist somit möglich, nahezu<br />

beliebige Töne auszugeben. Um Speicherplatz für hierzu nötige Samples<br />

zu sparen wird die PWM nur genutzt, um einfache Signaltöne in verschiedenen<br />

Frequenzen zu erzeugen. Diese lassen sich beispielsweise dazu verwenden, Fehler<br />

akustisch zu melden oder um auf den Knoten aufmerksam zu machen. Der<br />

Audioverstärker- <strong>und</strong> Filterchip lässt sich durch den Microcontroller vollständig<br />

deaktivieren, so dass keine Energie benötigt wird, sofern kein Signalton ausgegeben<br />

wird.<br />

8Inter-Integrated Circuit – Serielles Bus-System (Philips). Auch bekannt unter TWI (Two Wire<br />

Interface)<br />

9meist nur einige wenige LED in verschiedenen Farben<br />

21


Kapitel 3. Analyse <strong>und</strong> Anforderungsspezifikation<br />

Infrarot – nicht verwendet –<br />

Da es sich bei der Hardware eigentlich um eine TV-Fernbedienung handelt, verfügt<br />

sie über eine Infrarotdiode, welche sowohl Infrarotsignale aussenden als auch<br />

empfangen kann. Die notwendige analoge Verstärkerschaltung, um die Signale<br />

auch digital auswerten zu können, ist vorhanden. Da sich das Sensornetz dieser<br />

Arbeit auf die Funkschnittstelle beschränkt, kommt die Fähigkeit, Infrarotsignale<br />

senden <strong>und</strong> empfangen zu können, nicht zum Einsatz. Die analoge Hardware wird<br />

daher so angesteuert, dass möglichst kein Strom fließt <strong>und</strong> somit keine unnötige<br />

Energie verbraucht wird.<br />

Schnittstellen zur Erweiterung<br />

Zur Erweiterung der Plattform stehen verschiedene, gängige Schnittstellen (SPI,<br />

I 2 C, UART 10 , JTAG) zur Verfügung. An den Bus, an welchem die Flashbausteine<br />

<strong>und</strong> das Display angeschlossen sind, lassen sich über dies hinaus weitere<br />

Geräte wie beispielsweise Sensoren anschließen, welche nicht über eine der seriellen<br />

Schnittstellen verfügen. Für einfache Aufgaben stehen noch einige Pins des<br />

Controllers für GPIO 11 -Zwecke zur Verfügung. Für zukünftige Entwicklungen stehen<br />

also viele Möglichkeiten offen.<br />

Stromversorgung Zwei NiMH Akkus mit 1,2 Volt, 700mAh<br />

Die Energiequelle der Knoten besteht aus jeweils zwei handelsüblichen 1,2 Volt<br />

AAA NiMH Akkus mit 700mAh. Über einen Schaltregler wird die Versorgungsspannung<br />

von 3,0 Volt generiert. Leider arbeitet dieser Schaltregler den Messungen<br />

nach zu urteilen nicht optimal, da selbst wenn alle abschaltbaren Komponenten<br />

deaktiviert sind noch immer etwa 5mA fließen. Um reproduzierbare<br />

Messergebnisse zu bekommen, wurde ein Knoten mit einem Netzteil ausgestattet.<br />

Über einen 2,5 Volt Linearregler wird die Spannung von zwei vollen Akkus<br />

simuliert.<br />

3.3.2 Messung der Leistungsaufnahme<br />

Da alle Versuche auf real existierender Hardware ausgeführt werden, war es nicht notwendig,<br />

ein genaues Modell der Sensorknoten für eine Simulation anzufertigen. Dennoch<br />

sind einige Systemparameter vermessen worden. Hierbei handelt es sich um die<br />

Leistungsaufnahme unter verschiedenen Betriebsmodi sowie die Abstrahlcharakteristik<br />

der Antenne der Sensorknoten.<br />

Die Leistungsaufnahme der Hardware wurde über einen 0,1 Ohm Messwiderstand (siehe<br />

Abbildung 3.2) bei einer Versorgungsspannung von 3,0 Volt gemessen. Angegeben sind<br />

die Verbrauchswerte in Milliwatt. Die gemessenen Betriebsmodi werden im Folgenden<br />

10Universal Asynchronous Receiver Transmitter, Kompatibel zu RS-232, welches einen Standard für<br />

eine serielle Schnittstelle bezeichnet<br />

11General Purpose Input/Output – Universal verwendbare Ein-/Ausgabe<br />

22


mW<br />

200<br />

175<br />

150<br />

125<br />

100<br />

75<br />

50<br />

25<br />

0<br />

Power down<br />

Funkchip<br />

Gr<strong>und</strong>system<br />

CPU 10 MHz CPU 40 MHz<br />

CPU idle<br />

CPU 20 MHz<br />

RF idle<br />

RX (idle)<br />

3.3. Gegebenheiten<br />

TX (-30 dBm) TX (0 dBm)<br />

RX (active) TX (-15 dBm) TX (10 dBm)<br />

Abbildung 3.3: Übersicht über die Messwerte der Leistungsaufnahme des Systems<br />

während verschiedener Betriebsmodi.<br />

zum besseren Verständnis kurz beschrieben, Abbildung 3.3 zeigt eine Übersicht über<br />

die jeweiligen Leistungsaufnahmen dieser Systemzustände. Die Messwerte könnten beispielsweise<br />

dazu verwendet werden, ein Modell zur Simulation des Sensorknotens anzufertigen.<br />

Sie dienen ebenfalls einer groben Abschätzung der möglichen Energieeffizienz<br />

des Systems. Abbildung 3.4 zeigt den Verlauf der Batteriespannung (Entladekurve) <strong>eines</strong><br />

aktiven <strong>und</strong> <strong>eines</strong> passiven Knotens. Der aktive Knoten sendet hierbei pro Sek<strong>und</strong>e<br />

ein Paket bei voller Sendeleistung aus. Der passive Knoten führt, außer der periodischen<br />

Messung der Batteriespannung <strong>und</strong> dem Abspeichern dieser im Flash, keine anderen<br />

Aktionen durch. Die übrige Zeit befinden sich beide Knoten in einem Power-Down<br />

Mode.<br />

In der folgenden Auflistung der gemessenen Systemzustände ist die Angabe des Verbrauchs<br />

in mW immer die Gesamtaufnahme des Systems.<br />

Power down 11mW<br />

Im ” Power down“ Mode sind alle Komponenten soweit dies möglich ist vollständig<br />

abgeschaltet bzw. in einem ” ultra low Power“ Mode. Der Microcontroller lässt sich<br />

nur noch über externe Interrupts wecken, da alle internen Komponenten deaktiviert<br />

sind <strong>und</strong> nicht mit einem Takt versorgt werden. Bevor die CPU nach einem<br />

Weckvorgang wieder zur Verfügung steht, vergeht eine kurze Zeit, bis sich die<br />

Takterzeugung eingeschwungen hat. Aktiv ist lediglich ein kleiner Rest analoger<br />

Schaltung sowie der Schaltregler, welche sich um die Umwandlung der Batteriespannung<br />

in stabile 3,0 Volt kümmert. Aus nicht nachvollziehbaren Gründen<br />

benötigt ein Sensorknoten in diesem Zustand dennoch 11mW <strong>und</strong> schränkt damit<br />

die längste zu erwartende Laufzeit <strong>eines</strong> Knotens nicht unerheblich ein. Die zwei<br />

Akkus haben eine Nennkapazität von 700mAh bei 1,2 Volt (entspricht 1,68Wh).<br />

Es ergibt sich somit eine rechnerisch maximale Laufzeit von etwa 6 Tagen. Praktisch<br />

wurden nur etwa 5 Tage erreicht (siehe Abbildung 3.4), was möglicherweise<br />

23


Kapitel 3. Analyse <strong>und</strong> Anforderungsspezifikation<br />

damit zu erklären ist, dass die Akkus nicht sonderlich hochwertig sind. Die erreichbare<br />

Laufzeit reicht dennoch für alle praktischen Tests des Netzes aus.<br />

CPU idle 30mW<br />

Bei der ” CPU idle“ Messung befindet sich der Microcontroller im Idle-Zustand.<br />

Hierbei handelt es sich um eine Vorstufe zum Power Down Mode, aus dem die<br />

CPU sehr schnell geweckt werden kann. Die interne Peripherie <strong>und</strong> Takterzeugung<br />

läuft – im Gegensatz zum Power Down Mode – weiter. Alle außerhalb des<br />

Controllers befindlichen Komponenten der Plattform befinden sich (wie zuvor)<br />

im Zustand der kleinstmöglichen Leistungsaufnahme.<br />

CPU 10 MHz 69mW<br />

Für diese Messung führt der Microcontroller eine Endlosschleife aus. Er ist hierbei<br />

voll aktiv <strong>und</strong> wendet keinerlei Methoden zur Senkung des Energiebedarfs an.<br />

Die Taktfrequenz der CPU beträgt 10 MHz. Alle weiteren Komponenten der<br />

Plattform sind deaktiviert.<br />

CPU 20 MHz 108mW<br />

Als Taktrate für die CPU sind bei dieser Messung 20MHz gewählt, alles Weitere<br />

entspricht der vorausgehenden Messung.<br />

CPU 40 MHz 153mW<br />

Als Taktrate für die CPU sind bei dieser Messung 40MHz gewählt, alles Weitere<br />

entspricht der vorausgehenden Messung. Es ist offensichtlich, dass für eine energieeffiziente<br />

Implementierung die CPU so oft wie nur möglich im Power-Downbzw.<br />

Idle-Zustand sein sollte. Sofern die CPU die meiste Zeit auf andere Komponenten<br />

wartet, sollte die kleinstmögliche Taktfrequenz gewählt bzw. – sofern<br />

möglich – in den Idle-Zustand gewechselt werden. Für die vierfache Rechenleistung<br />

wird nur etwa doppelt 12 so viel Leistung benötigt. Da die Plattform mit<br />

Akkus betrieben wird, kann es dennoch sinnvoll sein, auch für aufwändige Berechnungen<br />

die Taktfrequenz nicht zu erhöhen. Der höhere Strom über einen<br />

kürzeren Zeitraum kann die Akkus stärker belasten als der niedrigere Strom über<br />

einen längeren Zeitraum[29, 30, 31]. In der Regel sind jedoch keine aufwändigen<br />

Berechnungen auf den Knoten durchzuführen.<br />

RF idle 18mW<br />

Die ” RF idle“ Messung entspricht der ” Power down“-Messung mit dem Unterschied,<br />

dass der Funkchip als einzige Komponente nicht abgeschaltet ist. Er befindet<br />

sich in einem Bereitschaftsmodus, aus welchem er schnell damit beginnen<br />

kann zu senden oder zu empfangen. Die 18mW setzen sich zusammen aus 11mW<br />

für das System <strong>und</strong> zusätzlichen 7mW für den Funkchip.<br />

12 Der CPU-Kern benötigt zwar vier mal so viel Strom, die restlichen aktiven Komponenten des Mikrocontrollers<br />

benötigen jedoch immer den gleichen Strom, sofern die CPU aktiv ist – unabhängig<br />

von der Taktfrequenz des CPU-Kerns!<br />

24


RX (idle) 79mW<br />

3.3. Gegebenheiten<br />

Bei der ” RX (idle)“ Messung befindet sich das System an sich im ” Power down“<br />

Modus, der Funkchip jedoch ist aktiv <strong>und</strong> empfangsbereit. Erneut werden 11mW<br />

für das System benötigt, der Funkchip benötigt 68mW.<br />

RX (active) 154mW<br />

Empfängt der Funkchip ein Paket <strong>eines</strong> anderen Knotens, so steigt die Leistungsaufnahme<br />

des Funkchips geringfügig auf 85mW an. Zusätzlich muss die CPU<br />

geweckt werden, so dass diese sich prinzipiell in einer Endlosschleife befindet <strong>und</strong><br />

die Daten des Funkchips entgegen nimmt. Die Taktfrequenz der CPU beträgt<br />

hierbei 10 MHz (dementsprechend 69mW für das System).<br />

TX (-30dBm, -15dBm, 0dBm, +10dBm) 110mW bis 191mW<br />

Beim Senden (TX) <strong>eines</strong> Pakets ist sowohl der Mikrocontroller als auch der Funkchip<br />

aktiv. Die Leistungsaufnahme hierbei ist abhängig von diversen Faktoren,<br />

den größten Einfluss hat die gewählte Sendeleistung. Gezeigt sind Messungen bei<br />

-30dBm, -15dBm, 0dBm <strong>und</strong> +10dBm Sendeleistung 13 – der Funkchip benötigt<br />

hierbei jeweils 41mW, 47mW, 86mW <strong>und</strong> 122mW. Der Mikrocontroller befindet<br />

sich wieder in einer Endlosschleife um den Funkchip mit Daten zu versorgen <strong>und</strong><br />

benötigt hierzu bei 10MHz 69mW. Bemerkenswert ist hierbei, dass die Leistungsaufnahme<br />

beim Empfangen <strong>eines</strong> Pakets in etwa vergleichbar ist mit dem Senden<br />

<strong>eines</strong> Pakets bei 0dBm Ausgangsleistung. Bei geringerer Sendeleistung wird zum<br />

Empfangen mehr Energie benötigt als zum Senden!<br />

Anhand der Messwerte ist zu erkennen, dass die Plattform nicht optimal für den Betrieb<br />

<strong>eines</strong> Sensorknotens geeignet ist. Dies war im Voraus nicht bekannt. Die kleinstmögliche<br />

Leistungsaufnahme liegt bei 11mW, zu erwarten wären hier Werte im Bereich von wenigen<br />

Mikrowatt gewesen. Die Plattform eignet sich aufgr<strong>und</strong> der Hardwarekonfiguration<br />

dennoch hervorragend zur Entwicklung <strong>und</strong> <strong>Evaluierung</strong> <strong>eines</strong> Sensornetzes, ein produktiver<br />

Betrieb über mehrere Monate hinweg ist jedoch nicht erreichbar. Die hohe<br />

Leistungsaufnahme in den aktiven Betriebsmodi macht es über dies hinaus einfach<br />

zu beurteilen, wie effizient das System mit den vorhandenen Resourcen umgeht. Eine<br />

nicht energieeffiziente Implementierung wäre bereits nach wenigen St<strong>und</strong>en nicht<br />

mehr einsatzbereit, je effizienter 14 die Implementierung ist, desto längere Laufzeiten<br />

des gesamten Sensornetzes 15 können erzielt werden.<br />

25


Kapitel 3. Analyse <strong>und</strong> Anforderungsspezifikation<br />

Batteriespannung [V]<br />

2,8<br />

2,75<br />

2,7<br />

2,65<br />

2,6<br />

2,55<br />

2,5<br />

2,45<br />

2,4<br />

2,35<br />

2,3<br />

2,25<br />

2,2<br />

Zeit [h]<br />

Passiver Knoten<br />

Aktiver Knoten<br />

0 30<br />

116<br />

Abbildung 3.4: Entladekurve <strong>eines</strong> aktiven <strong>und</strong> <strong>eines</strong> passiven Knotens. Der aktive<br />

Knoten sendet hierbei pro Sek<strong>und</strong>e ein Paket bei voller Sendeleistung<br />

aus. Der passive Knoten führt, außer der periodischen Messung der<br />

Batteriespannung <strong>und</strong> dem Abspeichern dieser im Flash, keine anderen<br />

Aktionen durch. Die übrige Zeit befinden sich beide Knoten in einem<br />

Power-Down Mode.<br />

26


a) Modell b) Messung<br />

Messpunkte<br />

Empfangsbereich<br />

Störbereich<br />

3.3. Gegebenheiten<br />

Abbildung 3.5: Abstrahlcharakteristik von Sensorknoten: a) bei der Simulierung häufig<br />

zum Einsatz kommendes Modell[32, 33] <strong>und</strong> b) eine reale Messung der<br />

in dieser Arbeit verwendeten Antenne. Der Empfangsbereich entspricht<br />

der Umgebung um den Knoten, in dem eine Datenübertragung möglich<br />

ist. Im Störbereich ist eine Übertragung nicht mehr möglich, es werden<br />

jedoch u.U. Übertragungen anderer Knoten gestört!<br />

27


Kapitel 3. Analyse <strong>und</strong> Anforderungsspezifikation<br />

3.3.3 Messung der Abstrahlcharakteristik<br />

Abbildung 3.5 zeigt die gemessene Abstrahlcharakteristik der in den Sensorknoten verbauten<br />

Antennen. Als Vergleich ist zusätzlich das üblicherweise in Simulationen zum<br />

Einsatz kommende Modell einer idealen Antenne dargestellt. Im Modell nimmt die Signalstärke<br />

in alle Richtungen gleichmäßig ab. Man nimmt einen Kreis 16 r<strong>und</strong> um den<br />

Knoten an, in welchem eine Kommunikation möglich ist (Empfangsbereich) sowie einen<br />

Bereich, in welchem zwar keine Kommunikation mehr erfolgen kann, das ausgesendete<br />

Signal jedoch andere Knoten bei ihrer Kommunikation stören könnte (Störbereich). Bei<br />

der Messung stellte sich heraus, dass bei der richtigen Hardware der Signalwert nicht<br />

in alle Richtungen r<strong>und</strong> um den Sensorknoten im gleichen Maße abnimmt 17 . Gemessen<br />

wurde in einem gleichmäßigen Raster r<strong>und</strong> um einen sendenden Knoten. Bestimmt<br />

wurde jeweils, ob eine Übertragung möglich ist <strong>und</strong> welche Signalstärke gemessen wurde.<br />

In der Grafik ist nur die Aussage ” Empfang möglich“ dargestellt. Um die Messung<br />

durchführen zu können, wurde ein Knoten mit einer R<strong>und</strong>strahlantenne ausgestattet,<br />

deren Empfindlichkeit nahezu dem Modell entspricht. Wäre die Messung ebenfalls mit<br />

der originalen Antenne der Knoten durchgeführt worden, würde die Graphik noch weiter<br />

vom Modell abweichen. Ähnliche Ergebnisse bei der Messung an MICA2-Knoten[3]<br />

werden im Paper ” Impact of Radio Irregularity on Wireless Sensor Networks“[33] vorgestellt.<br />

3.3.4 Software<br />

Als Gr<strong>und</strong>lage für die Entwicklung der Software wurde die Open Source Firmware<br />

” Boop“[28] verwendet, welche als primäres Ziel hat, eine möglichst komfortable Universalfernbedienung<br />

aus der Betty-Hardware zu machen. Offensichtlich haben die Entwicklung<br />

<strong>eines</strong> Sensorknotens <strong>und</strong> die Entwicklung einer Universalfernbedienung ein<br />

deutlich voneinander abweichendes Ziel. Dies führte dazu, dass die gegebene Firmware<br />

im ersten Schritt auf gr<strong>und</strong>legende Funktionen reduziert wurde <strong>und</strong> nicht benötigter<br />

Code, wie beispielsweise das Benutzerinterface, entfernt wurde. Das übrig gebliebene<br />

Gerüst wurde als Gr<strong>und</strong>lage für die weitere Entwicklung verwendet. Neu hinzugefügt<br />

wurden Funktionen zur Ansteuerung des Funkchips, der Verwaltung des Energiebedarfs<br />

<strong>und</strong> zur Interaktion mit dem Watchdog.<br />

13dBm ist ein logarithmisches Leistungsmaß mit der Bezugsgröße 1mW. -30dBm entsprechen daher<br />

0.001 mW, -15dBm etwa 0.03mW, 0dBm 1mW <strong>und</strong> 10dBm 10mW<br />

14bei gleicher Leistung<br />

15einzelne Knoten können unter Umständen bereits vorzeitig ausfallen ohne dass dies die Gesamtfunktionalität<br />

einschränkt!<br />

16Eigentlich wäre eine Kugel das richtige Modell, in der Simulation wird das Netz jedoch oft in nur<br />

einer Ebene zweidimensional dargestellt.<br />

17Da die Antenne im Gehäuse mehrfach gefaltet ist, wäre eine gleichmäßige Abstrahlcharakteristik<br />

eher erstaunlich gewesen.<br />

28


3.3. Gegebenheiten<br />

” Boop“ steht unter der GPL18 3.0. Obwohl in dieser Arbeit nicht mehr viel der ursprünglichen<br />

Codebasis verwendet wird, gilt sie als abgeleitetes Werk <strong>und</strong> steht aufgr<strong>und</strong><br />

der Lizenzbedingungen somit ebenfalls unter der GLP 3.0. Eine Kopie der GPL<br />

3.0 ist in der Codebasis enthalten <strong>und</strong> kann ebenfalls unter [34] nachgelesen werden.<br />

Die nötigen Werkzeuge zur Übersetzung der Software von C bzw. Assembler in Maschinencode<br />

stellt die Ronetix Toolchain“[35] in der Version 4.1.1 bereit. Diese enthält<br />

”<br />

die GNU-Tools für ARM (Compiler, Assembler, Linker <strong>und</strong> diverse Tools) sowie die<br />

” newlib“ Bibliothek. Hierbei handelt es sich um eine für den Einsatz auf eingebetteten<br />

Systemen optimierte Standard-C-Bibliothek.<br />

18 GNU General Public License<br />

29


Kapitel 3. Analyse <strong>und</strong> Anforderungsspezifikation<br />

30


4 Systementwurf<br />

Nachdem das System <strong>und</strong> die einzelnen Komponenten in den vorherigen Kapiteln bereits<br />

vorgestellt wurden, erfolgt nun eine Beschreibung des Entwurfs <strong>und</strong> der Architektur.<br />

Es wird zunächst gezeigt, wie die auf den einzelnen Knoten laufende Software aufgebaut<br />

ist <strong>und</strong> welche Besonderheiten sie bietet. Anschließend wird gezeigt, wie die Software<br />

unter den Knoten verteilt wird. Abschließend folgt eine Beschreibung der Architektur<br />

der Kommunikation im gesamten System zwischen den Knoten. Die verwendeten<br />

Protokolle werden im Detail vorgestellt.<br />

4.1 Softwarearchitektur<br />

Für die Software wurde eine zweigeteilte Architektur gewählt. Sie besteht aus einem<br />

fest auf jedem Knoten installierten Teil (im Weiteren ” Firmware“ genannt) sowie einem<br />

austauschbarem Teil (im Weiteren ” Anwendung“ genannt). Die Firmware stellt<br />

die Basisfunktionalität zur Verfügung. In der Anwendung werden weitergehende Funktionen<br />

<strong>und</strong> das Verhalten der Sensorknoten implementiert. Abbildung 4.1 zeigt einen<br />

groben Überblick über die zweigeteilte Architektur.<br />

Es folgt nun zunächst die Architektur der Firmware. Anschließend wird die Architektur<br />

der Hauptanwendung 1 beschrieben. Im folgenden Unterkapitel ” Software Deployment“<br />

(4.2) werden dann die Mechanismen vorgestellt, welche den Austausch <strong>und</strong> die Verteilung<br />

der Anwendung ermöglichen.<br />

4.1.1 Architektur der Firmware<br />

Die Firmware stellt eine solide Basis für die Entwicklung von Anwendungen für das<br />

Sensornetzwerk dar. Sie erfüllt prinzipiell vier Aufgaben: die Hardware Abstraktion,<br />

einen Callback Mechanismus, eine umfangreiche RF Komponente <strong>und</strong> das<br />

Softwareupdate.<br />

Das Softwareupdate wird im Unterkapitel 4.2 im Detail vorgestellt, hier folgt eine kurze<br />

Beschreibung der übrigen Funktionen der Firmware.<br />

1 Neben dieser gibt es mehrere kleine Testanwendungen, deren Ergebnisse jedoch in die Hauptanwen-<br />

dung eingeflossen sind.<br />

31


Kapitel 4. Systementwurf<br />

Firmware Anwendung<br />

Hardware Abstraktion<br />

ADC<br />

Power<br />

Watchdog<br />

Flash<br />

Audio<br />

Sensornetz- <strong>und</strong> Knotenlogik<br />

Laufzeitprotokoll Energieverwaltung Ereignisverarbeitung<br />

Schnittstelle zur Firmware (Pointertabelle)<br />

RTC<br />

IRQ<br />

Timer<br />

LCD<br />

STDIO<br />

Callback Mechanismus<br />

Software Update<br />

Hardware<br />

RF Komponente<br />

Paket Empfangen<br />

Paket Senden<br />

Chip Konfigurieren<br />

Wake on Radio<br />

Abbildung 4.1: Grober Überblick über die zweigeteilte Softwarearchitektur. Gezeigt<br />

werden die wesentlichen Komponenten der Firmware <strong>und</strong> der Anwendung.<br />

32


Hardwareabstraktion<br />

4.1. Softwarearchitektur<br />

Damit sich der Entwurf der auf dem Sensorknoten laufenden Anwendung quasi vollständig<br />

auf die Programmlogik konzentrieren kann, wird von der Firmware eine große<br />

Menge an Funktionen angeboten, um einfach auf die Hardware des Knotens zugreifen<br />

zu können. Der Zugriff auf die Hardware erfolgt hierbei über normale Funktionsaufrufe.<br />

Um beispielsweise die Spannung der Stromversorgung (<strong>und</strong> somit dem Ladezustand<br />

der Akkus) abzufragen, genügt es, die entsprechende Funktion aufzurufen.<br />

Selbstverständlich kann die jeweilige Anwendung auch direkt auf die Hardware zugreifen,<br />

sofern dies nötig ist.<br />

” Callback“ Mechanismus<br />

Damit die Anwendung nicht ständig aktiv nachfragen muss, ob neue zu verarbeitende<br />

Ereignisse vorliegen, bietet es die Firmware an, für bestimmte Ereignisse eigene Funktionen<br />

2 anzumelden, welche dann aufgerufen werden, wenn das Ereignis auftritt. Da<br />

die Ereignisse überwiegend von der Hardware ausgelöst werden (<strong>und</strong> zwar auch dann,<br />

wenn die CPU in einem Stromsparzustand ist), trägt diese Vorgehensweise auch zum<br />

Energiesparen bei.<br />

Die Firmware verwaltet hierzu eine Liste mit Funktionspointern. Wenn ein Ereignis<br />

auftritt, welches einen ” Callback“ auslösen kann, wird statt des direkten Sprungs auf<br />

den Funktionspointer eine Wrapper-Funktion aufgerufen. Diese überprüft dann, ob das<br />

Sprungziel überhaupt existiert <strong>und</strong> eine gültige ” Callback-Funktion“ ist <strong>und</strong> führt erst<br />

dann den Sprung aus. Über bestimmte Funktionen kann die Anwendung ihre eigenen<br />

Funktionen in diese Liste eintragen lassen. Es ist somit nicht nötig, alle möglichen ” Callbacks“<br />

in der Anwendung zu implementieren. Es müssen nur die von der Anwendung<br />

benötigten Funktionen implementiert <strong>und</strong> registriert werden.<br />

RF Komponente<br />

Da die Ansteuerung des Funkchips von jeder Anwendung benötigt wird (<strong>und</strong> auch von<br />

der Firmware selbst zur Durchführung des kabellosen Softwareupdates), wurde eine<br />

komplette Softwarekomponente zur Konfiguration <strong>und</strong> Verwendung des Funkchips in<br />

der Firmware implementiert.<br />

Die API 3 der Komponente erlaubt es, Pakete mit einer Länge von bis zu 64kByte zu<br />

senden <strong>und</strong> zu empfangen. Ebenfalls unterstützt wird der ” Wake-on-Radio“ Mechanismus<br />

(siehe 3.3.1 <strong>und</strong> 4.3.1). Über die bereits vorgestellte Callback-Schnittstelle kann die<br />

2 Die aufgerufenen Funktionen werden ” Callback-Funktionen“ genannt.<br />

3 API steht für engl. application programming interface, deutsch: ” Schnittstelle zur Anwendungsprogrammierung“.<br />

Im weiteren Sinne wird die Schnittstelle jeder Bibliothek (Library) als API<br />

bezeichnet.<br />

33


Kapitel 4. Systementwurf<br />

0x80000000<br />

0x80020000<br />

0x80040000<br />

0x80060000<br />

0x80070000<br />

Firmware<br />

Anwendung<br />

temporäre Anwendung<br />

Nachrichtenindex<br />

Nachrichtenwarteschlange<br />

Flash 0<br />

Logdaten<br />

Konfiguration<br />

Flash 1<br />

0x82000000<br />

0x820f0000<br />

Abbildung 4.2: Aufteilung des Flashspeichers. Der erste Baustein wird verwendet, um<br />

die Firmware <strong>und</strong> die Anwendung abzulegen. Zusätzlicher Platz ist reserviert<br />

um eine temporäre Anwendung während des Anwendungsupdates<br />

anzulegen. Der restliche zur Verfügung stehende Speicherplatz wird<br />

für eine Nachrichtenwarteschlange samt dazugehörigem Index verwendet.<br />

Im zweiten Baustein wird, außer <strong>eines</strong> kleinen Bereichs für Konfigurationsdaten,<br />

nur das Protokoll der Laufzeit abgelegt.<br />

Anwendungen eingehende Pakete zur Bearbeitung entgegennehmen. Einstellungen wie<br />

beispielsweise Datenrate, Sendeleistung <strong>und</strong> Übertragungskanal können über einfache<br />

highlevel Funktionsaufrufe vorgenommen werden.[19][36]<br />

Bei jedem empfangenen Paket wird von der Firmware zunächst eine Vorfilterung durchgeführt.<br />

Handelt es sich um ein ” Software-Update“-Paket oder ein ” Reset“-Paket, wird<br />

dieses direkt verarbeitet. Andernfalls wir das Paket zur weiteren Verarbeitung der Anwendung<br />

übergeben. Nicht für die Anwendung bestimmte Pakete bekommt diese somit<br />

nicht zu sehen.<br />

4.1.2 Aufteilung des Speichers<br />

Der Programmcode wird komplett im Flash abgelegt <strong>und</strong> aus diesem ausgeführt, so<br />

dass das SRAM (nahezu) komplett für dynamische Daten zur Verfügung steht. Für<br />

weniger dynamische Daten wird der Flashspeicher genutzt. Da der Flash-Speicher seine<br />

Daten auch ohne Energieversorgung behält, können so über einen längeren Zeitraum<br />

gesammelte Daten zur späteren Auswertung gespeichert werden.<br />

34


Sensornetzknotenanwendung<br />

Implementierung der<br />

verschiedenen Szenarien<br />

Aufgabenverwaltung<br />

Nachrichtenverwaltung <strong>und</strong><br />

-verarbeitung<br />

Schnittstelle zur Firmware (Pointertabelle)<br />

4.1. Softwarearchitektur<br />

Kanal- <strong>und</strong> Knotenbewertung<br />

Routing <strong>und</strong> Routenverwaltung<br />

Energieverwaltung<br />

Laufzeitprotokoll Ereignisverarbeitung<br />

Abbildung 4.3: Teilkomponenten der Hauptanwendung<br />

Die (im Verhältnis zum SRAM) Menge an zur Verfügung stehendem Speicher wird neben<br />

der Protokollierung auch dazu genutzt, eine energieeffiziente Nachrichtenweiterleitung<br />

im gesamten Netzwerk zu etablieren. Nachrichten müssen pro Hop nur ein einziges<br />

Mal übertragen werden <strong>und</strong> stehen somit bei jedem Knoten im Datenpfand im Falle<br />

einer nötigen Übertragungswiederholung zur Verfügung <strong>und</strong> müssen nicht über den<br />

gesamten Pfad erneut übertragen werden. Wie genau dieser Mechanismus funktioniert<br />

<strong>und</strong> zum Energiesparen beitragen kann, wird in den folgenden Kapiteln beschrieben.<br />

Die Aufteilung des Speichers der beiden Flashbausteine auf die jeweiligen Komponenten<br />

des Sensorknotens ist in Abbildung 4.2 dargestellt.<br />

4.1.3 Architektur der Anwendung<br />

Es wurden mehrere Anwendungen, welche auf den Sensorknoten ausgeführt werden<br />

können, entwickelt. Diese dienten im Wesentlichen der Erprobung der Schnittstelle ” Anwendung<br />

/ Firmware“ <strong>und</strong> der Entwicklung von neuen Funktionen. Die Erkenntnisse,<br />

welche mit diesen Testanwendungen gesammelt wurden, kommen in der Sensorknoten<strong>und</strong><br />

Routinganwendung zum Einsatz. Im weiteren Verlauf dieser Arbeit ist immer diese<br />

Hauptanwendung gemeint. Abbildung 4.3 zeigt die Teilkomponenten dieser Anwendung,<br />

welche im Folgenden vorgestellt werden.<br />

35


Kapitel 4. Systementwurf<br />

b) c)<br />

a) gestörte Kanäle<br />

Abbildung 4.4: Beispiel für eine Anwendung: Messung der Belegung des 433MHz Frequenzbereiches.<br />

a) <strong>und</strong> b) mit einem Störsender aus 1,5m bzw. 15m<br />

Entfernung. c) zeigt das ungestörte Spektrum. Die grau hinterlegten<br />

Kanäle sind die von der Software als ” belegt“ bewerteten <strong>und</strong> würden<br />

bei einer Datenübertragung vermieden.<br />

Beispiel für eine Testanwendung<br />

Als ein Beispiel für eine Testanwendung sei die ” Scanner“ Anwendung genannt. Um die<br />

Belegung des Frequenzspektrums der Funkmodems anzuzeigen, wird dieses in gleichmäßigen<br />

Schritten schnell abgetastet <strong>und</strong> die gemessenen Signalpegel auf dem Display<br />

angezeigt. Abbildung 4.4 zeigt Bilder des Displays. Teilbild a) <strong>und</strong> b) zeigen das<br />

Spektrum <strong>eines</strong> Störsenders 4 aus etwa 1,5m <strong>und</strong> 15m Entfernung. Teilbild c) zeigt das<br />

ungestörte Spektrum. Die grau hinterlegten Kanäle sind die von der Software als ” belegt“<br />

bewerteten <strong>und</strong> würden bei einer Datenübertragung vermieden. Das Ergebnis<br />

dieses Tests führte dazu, dass der Frequenzbereich in sechs statt zunächst 16 geplanten<br />

Kanälen eingeteilt wurde. Erkenntnisse aus dieser Anwendung sind direkt in die<br />

Kanalbewertungskomponente der Hauptanwendung eingeflossen.<br />

Implementierung der verschiedenen Szenarien<br />

Für die drei verschiedenen Szenarien (siehe Kaptiel 2.2) werden zwar unterschiedliche<br />

Vorgänge auf den einzelnen Knoten durchgeführt, das Basissystem ist jedoch bei allen<br />

identisch. Es wurde daher nicht für jedes Szenario eine eigene Anwendung entwickelt,<br />

sondern eine Teilkomponente der Anwendung kümmert sich um die Umsetzung der<br />

Aufgaben <strong>und</strong> bietet ein Benutzerinterface, über welches über die serielle Schnittstelle<br />

auf das Verhalten der Knoten Einfluss genommen werden kann. Zusätzlich können diverse<br />

Informationen (Routingtabelle, Nachrichtenwarteschlange, ...) über den internen<br />

Status der Knoten lokal ausgegeben oder über das Netz von anderen Knoten angefordert<br />

werden.<br />

4 Die Basisstation <strong>eines</strong> 433 MHz Funkkopfhörer-Sets<br />

36


Kanal- <strong>und</strong> Knotenbewertung<br />

4.1. Softwarearchitektur<br />

Die Kanal- <strong>und</strong> Knotenbewertung besteht aus zwei voneinander unabhängigen Komponenten.<br />

Die Kanalbewertung basiert auf der bereits unter 4.1.3 vorgestellten Testanwendung.<br />

Die Abtastung der Kanäle erfolgt jedoch nicht kontinuierlich sondern nur in<br />

größeren Abständen. Aufgr<strong>und</strong> dieser Abtastung wird für jeden Kanal dynamisch unter<br />

Berücksichtigung der anderen Kanäle eine Bewertung erstellt. Immer dann, wenn<br />

ein Kanalwechsel erfolgt, wird zunächst diese Bewertung überprüft, um so potentiell<br />

gestörte Kanäle zu vermeiden. Durch die größeren Pausen zwischen den einzelnen<br />

Überprüfungen der Kanäle werden eher langfristige Störungen, wie zum Beispiel der<br />

bereits genannte Funkkopfhörer, erkannt. Kurzfristige Störungen müssen durch Empfangsbestätigungen<br />

<strong>und</strong> Sendewiederholungen ausgeglichen werden.<br />

Die Knotenbewertung greift genau hier ein. Bei jeder nötigen Sendewiederholung wird<br />

die Bewertung <strong>eines</strong> Knotens herabgesetzt, bei jeder erfolgreichen Empfangsbestätigung<br />

erhöht. Aufgr<strong>und</strong> dieser Bewertung wird dann adaptiv die Einstellung des Funkchips für<br />

die nächste Übertragung gewählt. Bei einer schlechten Bewertung wird die Datenrate<br />

reduziert <strong>und</strong> die Sendeleistung erhöht, bei einer guten Bewertung die Sendeleistung<br />

reduziert <strong>und</strong> die Datenrate erhöht.<br />

Die Kombination aus einer dynamischen Bewertung der Übertragungskanäle <strong>und</strong> der<br />

ständigen Anpassung der Sendeleistung <strong>und</strong> Datenrate ermöglicht es, Verbindungen mit<br />

niedriger Fehlerrate aufzubauen <strong>und</strong> somit unnötige Sendewiederholungen einzusparen.<br />

Durch die Reduktion der Sendeleistung <strong>und</strong> Erhöhung der Datenrate wird bei guten<br />

Verbindungen über dies hinaus die benötigte Energie für die Übertragung reduziert.<br />

Die benötigte Energie für die Übertragung einer Nachricht lässt sich Abschätzen durch<br />

die Nachrichtenlänge (in Byte), der Datenrate (in Bit pro Sek<strong>und</strong>e), die Sendeleistung<br />

(in Watt), den Gr<strong>und</strong>verbrauch des aktiven Systems (ebenfalls in Watt) sowie der<br />

Anzahl der Übertragungswiederholungen n:<br />

<br />

Nachrichtenlänge<br />

EÜbertragung = n ∗<br />

Datenrate<br />

Aufgabenverwaltung<br />

∗ (PSendeleistung + PGr<strong>und</strong>leistung)<br />

Damit Knoten mehrere Aufgaben gleichzeitig erfüllen können, werden diese nicht immer<br />

gleich bearbeitet, wenn sie durch einen anderen Knoten oder die Anwendung selbst in<br />

Auftrag gegeben werden. Stattdessen erfolgt die Bearbeitung <strong>und</strong> Beantwortung von<br />

Anfragen asynchron. Die Aufgaben werden dazu in eine Warteschlange eingefügt. Durch<br />

die Aufteilung in Teilaufgaben können so mehrere Aufgaben parallel bearbeitet werden<br />

– in etwa vergleichbar mit dem Scheduler <strong>eines</strong> Betriebssystems.<br />

Für jede Aufgabe kann eine Wartezeit angegeben werden, bis die Bearbeitung erfolgt.<br />

Durch zufällige Wartezeiten kann eine gewisse zeitliche Entzerrung von ausgehenden<br />

37


Kapitel 4. Systementwurf<br />

Typ<br />

Timeout<br />

betr. Route ID<br />

Node ID<br />

Sequenz Nr.<br />

Fehlercounter<br />

Leseposition Freigabeposition<br />

Schreibposition<br />

zu bearbeitende Aufgaben neue Aufgaben freier Speicher<br />

Abbildung 4.5: Verwaltung der Aufgaben in einem Ringbuffer. Es werden drei Zeiger<br />

(Leseposition, Freigabeposition <strong>und</strong> Schreibposition) verwendet, um<br />

den Zugriff auf die Datenstruktur zu koordinieren. Die Bedeutung des<br />

Inhalts <strong>eines</strong> einzelnen Eintrags ist im gewissen Rahmen abhängig vom<br />

Aufgabentyp, dargestellt sind die zur Verfügung stehenden Felder.<br />

Paketen erreicht werden. Nicht erfolgreich erledigte Aufgaben können einfach wieder in<br />

die Warteschlange eingefügt werden. Über den selben Mechanismus können Timeouts<br />

verwaltet werden oder periodische Aufgaben abgewickelt werden.<br />

Die Speicherung <strong>und</strong> Verwaltung der Aufgaben erfolgt in einem Ringbuffer. Mit jedem<br />

durch die Echtzeituhr ausgelösten Interrupt werden – sofern vorhanden – alle neuen<br />

Aufgaben zur Verarbeitung freigegebenen. Die freigegebenen Aufgaben werden dann<br />

nach <strong>und</strong> nach bearbeitet. Während dieses Abarbeitungsschrittes neu anfallende Aufgaben<br />

werden erst im nächsten Schritt freigegeben <strong>und</strong> bearbeitet. Aufgaben, deren<br />

Wartezeit noch nicht abgelaufen ist, werden wieder an das Ende des Buffers angefügt.<br />

Abbildung 4.5 zeigt den Aufbau dieser Verwaltungsstruktur.<br />

Diese zentrale Aufgabenverwaltung <strong>und</strong> -abarbeitung führt die Teilkomponenten der<br />

Anwendung zusammen <strong>und</strong> hat einen großen Einfluss auf die Funktion <strong>und</strong> das Verhalten<br />

der einzelnen Knoten.<br />

Routing <strong>und</strong> Routenverwaltung<br />

Jeder Knoten kann mehrere Routen zu mehreren verschiedenen Zielen verwalten. Routen<br />

werden erst dann gesucht bzw. aufgebaut, wenn sie auch benutzt werden sollen –<br />

38


4.1. Softwarearchitektur<br />

Source Prev Target Next Length Seq. Nr DR SL Bat. Flags Errors Rating Path<br />

a) 1 1 2 255 32 1234 NONE NONE 255 0x01 0 0/0 1<br />

b) 1 0 3 3 1 8214 MAX MIN 92 0x10 1 9/1 1,3<br />

c) 1 0 100 3 4 4382 MED LOW 50 0x02 0 0/0 1,3..<br />

d) 4 3 55 255 30 8215 NONE NONE 255 0x01 0 0/0 4,3,1<br />

e) 255 255 255 255 0 0 0 0 0 0x00 0 0/0 0<br />

Routenwahl<br />

Nachbarschafts Bewertung<br />

Abbildung 4.6: Aufbau der Routingtabelle. Grün hinterlegt sind die Spalten, die zur<br />

Routingwahl verwendet werden. Die blau hinterlegten Spalten dienen<br />

der adaptiven Anpassung von Datenrate <strong>und</strong> Sendeleistung zwischen<br />

zwei Nachbarn. Dargestellt sind einige Einträge aus Sicht vom Knoten<br />

mit der Nummer 1: a) Route-Request von Knoten 1 zu Knoten 2. b)<br />

Nachbarschaft zu Knoten 3. c) Bestehende Route zu Knoten 100 über<br />

4 Hops. d) Route-Request von Knoten 4 zu Knoten 55, welches über 3<br />

bei 1 eingegangen ist. e) Nicht verwendeter Eintrag.<br />

es handelt sich hierbei also um reaktives Routing. Nicht verwendete Routen werden<br />

nach einer bestimmten Zeit automatisch aus dem Bestand gelöscht. Als Basis für das<br />

Routing wurde das AODV-Protokoll (AdHoc On Demand Distance-Vector)[37] verwendet.<br />

5 Da das AODV-Protokoll nur eine einzige Route pro Ziel vorsieht, konnte es nicht<br />

vollständig übernommen werden. Durch die diversen Änderungen ist eigentlich ein neues<br />

Routingprotokoll entstanden, welches im Unterkapitel 4.3.4 im Detail beschrieben<br />

wird. Das Protokoll sucht <strong>und</strong> findet, sofern vorhanden, mehrere schleifenfreie Pfade<br />

zum Ziel. Die Routenwahl kann durch die Anwendung in der Form beeinflusst werden,<br />

dass entweder Routen mit niedriger Latenz, Routen mit hoher Bandbreite oder Routen<br />

mit einer guten Energieeffizienz 6 gewählt werden. Lokal auftretende Probleme auf dem<br />

Pfad werden, soweit möglich, lokal behoben. Nur dann, wenn kein alternativer Pfad<br />

zum Ziel gewählt werden kann, wird das Problem an den vorausgehenden Knoten (<strong>und</strong><br />

somit ggf. bis zur Quelle zurück) gemeldet. Parallel zur Verwaltung <strong>und</strong> Organisation<br />

der Routen werden viele der gesendeten Pakete zur netzweiten Zeitsynchronisation mit<br />

einem Zeitstempel versehen.<br />

Zur knoteninternen Verwaltung der Routen wird eine einfache Tabelle verwendet. Der<br />

Aufbau dieser Tabelle ist in Abbildung 4.6 dargestellt. Nicht verwendete Tabelleneinträge<br />

werden durch eine nicht existierende Zieladresse (255) gekennzeichnet. Da relativ<br />

wenig Speicher zur Verfügung steht <strong>und</strong> der Prozessor vergleichsweise schnell arbeitet,<br />

5Zusätzlichen Einfluss hatten The Pulse Protocol“[38] <strong>und</strong> das Directed Diffusion“ Protokoll[39]<br />

” ”<br />

für kabellose Sensornetze.<br />

6Die Energieeffizienz bedeutet hierbei auch, dass vorzugsweise Knoten gewählt werden, welche über<br />

einen vollen Akku verfügen.<br />

39


Kapitel 4. Systementwurf<br />

wurde auf eine effizientere (im Sinne von CPU-Zyklen) Verwaltung der Einträge verzichtet.<br />

7 Es fand also eine Abwägung zwischen nötigem Speicherbedarf <strong>und</strong> zur Verfügung<br />

stehenden Prozessorzyklen statt.<br />

Nachrichtenverwaltung <strong>und</strong> -verarbeitung<br />

Als Nachrichten werden all die Datenpakete bezeichnet, die von einem Knoten (Quelle)<br />

zu einem anderen Knoten (Ziel) durch das Netz weitergeleitet werden sollen. Bevor<br />

eine Nachricht durch das Netz geschickt werden kann, muss zuvor durch das Routingprotokoll<br />

mindestens ein Pfad durch das Netz gef<strong>und</strong>en werden. Um den Signalisierungsaufwand<br />

gering zu halten, werden Nachrichten, welche den jeweils gleichen<br />

nächsten Knoten auf ihrem Pfad haben, automatisch zusammengefasst <strong>und</strong> gemeinsam<br />

übertragen. Im Abschnitt 4.3.5 wird diese netzweite Datenübertragung im Detail<br />

vorgestellt.<br />

Da für größere Datenmengen das RAM der Knoten nicht ausreicht, werden die Nachrichten<br />

im Flash abgelegt. Da ggf. viele Nachrichten gleichzeitig verwaltet werden<br />

müssen, werden auch die notwendigen Daten zur Nachrichtenverwaltung im Flash abgelegt.<br />

Gegenüber der Verwaltung im RAM hat dies diverse Nachteile. Um diese Nachteile<br />

etwas zu kompensieren, werden die möglicherweise dynamischen Anteile dieses Indexes<br />

im RAM abgelegt, nur die garantiert statischen Anteile werden ins Flash geschrieben.<br />

Sollten bei der Weiterleitung der Nachrichten auf Ihrem Weg zum Ziel Probleme auftreten,<br />

so wird diese Art der quasi dauerhaften Speicherung zum Vorteil. Tritt ein Fehler<br />

auf <strong>und</strong> kann die Nachricht nicht weiter in Richtung Ziel geleitet werden, so muss der<br />

auf dem Pfad vorausgehende Knoten nur darüber in Kenntnis gesetzt werden, dass<br />

die Nachricht nicht zugestellt werden konnte 8 – eine erneute Übertragung der Nachricht<br />

auf dem Pfad zurück oder gar von der Quelle ausgehend ist nicht nötig, da die<br />

Daten noch vorliegen. Der Knoten, der über das Problem informiert wurde, kann die<br />

Nachricht dann entweder auf einem anderen Weg zum Ziel leiten oder – falls dies nicht<br />

möglich ist – ebenfalls seinen Vorgänger informieren.<br />

Regelmäßig wird überprüft, ob noch ausstehende Nachrichten zu bearbeiten sind. Wenn<br />

ja, erfolgt die nötige Behandlung. Sind keine weiteren Nachrichten zu bearbeiten,<br />

erfolgt, sofern der zur Verfügung stehende Speicherbereich im Flash einen gewissen<br />

Schwellwert unterschritten hat, eine Freigabe von neuem Speichern, indem alte Nachrichten<br />

gelöscht werden. Da der Flashspeicher nur sektorweise gelöscht werden kann,<br />

kann diese Freigabe erst dann erfolgen, wenn alle im entsprechenden Sektor gespeicherten<br />

Nachrichten bearbeitet wurden. Bereits bearbeitete aber noch nicht gelöschte<br />

Nachrichten werden durch ein entsprechendes Flag gekennzeichnet 9 .<br />

7 Zur Optimierung vorstellbar wäre es, eine Menge verketteter Listen pro Ziel zu verwenden. Zweifelhaft<br />

ist es jedoch, ob die hierzu notwendige dynamische Speicherverwaltung <strong>und</strong> der geringfügig<br />

höhere Speicherbedarf die eingesparten Prozessorzyklen rechtfertigt.<br />

8 Zur Identifizierung der Nachricht genügt das Tupel (Quellknoten, Zielknoten, Sequenznummer)<br />

9 Einzelne Bits können im Flash jederzeit von 1 auf 0 gesetzt werden. Ein Schreibvorgang von 0 nach<br />

40


Energieverwaltung<br />

4.1. Softwarearchitektur<br />

Eine geschickte Verwaltung bzw. Minimierung des Energiebedarfs der einzelnen Knoten<br />

ist, neben dem Design der Protokolle für einen energieeffizienten Betrieb des Sensornetzes,<br />

unabdingbar.<br />

Energie gespart werden kann, indem die CPU, der Funkchip oder beides in einen Energiesparmodus<br />

versetzt wird. Die CPU selbst kann hierzu entweder (nahezu) vollständig<br />

deaktiviert werden ( ” Power-Down-Mode“) oder in einen Schlafzustand ( ” Idle“) wechseln,<br />

aus dem sie sehr schnell wieder aufwachen kann. Zusätzlich kann die Taktfrequenz<br />

der jeweils aktuellen Aufgabe angepasst werden 10 . Der Funkchip verfügt ebenfalls über<br />

einen Power-Down- <strong>und</strong> einen Idle-Modus. Als weitere Möglichkeit kann ein Wake-on-<br />

Radio Modus gewählt werden, in dem der Funkchip eigenständig periodisch aufwacht,<br />

das Medium abhört <strong>und</strong> – sofern ein Paket eingeht – die CPU über einen Interrupt<br />

wecken kann. Geht während der Lauschphase kein Paket ein, wechselt der Funkchip<br />

wieder zurück in den Power-Down-Mode.<br />

Die Kombination aus Wake-on-Radio <strong>und</strong> Power-Down-Mode der CPU ist der Gr<strong>und</strong>zustand,<br />

der eine optimale Laufzeit bei gleichzeitiger Erreichbarkeit ermöglicht. Es ist<br />

die Aufgabe der Anwendung, diesen Zustand so oft wie es nur möglich ist zu erreichen.<br />

Der Funkchip signalisiert über einen Interrupt eingehende Daten <strong>und</strong> weckt hierüber<br />

die CPU, um diese entgegenzunehmen <strong>und</strong> entsprechend zu verarbeiten. Durch den<br />

jede Sek<strong>und</strong>e von der Echtzeituhr ausgelösten Interrupt wird der Prozessor überdies<br />

regelmäßig geweckt. Liegt keine Aufgabe vor <strong>und</strong> ist keine Nachricht zu verschicken,<br />

so wechselt die CPU sofort wieder in den Energiesparmodus. Die CPU wird somit nur<br />

einmal pro Sek<strong>und</strong>e kurz geweckt, wenn keine Aktivitäten im Netz stattfinden.<br />

Da zuerst die funktionalen Anforderungen des Netzes im Vordergr<strong>und</strong> standen, wurden<br />

diese Energiesparmechanismen nicht alle vollständig integriert. Es sind – bis auf<br />

die zur Nachbarschaftserkennung notwendige Bake – alle Funktionen darauf vorbereitet,<br />

den Wake-on-Radio Mechanismus zu verwenden. Aufgr<strong>und</strong> der vielen notwendigen<br />

Aufweckpakete führt dies jedoch bei mehreren Knoten, welche sich in gegenseitiger<br />

Reichweite befinden, zu einer zu starken Belegung des Signalisierungskanals <strong>und</strong> somit<br />

zu einer schlechten Gesamtperformance des Netzes. Um das Problem zu umgehen, sind<br />

daher alle Knoten gr<strong>und</strong>sätzlich empfangsbereit. Bei einem Wake-on-Radio Zyklus von<br />

0,5 Sek<strong>und</strong>en müssen im Durchschnitt für 0,25 Sek<strong>und</strong>en Weckpakete geschickt werden,<br />

bis der Partner geweckt ist. Bei einer Datenrate von 100kbps <strong>und</strong> einer mittleren<br />

Paketgröße von 15 Byte für ein typisches Signalisierungspaket können stattdessen theoretisch<br />

über 400 Signalisierungsvorgänge erfolgen! Der Prozessor wird jedoch dennoch,<br />

wann immer keine Aufgaben zu bearbeiten sind, in einen Energiesparmodus versetzt.<br />

Bei häufigem Verkehr auf dem Signalisierungskanal ist somit die Energieeffizienz höher,<br />

1 ist jedoch ausgeschlossen.<br />

10 Zur Wahl der Taktfrequenz stehen 10, 20 <strong>und</strong> 40 MHz zur Verfügung. Es hat sich jedoch herausgestellt,<br />

dass für die reinen Sensorknotenaufgaben 10 MHz Takt ausreichend ist. Lediglich für<br />

rechenintensive Aufgaben würde es sich ggf. lohnen, den Takt zu erhöhen!<br />

41


Kapitel 4. Systementwurf<br />

obwohl jeder einzelne Knoten mehr Energie benötigt, um den Funkchip jederzeit Empfangsbereit<br />

zu halten. Diese Energie wird jedoch beim Senden der Nachrichten wieder<br />

eingespart, da es mit höherer Wahrscheinlichkeit nicht zu Kollisionen kommt. Bei einer<br />

Konfiguration des Netzes, in welcher wenig Signalisierungsverkehr erfolgt, wäre die<br />

” Wake-on-Radio“-Variante im Sinne der Energieeffizienz vorzuziehen.<br />

Laufzeitprotokollierung<br />

Damit das Verhalten der Sensorknoten nach der Ausführung <strong>eines</strong> Versuches ausgewertet<br />

<strong>und</strong> analysiert werden kann, werden wichtige Systemparameter, wie Beispielsweise<br />

die aktuelle Versorgungsspannung oder die Anzahl der ein- <strong>und</strong> ausgehenden Pakete der<br />

Funkschnittstelle, in regelmäßigen Abständen direkt ins Flash geschrieben. Die Daten<br />

gehen somit auch nicht verloren, wenn die Energieversorgung unterbrochen wird. Hierzu<br />

steht nahezu der gesamte zweite Flashbaustein zur Verfügung. Bei einem Schreibintervall<br />

von zehn Sek<strong>und</strong>en <strong>und</strong> 52 Byte pro Eintrag 11 können so Protokolle zu Versuchen,<br />

welche über zwei Tage am Stück andauern mit einer guten zeitlichen Auflösung abgespeichert<br />

werden. Da die Versuche, die im Rahmen dieser Arbeit durchgeführt wurden,<br />

meist nur wenige St<strong>und</strong>en dauerten, wurde das Schreibintervall auf eine Sek<strong>und</strong>e herabgesetzt,<br />

um detailliertere Auswertungen erstellen zu können.<br />

Damit nach der Durchführung <strong>eines</strong> Versuchs nicht alle Knoten einzeln ausgelesen<br />

werden müssen, ist eine Funktion implementiert, welche einen komprimierten Auszug<br />

des Logfiles an einen im Voraus bestimmten Knoten verschicken kann. Der Versand<br />

der Daten kann entweder gezielt angefordert werden oder simultan bei allen Knoten<br />

durch das Überschreiten einer bestimmten Zeitmarke ausgelöst werden. Zum Versand<br />

der Daten kommt das normale Nachrichtenübertragungsprotokoll zum Einsatz. Der<br />

Zielknoten muss sich also nicht in direkter Reichweite befinden.<br />

Ereignisverarbeitung<br />

Die Ereignisverarbeitung ist dafür zuständig, angefallene Interrupts zu verarbeiten.<br />

Hierzu zählt der Interrupt der Echtzeituhr <strong>und</strong> des Funkchips.<br />

Die Echtzeituhr löst jede Sek<strong>und</strong>e einen Interrupt aus. Die Firmware verwendet diesen<br />

Interrupt, um die Systemzeit mit der Zeit der Echtzeituhr abzugleichen. Anschließend<br />

wird der entsprechende Ereignishandler der Anwendung aufgerufen. Dieser wird für<br />

verschiedene Zwecke genutzt. So wird das aktuelle Laufzeitprotokoll in den Flashspeicher<br />

geschrieben <strong>und</strong> zurückgesetzt. Es kann bestimmt werden, wie viele Sek<strong>und</strong>en<br />

verstreichen, bis dies erfolgt. Die Bake, welche zur Nachbarschaftserkennung versendet<br />

wird, wird durch den gleichen Mechanismus ausgelöst, mit dem Unterschied, dass die<br />

11 Dies entspricht der Protokollierung der Versorgungsspannung, der Systemzeit, besonderen Ereignissen<br />

<strong>und</strong> einer detaillierten Aufschlüsselung der Funkschnittstelle<br />

42


a) b)<br />

4.2. Software Deployment<br />

Sensorknoten<br />

Master Sensorknoten<br />

PC mit akt. Software<br />

Kabelverbindung<br />

Funkübertragung<br />

Abbildung 4.7: Software Deployment Varianten: a) an einzelne Knoten über die serielle<br />

Schnittstelle <strong>und</strong> b) Übertragung an viele Knoten gleichzeitig per Funk.<br />

zu verstreichende Zeit nach jeder Aktion (zufällig) neu bestimmt wird. Die letzte Aktion,<br />

die von diesem Ereignis ausgelöst wird, ist die Freigabe der bisher angefallenen<br />

Aufgaben <strong>und</strong> Nachrichten zur Bearbeitung. Durch diese periodische Freigabe wird,<br />

wie bereits beschrieben, eine schrittweise Abarbeitung erreicht.<br />

Nicht explizit von der Anwendung erwartete Pakete werden vom Funkchip empfangen<br />

<strong>und</strong> lösen ebenfalls einen Interrupt aus. Die Firmware nimmt diesen Interrupt entgegen<br />

<strong>und</strong> leistet einige Vorverarbeitung, wie beispielsweise Adress- <strong>und</strong> Prüfsummenchecks.<br />

Handelt es sich um ein an den aktuellen Knoten adressiertes Paket, wird der Pakethandler<br />

aufgerufen, welcher sich um die weitere Bearbeitung des Pakets kümmert. Aufgr<strong>und</strong><br />

des Pakettyps wird unterschieden, wie das Paket verarbeitet werden muss. So werden<br />

beispielsweise Routinganfragen <strong>und</strong> -antworten angenommen <strong>und</strong> zur weiteren Verarbeitung<br />

in die Aufgabenliste geschrieben. Als ein anderes Beispiel sei der Weckvorgang<br />

<strong>eines</strong> anderen Knotens zum Nachrichtenaustausch genannt.<br />

4.2 Software Deployment<br />

Der Austausch bzw. die Verteilung der Anwendung zur Laufzeit ist eine bedeutende<br />

Funktion der Firmware bzw. des Systems <strong>und</strong> wird daher hier besonders hervorgehoben.<br />

Die Verteilung kann entweder kabelgeb<strong>und</strong>en über die serielle Schnittstelle oder kabellos<br />

über Funk erfolgen. Die Firmware bietet sowohl die Unterstützung dafür, die auf dem<br />

Knoten installierte Anwendung an (mehrere) andere Knoten zu schicken, als auch eine<br />

neue Anwendung von einem anderen Knoten per Funk zu empfangen. Abbildung 4.7<br />

visualisiert die beiden Möglichkeiten der Übertragung neuer Software.<br />

Es werden nun zunächst die beiden Varianten (kabelgeb<strong>und</strong>en, kabellos) vorgestellt.<br />

Anschließend wird gezeigt, wie diese zweigeteilte Architektur aus fester Firmware <strong>und</strong><br />

43


Kapitel 4. Systementwurf<br />

austauschbarer Anwendung zusammengehalten <strong>und</strong> ermöglicht wird.<br />

Das Paper ” Updating Software in Wireless Sensor Networks: A Survey“[40] bietet einen<br />

guten Überblick über verschiedene Verfahren des Software Deployments in anderen<br />

kabellosen Sensornetzen sowie Sensornetzen im Allgemeinen.<br />

4.2.1 Übertragung über die serielle Schnittstelle<br />

Bei der Übertragung der Anwendung über die serielle Schnittstelle kommt das bereits<br />

in der Studienarbeit ” Entwurf <strong>und</strong> Implementierung der Infrastruktur für den FPGAbasierten<br />

Sensorknoten Hyperion“[19] entworfene Protokoll zum Einsatz, das dort im<br />

Bootloader implementiert war. Auf eine zu tiefgehende Beschreibung wird daher hier<br />

verzichtet. Wichtigster Unterschied ist, dass die Anwendung nicht in das RAM kopiert,<br />

sondern direkt in den Flashspeicher geschrieben wird. Die Daten werden paketweise<br />

übertragen <strong>und</strong> jedes Paket einzeln über eine Prüfsumme auf Übertragungsfehler untersucht.<br />

Nach vollständiger Übertragung erfolgt zusätzlich eine Überprüfung der gesamten<br />

Daten. Übertragungsfehler sind somit höchst unwahrscheinlich. Dadurch, dass<br />

die Daten direkt in den Flashspeicher geschrieben werden, ist der Vorgang nur einmal<br />

nötig <strong>und</strong> muss nicht bei jedem Neustart der Plattform erfolgen. Nach leichten<br />

Anpassungen konnte auch die in Java geschriebene GUI 12 , welche die Gegenseite des<br />

Protokolls implementiert, weiter verwendet werden.<br />

4.2.2 Übertragung per Funk<br />

Für die Übertragung über Funk wurde ein neues Protokoll entworfen, welches per<br />

Broadcast alle Knoten in Reichweite des Senders gleichzeitig aktualisieren kann. Die<br />

übertragene Anwendung wird nur dann aktiv, wenn sie sowohl vollständig als auch<br />

korrekt beim Empfänger angekommen ist. Falls die Übertragung nicht erfolgreich war,<br />

bleibt die ursprüngliche Anwendung aktiv. Bereits aktuelle Softwareversionen werden<br />

nicht überschrieben. Dies ermöglicht es, das Softwareupdate von mehreren Standorten<br />

im Einsatzgebiet des Sensornetzes mehrfach auszuführen, um so alle Knoten zu erreichen<br />

<strong>und</strong> zu aktualisieren. Eine detaillierte Beschreibung dieses Übertragungsvorganges<br />

folgt im Unterkapitel 4.3.2.<br />

4.2.3 Bindeglied Firmware / Anwendung<br />

Die Firmware stellt, wie bereits beschrieben, eine gr<strong>und</strong>legende Funktionalität zur<br />

Verfügung. Hierzu zählt unter anderem auch die embedded C Laufzeitumgebung ” newlib“<br />

mit den typischen Funktionen wie memcpy() oder printf().<br />

12 Graphical User Interface, englisch für grafische Benutzeroberfläche<br />

44


Hardware Abstraktion<br />

ADC<br />

Power<br />

WD<br />

Flash<br />

RTC<br />

IRQ<br />

Timer<br />

LCD<br />

Audio STDIO<br />

„Callbacks“<br />

Software Update<br />

RF Komponente<br />

Paket Empfangen<br />

Paket Senden<br />

Konfigurieren<br />

Wake on Radio<br />

Firmware.elf<br />

Header Files<br />

#!/usr/bin/perl<br />

@WISHLIST=(„puts“,<br />

...)<br />

Konvertier-Skript<br />

h<br />

c<br />

Generierter Code<br />

4.2. Software Deployment<br />

App. Code<br />

Sensornetz- <strong>und</strong> Knotenlogik<br />

Laufzeitprotokoll Energieverwaltung Ereignisverarbeitung<br />

Schnittste lle zur Firmware (Pointertabelle)<br />

App.elf<br />

Abbildung 4.8: Automatische Codeerzeugung: Aus der ELF-Datei der Firmware <strong>und</strong><br />

den Headerdateien erzeugt das Konvertier-Skript neuen Code. Dieser<br />

wird zusammen mit dem eigentlichen Anwendungscode kompiliert <strong>und</strong><br />

ergibt so die ELF-Datei der Anwendung. Der automatisiert erzeugte<br />

Code enthält im Wesentlichen Pointer auf die Funktionen der Firmware.<br />

Problematik<br />

Alle in der Firmware implementierten Funktionen sollen in der Anwendung transparent<br />

genutzt werden können. Um das Speicherabbild der austauschbaren Anwendung klein<br />

zu halten, war es ebenfalls notwendig, die Funktionen der Laufzeitumgebung nach außen<br />

hin zur Verfügung zu stellen. Weiterhin ist es erstrebenswert, in der Firmware angelegte<br />

Datenstrukturen, welche die Firmware an sich nicht benötigt, in der Anwendung nutzen<br />

zu können. Hierzu zählt beispielsweise der Sende- <strong>und</strong> Empfangspuffer für die Pakete<br />

des Funkchips.<br />

Gewählte Lösung<br />

Um das Problem zu lösen, werden in der Firmware bereits vorhandene Funktionen<br />

in der Anwendung nicht noch einmal abgelegt, sondern nur jeweils ein Pointer auf<br />

die entsprechende Funktion. Die Tabelle mit den Funktionspointern ist nicht Bestandteil<br />

der Firmware. Stattdessen wird (automatisiert) neuer Programmcode erzeugt, der<br />

im Wesentlichen aus Funktionspointern <strong>und</strong> Konstanten besteht 13 . Dieser neue Programmcode<br />

kann dann normal übersetzt <strong>und</strong> gegen die Anwendung gelinkt werden.<br />

Abbildung 4.8 zeigt die hierzu nötigen Schritte. Eine Besonderheit dieses Ansatzes<br />

13 Eine Alternative wäre es gewesen, die Funktionen der Firmware an statische Adressen zu linken <strong>und</strong><br />

dann diese Adressen aus der Anwendung direkt anzuspringen. Aufgr<strong>und</strong> der Vielzahl der möglichen<br />

Funktionen ist dies jedoch nicht praktikabel. Alternativ könnte die Firmware eine Tabelle mit allen<br />

in ihr vorhandenen Funktionen verwalten – mit dem Nachteil, dass alle benötigten Funktionen<br />

im Voraus bekannt sein müssen <strong>und</strong> nachträglich keine weiteren Funktionen hinzugefügt werden<br />

können!<br />

45


Kapitel 4. Systementwurf<br />

ist es, dass zum Zeitpunkt der Übersetzung der Firmware nicht bekannt sein muss,<br />

welche Funktionen später wirklich von der Anwendung genutzt werden. Wird eine weitere<br />

Funktion benötigt, so ist es ausreichend, diese im Skript 14 , welches sich um die<br />

automatische Codeerzeugung kümmert, in die entsprechende Liste einzutragen. Die<br />

Funktionspointertabelle ist am Ende Bestandteil der Anwendung.<br />

Das Schöne an dieser Lösung ist, dass die Anwendung so programmiert werden kann,<br />

als wären die Funktionen der Firmware Bestandteil der Anwendung. Die komplette Einbindung<br />

der Funktionen der Firmware über die Funktionspointer wird vom Compiler 15<br />

übernommen. Es ist lediglich die statische Tabelle mit den Funktionspointern nach der<br />

Übersetzung der Firmware (automatisiert) zu erzeugen. Details zur Implementierung<br />

werden im Abschnitt 5.1.3 beschrieben.<br />

Potentielle Möglichkeiten<br />

Die Trennung von Anwendungslogik <strong>und</strong> Hardwarezugriffen würde es theoretisch ermöglichen,<br />

die echte Hardware samt Firmware gegen einen Simulator auszutauschen.<br />

Statt einer auf Prozessorzyklen genauen Simulation könnten so die highlevel Funktionsaufrufe<br />

simuliert werden – verb<strong>und</strong>en mit einem erheblichen Geschwindigkeitsvorteil.<br />

Vorstellbar wäre auch eine direkte Anbindung der Anwendungslogik an einen bereits<br />

bestehenden Simulator. Hierfür müsste eine entsprechende Übersetzungssoftware entworfen<br />

werden, welche die Schnittstellen des Simulators an die Schnittstellen der Firmware<br />

anpasst. Beides ist im Rahmen dieser Arbeit nicht erfolgt, da es das primäre Ziel<br />

war, eine außerhalb von Simulatoren funktionierende Realisierung <strong>eines</strong> Sensornetzes<br />

zu erstellen.<br />

Eine ähnliche Art der Simulation wird für Sensornetze, welche TinyOS als Gr<strong>und</strong>lage<br />

verwenden, mit Hilfe des Simulators TOSSIM angeboten. Hierbei wird die Anwendungssoftware<br />

nicht mit den Bibliotheken des TinyOS-Betriebsystems zusammen übersetzt,<br />

sondern mit denen des TOSSIM Simulators. Der Simulator stellt hierzu die gleichen<br />

Schnittstellen wie das eigentliche Betriebssystem bereit. Der gleiche Programmcode<br />

kann somit entweder direkt auf echter Hardware ausgeführt werden oder in einem simulierten<br />

Umfeld zum Einsatz kommen.[41, 42, 43, 3]<br />

14In der Variable @WISHLIST des Perl-Skripts make fptrs.pl werden die zu exportierenden Funktionen<br />

gelistet.<br />

15Die Entwickler des Compilers diese Art der Programmierung leider nicht berücksichtigt. Bei einigen<br />

direkt in den Compiler eingebauten Funktionen wie memset kam es zu Problemen. Um diesen<br />

Fehler im Compiler zu umgehen, wurden eingebaute Funktionen im Compiler deaktiviert <strong>und</strong><br />

problematische Funktionen sowohl in der Anwendung als auch in der Firmware implementiert.<br />

46


4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

16bit Länge<br />

Preamble Sync Länge Ziel Quelle Typ<br />

Nutzdaten<br />

crc-16<br />

(optional)<br />

n*8 Bit 32 Bit 8 Bit 8 Bit 8 Bit 8 Bit 16 Bit Länge * 8 Bit<br />

16 Bit<br />

Hardware Software Hardware<br />

Abbildung 4.9: Minimaler Aufbau <strong>eines</strong> Paketes. Das 16 Bit breite Längenfeld wird nur<br />

verwendet, wenn die Paketlänge nicht durch 8 Bit angegeben werden<br />

kann. In diesem Fall wird das reguläre Feld auf 255 gesetzt <strong>und</strong> die<br />

wirkliche Länge im breiteren Längenfeld gespeichert. Dies reduziert den<br />

Overhead für kleine Pakete <strong>und</strong> ermöglicht dennoch Pakete mit einer<br />

Länge von bis zu 64 kByte.<br />

4.3 Netzwerkarchitektur <strong>und</strong> Protokolle<br />

Nachdem nun die Architektur der Software vorgestellt wurde, werden die verwendeten<br />

Protokolle <strong>und</strong> Möglichkeiten der Datenübertragung zwischen zwei oder mehr Knoten<br />

dargestellt. Es folgt die Beschreibung der gr<strong>und</strong>legenden Datenübertragung zwischen<br />

zwei Knoten bis hin zur netzweiten Kommunikation. Es werden hierbei immer zuerst die<br />

verwendeten Pakete vorgestellt. Anschließend wird gezeigt, wie diese Pakete verwendet<br />

werden.<br />

4.3.1 Gr<strong>und</strong>legende Datenübertragung<br />

Die gr<strong>und</strong>legende Datenübertragung findet immer direkt zwischen zwei (1:1) oder mehr<br />

(1:n) Knoten statt. Es werden keine anderen Knoten verwendet, um Daten weiterzuleiten,<br />

wenn zwei Knoten nicht in gegenseitiger Reichweite sind.<br />

Für jedes übertragene Paket ist ein bestimmtes Format vorgegeben, das in Abbildung<br />

4.9 gezeigt ist. Es besteht aus den direkt vom Funkchip erzeugten Feldern (in der Abbildung<br />

blau gekennzeichnet), den in jedem Paket immer gleichen <strong>und</strong> festen Kopfdaten<br />

(in der Abbildung gelb <strong>und</strong> grün) sowie den eigentlichen Nutzdaten (rot). Die Felder<br />

sind in Reihenfolge ihrer Platzierung:<br />

Preamble (n*8 Bit): Eine Sequenz von abwechselnd Nullen <strong>und</strong> Einsen um den<br />

Empfänger auf den Sender zu synchronisieren. Dieses Feld kann beliebig lang sein<br />

<strong>und</strong> wird direkt vom Funkchip erzeugt.<br />

Syncword (32 Bit): Ein bestimmtes Bitmuster, welches dem Empfänger anzeigt,<br />

dass die Datenübertragung beginnt.<br />

47


Kapitel 4. Systementwurf<br />

Wake-On-Radio Paket<br />

Wake-On-Radio ACK-Paket<br />

Generisches ACK-Paket<br />

0x06 Weckgr<strong>und</strong><br />

0x05 Weckgr<strong>und</strong><br />

0x05<br />

8 Bit<br />

8 Bit<br />

Signalst.<br />

8 Bit<br />

P S 1/3/4 Z Q Typ Nutzdaten<br />

crc<br />

Prüfsumme<br />

32 Bit<br />

Zielkanal<br />

Abbildung 4.10: Aufbau der direkt von der Firmware verwendeten Pakete.<br />

Länge (8 Bit): Bei Paketen bis zu 254 Byte Länge (Nutzdaten + Paketkopf)<br />

wird hier direkt die Länge des Paketes angegeben. Falls das Paket länger sein<br />

sollte, wird der Wert auf 255 gesetzt <strong>und</strong> die Länge in einem 16 Bit breiten Feld<br />

angegeben.<br />

Ziel (8 Bit): Bei gerichteter Kommunikation wird hier direkt die Knoten-ID des<br />

Empfängers angegeben. Andere Knoten, die ein Paket empfangen, welches nicht<br />

direkt an sie adressiert ist, können, direkt nachdem sie dieses Byte gelesen haben,<br />

den Empfangsvorgang abbrechen <strong>und</strong> das Paket verwerfen. Bei an alle Knoten<br />

gerichteten Paketen wird das Feld auf 255 gesetzt.<br />

Quelle (8 Bit): Enthält die Knoten-ID des Absenders<br />

Typ (8 Bit): Dieses Feld wird verwendet, um anzuzeigen, welche Art von Nutzdaten<br />

im Paket enthalten sind.<br />

Optionales Längenfeld (16 Bit): Bei langen Paketen wird dieses Feld verwendet,<br />

um die tatsächliche Größe anzugeben. Bei Paketen bis zu 254 Byte Länge ist<br />

dieses Feld nicht vorhanden.<br />

Nutzdaten (0..64kByte): Dieses Feld enthält die eigentlichen Nutzdaten, die von<br />

Pakettyp zu Pakettyp unterschiedlich sind <strong>und</strong> im Folgenden noch genauer vorgestellt<br />

werden.<br />

Prüfsumme (16 Bit): Direkt in der Hardware des Funkchips wird eine 16 Bit<br />

Prüfsumme (crc-16) berechnet <strong>und</strong> beim Senden automatisch an das Paket angefügt.<br />

Beim Empfangen wird diese Prüfsumme überprüft. Schlägt der Prüfsummentest<br />

fehl, wird das Paket verworfen.<br />

Direkt von der Firmware verwendet werden drei Pakettypen. Hierbei handelt es sich<br />

zum einen um das ” ACK“-Paket, mit welchem die Empfangsroutine automatisch ein<br />

48<br />

8 Bit


4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

eingegangenes Paket bestätigen kann. Es wird hierbei eine einfache 32Bit Prüfsumme<br />

verwendet, um das bestätigte Paket zu identifizieren. Zum anderen kann ein Knoten<br />

einen anderen Knoten über Funk wecken. Hierzu wird das ” Wake-on-Radio“-Paket<br />

mehrmals in kurzen Abständen geschickt. Im ” Wake-on-Radio“-Paket wird ein Gr<strong>und</strong><br />

angegeben, warum der andere Knoten geweckt werden soll. Wird <strong>eines</strong> dieser Pakete<br />

empfangen, wird dieser Empfang mit einem ” Wake-on-Radio ACK“-Paket bestätigt.<br />

Das ” Wake-on-Radio ACK“-Paket beinhaltet, neben einer Bestätigung des Weckgr<strong>und</strong>es,<br />

den Messwert der Signalstärke des ” Wake-on-Radio“-Paketes sowie den Kanal,<br />

auf welchen gewechselt werden soll, um die weitere Kommunikation durchzuführen.<br />

Abbildung 4.10 zeigt den Aufbau dieser drei Pakettypen.<br />

Abbildung 4.11 zeigt, welche Möglichkeiten mit den bisher vorgestellten Pakettypen<br />

umgesetzt werden können:<br />

Broadcast Kommunikation: Ein Sender, viele Empfänger<br />

Unicast Kommunikation: Ein Sender, ein Empfänger<br />

Bestätigte Unicast Kommunikation: Ein Sender, ein Empfänger. Dem Sender wird<br />

der Empfang einer Nachricht bestätigt.<br />

Wake-on-Radio: Ein Knoten kann einen (oder alle) anderen Knoten aus einem<br />

energiesparendem Schlafzustand wecken, um anschließend beliebige Daten auszutauschen<br />

4.3.2 Protokoll der kabellosen Softwareaktuallisierung<br />

Für die kabellose Softwareaktualisierung wurde ein einfaches Protokoll entworfen, welches<br />

sich die Möglichkeiten <strong>und</strong> Eigenschaften der Broadcast Kommunikation zu Nutze<br />

macht, um viele Knoten gleichzeitig zu aktualisieren.<br />

Da im Voraus nicht bekannt ist, welche Knoten überhaupt das Update empfangen, kann<br />

keine bestätigte Übertragung verwendet werden. Stattdessen werden die Pakete vorsorglich<br />

mehrfach verschickt 16 . Zusätzlich kommen negative Bestätigungen ( ” NACK 17 “)<br />

zum Einsatz, die dem Sender anzeigen, dass bei mindestens einem Empfänger Feh-<br />

ler aufgetreten sind. Der Sender kann dann einfach ab der Position, welche ihm im<br />

” NACK“-Paket mitgeteilt wurde, die Übertragung wiederholen.<br />

Alle Pakete, die für das Softwareupdate verwendet werden, haben den gleichen Typ<br />

(0x04), so dass die Firmware beim Empfang <strong>eines</strong> solchen Paketes direkt zu den Update-<br />

Routinen wechseln kann. Innerhalb der Nutzdaten findet eine weitere Aufspaltung statt.<br />

Das Update verläuft in mehreren Phasen, für jede Phase werden die entsprechenden<br />

Pakete verwendet. Die Phasen sind:<br />

16 In der aktuellen Implementierung wird jedes Paket 10 mal verschickt.<br />

17 NACK ist die Abkürzung für not acknowledged (= Ablehnung)<br />

49


Kapitel 4. Systementwurf<br />

a) Broadcast<br />

b) Unicast<br />

Knoten A Knoten B Knoten C<br />

Nachricht<br />

Nachricht<br />

Nachricht<br />

Nachricht<br />

c) Unicast<br />

Nachricht<br />

bestätigt ACK (Nachricht)<br />

d) Wake-on-<br />

Radio<br />

Broadcast<br />

Unicast<br />

WoR (C)<br />

WoR (C)<br />

Empfangsbereit<br />

Sender aktiv<br />

ACK (WoR)<br />

inaktiv („Idle“)<br />

irrelevant<br />

Abbildung 4.11: Darstellung, der von der Firmware angebotenen Möglichkeiten, der<br />

Paketübertragung: a) Broadcast an alle Empfänger im Empfangsbereich.<br />

b) Unicast an einen bestimmten Empfänger. c) Unicast an einen<br />

bestimmten Empfänger mit Empfangsbestätigung. d) Weckvorgang<br />

<strong>eines</strong> Knotens via ” Wake-on-Radio“.<br />

50


Finish<br />

Nack<br />

Data<br />

Setup<br />

Prepare<br />

FINISH ID<br />

0x05 0x05 0xFF<br />

NACK ID<br />

0x04 0x04 0xFF<br />

DATA ID Daten Position<br />

0x03 0x03 0xFF<br />

SETUP ID<br />

0x02 0x02 0xFF<br />

PREP ID<br />

0x01 0x01 0xFF<br />

Flags<br />

8 Bit<br />

Flags<br />

8 Bit<br />

Timesync (µS)<br />

24 Bit 32 Bit<br />

4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

crc32 Anw.<br />

32 Bit<br />

NACK-Position<br />

32 Bit<br />

P S L 0xFF Q 0x04 L16 Nutzdaten crc<br />

Daten<br />

32 Bit 1..512 Byte<br />

Gesamtlänge crc32 Anw. crc32 Firmware<br />

32 Bit 32 Bit 32 Bit<br />

Abbildung 4.12: Aufbau der für das kabellose Softwareupdate verwendeten Pakete.<br />

1. Phase: Vorbereitung ( ” Prepare“-Pakete):<br />

Zeitsynchronisation der Knoten mit einer Genauigkeit im Microsek<strong>und</strong>en Bereich.<br />

Eine gemeinsame Zeitbasis wird für das spätere Protokoll benötigt.<br />

2. Phase: Konfiguration ( ” Setup“-Pakete):<br />

Mitteilung der Länge der zu übertragenden Software sowie die Prüfsumme der<br />

zu übertragenden Software (damit Knoten, welche bereits die aktuelle Software<br />

empfangen haben, diese nicht erneut empfangen müssen) <strong>und</strong> die Prüfsumme der<br />

Firmware (um sicherzustellen, dass die Firmware kompatibel zur neuen Software<br />

ist).<br />

3. Phase: Datenübertragung ( ” Data“-Pakete <strong>und</strong> ” Nack“-Pakete):<br />

Übermittlung der neuen Software in mehreren Teilstücken. Übertragungsfehler<br />

können durch ” NACK“-Pakete angezeigt werden.<br />

4. Phase: Abschluss ( ” Finish“-Pakete):<br />

Abschließende Überprüfung, ob die Übertragung fehlerfrei war<br />

Abbildung 4.13 zeigt einen theoretischen Durchlauf des Softwareupdates mit einem<br />

sendenden ( ” Masterknoten“) <strong>und</strong> zwei empfangenden Knoten ( ” Slaveknoten“). In der<br />

Darstellung sind mehrere Vereinfachungen getroffen, um sie übersichtlich zu halten. So<br />

51


Kapitel 4. Systementwurf<br />

Zeit Sender Empfänger A Empfänger B<br />

-10<br />

-5<br />

0<br />

10<br />

15<br />

20<br />

25<br />

30<br />

35<br />

100<br />

105<br />

110<br />

115<br />

120<br />

125<br />

210<br />

215<br />

220<br />

E<br />

Wake<br />

Prepare<br />

Setup<br />

Data (0..2)<br />

Data (3..5)<br />

ACK<br />

Data (4..6)<br />

Data (13..15)<br />

G<br />

Finish<br />

NACK (0)<br />

Data (0..2)<br />

Finish<br />

NACK (3)<br />

Abbildung 4.13: Ablauf der Softwareaktualisierung über Funk. Die blau hinterlegten<br />

Punkte entsprechen den, im Text beschriebenen, Situationen. Um die<br />

Grafik übersichtlich zu halten, sind nur zwei Empfänger angegeben – es<br />

könnten jedoch H<strong>und</strong>erte sein! Ebenfalls werden nicht alle möglichen<br />

Fehlersituationen, mit denen das Protokoll umgehen kann, gezeigt.<br />

52<br />

D<br />

F<br />

A<br />

B<br />

C


4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

werden die mehrfach übertragenen Pakete nur als eine ” logische“ Übertragung dargestellt.<br />

Außerdem wird mit jedem ” Data“-Paket nur je ein Byte übertragen – in der<br />

Wirklichkeit sind es je 512 Byte. Da die Daten per Broadcast verteilt werden, ist die<br />

Anzahl der Knoten nach oben theoretisch unbeschränkt. Es sind mehrere Marken (blaue<br />

Punkte) in der Grafik eingefügt, auf welche in der folgenden Beschreibung des Ablaufs<br />

näher eingegangen wird. Die Marken werden im folgenden Text durch X gekennzeichnet.<br />

Zunächst werden alle Knoten im Empfangsbereich geweckt. Hierbei kommt der ” Wakeon-Radio“<br />

Mechanismus zum Einsatz. Als Weckgr<strong>und</strong> wird ” Softwareupdate“ angegeben,<br />

so dass der empfangende Knoten direkt in den Update-Modus wechseln kann.<br />

Anschließend folgt die Prepare-Phase, in welcher die Uhren aller Knoten gleichzeitig<br />

auf Null gesetzt werden A . Ab diesem Punkt ticken die Uhren aller Empfänger<br />

<strong>und</strong> des Senders synchron. Nach dieser Synchronisation beginnt die Setup-Phase. Den<br />

Empfängern der Software wird mitgeteilt, wie lang diese ist <strong>und</strong> wie Ihre Prüfsumme<br />

ist. Diese Prüfsumme wird verwendet, um zu überprüfen, ob die Software nicht bereits<br />

aktuell ist. Sollte die Software bereits aktuell sein, nimmt der Knoten nicht weiter am<br />

Update teil <strong>und</strong> wird daher auch keine (unnötigen) ” NACK“-Pakete verschicken. Dies<br />

ermöglicht es, das Update von mehreren Positionen im Einsatzgebiet hintereinander<br />

auszuführen, um eventuelle Distanzprobleme zu umgehen. Das ” Setup“-Paket enthält<br />

ebenfalls die Prüfsumme der aktuellen Firmware. Die Überprüfung auf die aktuelle<br />

Firmware muss erfolgen, da die Anwendung Pointer enthält, welche auf Funktionen in<br />

der Firmware verweisen. Sollten diese Pointer nicht stimmen, so wäre das Verhalten<br />

des Knotens nicht mehr definiert.<br />

Nachdem die Setup-Phase abgeschlossen ist, beginnt die Datenübertragung. Hierbei<br />

wird die Zeit aufgeteilt in eine Master Periode“ <strong>und</strong> eine Slave Periode“. Beide Pe-<br />

” ”<br />

rioden sind jeweils fünf Sek<strong>und</strong>en lang. Während der Master Periode“ verschickt der<br />

”<br />

Knoten, von welchem das Update ausgeht, Datenpakete. Nachdem die fünf Sek<strong>und</strong>en<br />

um sind18 , beginnt die Slave Periode“. Sollte einer der Empfänger ein Problem festge-<br />

”<br />

stellt haben, so hat er nun während dieser Periode die Möglichkeit, ein NACK“-Paket<br />

”<br />

an den Sender zu schicken. Das NACK“-Paket enthält die letzte einwandfrei empfan-<br />

”<br />

gene Position. Der Empfang des NACK“-Paketes wird bestätigt B . In der nächsten<br />

”<br />

” Master Periode“ wird der Sender dann die Daten ab der niedrigsten gemeldeten Position<br />

verschicken.<br />

Nachdem alle Daten übertragen wurden, wird den empfangenden Knoten über das<br />

” Finish“-Paket noch einmal die Prüfsumme der neuen Anwendung mitgeteilt. Diese<br />

können dann überprüfen, ob die Übertragung erfolgreich war. Wenn die Übertragung<br />

erfolgreich war, zieht sich der Knoten zurück <strong>und</strong> wird sich nach einer gewissen Zeit<br />

neu starten <strong>und</strong> somit die neue Software zur Ausführung bringen C . Sollte es zu<br />

Übertragungsfehlern gekommen sein, so schickt der Knoten, der ein Problem festgestellt<br />

hat, ein NACK“-Paket, welches als Position den Wert 0 führt D . Der Masterknoten<br />

”<br />

18 In der Tat werden nur vier der fünf Sek<strong>und</strong>en zur Datenübertragung genutzt um Probleme mit<br />

eventuell abdriftenden Uhren im Voraus zu vermeiden<br />

53


Kapitel 4. Systementwurf<br />

Nachbarschafts Information<br />

0x0E<br />

Bake 0x0F<br />

DR<br />

8 Bit<br />

SL<br />

8 Bit<br />

Seq. Nr.<br />

16 Bit<br />

res. Bat. Seq. Nr. Systemzeit<br />

8 Bit 8 Bit<br />

16 Bit 32 Bit<br />

P S 5/8 Z Q Typ Nutzdaten<br />

crc<br />

Bat.<br />

8 Bit<br />

DR: max. Datenrate<br />

SL: min. Sendeleistung<br />

Abbildung 4.14: Aufbau der Pakete, die zum Erstellen der Nachbarschaftsbeziehungen<br />

verwendet werden.<br />

wird daraufhin die Übertragung ab dem Start wiederholen. E Verläuft dieser Durchlauf<br />

fehlerfrei F , so wird kein ” NACK“-Paket verschickt <strong>und</strong> auch der Masterknoten nach<br />

einer Weile neu gestartet werden G .<br />

Die für die Übertragung benötigte Zeit lässt sich einfach abschätzen. Unter der Annahme,<br />

dass keine Übertragungswiederholung nötig ist, besteht sie aus einem konstanten<br />

Anteil (Weckvorgang, Zeitsynchronisierung, Initialisierung, Abschluss) sowie einem von<br />

der Datenmenge DUpdate abhängigem Anteil.<br />

Die Robustheit der Übertragung kann durch die Variation der Anzahl n der pro Übertragungseinheit<br />

wiederholt gesendeten Pakete beeinflusst werden. In der aktuellen<br />

Implementierung werden die Pakete jeweils 10 mal verschickt. Um den empfangenden<br />

Knoten genügend Zeit zu geben, die Daten in den Flashspeicher zu kopieren, wird<br />

jeweils 100ms gewartet, bevor neue Daten geschickt werden.<br />

T Übertragung = TWake + TSync + TInit +<br />

DDelay = (100ms ∗ Datenrate) ∗ DUpdate<br />

T Übertragung ≈ 5s + 7s + 5s +<br />

<br />

DUpdate ∗ n + DDelay<br />

∗ TIntervall + TFinish<br />

Datenrate ∗ 4s<br />

DNachricht<br />

<br />

<br />

DUpdate ∗ (10 + 6)<br />

250000 Bit<br />

s<br />

∗ 4s<br />

≈ 6 ∗ DUpdate<br />

∗ 10s + 10s<br />

Die Übertragung <strong>eines</strong> 55000 Byte großen Softwareupdates würde somit in etwa 27s +<br />

7 ∗ 10s = 107s benötigen.<br />

4.3.3 Nachbarschaftsbeziehung<br />

Da – im Gegensatz zum Softwareupdate – bei der weiteren Kommunikation immer eine<br />

gerichtete <strong>und</strong> bestätigte Datenübertragung stattfindet, ist es für die Knoten wichtig<br />

54


4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

zu wissen, welche Nachbarn in Funkreichweite liegen. Hierfür werden von allen Knoten<br />

in zufälligen Abständen ” Baken“-Pakete per Broadcast verschickt. Die Bake enthält<br />

Informationen über die aktuelle Sequenznummer des Knotens, den Ladezustand der<br />

Batterie <strong>und</strong> der Systemzeit. Mit diesen Informationen kann bei einem bereits bekannten<br />

Nachbarn eine Aktualisierung der Routingtabelle erfolgen. Zusätzlich dient die Bake<br />

der Zeitsynchronisation. Hierfür wird vor dem Aussenden der Bake gewartet, bis die<br />

Hardware Echtzeituhr einen Sek<strong>und</strong>enumbruch anzeigt. Die empfangene Systemzeit<br />

wird mit der eigenen Systemzeit verglichen. Ist die Zeit in der Bake bereits gleich weit<br />

oder weiter fortgeschritten, wird die Zeit aus der Bake übernommen. Die Systemzeit<br />

breitet sich mit dieser Vorgehensweise nach <strong>und</strong> nach, r<strong>und</strong> um den Knoten mit der<br />

bisher am weitesten fortgeschrittenen Zeit, im gesamten Netz aus. Abbildung 4.14 zeigt<br />

den Aufbau der verwendeten Pakete.<br />

Wird eine Bake von einem bisher unbekannten Knoten empfangen, folgt der Aufbau<br />

einer beidseitigen Nachbarschaftsbeziehung.<br />

Der Aufbau der Nachbarschafsbeziehung erfolgt in drei Phasen:<br />

1. Phase: Wecken<br />

Wecken des neuen Nachbarn <strong>und</strong> gemeinsamer Wechsel auf einen anderen Übertragungskanal<br />

2. Phase: Nachbarschafts Information senden<br />

Bestätigte Übertragung <strong>eines</strong> ” Nachbarschafts Information“-Paketes an den neuen<br />

Nachbarn<br />

3. Phase: Nachbarschafts Information empfangen<br />

Empfang des ” Nachbarschafts Information“-Paketes des neuen Nachbarn<br />

Nach diesen drei Schritten wechseln die Knoten wieder zurück auf den Signalisierungskanal.<br />

Durch den Austausch der ” Nachbarschafs Informations“-Pakete wird sichergestellt,<br />

dass sich beide Knoten gegenseitig empfangen können. Gleichzeitig einigen sich<br />

die Knoten auf eine für zukünftige Datenübertragungen zu verwendende Datenrate <strong>und</strong><br />

Sendeleistung. Diese ist jedoch nicht fest, sondern wird kontinuierlich angepasst <strong>und</strong><br />

daher vor jeder Datenübertragung noch einmal abgeglichen.<br />

4.3.4 Signalisierung <strong>und</strong> Routenmanagement<br />

Der nächste Schritt zur netzweiten Datenübertragung ist zunächst einmal der eigentliche<br />

Aufbau des Netzes <strong>und</strong> dem Finden <strong>und</strong> Verwalten von Pfaden durch dieses Netz.<br />

55


Kapitel 4. Systementwurf<br />

Als Gr<strong>und</strong>lage für den Entwurf des hierzu nötigen Protokolls wurde das AODV-Protokoll<br />

(AdHoc On Demand Distance-Vector)[37] verwendet. 19 Da dieses Protokoll jedoch<br />

nicht alle gewünschten Anforderungen erfüllen kann, wurde es um die Möglichkeit,<br />

mehrere Pfade zu einem einzigen Ziel behandeln zu können erweitert. Hierzu waren<br />

einige tiefgehende Änderungen notwendig. Dennoch wird vor der Beschreibung des in<br />

dieser Arbeit entworfenen Protokolls AODV kurz vorgestellt.<br />

Herkömmliche Distance-Vector Protokolle<br />

Die Gr<strong>und</strong>legende Idee von Distance-Vector Protokollen ist es, dass jeder Knoten eine<br />

eigene Routingtabelle führt <strong>und</strong> Routingentscheidungen lokal trifft. In der Tabelle ist<br />

unter Anderem eingetragen, welcher Knoten als nächstes zu wählen ist, um einen Weg<br />

zum gewünschten Ziel zu finden <strong>und</strong> mit welchen Kosten dieser Weg verb<strong>und</strong>en ist.<br />

Bei herkömmlichen Distance-Vector Protokollen ist beispielsweise die Entfernung zum<br />

Ziel das Entscheidungskriterium, nach welchem ein Pfad ausgewählt wird. Die Tabellen<br />

mit allen bekannten Zielen werden hierbei in regelmäßigen Abständen an alle anderen<br />

Knoten geschickt, damit diese wiederum entscheiden können, ob sie den entsprechenden<br />

Knoten bei der Wahl <strong>eines</strong> Pfades zu einem Ziel verwenden können. Nach einiger Zeit<br />

etabliert sich auf jedem Knoten im Netz eine Tabelle mit (ggf. mehreren) möglichen<br />

Pfaden zu allen Zielen im Netz. Es werden hierbei jedoch immer alle Pfade zu allen<br />

Knoten aufgebaut, was bei Änderungen im Netz eine nicht unerhebliche Menge an<br />

Signalisierungsverkehr verursacht. In RFC 1058[44] wird das Routingprotokoll ” RIP“<br />

im Detail beschrieben. Hierbei handelt es sich um ein im Internet eingesetztes Distance-<br />

Vector Routingprotokoll.<br />

Oftmals ist es nicht für jeden Knoten notwendig, alle Pfade zu allen Zielen zu kennen.<br />

Insbesondere für Systemen mit geringen Ressourcen (was typischerweise für alle<br />

Sensornetze zutrifft) bedeutet diese Vielzahl an Informationen <strong>und</strong> der nötige Signalisierungsverkehr<br />

eine hohe Belastung. Ein herkömmliches Distance-Vector Protokoll ist<br />

somit für ein Sensornetz eher ungeeignet.<br />

Das AdHoc on Demand Distance-Vector Protokoll<br />

Das AODV-Protokoll wurde dafür entworfen, um in einem mobilen Netz eine Route<br />

zu einem Zielknoten zu finden, wenn sie benötigt wird. Es eignet sich daher besser für<br />

ein Sensornetz, da nicht immer alle Pfade aufgebaut werden – wenn sie nicht benötigt<br />

werden. Über dies hinaus berücksichtigt das Protokoll, dass im Voraus nicht bekannt<br />

ist, welche Knoten verwendet werden können. Routen werden von einem Knoten über<br />

” Route-Request (RREQ)“-Pakete von allen seinen Nachbarn angefordert. Ein Knoten,<br />

der ein solches RREQ“-Paket empfängt, leitet das RREQ“ (ebenfalls an alle seine<br />

” ”<br />

19 Zusätzlichen Einfluss hatten ” The Pulse Protocol“[38] <strong>und</strong> das ” Directed Diffusion“ Protokoll[39]<br />

für kabellose Sensornetze.<br />

56


4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

Nachbarn) solange weiter, bis es das Ziel oder einen Knoten, der bereits einen Pfad<br />

zum Ziel hat, erreicht. Von diesem Knoten (bzw. dem Ziel) aus wird dann über ein<br />

” Route-Reply (RREP)“-Paket direkt per Unicast auf dem besten Weg zum Ursprung<br />

des RREQ“-Paketes zurück, der Pfad durch das Netz etabliert. Jeder Knoten merkt<br />

”<br />

sich jeweils nur einen Pfad zum Ziel. Eine Sequenznummer im RREP“-Paket wird<br />

”<br />

verwendet um anzuzeigen, wie aktuell“ der Pfad ist. Hat ein Knoten bereits einen<br />

”<br />

aktuelleren Pfad, verwirft er das RREP“-Paket.[37]<br />

”<br />

Dadurch, dass das gesamte Netz mit dem ” RREQ“-Paket geflutet wird (bzw. nicht das<br />

gesamte, da über einen TTL 20 -Wert vorgegeben wird, wie viele Schritte das ” RREQ“-<br />

Paket weiter gesendet werden soll), wird, sofern es einen Pfad zum Ziel gibt, dieser auf<br />

jeden Fall gef<strong>und</strong>en. Als positiv zu bewerten ist hierbei, dass nach dem anfänglichen<br />

Fluten des Netzes nur noch wenig Signalisierungsverkehr anfällt. Durch die Verwendung<br />

der Sequenznummer kann sichergestellt werden, dass keine Schleifen entstehen. Nicht<br />

mehr fehlerfrei funktionierende Routen können über Fehler-Pakete ( ” RERR“) anderen<br />

Knoten mitgeteilt werden. Da nur wirklich benötigte Routen aufgebaut werden, kann<br />

die Verwaltung auch auf Systemen mit beschränkten Ressourcen effektiv durchgeführt<br />

werden. Insbesondere für Szenarien, bei denen es eine zentrale Datensenke gibt, würde<br />

sich das AODV-Protokoll für ein Sensornetz gut eignen.<br />

Entwurf des Routingprotokolls dieser Arbeit<br />

Wie in der Einführung bereits geschrieben, basiert das in dieser Arbeit entworfene<br />

Routingprotokoll auf AODV. Es wurde jedoch etwas erweitert <strong>und</strong> verändert, um dem<br />

Einsatz in einem Sensornetz besser zu entsprechen.<br />

Da immer mit dem Ausfall von Knoten gerechnet werden muss, ist es vorteilhaft, mehrere<br />

Routen zu einem Ziel bereitstehen zu haben, für den Fall, dass die eigentlich<br />

präferierte Route nicht mehr verfügbar ist. Das Vorhandensein von mehreren Routen<br />

zum Ziel erlaubt es überdies, verschiedene Kostenfunktionen zur Wahl des jeweils<br />

nächsten Schrittes anzubieten. In dieser Arbeit angeboten werden Kostenfunktionen,<br />

die entweder Routen mit möglichst hoher Bandbreite, niedriger Latenz oder mit einer<br />

guten Energieeffizienz auswählen. Nach wie vor liegt die Entscheidung über den jeweils<br />

nächsten Schritt bei jedem Knoten für sich. Dieser Schritt wird, unter Verwendung<br />

einer der Kostenfunktionen, aus der Routingtabelle gewählt.<br />

Der Aufbau, der zum Einsatz kommenden Pakete ( ” RREQ“, ” RREP“ <strong>und</strong> ” RERR“),<br />

ist in Abbildung 4.15 dargestellt. Es handelt sich hierbei um die gleichen Pakettypen,<br />

die auch vom AODV Protokoll verwendet werden. Ihr Inhalt wurde jedoch erweitert,<br />

um die Anforderungen an das neue Protokoll erfüllen zu können.<br />

Der Aufbau <strong>und</strong> die Verarbeitung von ” Route-Request (RREQ)“-Paketen wurde nahezu<br />

unverändert aus dem AODV Protokoll übernommen. Sollte ein Knoten ” RREQ“-<br />

20 Time-to-live: verhindert, dass Pakete endlos lange von Knoten zu Knoten weitergeleitet werden,<br />

indem der Wert bei jeder Weiterleitung decrementiert wird<br />

57


Kapitel 4. Systementwurf<br />

Route Error Paket<br />

(RERR)<br />

Route Reply Paket<br />

(RREP)<br />

Route Request Paket<br />

(RREQ)<br />

0x12<br />

0x11<br />

0x10<br />

Knotenliste<br />

Ziel<br />

Ziel<br />

8 Bit<br />

n*8 Bit<br />

Hops Seq. Start Seq. Flags<br />

8 Bit 16 Bit 8 Bit 16 Bit 32 Bit<br />

DR SL (minimal)<br />

Bat.<br />

(local)<br />

Bat.<br />

TTL Seq. Start Flags (local)<br />

Bat.<br />

P S L Z Q Typ Nutzdaten<br />

crc<br />

DR: max. mögliche Datenrate<br />

SL: min. nötige Sendeleistung<br />

(local)<br />

Zeit<br />

(local)<br />

Seq.<br />

(local)<br />

Seq.<br />

4 Bit 4 Bit 8 Bit 8 Bit 32 Bit 16 Bit<br />

(local)<br />

Zeit<br />

8 Bit 16 Bit 8 Bit 32 Bit 8 Bit 16 Bit 32 Bit<br />

kompl. Pfad<br />

Abbildung 4.15: Aufbau der für das Verwalten von Routen verwendeten Pakete<br />

( ” RREQ“, ” RREP“ <strong>und</strong> ” RERR“).<br />

Pakete von zwei oder mehr verschiedenen Knoten zum gleichen Ziel bekommen, so<br />

werden diese Routing-Anfragen zwar in der Routingtabelle gespeichert, das ” RREQ“-<br />

Paket wird jedoch nur ein einziges Mal weitergeleitet. In Verbindung mit dem TTL-Feld<br />

dämmt diese Vorgehensweise das Fluten des Netzes durch ” RREQ“-Pakete ein.<br />

Die ” Route-Reply (RREP)“-Pakete wurden um verschiedene Felder erweitert, welche<br />

für die Berechnung der Kostenfunktionen notwendig sind. Dies ist die maximal auf dem<br />

gesamten Pfad mögliche Datenrate 21 , die hierzu minimal benötigte Sendeleistung 22 sowie<br />

die geringste Batteriespannung auf dem Pfad. Da bei mehreren gleichzeitig zugelassenen<br />

Pfaden zu einem Ziel die Sequenznummer alleine nicht mehr ausreicht, um<br />

Schleifen zu erkennen, wird der komplette Pfad bis zum Ziel mitgeschickt. Sollte ein<br />

Knoten ein ” RREP“-Paket erhalten <strong>und</strong> sich selbst in diesem Pfad wiederfinden so<br />

wird das Paket verworfen.<br />

” RREP“ <strong>und</strong> RREQ“ enthalten zusätzliche Informationen über den Zustand des Kno-<br />

”<br />

tens, der diese verschickt hat. Die Informationen dienen dazu, die entsprechenden Einträge<br />

in der Routingtablle des Empfängers zu aktuallisieren.<br />

Das ” Route-Error (RERR)“-Paket wurde in der Form erweitert, dass es eine gesamte<br />

Liste von Knoten enthalten kann, welche ab sofort über den Absender des Paketes nicht<br />

mehr zu erreichen sind.<br />

Die Abbildungen 4.16, 4.17 <strong>und</strong> 4.18 zeigen, wie ein Knoten, der ein ” RREQ“-, ” RREP“oder<br />

” RERR“-Paket empfängt dieses verarbeitet. Abbildung 4.20 zeigt exemplarisch,<br />

wie eine Route durch ein (kl<strong>eines</strong>) Netz gef<strong>und</strong>en wird.<br />

21 Also die Datenrate des niedrigsten Teilstücks<br />

22 Das Teilstück, welches die höchste Sendeleistung benötigt, bestimmt diesen Wert<br />

58<br />

n*8 Bit


Behandlung <strong>eines</strong> eingehenden ” Route-Request“-Paketes<br />

4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

Empfängt ein Knoten ein ” Route-Request“-Paket von einem anderen Knoten, so überprüft<br />

er zunächst, ob nicht genau dieses Route-Reqeust bereits vorliegt. Diese Überprüfung<br />

dient im Wesentlichen der Begrenzung der Anzahl der später gef<strong>und</strong>enen Routen.<br />

Es werden also nicht immer alle möglichen Pfade gef<strong>und</strong>en <strong>und</strong> verfolgt. Anschließend<br />

wird überprüft, ob der Knoten nicht selbst das Ziel der Anfrage ist. Es kann zwar<br />

eigentlich nicht vorkommen, dass der Knoten selbst das Ziel ist, die korrekte Antwort<br />

ist in diesem Fall jedoch das Aussenden <strong>eines</strong> ” Route-Reply“-Paketes.<br />

Wenn das Paket durch diese beiden Tests gekommen ist, folgt die wichtigste Fallunterscheidung:<br />

Befindet sich bereits ein Eintrag in meiner Routingtabelle, der zum gleichen<br />

Ziel führt? Falls nein, wird die neue Anfrage in der Routingtabelle gespeichert <strong>und</strong> zur<br />

weiteren Verarbeitung an alle anderen Nachbarn weitergeleitet.<br />

Falls sich bereits Einträge in der Routingtabelle befinden, so werden diese alle nacheinander<br />

darauf untersucht, ob sie geeignet sind, die Anfrage zu beantworten (bestehende<br />

Route zum Ziel bzw. Nachbarknoten). In diesem Fall wird ein Route-Reply an den<br />

anfragenden Knoten verschickt. Andernfalls wird weiter unterschieden, ob es sich beim<br />

Ursprungsknoten der bereits vorhandenen Anfrage um den gleichen Knoten handelt,<br />

wie in der aktuellen Anfrage. Falls ja, wird der Eintrag aktualisiert, falls nein, wird ein<br />

neuer Eintrag angelegt. In beiden Fällen wird überprüft, ob die Reichweite (TTL) der<br />

neuen Anfrage größer ist, als die der bereits vorhandenen. Falls ja, wird das Route-<br />

Request an alle anderen Nachbarn weitergeleitet.<br />

Behandlung <strong>eines</strong> eingehenden ” Route-Reply“-Paketes<br />

Beim Empfang <strong>eines</strong> ” Route-Reply“-Paketes erfolgen zunächst einige Kontrollen, die<br />

dazu führen könnten, dass das Paket verworfen werden muss ( ” Bin ich Ziel dieses<br />

Route-Replys?“, ” Enthält der Pfad eine Schleife?“, ” Wurde genau dieses Route-Reply<br />

bereits verarbeitet?“). Wurde das Paket nicht verworfen, so wird die neue Route in die<br />

Routingdatenbank übernommen. Anschließend wird überprüft, ob der Knoten noch<br />

offene Routing Anfragen von anderen Knoten zu dem neuen Ziel vorliegen hat. Falls<br />

ja, so wird jede dieser offenen Anfragen mit einem ” Route-Reply“-Paket beantwortet<br />

<strong>und</strong> das Timeout dieser offenen Anfrage reduziert. Die Anfrage wird nicht direkt aus<br />

der Datenbank gelöscht, da für den Fall, dass weitere ” Route-Reply“-Pakete zu dieser<br />

Anfrage eingehen, diese ebenfalls (für eine gewisse Zeit) beantwortet werden können.<br />

Dieser Mechanismus dient wieder dazu, zwar mehrere verschiedene Pfade zum Ziel<br />

durch das Netz zu finden, jedoch nicht zwangsweise alle.<br />

Behandlung <strong>eines</strong> eingehenden ” Route-Error“-Paketes<br />

” Route-Error“-Pakete werden verwendet, wenn ein Knoten selbst feststellt, dass er<br />

keine Verbindung mehr zu einem Ziel hat, zu welchem er zuvor noch eine Verbindung<br />

59


Kapitel 4. Systementwurf<br />

Abbildung 4.16: Behandlung <strong>eines</strong> eingehenden ” Route-Request“-Paketes<br />

Bin ich das Ziel?<br />

Liegt genau dieses Route-Request bereits vor?<br />

(Ziel, seq. Nr)<br />

nein<br />

Habe ich eine Route zum Ziel oder bereits<br />

ein anderes Route-Request zum Ziel?<br />

nein<br />

nein<br />

Route-Request an alle anderen<br />

Nachbarn weiterleiten!<br />

ja<br />

ja<br />

Paket verwerfen<br />

Route-Reply verschicken<br />

Ist das Ziel mein Nachbar<br />

oder habe ich eine bestehende Route zum Ziel?<br />

nein<br />

Handelt es sich um einen<br />

anderen Ursprungsknoten?<br />

nein ja<br />

ja<br />

Ausführen für alle Einträge in der<br />

Routingtabelle zum Ziel<br />

ja<br />

Route-Reply verschicken<br />

Eintrag in Routingtabelle aktualisieren. Neuen Request-Eintrag in Routingtabelle.<br />

Request TTL größer als bisher?<br />

ja<br />

Route-Request an alle anderen<br />

Nachbarn weiterleiten!<br />

60


4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

Abbildung 4.17: Behandlung <strong>eines</strong> eingehenden ” Route-Reply“-Paketes<br />

Bin ich das Ziel dieses Route-Replys?<br />

nein<br />

Enthält der Pfad eine Schleife?<br />

Wurde genau dieses Route-Reply bereits<br />

verarbeitet?<br />

nein<br />

nein<br />

Neue Route in Routingtabelle übernehmen<br />

Hatten wir überhaupt (mind.) ein aktives<br />

Route-Request zu diesem Ziel?<br />

nein<br />

keine weitere Aktion<br />

ja<br />

ja<br />

ja<br />

ja<br />

Paket verwerfen<br />

Paket verwerfen<br />

Ausführen für alle offenen<br />

Route-Requests zum Ziel<br />

Route-Reply weiterleiten<br />

Paket verwerfen<br />

Timeout des Request-Eintrag in Routingtabelle<br />

auf MULTI_ROUTE_TIMEOUT setzen<br />

61


Kapitel 4. Systementwurf<br />

hatte. Da durch den Verlust <strong>eines</strong> Nachbarn ggf. viele Knoten auf einmal nicht mehr<br />

erreicht werden können, wird im Fehlerpaket eine ganze Liste von Knoten angegeben,<br />

die ab sofort nicht mehr erreichbar sind.<br />

Empfängt ein anderer Knoten ein solches Paket, so markiert er zunächst einmal alle<br />

Routen, welche den Absender des Paketes als nächsten Hop haben, als ungültig, sofern<br />

sie einen der als unerreichbar markierten Knoten als Ziel haben oder deren Pfad einen<br />

solchen Knoten beinhaltet. Sollte der Knoten nach dieser Kennzeichnung ebenfalls bestimmte<br />

Ziele nicht mehr erreichen können (also keine Alternativrouten vorliegen),<br />

verschickt er ebenfalls ” Route-Error“-Pakete an seine Nachbarn.<br />

4.3.5 Netzweite Datenübertragung<br />

Mit Hilfe der durch den Routingalgorithmus gef<strong>und</strong>enen Pfade durch das Netz, kann<br />

nun auch ein netzweiter Austausch von Daten erfolgen. Bevor Daten zu einem Zielknoten<br />

übertragen werden, muss zunächst eine Route zu diesem gef<strong>und</strong>en werden. Die Daten<br />

werden anschließend an den, auf dem Pfad zum Ziel, nächsten Knoten übertragen.<br />

Dieser behandelt die so empfangenen Daten dann genauso, bis die Daten beim Zielknoten<br />

ankommen. Es findet eine so genannte ” Store and Forward“ Nachrichtenweiterleitung<br />

statt. Der absendende Knoten kann im Voraus nicht wissen, welchen Weg durch<br />

das Netz die Daten nehmen werden, er kann jedoch wählen, aufgr<strong>und</strong> welcher Kostenfunktion<br />

(Latenz, Bandbreite oder Netzenergie) der jeweils nächste Schritt gewählt<br />

wird.<br />

Fehlerbehandlung<br />

Die Nachrichten werden für eine gewisse Zeit bei allen auf dem Pfad liegenden Knoten<br />

gespeichert. Sollte es sich herausstellen, dass ein Knoten eine Nachricht nicht zustellen<br />

kann, so meldet er diesen Fehler mit einer kurzen Fehlermeldung auf dem bisher<br />

zurückgelegten Pfad zurück. Da jeder Knoten auf dem Pfad die Nachricht noch in seinem<br />

Speicher abgelegt hat, muss die Nachricht nicht erneut übertragen werden. Sobald<br />

einer der Knoten auf dem Pfad eine alternative Route zum Ziel hat, wird diese eingeschlagen.<br />

Der nicht erfolgreiche Zweig wird als ungültig markiert – falls nötig kommt<br />

es hierbei auch zum Versand von ” Route-Error“-Paketen durch das Routingprotokoll.<br />

Um dieses Zurückwandern auf dem Pfad zu ermöglichen, wird in jeder Nachricht der<br />

bisher zurückgelegte Pfad protokolliert. Hierdurch wird zusätzlich verhindert, dass sich<br />

die Nachricht auf einem Kreis durch das Netz bewegt. Zusätzlich wird angegeben, wie<br />

viele Schritte die Nachricht höchstens gehen soll, bis sie verworfen wird.<br />

62


4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

Abbildung 4.18: Behandlung <strong>eines</strong> von Knoten ” A“ eingehenden ” Route-Error“-<br />

Paketes.<br />

Route zu oder über Knoten Y via X<br />

in Routingtabelle als ungültig markieren<br />

Habe ich eine weitere Route mit gleichem<br />

Ziel über einen anderen Knoten?<br />

nein<br />

Fehlerflag auf true setzen<br />

keine weitere Aktion<br />

nein<br />

Ausführen für alle nicht mehr über<br />

Knoten X erreichbaren Knoten Y<br />

Fehlerflag gesetzt?<br />

ja<br />

ja<br />

weiter...<br />

Route-Error Paket mit einer Liste aller nicht mehr<br />

über mich erreichbaren Knoten an alle meine<br />

Nachbarn verschicken<br />

63


Kapitel 4. Systementwurf<br />

G, [DFG], A<br />

Ziel, Pfad, Ursprung<br />

A)<br />

B: B<br />

C: C<br />

D: D<br />

G: -?-<br />

Routingtabelle<br />

Ursprung, Ziel<br />

[XYZ]<br />

A B<br />

A, G<br />

C D E<br />

F G<br />

Nicht mehr erreichbare Knoten<br />

X<br />

Nachbarschaft<br />

Route Request<br />

Route Reply<br />

Route Error<br />

Knoten mit ID X<br />

Hindernis<br />

..... Inhalt der Nachricht<br />

Abbildung 4.19: Legende der Signalisierung <strong>und</strong> Routenmanagement Grafik<br />

a)<br />

A, G<br />

b)<br />

A, G<br />

A)<br />

B: B<br />

C: C<br />

D: D<br />

G: -?-<br />

A B<br />

C D E<br />

A B<br />

A, G<br />

F G<br />

c) d)<br />

G, [EG], A<br />

A)<br />

B: B<br />

C: C<br />

D: D<br />

G: -?-<br />

G: DG<br />

C D E<br />

G, [FG], A<br />

F G<br />

A)<br />

B: B<br />

C: C<br />

D: D<br />

G: -?-<br />

G: DG<br />

A, G<br />

A)<br />

B: B<br />

C: C<br />

D: D<br />

G: -?-<br />

G: DG<br />

G: BEG<br />

G: CFG<br />

G, [DG], A<br />

A B<br />

A, G<br />

C D E<br />

G, [BEG], A<br />

A B<br />

A, G<br />

F G<br />

C D E<br />

G, [CFG], A<br />

F G<br />

Abbildung 4.20: Suchen <strong>und</strong> Finden einer Route im Netz: Knoten A fordert eine Route<br />

zum Knoten G an. Es sind hierbei die logischen Schritte dargestellt<br />

<strong>und</strong> nicht unbedingt die zeitlich exakte Abfolge. Im grauen Kasten ist<br />

die Routingtabelle von Knoten A im jeweiligen Schritt gezeigt.<br />

64


Daten<br />

Data Finish<br />

Data Setup<br />

0x15<br />

0x16<br />

0x14<br />

Länge<br />

n/a<br />

n/a<br />

0 Bit<br />

n/a<br />

0 Bit 0 Bit<br />

4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

Prio RS Länge Typ Flags Quelle Ziel Seq. Nr. TTL Pfad<br />

4 Bit 4 Bit 16 Bit 4 Bit 9 Bit 8 Bit 8 Bit 16 Bit 8 Bit<br />

0..32 Byte<br />

Nachrichtenkopf<br />

DR SL Systemzeit<br />

8 Bit 8 Bit<br />

32 Bit<br />

P S L Z Q Typ L16 Nutzdaten crc<br />

Nachricht<br />

0 / 16 Bit 0..512 Byte<br />

DR: Datenrate<br />

SL: Sendeleistung<br />

RS: Routen Style<br />

Abbildung 4.21: Aufbau der zum Nachrichtenaustausch verwendeten Pakete. (DATA-<br />

SETUP, DATA <strong>und</strong> DATAFINISH)<br />

Ablauf des Nachrichtenaustauschs<br />

Abbildung 4.21 zeigt die beim Austausch von Nachrichten zwischen zwei benachbarten<br />

Knoten zum Einsatz kommenden Pakete. Abbildung 4.22 zeigt, wie dieser Nachrichtenaustausch<br />

in mehreren Phasen abläuft:<br />

1. Phase: Partner wecken<br />

Mit Hilfe des direkt von der Firmware angebotenen ” Wake-on-Radio“-Mechanismus<br />

wird der Partner, zu dem Daten übertragen werden sollen geweckt.<br />

2. Phase: Übertragungsparameter aushandeln<br />

Nachdem der Partner geweckt wurde, wechseln beide Knoten auf einen anderen<br />

Kanal, um dort die eigentliche Datenübertragung durchzuführen. Zuvor einigen<br />

sie sich jedoch noch auf eine gemeinsame Datenrate ( ” Data Setup“-Pakete) <strong>und</strong><br />

konfigurieren ihre Funkchips entsprechend.<br />

3. Phase: Nachrichtenaustausch von A nach B<br />

Es folgt die gebündelte Übertragung aller Nachrichten in der Warteschlange, deren<br />

Ziel ebenfalls über den geweckten Knoten erreicht werden kann ( Data“-<br />

”<br />

Pakete) . Nachdem alle Nachrichten übertragen wurden, wird abschließend ein<br />

” Data Finish“-Paket gesendet.<br />

65


Kapitel 4. Systementwurf<br />

Phase 1:<br />

Partner wecken<br />

Phase 2:<br />

Übertragungskanal wechseln<br />

<strong>und</strong> Übertragungsparameter<br />

aushandeln<br />

Phase 3a:<br />

Übertragung „Hinrichtung“<br />

*) es sind hier nur zwei Nachrichten<br />

dargestellt. Es könnten jedoch<br />

dutzende sein!<br />

Phase 3b:<br />

Abschluss „Hinrichtung“<br />

Phase 4a:<br />

Übertragung „Rückrichtung“<br />

*) nur, wenn überhaupt Nachrichten<br />

zur Übertragung auf dem Rückweg<br />

ausstehen!<br />

Phase 4b:<br />

Abschluss „Rückrichtung“<br />

Knoten A Knoten B<br />

WoR<br />

ACK<br />

DATA SETUP<br />

ACK<br />

DATA SETUP<br />

ACK<br />

DATA<br />

ACK<br />

DATA*<br />

ACK<br />

DATA FINISH<br />

ACK<br />

DATA*<br />

ACK<br />

DATA*<br />

ACK<br />

DATA FINISH<br />

ACK<br />

Abbildung 4.22: Ablauf des Nachrichtenaustauschs zwischen zwei benachbarten<br />

Knoten. Dargestellt ist nur der logische Ablauf, ggf. nötige<br />

Übertragungswiederholungen sind nicht gezeigt!<br />

66


4. Phase: Nachrichtenaustausch von B nach A<br />

4.3. Netzwerkarchitektur <strong>und</strong> Protokolle<br />

Die 4. Phase entspricht der 3. Phase, mit dem Unterschied, dass nun Knoten B alle<br />

Nachrichten seiner Warteschlange an A überträgt, deren Pfad über A verläuft.<br />

Liegt keine solche Nachricht vor, sendet Knoten B nur ein ” Data Finish“-Paket,<br />

um die Übertragung zu beenden.<br />

Nach der Übertragung der Daten wechseln beide Knoten wieder auf den Signalisierungskanal.<br />

Empfangene Nachrichten werden ggf. verarbeitet.<br />

Die gebündelte Übertragung aller ausstehenden Nachrichten über den gleichen Partner<br />

dient der Erhöhung der Energieeffizienz des Sensornetzes. Der Partner muss nur ein<br />

einziges Mal geweckt werden, um gleich eine ganze Menge von Daten zu übertragen.<br />

Insbesondere bei Netzen, bei denen es nur eine zentrale Datensenke gibt, wirkt sich<br />

diese Bündelung aus.<br />

Sofern einer der beiden Knoten Nachrichten empfangen hat, die nicht an ihn adressiert<br />

waren, wird er diese entsprechend seiner Routingtabelle weiterleiten. Liegt keine<br />

Route zum Ziel vor, so wird zunächst versucht, eine Route zum Ziel zu finden.<br />

Glückt dies innerhalb einer vorgegebenen Zeitspanne nicht, so wird die Nachricht als<br />

unzustellbar gekennzeichnet <strong>und</strong> dem Knoten, von welchem die Nachricht empfangen<br />

wurde, eine kurze Fehlermeldung zugeschickt. Dieser kann dann – sofern er noch über<br />

eine alternative Route verfügt – die Nachricht auf einem anderen Weg zum Ziel erneut<br />

verschicken. Liegt keine alternative Route vor, so wird die Fehlermeldung entlang<br />

des bisher zurückgelegten Pfades in Richtung Quelle weitergeleitet. Über die Angabe<br />

einer maximalen Anzahl von solchen Schritten kann angegeben werden, ab wann<br />

eine Nachricht endgültig verworfen werden soll. In Abbildung 4.23 ist diese Multihop-<br />

Nachrichtenweiterleitung in einem kleinen Netz beispielhaft dargestellt.<br />

67


Kapitel 4. Systementwurf<br />

a) b) c)<br />

C F<br />

C F<br />

A B<br />

D E<br />

G A B<br />

A B<br />

D E<br />

d) e) f)<br />

C<br />

C<br />

A B<br />

A B<br />

D E<br />

g) h) i)<br />

C<br />

C<br />

A B<br />

D E<br />

Fehlermeldung<br />

Nachricht<br />

D E<br />

G<br />

D E<br />

möglicher Pfad<br />

verwendeter Pfad<br />

A Datenquelle G Datensenke<br />

G<br />

G<br />

G A B<br />

G<br />

A B<br />

A B<br />

F<br />

C<br />

D E<br />

C<br />

F<br />

D E<br />

C<br />

D E<br />

erfolgloser Pfad<br />

G<br />

G<br />

G<br />

ausfallender Knoten<br />

G „normaler“ Knoten<br />

Abbildung 4.23: Übermittlung einer Nachricht von Knoten A zu Knoten G: In Teilbild<br />

c) fällt ein auf dem Pfad liegender Knoten aus. Die Nachricht<br />

in Teilbild d) kann daher nicht zugestellt werden. In Teilbild e) wird<br />

nur eine kurze Fehlermeldung auf dem Pfad zurückgeschickt, nicht<br />

jedoch die gesamte Nachricht. Da Knoten B einen alternativen Pfad<br />

kennt, wählt er diesen, ansonsten wäre die Fehlermeldung einen weiteren<br />

Schritt auf dem Pfad zurückgeschickt worden. Teilbild i) Zeigt<br />

den verwendeten Pfad, der auch in der Nachricht vermerkt ist. Knoten<br />

B merkt sich, dass die Route über C fehlerhaft ist <strong>und</strong> würde bei<br />

folgenden Nachrichten direkt den Weg über D wählen.<br />

68


5 Implementierung <strong>und</strong><br />

Testumgebung<br />

Nachdem der Entwurf <strong>und</strong> die Architektur des Systems vorgestellt wurde, wird nun<br />

gezeigt, wie dieser Entwurf umgesetzt <strong>und</strong> getestet wurde. Daran anschließend werden<br />

verschiedene Testergebnisse vorgestellt <strong>und</strong> diskutiert.<br />

5.1 Implementierung<br />

Aufgr<strong>und</strong> der Größe der Codebasis (über 22000 Zeilen C-Code sowie mehrere Tausend<br />

Zeilen Java) ist es nicht möglich, jedes Detail vorzustellen. Stattdessen werden –<br />

nach einer Gesamtübersicht – einige Punkte der Implementierung herausgegriffen <strong>und</strong><br />

stellvertretend vorgestellt. Auf eine Beschreibung der Implementierung der Java-GUI<br />

wird verzichtet, da diese nahezu unverändert aus der Studienarbeit ” Entwurf <strong>und</strong> Implementierung<br />

der Infrastruktur für den FPGA-basierten Sensorknoten Hyperion“[19]<br />

übernommen wurde.<br />

5.1.1 Übersicht<br />

In Abbildung 5.1 ist die Verzeichnisstruktur der Implementierung dargestellt. Sie teilt<br />

sich im Wesentlichen in drei Punkte auf: In den Unterordnern jars, gnu <strong>und</strong> ces ist der<br />

Java-Code abgelegt, der für die GUI notwendig ist. Im Unterordner firmware ist der<br />

gesamte Quellcode der Firmware sowie das Skript zum Erzeugen der Funktionspointertabellen<br />

abgelegt. Im Unterordner app sind die diversen Testanwendungen sowie die<br />

Hauptanwendung abegelegt.<br />

Bedeutung der Unterordner der Firmware<br />

watchdog Verfügbarkeit des Systems bei Fehlern wiederherstellen<br />

Im Unterordner watchdog sind all die Funktionen untergebracht, welche zur Initialisierung<br />

<strong>und</strong> Verwendung des Watchdogs des Microcontrollers notwendig sind.<br />

69


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

/<br />

jars<br />

gnu<br />

ces<br />

firmware<br />

io<br />

getopt<br />

terminal<br />

watchdog<br />

lowpower<br />

cc1100<br />

sensornode<br />

interrupt<br />

flash<br />

display<br />

audio<br />

adc<br />

serial<br />

rtc<br />

Java-GUI<br />

aus „boop“-Firmware übernommen bzw. angepasst<br />

app<br />

simple<br />

monitor<br />

scanner<br />

rf_test<br />

power_test<br />

logtool<br />

entladekurve<br />

dauerbake<br />

Hauptanwendung<br />

syslog.c<br />

lcdlog.c<br />

channel_rater.c<br />

rate_nachbar.c<br />

route.c<br />

route_data.c<br />

bitmap.c<br />

fptrs.c<br />

main.c<br />

Abbildung 5.1: Übersicht über das Verzeichnis der implementierten Software. Mit Ausnahme<br />

der Hauptanwendung sind nur die Unterordner <strong>und</strong> nicht die<br />

Dateien gezeigt.<br />

70


5.1. Implementierung<br />

Um zu verhindern, dass der Sensorknoten durch die Hardware automatisch neu<br />

gestartet wird, muss regelmäßig die Funktion feedWatchdog aufgerufen werden 1 .<br />

lowpower Beeinflussung der Energieaufnahme<br />

Alle vom Microcontroller angebotenen Möglichkeiten zur Reduzierung der Leistungsaufnahme,<br />

können durch die Funktionen im Unterordner lowpower direkt<br />

verwendet werden. Der Energiebedarf der externen (analogen) Beschaltung des<br />

Microcontrollers wird durch die Wahl einer geschickten Belegung der I/O-Pins minimiert.<br />

Sollte die Anwendung einmal mehr Rechenleistung benötigen, so stehen<br />

Funktionen zur Verfügung, um ggf. die Taktfrequenz des Prozessors zu erhöhen<br />

<strong>und</strong> danach wieder zu senken.<br />

cc1100 Ansteuerung des Funkchips<br />

Funktionen um den Funkchip zu konfigurieren <strong>und</strong> Pakete zu senden bzw. zu<br />

empfangen, sind im Unterordner cc1100 abgelegt. Die Ansteuerung des Funkchips<br />

wird später noch im Detail vorgestellt.<br />

sensornode Software Deployment <strong>und</strong> ” Callback“-Interface<br />

Im Unterordner sensornode befinden sich sowohl die Funktionen des Software<br />

Deployments, als auch das ” Callback“-Interface. Das Protokoll, welches zur kabellosen<br />

Softwareaktualisierung verwendet wird, ist hier implementiert. Im Unterkapitel<br />

5.1.4 wird diese Implementierung vorgestellt.<br />

interrupt Konfiguration der Interrupts<br />

Der Code für die Konfiguration der Interrupts wurde aus der ” boop“-Firmware<br />

übernommen. Es stehen Funktionen zur Verfügung, um Interrupts global ein bzw.<br />

aus zu schalten. Zusätzlich können einzelne Interruptquellen des Interruptcontrollers<br />

des Prozessors aktiviert bzw. deaktiviert werden.<br />

flash Flashbaustein schreiben/löschen<br />

Um den Flashspeicher beschreiben bzw. löschen zu können, ist es notwendig, diesem<br />

bestimmte Signale zukommen zu lassen. Die Funktionen in diesem Unterordner,<br />

die ebenfalls aus der ” boop“-Firmware übernommen wurden, kümmern sich<br />

um diese Signale <strong>und</strong> bieten es an, komplette Blöcke oder einzelne Wörter in das<br />

Flash zu schreiben <strong>und</strong> Sektoren zu löschen. Da die Flashbausteine am Speicherinterface<br />

des Prozessors angeschlossen sind, können Lesezugriffe ohne besondere<br />

Vorkehrungen direkt erfolgen.<br />

display Text- <strong>und</strong> Zeichenfunktionen für das LCD<br />

Umfangreiche Funktionen, um einfache Grafiken <strong>und</strong> Text auf dem Display auszugeben,<br />

befinden sich im Unterordner display. Die Funktionen entstammen der<br />

1 Aktuell ist der Watchdog so eingestellt, dass dies mindestens ein mal pro Minute erfolgen muss.<br />

Ansonsten wird der Knoten zurückgesetzt <strong>und</strong> neu gestartet.<br />

71


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

” boop“-Firmware. Unterstützt wird das Zeichnen von Linien, Rechtecken, Kreisen<br />

<strong>und</strong> natürlich einzelnen Bildpunkten. Es stehen mehrere Schriftarten in verschiedenen<br />

Größen zur Auswahl. Ausgegeben werden können einzelnen Buchstaben<br />

oder komplette Zeichenketten.<br />

audio PWM Audio-Erzeugung<br />

Die ursprünglich in der ” boop“-Firmware vorhande Möglichkeit, Audio-Samples<br />

auszugeben, wurden vollständig entfernt. Stattdessen liegen nun Funktionen vor,<br />

welche einfache Signaltöne mit wählbarer Frequenz <strong>und</strong> Dauer ausgeben. Da die<br />

Signale direkt vom PWM Controller erzeugt werden, ist es ebenfalls möglich, die<br />

Ausgabe im Hintergr<strong>und</strong> erfolgen zu lassen. Die Anwendung muss bzw. sollte 2<br />

sich jedoch darum kümmern, die Ausgabe nach einiger Zeit wieder zu beenden.<br />

adc Analog/Digital-Wandler<br />

Wie bei der Audioausgabe wurden die umfangreichen Funktionen der ” boop“-<br />

Firmware gegen eine sehr einfache Funktion ausgetauscht. Sie liefert lediglich<br />

den Messwert der Akkuspannung durch den Analog/Digital-Wandler zurück.<br />

serial Serielle Schnittstelle<br />

In der ursprünglichen ” boop“-Firmware wurden nicht die üblichen Ausgabefunktionen<br />

wie puts oder printf verwendet, sondern stattdessen im Unterordner<br />

serial diverse Funktionen zur Ausgabe auf der seriellen Schnittstelle implementiert.<br />

Diese werden nicht weiter verwendet, übernommen wurden jedoch, nach<br />

kleineren Anpassungen, die Funktionen zur Konfiguration der seriellen Schnittstelle<br />

des Microcontrollers. Um die Funktionen der ” newlib“ zur Ausgabe verwenden<br />

zu können, mussten eigene Syscalls implementiert werden, die die Einbzw.<br />

Ausgabe direkt auf der Hardware ausführen. Diese Syscalls werden von den<br />

Funktionen der ” newlib“ zur Ausgabe verwendet.<br />

rtc Echtzeituhr<br />

Um die Möglichkeit, die Systemzeit in Sek<strong>und</strong>en verwalten zu können erweitert,<br />

wurden die Funktionen der boop-Firmware zur Ansteuerung der Echtzeituhr<br />

übernommen. Hierbei werden die Werte der aktuellen Sek<strong>und</strong>e, Minute <strong>und</strong> St<strong>und</strong>e<br />

einfach aufaddiert 3 , um den Wert der Systemzeit in Sek<strong>und</strong>en verwenden zu<br />

können. Die Systemzeit ist also maximal einen Tag lang verwendbar, was jedoch<br />

im Rahmen der durchgeführten Tests vollkommen ausreichend ist. Für längere<br />

Testdurchläufe wäre es problemlos möglich, auch den aktuellen Tag bzw. Monat<br />

zur Berechnung der Zeit hinzuzufügen.<br />

2 Es steht ein 1 Watt Leistungsverstärker für die Tonausgabe zur Verfügung. Die Signaltöne sind<br />

daher gut wahrnehmbar, benötigen jedoch dementsprechend viel Energie.<br />

3 Systemzeit = Sek<strong>und</strong>en + 60 ∗ (Minuten + 60 ∗ St<strong>und</strong>en)<br />

72


Testanwendungen im Unterordner app<br />

simple Einfache Minimalanwendung<br />

5.1. Implementierung<br />

Die Anwendung enthält alle Funktionen, die mindestens notwendig sind, um Programmcode<br />

zu erzeugen, welcher zusammen mit der Firmware ausgeführt werden<br />

kann. Sie war der Startpunkt für den Entwurf der austauschbaren Anwendungen<br />

<strong>und</strong> entspricht dem typischen ” hello world“-Programm.<br />

monitor Überwachung des Singalisierungskanals<br />

Das monitor-Programm empfängt kontinuierlich die auf dem Signalisierungskanal<br />

übertragenen Pakete <strong>und</strong> zeigt dann auf dem LCD Informationen über das aktuell<br />

empfangene Paket an. Ein kurzes Blinken der Hintergr<strong>und</strong>beleuchtung signalisiert<br />

den Empfang <strong>eines</strong> Pakets. Zusammen mit dem Programm dauerbake wurde so<br />

die Abstrahlcharakteristik der Antennen gemessen (siehe Kapitel 3.3.3).<br />

scanner Überwachung des gesamten Frequenzbereichs<br />

Bei der Entwicklung der Gr<strong>und</strong>lagen der dynamischen Kanal-Bewertung entstand<br />

dieses Programm, das die zur Verfügung stehenden Übertragungskanale in schneller<br />

Folge abtastet <strong>und</strong> den gemessenen Signalpegel in Form <strong>eines</strong> Balkens pro Kanal<br />

auf dem LCD darstellt. Längerfristige Störungen können so erkannt werden<br />

<strong>und</strong> die dynamische Vermeidung von gestörten Kanälen gut visualisiert werden<br />

(siehe Abbildung 4.4).<br />

rf test Testumgebung für die Funktionen des Funkchips<br />

Um die von der Firmware angebotenen Möglichkeiten zur Konfiguration des Funkchips<br />

zu testen <strong>und</strong> neue Funktionen zu entwickeln, steht die rf test-Anwendung<br />

zur Verfügung. Alle Funktionen können über eine einfache Kommandozeile aufgerufen<br />

<strong>und</strong> verwendet werden.<br />

power test Messung des Energiebedarfs<br />

Um den Energiebedarf der Plattform unter bestimmten Bedingungen messen zu<br />

können, wurde die power test-Anwendung geschrieben. Die verschiedenen Situationen<br />

können so jederzeit künstlich hervorgerufen <strong>und</strong> reproduzierbar gemessen<br />

werden.<br />

logtool Entwicklungsumgebung für das Systemlog<br />

Das logtool dient zum Auslesen bzw. Schreiben des Systemlogs. Im Unterordner<br />

sind zusätzlich diverse Perl-Skripte enthalten, die die Ausgabe des Systemlog in<br />

CSV-Dateien 4 umwandeln.<br />

4 Comma-Separated Values. Diese Dateien können dann z.B. zur Erzeugung von Diagrammen ver-<br />

wendet werden.<br />

73


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

Zeilen Programmcode<br />

11000<br />

10000<br />

9000<br />

8000<br />

7000<br />

6000<br />

5000<br />

4000<br />

3000<br />

2000<br />

1000<br />

0<br />

Software Update<br />

Ansteuerung Funkchip<br />

Hardwareabstraktion, ...<br />

Nachrichtenübermittlung<br />

Routing<br />

Verwaltung, ...<br />

Firmware Hauptanwendung übrige Anwendungen<br />

Abbildung 5.2: Verteilung der über 22000 Zeilen Programmcode auf Firmware, Hauptanwendung<br />

<strong>und</strong> die übrigen Anwendungen.<br />

entladekurve Anfertigen der Entladekurven<br />

Die entladekurve Anwendung ist eine Kombination der power test- <strong>und</strong> der<br />

logtool-Anwendung <strong>und</strong> dient dem Anfertigen von Entladekurven. Hierzu wird<br />

das System in einen bestimmten Zustand versetzt <strong>und</strong> regelmäßig der Ladezustand<br />

des Akkus in das Systemlog geschrieben.<br />

dauerbake Permanentes Aussenden <strong>eines</strong> Pakets<br />

Zum Bestimmen der Reichweite der Sensorknoten sowie dem Ausmessen der Abstrahlcharakteristik<br />

dient diese Anwendung. Sie besteht im Wesentlichen aus einer<br />

Endlosschleifen, in welcher ein kurzes Datenpaket verschickt wird (siehe Kapitel<br />

3.3.3).<br />

In Abbildung 5.2 ist dargestellt, welchen Anteil an Zeilen Programmcode die Komponenten<br />

Firmware“, Hauptanwendung“ <strong>und</strong> die Test-Anwendungen“ haben. Bei der<br />

” ” ”<br />

Firmware sind die beiden Teilkomponenten zur Ansteuerung des Funkchips“ <strong>und</strong> zur<br />

”<br />

” Durchführung des Software-Updates“ gesondert hervorgehoben. Bei der Hauptanwendung<br />

die Teilkomponenten Routing“ <strong>und</strong> Nachrichtenübermittlung“.<br />

” ”<br />

Es folgt nun eine detaillierte Vorstellung einiger ausgewählter Punkte der Implementierung.<br />

74


5.1. Implementierung<br />

Abbildung 5.3: Verschiedene Zugriffsarten auf die Register des Funkchips[36]<br />

5.1.2 Ansteuerung des Funkchips<br />

Der Funkchip wird über SPI 5 an den Microcontroller angeb<strong>und</strong>en. Auf der Seite des<br />

Microcontrollers wird das SPI durch den SSP 6 -Controller in Hardware realisiert. Die<br />

Datenrate über den SPI-Bus zum Funkchip kann bis zu 10Mbps betragen <strong>und</strong> ist somit<br />

deutlich schneller als die eigentliche Datenübertragung auf dem Funkweg.<br />

Der Funkchip wird über diverse Konfigurationsregister für den gewünschten Betriebsmodus<br />

eingestellt. Der Zugriff auf die Register erfolgt, indem zunächst die Adresse <strong>und</strong><br />

anschließend die Daten über den SPI-Bus übertragen werden. Die komplette Konfiguration<br />

kann in einem ” Burst“ ohne Adressierung der einzelnen Register erfolgen. Befehle<br />

(wie z.B. Beginn der Funkübertragung, Reset, ...) werden über bestimmte Adressen<br />

mit so genannten ” Strobes“ übermittelt. Für die zu sendenden bzw. zu empfangenen<br />

Daten stehen je ein 64 Byte großer FIFO 7 Buffer zur Verfügung. Die verschiedenen<br />

Zugriffsarten auf die Register sind in Abbildung 5.3 dargestellt.<br />

Die genaue Beschreibung der Bedeutung der einzelnen Register ist im Datenblatt des<br />

Funkchips gut beschrieben[36]. Damit bei der Entwicklung von Anwendungen für den<br />

Sensorknoten solche Details nicht berücksichtigt werden müssen, wurde eine Reihe von<br />

Funktionen geschrieben, die sich darum kümmern, den Funkchip so zu konfigurieren,<br />

wie es gewünscht ist. Hierzu ist dann nur ein einzelner Funktionsaufruf notwendig, der<br />

umfangreiche Zugriff auf die Register des Funkchips kann entfallen – Wissen über die<br />

nötigen Registerwerte ist nicht notwendig.<br />

Neben vielen anderen Funktionen zählt hierzu insbesondere:<br />

Funkchip initialisieren (cc1100_init(void))<br />

Sendeleistung einstellen (cc1100_SetPower(unsigned char power))<br />

Übertragungskanal wählen (cc1100_SetChannel(unsigned char channel))<br />

5 Serial Peripheral Interface<br />

6 Synchronous Serial Port<br />

7 First In First Out: Elemente werden in genau der Reihenfolge abgerufen, in der sie zuvor abgelegt<br />

wurden.<br />

75


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

Datenratenprofil wählen (cc1100_WriteProfile(unsigned char ProfileNr))<br />

Pakete verschicken (SendPacket(unsigned char adr, unsigned char typ,<br />

int length, unsigned char* daten))<br />

Pakete empfangen (ReceivePacket(int pkt_timeout, int max_length,<br />

unsigned char* daten, packet_stat_t* stat))<br />

Die Funktion, mit welcher das ” Datenratenprofil“ gewählt werden kann, verwendet hierbei<br />

gleich einen ganzen Satz verschiedener Register, um eine zur gewünschten Datenrate<br />

passende Modulation <strong>und</strong> Filtereinstellungen einzustellen. Diese <strong>und</strong> die Funktionen<br />

zum Senden bzw. Empfangen von Paketen wurden mit einigen Veränderungen <strong>und</strong><br />

Anpassungen aus der Studienarbeit ” Entwurf <strong>und</strong> Implementierung der Infrastruktur<br />

für den FPGA-basierten Sensorknoten Hyperion“[19] übernommen. Sie wurden dort<br />

bereits im Detail beschrieben.<br />

5.1.3 Automatische Codeerzeugung für Anwendungsaustausch<br />

In Abbildung 4.8 wurde bereits der Ablauf gezeigt, welcher notwendig ist, um eine<br />

auf der Firmware ausführbare Anwendung zu erzeugen. Hierbei wird aus der fertig<br />

übersetzten Firmware, zusammen mit den Headerfiles der Firmware <strong>und</strong> der ” newlib“,<br />

neuer Programmcode erzeugt, welcher dann zusammen mit dem Code der Anwendung<br />

compiliert wird. Es wird nun das Skript, das den neuen Programmcode erzeugt, vorgestellt.<br />

Es handelt sich hierbei um das Perl-Skript make fptrs.pl, welches direkt im Ordner<br />

der Firmware abgelegt ist. Beim Aufruf des Makefiles wird es automatisch aufgerufen,<br />

nachdem die Firmware neu übersetzt wurde.<br />

Am Anfang des Skripts sind einige Konfigurationsmöglichkeiten gegeben. Wichtig sind<br />

hierbei:<br />

@INC PATH: Das Array @INC PATH enthält eine Liste von Pfaden, in welchen nach Headerfiles<br />

gesucht werden soll. Wichtig ist hierbei sowohl das Verzeichnis ” .“ 8 als<br />

auch das Verzeichnis, in welchem die Headerfiles der C-Bibliothek abgelegt sind.<br />

Wenn weitere Bibliotheken verwendet werden, so müssten deren Pfade ebenfalls<br />

in diesem Array eingetragen werden.<br />

8<br />

7 @INC_PATH=(".","/opt/armtool/4.1.1/arm-elf/include");<br />

” .“ ist das aktuelle Arbeitsverzeichnis. Da das Skript im Ordner der Firmware abgelegt ist, befinden<br />

sich also hier die Headerfiles der Firmware.<br />

76


5.1. Implementierung<br />

@WISHLIST: Im Array @WISHLIST werden all die Funktionen angegeben, welche in der<br />

Firmware enthalten sind <strong>und</strong> in der Anwendung genutzt werden sollen. Für das<br />

Skript <strong>und</strong> die spätere Anwendung macht es keinen Unterschied, ob die Funktion<br />

direkt in der Firmware implementiert ist oder aus der C-Bibliothek entnommen<br />

wird. Wichtig ist hierbei nur, dass die Funktion im Speicherabbild der Firmware<br />

enthalten ist. Dies ist in der Regel der Fall, sobald die Funktion von der Firmware<br />

selbst einmal verwendet wurde. Die Signatur 9 der Funktionen muss nicht<br />

mit angegeben werden, diese wird vollautomatisch aus den Headerfiles extrahiert.<br />

9 @WISHLIST=("feedWatchdog", "printf", "ReceivePacket", "SendPacket");<br />

@VARLIST: Ähnlich, wie im Array @WISHLIST zu exportierende Funktionen angegeben<br />

werden, werden im Array @VARLIST Variablen aufgelistet, die später global zur<br />

Verfügung stehen sollen. Im Unterschied zur Funktionsliste muss die Signatur der<br />

Variablen jedoch mit angegeben werden.<br />

25 @VARLIST =("unsigned char TxBuffer[]", ..., "unsigned int SysTime");<br />

Das Skript verwendet den Befehl ” nm“ der GNU Development Tools, um eine Liste der<br />

Symbole der Firmware ausgeben zu lassen. Diese Liste besteht aus allen in der Firmware<br />

verwendeten Funktionen <strong>und</strong> globalen Variablen. Ausgegeben wird das Tripel (Adresse,<br />

Typ, Name). Beispiel:<br />

~/workspace/betty/firmware> nm boop_rom.elf<br />

[...]<br />

8000595c T cc1100_SetChannel<br />

80005568 T cc1100_SetPacketLength<br />

80005574 T cc1100_SetPacketMode<br />

800054b0 T cc1100_SetPower<br />

[...]<br />

Der Typ ” T“ gibt an, dass es sich hierbei um eine Funktion handelt, welche im Textsegment<br />

abgelegt ist. Dies trifft auf alle Funktionen zu, welche exportiert werden sollen.<br />

Für jeden Eintrag des Typs ” T“ in der Tabelle wird überprüft, ob der Name im Array<br />

@WISHLIST enthalten ist:<br />

9 Eine Signatur definiert die formale Schnittstelle einer Funktion. Sie besteht aus dem Namen der<br />

Funktion, der Anzahl, Reihenfolge <strong>und</strong> Typen ihrer Parameter <strong>und</strong> dem Typ des oder der Funktionsrückgabewerte.<br />

77


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

123 @map = split("\n",‘nm ELF_FILE‘);<br />

124 for (i=@map; i>0; i--) {<br />

125<br />

126 if (map[i] =~ /^(.*) T (.*)/) { # Symbol ist Funktion im Textsegment<br />

127 adr=1; name=2;<br />

128<br />

129 if (grep (/^name/, @WISHLIST)) { # Funktion soll exportiert werden<br />

130<br />

131 # Funktionssignatur suchen<br />

132<br />

133 }<br />

134 }<br />

135 }<br />

In diesem Fall sind bereits die Adresse der Funktion <strong>und</strong> der Funktionsname bekannt.<br />

Es fehlt die Funktionssignatur, welche jedoch aus den Headerfiles extrahiert werden<br />

kann. Hierfür setzt das Skript die GNU Werkzeuge ” find“ <strong>und</strong> ” grep“ ein, um in den<br />

im Array @INC PATH angegebenen Pfaden zunächst rekursiv alle Headerfiles zu suchen<br />

<strong>und</strong> anschließend in diesen Headerfiles nach dem Namen der Funktion zu suchen:<br />

137 while (x for file in ‘find . -iname "*.h"‘; do<br />

grep cc1100_SetChannel $file; done;<br />

void cc1100_SetChannel(BYTE channel);<br />

Jeder zurückgegebene Treffer wird zunächst mit Hilfe von regulären Ausdrücken so bereinigt,<br />

dass er der Form ” Typ Name (Signatur)“ entspricht. Ein einfacher regulärer<br />

Ausdruck zerlegt dieses Ergebnis in die Variablen f typ, f name <strong>und</strong> f sig. Der<br />

dann so gef<strong>und</strong>ene Name wird mit dem gesuchten Namen verglichen. Falls beide übereinstimmen,<br />

stehen alle Informationen zur Verfügung, die nötig sind, um den gewünsch-<br />

78


ten Funktionspointer zu erstellen:<br />

142 foreach(@f<strong>und</strong>stellen) {<br />

143 # cleanup.. libc<br />

5.1. Implementierung<br />

144 _ =~ s/(.*?)(\s*)(\*)?_EXFUN\((.*?)(\s*?),(\s*?)(.*?)\)/13 47/g;<br />

145 _ =~ s/_PTR/void*/g;<br />

146 _ =~ s/extern(\s*)//g;<br />

147 _ =~ s/\(_VOID\)/\(void\)/g;<br />

148<br />

149 # typ name (sig)<br />

150 _ =~ /(unsigned |)(.*?)(\s+)(.*?)(\s*)\((.*?)\)/;<br />

151 f_typ=1.2;<br />

152 f_name=4;<br />

153 f_sig=6;<br />

154<br />

155 if (f_name eq name) {<br />

156 sig=f_sig;<br />

157 typ=f_typ;<br />

158 fo<strong>und</strong>="true";<br />

159 last; # foreach-Schleife beenden<br />

160 }<br />

161 }<br />

Hierzu wird für jede Funktion zunächst ein neuer Pointertyp definiert. Jeder neue Typ<br />

bekommt den Namen AUTOGEN fptr, zusammen mit einer durchlaufenden Nummer.<br />

Dieser neue Typ wird zusammen mit einem externen Funktionspointer dieses Typs in<br />

die neue Headderdatei geschrieben. In der neuen C-Datei wird dem Funktionspointer<br />

dann die Adresse der Funktion zugewiesen:<br />

172 genid++;<br />

173 print H_DATEI "typedef typ(*_AUTOGEN_fptr_genid)(sig);\n";<br />

174 print H_DATEI "extern _AUTOGEN_fptr_genid const name;\n\n";<br />

175 print C_DATEI<br />

176 "_AUTOGEN_fptr_genid const name=(_AUTOGEN_fptr_genid)0xadr;\n";<br />

Das Bereitstellen der globalen Variablen erfolgt ähnlich. Wieder wird der Befehl nm“<br />

”<br />

verwendet, um eine Liste der Symbole zu bekommen. Interessant sind diesmal jedoch<br />

die Symbole des Typs B“. Dies sind die im BSS Segment, also dem Bereich der uninitia-<br />

”<br />

lisierten Daten, abgelegten globalen Variablen. Um die Variablen in den Anwendungen<br />

” normal“ nutzen zu können, reicht es nicht aus, einen Pointer auf die Variable bereit zu<br />

stellen. Stattdessen wird mittels #define erwirkt, dass der C-Präprozessor die Variablennamen<br />

durch direkte Speicherzugriffe austauscht. Hierbei wird unterschieden, ob<br />

es sich um ein Array oder einen Skalar handelt <strong>und</strong> entsprechender Code generiert:<br />

79


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

233 if (array) { # bei der Variable handelt es sich bereits um einen Pointer<br />

234 print H_DATEI "#define name (((typ*) 0xadr))\n";<br />

235 } else {<br />

236 print H_DATEI "#define name (*((typ*) 0xadr))\n";<br />

237 }<br />

Beispielcode<br />

An kurzen Stücken des (automatisch generiertem) Quellcodes soll die Funktionsweise<br />

demonstriert werden. Listing 5.1 zeigt einen Ausschnitt aus der Datei fptrs.h, in welcher<br />

die aus den Funktionssignaturen automatisch definierten Pointer erzeugt wurden.<br />

Listing 5.3 zeigt den entsprechenden Ausschnitt aus der Datei fptrs.c, in der den<br />

Pointern die Werte zugewiesen werden. Listing 5.4 zeigt, wie diese Funktionspointer<br />

dann in einer Anwendung beispielsweise eingesetzt werden könnten. Es ist kein Unterschied<br />

zu einem Aufruf der Funktionen in einem normalen Programm zu erkennen!<br />

112 typedef int(*_AUTOGEN_fptr_29)(void);<br />

113 extern _AUTOGEN_fptr_29 const rand;<br />

114<br />

115 typedef int(*_AUTOGEN_fptr_30)(const char *);<br />

116 extern _AUTOGEN_fptr_30 const puts;<br />

117<br />

118 typedef int(*_AUTOGEN_fptr_31)(const char *, ...);<br />

119 extern _AUTOGEN_fptr_31 const printf;<br />

Listing 5.1: Automatisch erzeugte Funktionspointer in der Datei fptrs.h<br />

270 #define packet_stat (*((packet_stat_t *) 0x40002144))<br />

271 #define TxBuffer (((unsigned char *) 0x40001d44))<br />

272 #define SysTime (*((unsigned int *) 0x40001610))<br />

Listing 5.2: Globale Variablen in der Datei fptrs.h<br />

76 _AUTOGEN_fptr_29 const rand=(_AUTOGEN_fptr_29)0x80009d2c;<br />

77 _AUTOGEN_fptr_30 const puts=(_AUTOGEN_fptr_30)0x80009cfc;<br />

78 _AUTOGEN_fptr_31 const printf=(_AUTOGEN_fptr_31)0x80009c1c;<br />

Listing 5.3: Automatisch erzeugte Funktionspointer in der Datei fptrs.c<br />

1 #include "fptrs.h" // stdio.h wird *nicht* eingeb<strong>und</strong>en!<br />

2<br />

3 sprintf(TxBuffer,"String!");<br />

4 printf("Hallo Welt. Zufallszahl: %d. String: %s\n",rand(), TxBuffer);<br />

Listing 5.4: Beispielcode einer Anwendung<br />

80


5.1.4 Software-Update Protokoll<br />

5.1. Implementierung<br />

Der genaue Ablauf der Datenübertragung während des Softwareupdates wurde bereits<br />

in Unterkapitel 4.3.2 beschrieben. Dieser Ablauf wird hier nicht wiederholt. Stattdessen<br />

werden einige Detaillösungen anhand von Auszügen aus dem Quellcode, bzw. diesem<br />

entsprechenden Darstellungen, vorgestellt.<br />

Sowohl der Programmcode des Protokolls des Senders als auch der Empfänger ist in<br />

der Datei soft update.c im Unterordner sensornode der Firmware implementiert.<br />

Initiale Zeitsynchronisierung<br />

Die Zeitsynchronisierung zu Beginn des Softwareupdates ist für das spätere Protokoll<br />

wichtig, da die zur Verfügung stehende Zeit aufgeteilt wird in eine Hälfte, in welcher<br />

der Masterknoten aktiv ist <strong>und</strong> eine Hälfte, in der die Slaveknoten ggf. aktiv werden<br />

dürfen. In Listing 5.5 ist der Code gezeigt, welcher vom Master verwendet wird, um<br />

die Zeitsynchronisierung durchzuführen. Listing 5.6 zeigt entsprechend, wie ein solches<br />

Paket ausgewertet wird, nachdem es empfangen wurde.<br />

Die Vorgehensweise ist hierbei prinzipiell einfach gehalten. Der Sender schickt über<br />

einen gewissen Zeitraum hinweg durchgängig ” Softwareupdate/Prepare“-Pakete. Diese<br />

enthalten einen Countdown (in Mikrosek<strong>und</strong>en), welcher den Zeitpunkt der Synchronisation<br />

anzeigt. Empfängt ein Knoten ein solches Paket, wechselt er in den Softwareupdate-Modus<br />

<strong>und</strong> wartet dann genau die angegebene Zeit in Mikrosek<strong>und</strong>en. Anschließend<br />

setzt er seine Systemzeit auf Null. Das Paket dient neben der Zeitsynchronisation<br />

noch dazu, allen Knoten in Empfangsreichweite anzuzeigen, dass ein Softwareupdate<br />

durchgeführt werden soll. Der Countdown ist daher mit 7 Sek<strong>und</strong>en deutlich länger<br />

gewählt, als es für eine reine Zeitsynchronisation notwendig wäre.<br />

1 timer_stopwatch_start(); /* Setzt den Hardware-Timer zurück <strong>und</strong> konfiguriert<br />

ihn so, dass er jede Mikrosek<strong>und</strong>e inkrementiert wird */<br />

2<br />

3 int SyncIn=7000000; /* 7 Sek<strong>und</strong>en Vorlaufzeit. Die Pakete dienen nicht nur<br />

der Zeitsynchronisierung, sondern auch dazu, alle Knoten in<br />

Empfangsreichweite in den Softwareupdate-Modus zu versetzen */<br />

4<br />

5 while(SyncIn>20000) { /* Da der Knoten eine gewisse Zeit benötigen, das<br />

Paket zu senden macht es keinen Sinn, bis 0 herunter zu zählen! */<br />

6<br />

7 SyncIn=7000000-T0TC; /* T0TC ist direkt das Register des Hardware-Timers<br />

<strong>und</strong> enthält die ab dem Aufruf von timer_stopwatch_start(); vergangene<br />

Zeit in Mikrosek<strong>und</strong>en */<br />

8<br />

9 TxBuffer[6]=(SyncIn&0xFF000000)>>24; // den 32 Bit Wert auf<br />

10 TxBuffer[7]=(SyncIn&0x00FF0000)>>16; // vier Bytes aufteilen<br />

81


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

11 TxBuffer[8]=(SyncIn&0x0000FF00)>>8;<br />

12 TxBuffer[9]=(SyncIn&0x000000FF);<br />

13<br />

14 SendPacket(ALL_NODES, TYP_UPDATE , 10, TxBuffer);<br />

15<br />

16 feedWatchdog(); /* Verhindern, dass der Watchdog den Knoten neu startet */<br />

17 }<br />

18 while(T0TC


5.1. Implementierung<br />

a) b) c) d) e) f)<br />

Abbildung 5.4: Bildschirmfotos während <strong>eines</strong> erfolgreichen Softwareupdate-<br />

Durchlaufs<br />

Sender Empfänger<br />

(Zeit mod 10) < 4 ?<br />

nein ja<br />

Empfange NACK<br />

Pakete<br />

ggf. NACK<br />

verarbeiten<br />

Daten Senden<br />

Paket verarbeiten<br />

(Zeit mod 10) < 6 ?<br />

nein<br />

ggf. NACK<br />

versenden<br />

ja<br />

Paket empfangen<br />

nein<br />

Abbildung 5.5: Hauptschleifen der Implementierung des Protokolls für den Sender <strong>und</strong><br />

die Empfänger<br />

83<br />

ja


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

Hauptschleife des Senders<br />

In der Hauptschleife des Senders wird zunächst überprüft, ob der Sender überhaupt<br />

Daten übertragen darf. Hierzu wird die Systemzeit modulo 10 zur Entscheidung<br />

verwendet. Liegt der Wert in der ersten Hälfte (0 bis 3), so darf<br />

der Sender Daten verschicken. Liegt der Wert darüber (4 bis 9), so lauscht der<br />

Sender, ob einer der Empfänger Probleme bei der Übertragung hat <strong>und</strong> daher<br />

NACK-Pakete verschickt. Hierbei liegt eine gewisse Asymmetrie vor: Die Sendezeit<br />

beträgt vier Sek<strong>und</strong>en, die Empfangszeit sechs Sek<strong>und</strong>en. Diese Sek<strong>und</strong>e<br />

” Puffer“ dient dazu, dass auf keinen Fall ein Datenpaket von einem NACK-Paket<br />

gestört werden kann. Sollte der Sender mindestens ein NACK-Paket empfangen<br />

haben, so wird dieses vor der Übertragung von neuen Daten berücksichtigt <strong>und</strong><br />

die Übertragungsposition entsprechend angepasst.<br />

Hauptschleife der Empfänger<br />

Beim Empfänger erfolgt zunächst die Bearbeitung des eingegangenen Paketes,<br />

bevor auch hier anhand der Systemzeit unterschieden wird, wie weiter verfahren<br />

wird. Liegt der Wert der Systemzeit modulo 10 im Bereich zwischen 6 <strong>und</strong> 9,<br />

so darf der Knoten ggf. NACK-Pakete verschicken. Andernfalls (im Bereich zwischen<br />

0 <strong>und</strong> 5) lauscht der Knoten nach einem neuen Paket. Geht innerhalb <strong>eines</strong><br />

gewissen Zeitfensters ein solches ein, so wird es verarbeitet, andernfalls beginnt<br />

er – in Abhängigkeit der Systemzeit – von Neuem zu lauschen. Auch hier liegt<br />

wieder eine Asymmetrie vor (4 Sek<strong>und</strong>en mögliche Zeit zum Senden, 6 Sek<strong>und</strong>en<br />

lang wird empfangen), um eine Störung von Datenpaketen durch NACK-Pakete<br />

zu verhindern.<br />

In Abbildung 5.6 ist der Zustandsautomat gezeigt, der die Behandlung der eingehenden<br />

Nachrichten anhand des Protokolls steuert. Abbildung 5.4 zeigt einige Bildschirmfotos,<br />

welche einen erfolgreichen Durchlauf des Softwareupdates bei einem der Empfänger<br />

dokumentieren.<br />

5.1.5 Routenauswahl <strong>und</strong> -bewertung<br />

Wie Routen durch das Netz gef<strong>und</strong>en werden können, wurde im Entwurfskapitel 4.3.4<br />

bereits relativ nah an der wirklichen Implementierung beschrieben. Es wird nun hier<br />

im Detail vorgestellt, wie die Auswahl der gef<strong>und</strong>enen Routen aus der Routingtabelle<br />

heraus durchgeführt wird.<br />

Der Entsprechende Code hierzu ist in der Hauptanwendung in der Datei route.c in<br />

der Funktion doGetRoute implementiert. Die Funktion bewertet alle in der Tabelle eingetragenen<br />

Routen zum gewünschten Ziel anhand einer auswählbaren Kostenfunktion<br />

<strong>und</strong> gibt die Route mit der besten Bewertung zurück. Es können Knoten angegeben<br />

werden, die auf gar keinen Fall auf der Route liegen dürfen bzw. nicht der nächste<br />

Knoten auf dem Pfad sein dürfen. Dieses ” Blacklisting“ von Knoten ist notwendig, um<br />

84


CRC okay<br />

Erfolg<br />

Prepare<br />

Prepare<br />

Start Erwarte Setup<br />

CRC Check<br />

Finish<br />

CRC Fehler<br />

Fehlschlag<br />

Daten<br />

Setup<br />

Data, Setup<br />

5.1. Implementierung<br />

Zustand<br />

eingehende<br />

Nachricht<br />

Finalzustand<br />

Startzustand<br />

Abbildung 5.6: Zustandsautomat des Empfängers für die Behandlung eingehender Pakete<br />

des Softwareupdates<br />

Routen, welche eine Schleife bilden würden, auf jeden Fall auszuschließen bzw. für den<br />

Fall, dass ein zuvor gewählter Pfad nicht erfolgreich war <strong>und</strong> stattdessen ein anderer<br />

Pfad ausgegeben werden soll. Die beiden Blacklisten werden in Form von Bitmaps<br />

übergeben — entsprechende Funktionen um Bitmaps auf ein Array aus 32bit Werten<br />

abzubilden, sind in der Datei bitmap.c implementiert. Sofern die Blacklisten nicht verwendet<br />

werden sollen, kann die Funktion getRoute verwendet werden, die ihrerseits die<br />

Funktion doGetRoute aufruft, jedoch weniger Parameter benötigt.<br />

Anhand des kompletten Quellcodes der Funktion wird nun gezeigt, wie über die Routingtabelle<br />

iteriert wird, eine Route als tauglich überprüft <strong>und</strong> anschließend bewertet<br />

wird.<br />

Die Parameter der Funktion sind einigermaßen selbsterklärend: Zielknoten steht für<br />

den Knoten, welcher das Ziel der Route darstellt. Route style bestimmt die Bewertungsfunktion,<br />

die verwendet werden soll. Es steht hierbei LOW LATENCY ROUTE,<br />

HIGH BANDWIDTH ROUTE <strong>und</strong> BEST NETWORK POWER ROUTE zur Verfügung. Die beiden<br />

übergebenen Arrays dienen als Speicher für die Bitmaps, die die Information enthalten,<br />

welche Knoten nicht auf dem Pfad liegen sollen. Zur Iteration über die Routingtabelle<br />

wird eine einfache while-Schleife verwendet, die Variable rid gibt die gerade aktuell<br />

beobachtete Zeile in der Tabelle an.<br />

1840 unsigned short doGetRoute(unsigned char Zielknoten, unsigned char<br />

route_style, unsigned int NextHop_Blacklist[], unsigned int<br />

Path_Blacklist[]) {<br />

1841<br />

85


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

1842 unsigned short rid=0;<br />

1843 int best_rating=0;<br />

1844 unsigned short best_rating_route=NO_ROUTE;<br />

1845 int rating;<br />

1846<br />

1847<br />

1848 while(rid < MAX_ROUTES) {<br />

Bevor eine Route bewertet wird, wird zunächst überprüft, ob die Route überhaupt das<br />

richtige Ziel hat <strong>und</strong> nicht bereits in einem Fehlerzustand geführt wird. Zusätzlich wird<br />

direkt überprüft, ob der nächste Knoten auf dem Pfad nicht in der NextHop Blacklist<br />

geführt ist.<br />

1849 if(routes[rid].target == Zielknoten &&<br />

1850 routes[rid].nexthop != 0 && // Unused Slot<br />

1851 routes[rid].nexthop != 255 && // Route-Request<br />

1852 !(routes[rid].flags & ROUTE_ERROR) && // nur funktionsfähige Routen<br />

1853 (NextHop_Blacklist == NULL || !checkBit(NextHop_Blacklist, routes[rid<br />

].nexthop))) {<br />

Sofern der bereits zurückgelegte Pfad bekannt ist – also beispielsweise bei einer Nachrichtenweiterleitung<br />

– wird überprüft, ob eine Schleife entstehen würde, sofern die<br />

aktuell in Position rid gespeicherte Route ausgewählt werden würde. Hierzu muss<br />

für jeden einzelnen Knoten auf dem weiteren Pfad überprüft werden, ob er in der<br />

Path Blacklist eingetragen ist. Ist dies der Fall, so würde eine Schleife entstehen <strong>und</strong><br />

die Route kann nicht verwendet werden. Die Variable rokay wird auf false gesetzt <strong>und</strong><br />

die weitere Untersuchung des Pfades abgebrochen. Nur wenn nach dieser Überprüfung<br />

rokay noch true ist, wird die Route bewertet.<br />

1854 unsigned char rokay=true;<br />

1855 if(Path_Blacklist != NULL) { // kompletten Pfad überprüfen<br />

1856 unsigned char i;<br />

1857 for (i=0; i


5.1. Implementierung<br />

Sendeleistung. Für die Bewertung werden diese Parameter so normalisiert, dass sie jeweils<br />

im Bereich zwischen 0 <strong>und</strong> 200 liegen 10 . Hierbei bedeutet 200 am schlechtesten <strong>und</strong><br />

0 am besten. Diese normalisierten Werte werden dann, je nach gewählter Bewertungsfunktion,<br />

unterschiedlich gewichtet. So ist beispielsweise bei der LOW LATENCY ROUTE<br />

der Hopcount die wichtigste Eigenschaft. Die anderen Parameter werden dennoch in<br />

der Bewertung berücksichtigt, um bei Routen mit gleicher Länge eine Wahl treffen zu<br />

können. Ist die Bewertung der aktuellen Route besser als die bisher beste Route, so<br />

wird die aktuelle Route zur besten Route bestimmt.<br />

1865 // Die Bewertung basiert auf:<br />

1866 // Bandbreite routes[rid].min_datarate // 3 ... 10<br />

1867 // Akkupegel routes[rid].bat_level // 1 ... 200<br />

1868 // Hopcount routes[rid].hopcount // 1 ... 31<br />

1869 // Sendeleistung routes[rid].min_power // 1 ... 10<br />

1870 rating=1000000;<br />

1871 // Bewerte Route..<br />

1872 switch(route_style) {<br />

1873 case LOW_LATENCY_ROUTE:<br />

1874 rating -= 300 * ((int)routes[rid].hopcount *7);<br />

1875 rating -= 1 * (200-(int)routes[rid].bat_level);<br />

1876 rating -= 1 * ((int)routes[rid].min_power*20);<br />

1877 rating -= 20 * ((10-(int)routes[rid].min_datarate)*20);<br />

1878 break;<br />

1879<br />

1880 case HIGH_BANDWIDTH_ROUTE:<br />

1881 rating -= 30 * ((int)routes[rid].hopcount *7);<br />

1882 rating -= 1 * (200-(int)routes[rid].bat_level);<br />

1883 rating -= 1 * ((int)routes[rid].min_power*20);<br />

1884 rating -= 100 * ((10-(int)routes[rid].min_datarate)*20);<br />

1885 break;<br />

1886<br />

1887 default:<br />

1888 case BEST_NETWORK_POWER_ROUTE:<br />

1889 rating -= 20 * ((int)routes[rid].hopcount *7);<br />

1890 rating -= 100 * (200-(int)routes[rid].bat_level);<br />

1891 rating -= 20 * ((int)routes[rid].min_power*20);<br />

1892 rating -= 1 * ((10-(int)routes[rid].min_datarate)*20);<br />

1893 break;<br />

1894 }<br />

1895<br />

10 Die Wahl dieses Bereichs wurde getroffen, da dies die effektive Auflösung des A/D-Wandlers, welcher<br />

die Versorgungsspannung misst, ist. Dieser misst zwar mit 10 Bit, ab dem Messwert 800 ist der<br />

Akku jedoch erschöpft, Werte über 1000 sind zwar theoretisch möglich, kommen beim Einsatz<br />

von Akkus jedoch nicht vor. Es wird daher der Messwert mit dem Offset 800 verwendet, um den<br />

aktuellen Ladezustand abzuschätzen.<br />

87


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

1896 if (rating > best_rating) {<br />

1897 best_rating=rating;<br />

1898 best_rating_route=rid;<br />

1899 }<br />

Nachdem die Bewertung der aktuellen Route abgeschlossen ist, wird der nächste Eintrag<br />

in der Routingtabelle bewertet, so lange, bis alle Routen der Tabelle bewertet<br />

wurden. Sobald dies der Fall ist, wird die beste gef<strong>und</strong>ene Route zurückgegeben. Wurde<br />

überhaupt keine Route gef<strong>und</strong>en, so ist der Rückgabewert noch mit NO ROUTE initialisiert.<br />

1900 } // Route ohne Schleife<br />

1901 } // Route verwendbar<br />

1902<br />

1903 rid++;<br />

1904 } // Hauptschleife<br />

1905<br />

1906 return best_rating_route;<br />

1907 }<br />

5.1.6 Nachrichtenbündelung<br />

Die Behandlung eingehender Nachrichten, die Verwaltung der aktuell vorhandenen<br />

Nachrichten sowie das Aussenden von weiterzuleitenden Nachrichten ist in der Datei<br />

route data.c der Hauptanwendung implementiert. Die Implementierung des Nachrichtendienstes<br />

ist stark mit der Implementierung des Routingprotokolls verwoben.<br />

Beispielsweise die Mechanismen zur Aufgaben- <strong>und</strong> Timeoutverwaltung werden gemeinsam<br />

verwendet.<br />

Der Nachrichtendienst stellt die Funktion addMessage zur Verfügung. Ein Anwendungsprogramm<br />

braucht nur diese Funktion aufrufen, um eine Nachricht zuverlässig<br />

zu einem anderen Knoten zu verschicken. Alles Weitere (finden der Route, Behandlung<br />

von Fehlern, ...) wird automatisch durchgeführt. Die Verarbeitung von eingegangenen<br />

Nachrichten kann in der Funktion processLocalMessages implementiert werden, die<br />

immer dann aufgerufen wird, wenn unbearbeitete Nachrichten für den lokalen Knoten<br />

in der Nachrichtenwarteschlange eingetragen sind.<br />

In den Unterkapiteln 4.1.3 <strong>und</strong> 4.3.5 wurde bereits beschrieben, wie die Nachrichten<br />

verwaltet <strong>und</strong> verschickt werden. Anhand von Auszügen aus dem Quellcode wird hier<br />

nun das Detail vorgestellt, wie die gebündelte Übertragung von Nachrichten, welche<br />

den gleichen nächsten Schritt auf ihrem Pfad haben, umgesetzt wurde.<br />

Die Bündelung der Nachrichten wird durch die beiden Funktionen SendMsgs <strong>und</strong> get-<br />

NextNexthopMessage erreicht, die nun beide vorgestellt werden. Die Funktion Send-<br />

88


5.1. Implementierung<br />

Msgs dient hierbei der Übermittlung der Nachrichten zu einem Nachbarn <strong>und</strong> wird<br />

aufgerufen, nachdem der Nachbar geweckt, der Übertragungskanal gewechselt, sowie<br />

die Datenrate ausgehandelt wurde. Mit Hilfe der Funktion getNextNexthopMessage<br />

werden dann alle Nachrichten, welche den gleichen nächsten Schritt auf Ihrem Pfad<br />

haben, zusammen verschickt.<br />

Als Parameter benötigt die Funktion SendMsgs die Nummer der Route, welche die Verbindung<br />

zum Nachbarknoten beschreibt.<br />

977 unsigned char SendMsgs(unsigned short nrid) {<br />

978<br />

979 unsigned char NextHop=routes[nrid].target;<br />

980 unsigned char retVal=false;<br />

981<br />

982 unsigned short iterator=0xFFFF;<br />

983 unsigned char count=10;<br />

Die Bündelung der Nachrichten erfolgt in einer while-Schleife, die über die Nachrichten<br />

iteriert, deren nächster Schritt auf dem Pfad der aktuelle Partner ist. Hierzu wird die<br />

Variable iterator verwendet, um einerseits anzuzeigen, welche Nachricht gerade verarbeitet<br />

wird, andererseits dient sie der Funktion getNextNexthopMessage dazu, die<br />

jeweils nächste Nachricht zu finden. Die Schleife wird so lange durchlaufen, bis keine<br />

Nachricht mehr über den Nachbarn zu verschicken ist.<br />

984 while((iterator=getNextNexthopMessage(NextHop, iterator+1)) != NO_MSG) {<br />

Innerhalb der Schleife wird die gef<strong>und</strong>ene Nachricht dann in ein Paket kopiert <strong>und</strong><br />

anschließend an den Nachbarn geschickt. Nach jeder Übertragung wird je nach Ergebnis<br />

die Funktion updateNachbarGood oder updateNachbarBad verwendet, um die<br />

Verbindung zum Nachbarknoten zu bewerten <strong>und</strong> dadurch die Sendeleistung <strong>und</strong> die<br />

Datenrate dynamisch anzupassen. Während einer bestehenden Verbindung erfolgt keine<br />

Anpassung der Datenrate, da der hierzu notwendige Signalisierungsvorgang nicht im<br />

Protokoll enthalten ist. Stattdessen erfolgt die Anpassung der Datenrate beim nächsten<br />

Nachrichtenaustausch mit diesem Nachbarn.<br />

985 // Paket zusammenbauen..<br />

986 if ( !memcpy(TxBuffer,<br />

987 &data_route_index[iterator],<br />

988 sizeof(data_route_index_t))) {<br />

989<br />

990 puts(" Fehler beim Koperen (Struct)");<br />

991<br />

992 return false;<br />

993 }<br />

89


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

994 if(data_route_index[iterator].length >= DRQ_MSG_SIZE) {<br />

995<br />

996 printf(" Nachricht ist größer als erlaubt (%d)!!\n",<br />

data_route_index[iterator].length);<br />

997<br />

998 return false;<br />

999 }<br />

1000<br />

1001 unsigned char hdr_length=getHeaderLength(&data_route_index[iterator]);<br />

1002<br />

1003 TxBuffer[hdr_length]=0xFF; // Schutzbyte...<br />

1004 if((hdr_length+1)%2) {<br />

1005 // um die Nachricht später bequem ins Flash kopieren zu können, muss<br />

sie an einer graden "Wortgrenze" beginnen..<br />

1006 hdr_length++;<br />

1007 TxBuffer[hdr_length]=0xFF; // weiteres Schutzbyte...<br />

1008 }<br />

1009<br />

1010 if ( !memcpy(&TxBuffer[hdr_length+1],<br />

1011 ((unsigned char*)(DRQ_BASE+DRQ_MSG_SIZE*iterator)),<br />

1012 data_route_index[iterator].length )) {<br />

1013<br />

1014 puts(" Fehler beim Kopieren (data)");<br />

1015<br />

1016 return false;<br />

1017 }<br />

1018<br />

1019 sleep(100000); // warten, bis der andere Knoten bereit ist<br />

1020<br />

1021 count=50;<br />

1022 while(--count) {<br />

1023 if(SendPacket(NextHop, TYP_DATA | BESTAETIGT,<br />

1024 data_route_index[iterator].length+hdr_length+1, TxBuffer)) {<br />

1025<br />

1026 markSlotSent(iterator); // Nachricht als gesendet markieren<br />

1027 updateNachbarGood(nrid); // Verbindung zum Nachbarn ist gut<br />

1028 if(msg_rid != NO_ROUTE) {<br />

1029 updateRouteUsed(msg_rid); // Timeout der Route zurücksetzen<br />

1030 }<br />

1031 break; // Übertragung dieser Nachricht abgeschlossen<br />

1032<br />

1033 } else { // Paket konnte nicht verschickt werden<br />

1034 updateNachbarBad(nrid); // Verbindung zum Nachbarn ist schlecht<br />

1035 }<br />

1036 sleep(50000); // Zeit lassen, um Daten ins Flash zu schreiben<br />

1037 }<br />

90


1038 if(!count) {<br />

5.1. Implementierung<br />

1039 puts(" Senden fehlgeschlagen !!!!!!");<br />

1040 break; // Nach 50 Versuchen konnte eine Nachricht nicht zugestellt<br />

werden. Es macht keinen Sinn, weitere Nachrichten zu verschicken!<br />

1041 }<br />

1042<br />

1043 }<br />

Nachdem alle Nachrichten verschickt wurden, wird noch ein ” DATAFINISH“-Paket<br />

verschickt, um anzuzeigen, dass die Übertragung in dieser Richtung nun abgeschlossen<br />

ist. Anschließend wird die bestehende Verbindung genutzt, um ggf. Daten in Rückrichtung<br />

zu übertragen. Sind keine Daten auf der Rückrichtung zu übertragen bzw.<br />

wurden diese bereits zuvor übertragen, so wird die Verbindung nach der Übermittlung<br />

des ” DATAFINISH“-Paketes geschlossen <strong>und</strong> beide Knoten wechseln zurück auf den<br />

Signalisierungskanal.<br />

1044 sleep(100000);<br />

1045<br />

1046 puts(" Sende DATAFINISH");<br />

1047 count=50;<br />

1048 while(--count) {<br />

1049 if(SendPacket(NextHop, TYP_DATAFINISH | BESTAETIGT , 1, TxBuffer)) {<br />

1050 retVal=true;<br />

1051 break;<br />

1052 }<br />

1053 sleep((rand()%19000)+10000);<br />

1054 }<br />

1055<br />

1056 return retVal;<br />

1057 }<br />

Da die eigentliche Bündelung der Nachrichten in der Funktion getNextNexthopMessage<br />

erfolgt, wird diese nun ebenfalls vorgestellt. Als Parameter benötigt Sie den Knoten<br />

nexthop, über welchen der Pfad einer Nachricht als nächsten Schritt laufen soll. Die Variable<br />

iterator start wird verwendet, um den bisherigen Fortschritt der gebündelten<br />

Übertragung zu berücksichtigen.<br />

531 unsigned short getNextNexthopMessage(unsigned char nexthop, unsigned short<br />

iterator_start) {<br />

532 unsigned irqstat=disableIRQ();<br />

533 msg_rid=NO_ROUTE;<br />

534<br />

535 unsigned short slot=max(iterator_start, dri_lesezeichen.first_waiting); //<br />

nicht weiter "unten" anfangen zu suchen als dies eigentlich nötig ist<br />

91


536<br />

Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

537 unsigned char max_prio=0;<br />

538 unsigned short max_prio_msg=NO_MSG;<br />

539 unsigned short rid;<br />

540<br />

541 unsigned int Blacklist[8]; // 8*32 = 256<br />

Das Durchsuchen der Nachrichten erfolgt in einer einfachen Schleife. Alle Nachrichten<br />

ab der angegebenen Startposition werden überprüft, ob sie zur Übertragung über den<br />

gewünschten nächsten Schritt geeignet sind. Zusätzlich wird sichergestellt, dass sich<br />

keine Schleife auf dem Datenpfad bildet.<br />

542 while(slot < dri_lesezeichen.next_unused) {<br />

543<br />

544 MsgPathToBlacklist(Blacklist, slot);<br />

545<br />

546 rid=NO_ROUTE;<br />

547<br />

548 if(// Slot ist überhaupt in Verwendung<br />

549 slotUsed(slot) &&<br />

550 // <strong>und</strong> noch nicht abgeschlossen<br />

551 slotWaiting(slot) &&<br />

552 // <strong>und</strong> noch nicht gesendet<br />

553 (!checkBit(SlotSentBitmap,slot)) &&<br />

554 // <strong>und</strong> es gibt eine Route zum Ziel..<br />

555 ((rid=getDatapathRoute(data_route_index[slot].target, data_route_index<br />

[slot].route_style, Blacklist))!= NO_ROUTE && ((routes[rid].flags&<br />

ROUTE_REPLY) || (routes[rid].flags&NEIGHBOUR_ESTABLISHED))) &&<br />

556 // <strong>und</strong> der nächste Schritt auf der gef<strong>und</strong>enen Route ist der Gesuchte?<br />

557 (routes[rid].nexthop == nexthop)) {<br />

Sofern die Nachricht zur Übertragung geeignet ist, wird überprüft, ob eine Startposition<br />

zum Durchsuchen des Nachrichtenspeichers angegeben wurde. Falls dies der Fall<br />

ist, wird die gef<strong>und</strong>ene Nachricht auf jeden Fall als Rückgabewert der Funktion gespeichert<br />

<strong>und</strong> es werden keine weiteren Nachrichten untersucht. Wurde keine Startposition<br />

angegeben, so werden alle ausstehenden Nachrichten untersucht <strong>und</strong> letztendlich die<br />

Nachricht mit der höchsten Priorität zurückgeliefert. Dadurch, dass beim ersten Aufruf<br />

der Funktion bei einer Übertragung immer keine Startposition angegeben wird, wird sichergestellt,<br />

dass die Nachricht mit der höchsten Priorität immer zuerst verschickt wird.<br />

558 if(iterator_start == 0) {<br />

559 if (data_route_index[slot].priority > max_prio) {<br />

560 max_prio=data_route_index[slot].priority;<br />

561 max_prio_msg=slot;<br />

92


562 msg_rid=rid;<br />

563 }<br />

564 } else {<br />

565 msg_rid=rid;<br />

566 max_prio_msg=slot;<br />

567 break;<br />

568 }<br />

569 }<br />

570 slot++;<br />

571 }<br />

572<br />

573 // Durchsuchen des Nachrichtenspeichers abgeschlossen<br />

574<br />

575 restoreIRQ(irqstat);<br />

5.2. Testdurchführung<br />

576 // gibt die älteste Nachricht mit der höchsten Priorität zurück -- oder,<br />

wenn "iterator_start" verwendet wird, die jeweils nächste Nachricht,<br />

deren Pfad ebenfalls über "nexthop" läuft<br />

577 return max_prio_msg;<br />

578 }<br />

5.2 Testdurchführung<br />

Bei allen im Weiteren beschriebenen Versuchen kam ein Netz aus 30 Knoten zum Einsatz,<br />

die in einem Gitter von 5*6 Knoten ausgelegt waren. Abbildung 5.7 zeigt ein Foto<br />

<strong>eines</strong> solchen Versuchsaufbaus. Die Knoten liegen hierbei direkt auf dem Erdboden,<br />

welcher einen Großteil der abgestrahlten Energie absorbiert. Zum Schutz der Hardware<br />

vor eventueller Feuchtigkeit wurde eine handelsübliche Plastiktüte verwendet (Abbildung<br />

5.8). Somit ist es möglich, auf einem relativ kleinen Testfeld ein Netz aus 30<br />

Knoten unterzubringen. Diese Art des Aufbaus wurde aus praktischen Gründen, wie<br />

beispielsweise der Auf- <strong>und</strong> Abbauzeit, gewählt. Die Reichweite der einzelnen Knoten<br />

ist durch die Platzierung direkt auf dem Boden durch die Reduktion der Sendeleistung<br />

gut auf wenige Meter beschränkbar. Typischerweise sind bei diesem Aufbau bei minimaler<br />

Sendeleistung somit nur die direkten Nachbarn auf dem Funkweg zu erreichen.<br />

Zum Vergleich: Bei eine Platzierung zwei Meter über dem Boden <strong>und</strong> mit einer R<strong>und</strong>strahlantenne<br />

ausgestattet, liegt die Reichweite im Bereich von etwa 200 Metern[19]<br />

– ein so aufgebautes Netz aus nur 30 Knoten könnte bei einem Knotenabstand von<br />

150 Metern etwa 2<br />

3 Quadratkilometer, also die Fläche von etwa 100 Fußballfeldern11 ,<br />

abdecken!<br />

Es werden nun die durchgeführten Versuche vorgestellt <strong>und</strong> anschließend deren Ergebnisse<br />

gezeigt <strong>und</strong> diskutiert.<br />

11 Ein Fußballfeld hat typischerweise die Fläche von 68m ∗ 105m = 7140m 2 = 0, 007km 2<br />

93


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

Abbildung 5.7: Testnetz aus 30 Knoten<br />

Abbildung 5.8: Knoten bei einem realen Test<br />

94


5.2.1 Behandlung von Fehlern auf dem Datenpfad<br />

5.2. Testdurchführung<br />

Der erste durchgeführte Versuch soll die Fähigkeit des Routingprotokolls <strong>und</strong> der Nachrichtenweiterleitung<br />

aufzeigen, mit Ausfällen von Knoten zurecht zu kommen <strong>und</strong> alternative<br />

Routen zu finden <strong>und</strong> zu verwenden. Hierzu wurde zunächst das vollständige<br />

Netz aus 30 Knoten aufgebaut. Ein Knoten dient als Nachrichtenquelle (Q), einer als<br />

Nachrichtensenke (S). Teilabbildung 5.9.a) zeigt den initialen Aufbau des Netztes <strong>und</strong><br />

die Platzierung der Quelle bzw. Senke. Den Knoten liegen im Voraus keine Information<br />

über den Aufbau des Netzes vor! Alle Routen durch das Netz wurden mit Hilfe des<br />

bereits vorgestellten Routingprotokolls gef<strong>und</strong>en. Die vorgestellten Ergebnisse basieren<br />

auf einem realen Versuch.<br />

Versuchsdurchführung <strong>und</strong> Ergebnis<br />

Um das Routingprotokoll auf seine Leistungsfähigkeit zu testen, wurde dem System<br />

zunächst eine gewisse Zeit gelassen, einen Pfad durch das Netz zu finden. Der gef<strong>und</strong>ene<br />

Pfad ist jeweils durch Pfeile in den Teilbildern gezeigt. Es wurden dann jeweils ein oder<br />

mehrere auf dem Pfad liegende Knoten deaktiviert <strong>und</strong> dann protokolliert, welcher<br />

Pfad neu gef<strong>und</strong>en wurde. Die ausgefallenen Knoten werden zunächst rot in der Grafik<br />

dargestellt <strong>und</strong> anschließend entfernt. Das Ergebnis des Versuchs ist in Abbildung 5.9<br />

gezeigt.<br />

Ergebnisbewertung<br />

Der Ausfall von Knoten, die auf dem Datenpfad liegen, führt nicht dazu, dass die<br />

Verbindung zusammenbricht. Das System hat bewiesen, dass es mit dem Ausfall von<br />

Knoten umgehen kann <strong>und</strong> – sofern möglich – alternative Routen durch das Netz finden<br />

kann, um die Daten zuzustellen.<br />

5.2.2 Zeitsynchronisierung<br />

Um zu überprüfen, wie gut die Echtzeituhren der Sensorknoten (unmittelbar) nach<br />

einer Synchronisierung übereinstimmen, wurde das Interrupt-Signal der Echtzeituhr 12<br />

auf einen GPIO-Pin gelegt. An diesem Pin (von zwei verschiedenen Knoten) wurde ein<br />

hochwertiges Oszilloskop 13 angeschlossen. Das Oszilloskop wurde so eingestellt, dass es<br />

automatisch die fallenden Flanken im Signal erkennt <strong>und</strong> dann den zeitlichen Versatz<br />

beider Flanken berechnet. Direkt nach der Synchronisierung wurde so ein Wert von<br />

40s gemessen – dies entspricht in etwa einer Periode des 32kHz Quarzes der Echtzeituhr!<br />

Abbildung 5.10 zeigt ein Bildschirmfoto des Oszilloskops. Es wurde der bereits in<br />

12 Dieses wird immer genau dann ausgelöst, nachdem die Uhr um eine Sek<strong>und</strong>e fortgeschritten ist<br />

13 Agilent MSO6054A Mixed Signal Oscilloscope<br />

95


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

a) b)<br />

Q S Q S<br />

c) d)<br />

Q S Q S<br />

e) f)<br />

Q S Q S<br />

Q<br />

S<br />

Datenquelle<br />

Datensenke<br />

nicht verwendeter<br />

Knoten<br />

Knoten auf Route<br />

ausgefallener<br />

Knoten<br />

Abbildung 5.9: Experiment ” Behandlung von Fehlern auf dem Datenpfad“ in einem<br />

Netz aus 30 Knoten. Die Teilabbildungen zeigen jeweils das noch aktive<br />

Netz (blau, grün), die in diesem Schritt ausgefallenen Knoten (rot) <strong>und</strong><br />

den Datenpfad, welcher automatisch gef<strong>und</strong>en wurde (Pfeile).<br />

96


5.2. Testdurchführung<br />

Abbildung 5.10: Gemessenes Interrupt-Signal der Echtzeituhr von zwei Knoten unmittelbar<br />

nach einer Synchronisierung. Die Genauigkeit von 40s entspricht<br />

etwas über einer Periode des 32768Hz Quarzes der Uhr.<br />

97


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

Listing 5.5 <strong>und</strong> 5.6 vorgestellte Code des Softwareupdates zur Synchronisierung verwendet.<br />

Ergebnisbewertung<br />

Leider driften die Uhren recht schnell wieder voneinander ab, so dass nach wenigen Minuten<br />

bereits ein zeitlicher Versatz im zweistelligen Millisek<strong>und</strong>enbereich messbar ist. 14<br />

Im normalen Betrieb des Sensornetzes kommt diese aufwendige Synchronisierung daher<br />

nicht zum Einsatz. Einerseits würde sie die Knoten zu lange blockieren, anderseits<br />

müsste sie zu oft durchgeführt werden, um eine so genaue Synchronisierung aufrecht<br />

zu erhalten. Die Systemzeit von benachbarten Knoten ist – trotz einer weniger aufwendigen<br />

Synchronisierung – dennoch hinreichend synchron. Eine exakte Messung mit<br />

dem Oszilloskop im gesamten Netz ist nicht möglich, da dieses im Freien auf der Wiese<br />

aufgebaut wird <strong>und</strong> sich über eine zu große Fläche erstreckt. Über das gesamte Netz<br />

hinweg wird jedoch stets die gleiche Zeit auf dem Display ausgegeben, was bedeutet,<br />

dass das gesamte Netz mit einer Genauigkeit von besser als 1 Sek<strong>und</strong>e synchronisiert<br />

ist.<br />

5.2.3 Übertragungseffizienz <strong>und</strong> Belastbarkeit<br />

Um die Effizienz <strong>und</strong> Leistungsfähigkeit bei der Übertragung von Daten durch das Netz<br />

bewerten zu können, wurde das Netz verschiedenen Auslastungstests unterzogen. Die<br />

Testdurchläufe wurden in dem bereits beschriebenen Netz, bestehend aus 30 Knoten,<br />

durchgeführt. Abbildung 5.11 zeigt den Aufbau der Tests mit dem jeweiligen Ergebnis.<br />

Es werden drei verschiedene Netzkonfigurationen untersucht. In der ersten Messung<br />

(Abbildung 5.11.a) werden Daten von einem Knoten diagonal durch das Netz zu einem<br />

anderen Knoten geschickt. Im zweiten Test (Abbildung 5.11.b) werden Daten von fünf<br />

Knoten an einen Knoten geschickt. Im dritten Durchlauf (Abbildung 5.11.c) werden<br />

Daten von fünf Knoten an fünf andere Knoten geschickt. Die Knoten befinden sich<br />

hierbei jeweils ” über Kreuz“ auf der gegenüberliegenden Seite des Netzes.<br />

Versuchsdurchführung<br />

Je nach der Knoten-Identifikationsnummer <strong>und</strong> dem aktuellem Versuch verhält sich<br />

die Software der Knoten etwas unterschiedlich. Hierbei wird unterschieden in drei Arten<br />

von Knoten: Datenquellen (grün), Routingknoten (blau) <strong>und</strong> Datensenken (gelb).<br />

Nachdem die Software auf den Knoten verteilt wurde, läuft der Test vollautomatisch<br />

ab. Die Datenquellen verschicken periodisch Daten über das Netz an die Datensenken.<br />

Jeder Knoten protokolliert hierbei zu jedem Zeitpunkt, wie viele Bytes er gesendet<br />

14 Dies ist vergleichbar mit einer normalen Quarzuhr: Bei einer typischen Abweichung von nur 3<br />

Sek<strong>und</strong>en am Tag entspricht dies pro Minute immerhin 3s/(24 ∗ 60) ≈ 2ms<br />

98


a)<br />

b)<br />

c)<br />

5.2. Testdurchführung<br />

Bytes gesendet<br />

Bytes empfangen<br />

Abbildung 5.11: Messung der Übertragungseffizienz <strong>und</strong> der Belastbarkeit des Netzes<br />

<strong>und</strong> wie viele er empfangen hat. Nach zehn Minuten wird der Test beendet <strong>und</strong> alle<br />

Knoten schicken die letzten drei Minuten ihres Logfiles an einen Knoten, an dem ein<br />

PC angeschlossen ist, um die Daten entgegen zu nehmen. Nach der Durchführung des<br />

Tests werden die Logfiles aller Knoten zu einem zusammengefasst, indem für jeden<br />

Zeitpunkt jeweils die Summe der gesendeten <strong>und</strong> empfangenen Bytes gebildet wird.<br />

Anhand <strong>eines</strong> Vergleichs der beiden Summen lässt sich dann erkennen, wie effizient die<br />

Daten übertragen wurden.<br />

Im Idealfall, also in einem ungestörten Netz, in welchem nur je zwei Knoten zum gleichen<br />

Zeitpunkt Daten austauschen, liegt das Verhältnis von gesendeten <strong>und</strong> empfangenen<br />

Daten bei etwa 1,0. Eine Nachricht durch ein ansonsten ruhendes Netz zu leiten<br />

ist also sehr effizient. Diese Effizienz nimmt mit steigender Anzahl von gleichzeitig<br />

aktiven Knoten ab. Der Versuch soll zeigen, wie stark die Effizienz leidet, wenn regelmäßig<br />

Nachrichten in das Netz eingespeist werden <strong>und</strong> somit immer eine Teilmenge<br />

der Knoten 15 gleichzeitig Daten übertragen möchte. Im ersten Versuch sind dies etwa<br />

5-6 Knoten, im zweiten <strong>und</strong> dritten Versuch ist etwa die Hälfte der Knoten gleichzeitig<br />

aktiv!<br />

Ergebnisbewertung<br />

Je höher die Belastung des Netzes ist, also je mehr Knoten gleichzeitig aktiv sind,<br />

desto mehr Kollisionen gibt es. Unterschieden werden kann hierbei in ” logische“ Kollisionen<br />

<strong>und</strong> ” physikalische“ Kollisionen. Bei den ” logischen“ Kollisionen befindet sich<br />

15 Die Teilmenge entspricht den Knoten, die auf dem Pfad bzw. den Pfaden durch das Netz liegen<br />

99


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

ein Knoten gerade zum Datenaustausch mit einem anderen Knoten auf einem anderen<br />

Übertragungskanal. Ein dritter Knoten kann somit nicht mit einem der beiden<br />

Knoten kommunizieren. Er probiert also Pakete zu verschicken, welche nicht ankommen.<br />

Bei den ” physikalischen“ Kollisionen übertragen mindestens zwei Knoten zeitgleich<br />

auf dem gleichen Übertragungskanal Daten, was zur Zerstörung beider Pakete<br />

führt. Aufgr<strong>und</strong> des eingesetzten Kanalzugriffsverfahrens 16 <strong>und</strong> Verwendung mehrerer<br />

Übertragungskanäle ist die Anzahl der ” physikalischen“ Kollisionen eher gering.<br />

Im ersten Versuch, in dem nur einer der Knoten regelmäßig Daten an einen anderen<br />

Knoten über das Netz verschickt hat, beträgt das Verhältnis etwa 0,5. Es werden also<br />

im Schnitt doppelt so viele Daten übertragen wie empfangen. Bei fünf aktiven Datenquellen<br />

sinkt das Verhältnis bereits auf 0,35, bei der Übertragung über Kreuz liegt<br />

es noch immerhin bei 0,34. Bei einem ausgelasteten Netz sind also im Schnitt drei<br />

Übertragungswiederholungen pro Paket notwendig. Für eine Reduzierung dieser ” logischen“<br />

Kollisionen wäre einiges an Aufwand – verb<strong>und</strong>en mit weiterem Overhead – zu<br />

treiben 17 . Es wurde hierbei ein Tradeoff zwischen diesem Overhead <strong>und</strong> der Möglichkeit,<br />

den Kommunikationspartner direkt beim ersten Versuch zu erreichen, getroffen.<br />

Erfreulicher ist jedoch, dass immer alle Daten bei Ihrem Ziel angekommen sind. Im<br />

zweiten Versuch konnte die Bündelung von Nachrichten auf dem Pfad gut nachvollzogen<br />

werden. Der folgende Ausschnitt der von Knoten ” 29“ über die serielle Schnittstelle<br />

ausgegebenen Statusmeldungen zeigt, wie während einer Datenübertragung vier Nachrichten<br />

von drei unterschiedlichen Knoten übertragen wurden. Es kommt hierbei das<br />

unter 4.3.5 beschriebene Protokoll zum Nachrichtenaustausch zum Einsatz. Der Austausch<br />

der Nachrichten erfolgt zwischen den ” DATASETUP“- <strong>und</strong> ” DATAFINISH“-<br />

Meldungen.<br />

geweckt worden von Knoten 20! Kanal: 2<br />

DATASETUP (speed 7, power 6) abgeschlossen.<br />

Beginne mit Datenaustausch!<br />

neue Nachricht von: 34 für: 29<br />

neue Nachricht von: 34 für: 29<br />

neue Nachricht von: 32 für: 29<br />

neue Nachricht von: 30 für: 29<br />

DATAFINISH Paket erhalten!<br />

Sende nun ausgehende Nachrichten<br />

Sende DATAFINISH<br />

Übertragung abgeschlossen, zurück auf den<br />

Signalisierungskanal<br />

16 Es wird ein CSMA-Verfahren eingesetzt. Das Medium wird immer abgehört, bevor Daten übertragen<br />

werden. Nur wenn der Kanal frei ist, wird der Sender aktiviert. Diese Funktion ist direkt in Hardware<br />

im Funkchip implementiert <strong>und</strong> wird aktiv genutzt.<br />

17 Beispielsweise ein Zugriffsverfahren in der Art von Token-Ring oder ein TDMA-Verfahren<br />

100


150<br />

140<br />

130<br />

120<br />

110<br />

100<br />

90<br />

80<br />

70<br />

60<br />

-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8<br />

5.2. Testdurchführung<br />

Signalstärke / Abstand (indoor) Drehung um die eigene Achse<br />

150<br />

140<br />

130<br />

120<br />

110<br />

100<br />

90<br />

80<br />

70<br />

60<br />

0° 45° 90° 135° 180° 225° 270° 315°<br />

Abbildung 5.12: Messung der Signalstärke <strong>eines</strong> Knotens in Abhängigkeit zur Entfernung<br />

<strong>und</strong> der Ausrichtung des Knotens innerhalb <strong>eines</strong> Gebäudes<br />

5.2.4 Positionsbestimmung<br />

Wie in Kapitel 2.2.3 bereits angesprochen wurde, ist die Abschätzung der eigenen Position<br />

in einem Sensornetz für manche Aufgaben bzw. auch Protokolle wichtig. Es wurde<br />

daher untersucht, ob mit minimalem Aufwand eine solche Abschätzung, aufgr<strong>und</strong> der<br />

gemessenen Signalstärke von einigen festen Knoten im Inneren <strong>eines</strong> Gebäudes, zufriedenstellend<br />

funktioniert.<br />

Aufgr<strong>und</strong> der Ausbreitungseigenschaften von Funkwellen <strong>und</strong> beispielsweise Reflektionen<br />

an Wänden ist die gemessene Signalstärke nicht immer direkt abhängig von der<br />

Entfernung zum Sender[45]. Abbildung 5.12 zeigt das Ergebnis einer solchen Messung<br />

(linkes Teilbild). Zu erkennen ist hierbei kein auswertbarer Zusammenhang zwischen<br />

Signalstärke <strong>und</strong> Entfernung.<br />

Zusätzlich wurde der empfangende Knoten einmal um seine eigene Achse gedreht. Aufgr<strong>und</strong><br />

der nicht idealen Eigenschaften der Antenne (siehe Kapitel 3.3.3) schwankt die<br />

gemessene Stärke des Signals um etwa 10 Prozent!<br />

Da die Messwerte kein zufriedenstellendes Ergebnis versprachen, wurde auf eine weitere<br />

Untersuchung verzichtet. Es sei jedoch darauf hingewiesen, dass durchaus eine<br />

Abschätzung möglich ist, welcher Referenzknoten der ” Naheste“ ist. Mit aufwändigeren<br />

Verfahren ist auch eine genauere Abschätzung der eigenen Position durchaus möglich.<br />

Der Hersteller Texas Instruments bietet beispielsweise einen auf ZigBee basierenden<br />

Funkchip an (CC2430), welcher eine Positionsabschätzung aufgr<strong>und</strong> der Signalstärke<br />

in Hardware unterstützt[46, 47].<br />

101


Kapitel 5. Implementierung <strong>und</strong> Testumgebung<br />

102


6 Zusammenfassung <strong>und</strong> Ausblick<br />

Zum Schluss dieser Arbeit wird noch einmal zusammenfassend beschrieben, was erreicht<br />

wurde. Anschließend werden Möglichkeiten gezeigt, wie man die entwickelte Sensorknotenplattform<br />

<strong>und</strong> die Sensornetzanwendung in Zukunft nutzen könnte.<br />

6.1 Erreichtes<br />

Aufbauend auf der Hardware einer interaktiven Fernbedienung, wurde zunächst eine<br />

neue Plattform für die praktische Evaluation von Sensornetzen entwickelt. Hierzu<br />

wurde die gesamte Softwarebasis, die nötig ist, um eine Sensornetzanwendung zu entwickeln<br />

1 , auf vielen Knoten gleichzeitig zur Ausführung zu bringen 2 <strong>und</strong> anschließend<br />

auszuwerten 3 , entworfen <strong>und</strong> implementiert.<br />

Diese Softwarebasis wurde dann genutzt, um ein neu konzipiertes Sensornetz-Routingprotokoll<br />

in einer solchen Sensornetzanwendung umzusetzen <strong>und</strong> auf einer größeren<br />

Anzahl von Sensorknoten in einer natürlichen Umgebung auszuführen. Das Routingprotokoll<br />

beinhaltet einige neue Ideen, um den Aufbau des Netzes sowie die Weiterleitung<br />

von Nachrichten durch das Netz, möglichst energieeffizient zu gestalten.<br />

Die entwickelte Sensornetzanwendung ermöglicht eine selbstorganisierte Vernetzung der<br />

Knoten bei einer beliebigen Topologie des Netzes. Lokale Probleme im Netz werden automatisch<br />

erkannt <strong>und</strong> (sofern möglich) umgangen. Es ist gr<strong>und</strong>sätzlich ein Datenaustausch<br />

zwischen zwei beliebigen Knoten im gesamten Netz möglich. Bei der Verwendung<br />

von gemeinsam genutzten Pfaden (z.B. bei einer zentralen Datensenke), erfolgt eine automatische<br />

Bündelung von Nachrichten, um die Anzahl der Weckvorgänge möglichst<br />

gering zu halten. Die Sendeleistung <strong>und</strong> die Datenrate werden ständig adaptiv angepasst,<br />

um den Energiebedarf einer Übertragung zwischen zwei benachbarten Knoten so<br />

gering wie möglich zu halten. Die Wahl der verwendeten Routen durch das Netz kann<br />

auf Anwendungsebene beeinflusst werden, so dass entweder Pfade mit hoher Bandbreite,<br />

niedriger Latenz oder hohem Energievorrat der Knoten auf dem Pfad bevorzugt<br />

werden. Bei mehreren möglichen Pfaden werden immer der Energievorrat der Knoten,<br />

die benötige Sendeleistung sowie die mögliche Datenrate auf dem Pfad berücksichtigt.<br />

Die Datenübertragung zwischen je zwei Nachbarn erfolgt auf mehreren verschiedenen<br />

1Hardware-Abstraktion, Funktionen für den Versand bzw. Empfang von Datenpaketen, ...<br />

2Kabelloses Software Deployment<br />

3Laufzeitprotokollierung, Messung der Akkuspannung, ...<br />

103


Kapitel 6. Zusammenfassung <strong>und</strong> Ausblick<br />

Übertragungskanälen, wobei diese dynamisch bewertet <strong>und</strong> potentiell gestörte Kanäle<br />

gemieden werden. Dies alles reduziert die Wahrscheinlichkeit von Übertragungsfehlern<br />

<strong>und</strong> somit die Anzahl der nötigen Übertragungen <strong>und</strong> steigert damit die Energieeffizienz<br />

des gesamten Netzes.<br />

In mehreren Versuchen wurde untersucht, ob <strong>und</strong> wie die Softwarebasis sowie die darauf<br />

aufsetzende Sensornetzanwendung funktioniert. Alle Ergebnisse waren zufriedenstellend.<br />

Die vor dem Entwurf gesetzten Anforderungen an das Gesamtsystem wurden<br />

erfüllt.<br />

6.2 Ausblick<br />

Die in dieser Arbeit entwickelte Sensornetzanwendung ist nur eine Möglichkeit für den<br />

Einsatz der neu entwickelten, auf der Betty TV-Fernbedienung basierenden, Sensorknotenplattform<br />

sowie der entworfenen Protokolle. Von den vielen potentiellen Verwendungszwecken<br />

seien hier nur ein paar genannt:<br />

Dank der umfangreichen Laufzeitprotokollierung würde es sich anbieten, mehrere verschiedene<br />

Sensornetz-Protokolle auf der Plattform zu implementieren <strong>und</strong> diese anschließend<br />

miteinander zu vergleichen. Vorstellbar wäre es auch, eine Kompatibilitätsschicht<br />

zu implementieren, um die für andere Plattformen entworfenen Protokolle mit<br />

geringem Aufwand ausführen <strong>und</strong> miteinander vergleichen zu können. Hierdurch könnte<br />

insbesondere auch gezeigt werden, wie stark sich die im jeweiligen Protokoll vorgesehenen<br />

Möglichkeiten zur Steigerung der Energieeffizienz tatsächlich auswirken.<br />

Ebenfalls vorstellbar wäre es, die vorhandene Hardwareabstraktion dazu zu nutzen,<br />

die Sensornetzanwendung in einer simulierten Umgebung auszuführen. Eine parallele<br />

Ausführung der gleichen Anwendung in der Realität könnte dazu genutzt werden, das<br />

Modell der Simulation besser an die echte Umgebung anzupassen bzw. die Güte der<br />

Simulation zu beurteilen.<br />

Eine weitere Möglichkeit wäre es, die ” Routing-Knoten“, die im Routingprotokoll des<br />

Hyperion-Sensornetzwerkes vorgesehen sind[17], mit Hilfe der in dieser Arbeit entstandenen<br />

Sensorknotenplattform zu realisieren 4 .<br />

Letztendlich ist es natürlich auch möglich, das in dieser Arbeit entstandene Protokoll<br />

<strong>und</strong> die Sensorknoten-Basis weiter zu entwickeln. Insbesondere die im Moment bei Bedarf<br />

zufällig ausgelösten Weckvorgänge könnten zur Steigerung der Effizienz bei einem<br />

stark ausgelasteten Netz besser koordiniert werden. Bei einem schwach ausgelasteten<br />

Netz 5 besteht hierzu jedoch eigentlich kein Handlungsbedarf.<br />

4 Genaugenommen war diese Überlegung der Anlass zu dieser Arbeit, da beide Plattformen über eine<br />

kompatible Funkschnittstelle verfügen <strong>und</strong> die Betty-Fernbedienungen vergleichsweise preiswert<br />

sind. Leider war das Hyperion-Sensornetzwerk selbst nicht weit genug fortgeschritten, um eine<br />

praktische Evaluation zu ermöglichen.<br />

5 In der Regel wird ein Sensornetz nur gelegentlich Daten übertragen.<br />

104


Abbildungsverzeichnis<br />

1.1 Üblicher Entwurf <strong>eines</strong> Sensornetzes. a) Ein Modell der Knoten <strong>und</strong> der<br />

Umwelt wird angefertigt. Aufgr<strong>und</strong> von Messungen mit einigen Knoten<br />

wird dieses Modell parametrisiert. b) Aufgr<strong>und</strong> dieses Modells wird ein<br />

großes Sensornetz entworfen <strong>und</strong> simuliert. c) Nicht bekannt ist, ob das<br />

so entworfene Netz auch in der Realität funktioniert. . . . . . . . . . . 3<br />

1.2 Ansatz in dieser Arbeit. a) Gr<strong>und</strong>lagen, wie ” Wake-on-Radio“, werden<br />

mit wenigen Knoten entwickelt. b) Gr<strong>und</strong>legende Protokolle werden mit<br />

einigen Knoten in einer realen Umgebung entworfen <strong>und</strong> getestet c) Erprobung<br />

<strong>und</strong> Verbesserung des Netzes mit vielen Knoten in einer realen<br />

Umgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />

2.1 Ein aus vielen identischen, zufällig verteilten Knoten bestehendes Netz.<br />

Beispielsweise könnten Knoten von einem Flugzeug abgeworfen werden<br />

(lila), sich zufällig verteilen <strong>und</strong> dann, nachdem sie gelandet sind, zu<br />

einem Netz zusammenschließen (rot). . . . . . . . . . . . . . . . . . . . 10<br />

2.2 Szenario Kamerasensorknotennetzwerk (aus [16]) . . . . . . . . . . . . 11<br />

2.3 Einsatzszenario ” Positionsbestimmung“ (aus [24]) . . . . . . . . . . . . 12<br />

3.1 Übersicht Hardwareplattform Diagramm . . . . . . . . . . . . . . . . . 18<br />

3.2 Übersicht Hardwareplattform Foto . . . . . . . . . . . . . . . . . . . . 19<br />

3.3 Übersicht über die Messwerte der Leistungsaufnahme des Systems während<br />

verschiedener Betriebsmodi. . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

3.4 Entladekurve <strong>eines</strong> aktiven <strong>und</strong> <strong>eines</strong> passiven Knotens. Der aktive Knoten<br />

sendet hierbei pro Sek<strong>und</strong>e ein Paket bei voller Sendeleistung aus.<br />

Der passive Knoten führt, außer der periodischen Messung der Batteriespannung<br />

<strong>und</strong> dem Abspeichern dieser im Flash, keine anderen Aktionen<br />

durch. Die übrige Zeit befinden sich beide Knoten in einem Power-Down<br />

Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />

3.5 Abstrahlcharakteristik von Sensorknoten: a) bei der Simulierung häufig<br />

zum Einsatz kommendes Modell[32, 33] <strong>und</strong> b) eine reale Messung der<br />

in dieser Arbeit verwendeten Antenne. Der Empfangsbereich entspricht<br />

der Umgebung um den Knoten, in dem eine Datenübertragung möglich<br />

ist. Im Störbereich ist eine Übertragung nicht mehr möglich, es werden<br />

jedoch u.U. Übertragungen anderer Knoten gestört! . . . . . . . . . . . 27<br />

105


Abbildungsverzeichnis<br />

4.1 Grober Überblick über die zweigeteilte Softwarearchitektur. Gezeigt werden<br />

die wesentlichen Komponenten der Firmware <strong>und</strong> der Anwendung. 32<br />

4.2 Aufteilung des Flashspeichers. Der erste Baustein wird verwendet, um<br />

die Firmware <strong>und</strong> die Anwendung abzulegen. Zusätzlicher Platz ist reserviert<br />

um eine temporäre Anwendung während des Anwendungsupdates<br />

anzulegen. Der restliche zur Verfügung stehende Speicherplatz wird für<br />

eine Nachrichtenwarteschlange samt dazugehörigem Index verwendet. Im<br />

zweiten Baustein wird, außer <strong>eines</strong> kleinen Bereichs für Konfigurationsdaten,<br />

nur das Protokoll der Laufzeit abgelegt. . . . . . . . . . . . . . . 34<br />

4.3 Teilkomponenten der Hauptanwendung . . . . . . . . . . . . . . . . . . 35<br />

4.4 Beispiel für eine Anwendung: Messung der Belegung des 433MHz Frequenzbereiches.<br />

a) <strong>und</strong> b) mit einem Störsender aus 1,5m bzw. 15m<br />

Entfernung. c) zeigt das ungestörte Spektrum. Die grau hinterlegten<br />

Kanäle sind die von der Software als ” belegt“ bewerteten <strong>und</strong> würden<br />

bei einer Datenübertragung vermieden. . . . . . . . . . . . . . . . . . . 36<br />

4.5 Verwaltung der Aufgaben in einem Ringbuffer. Es werden drei Zeiger<br />

(Leseposition, Freigabeposition <strong>und</strong> Schreibposition) verwendet, um den<br />

Zugriff auf die Datenstruktur zu koordinieren. Die Bedeutung des Inhalts<br />

<strong>eines</strong> einzelnen Eintrags ist im gewissen Rahmen abhängig vom Aufgabentyp,<br />

dargestellt sind die zur Verfügung stehenden Felder. . . . . . . 38<br />

4.6 Aufbau der Routingtabelle. Grün hinterlegt sind die Spalten, die zur<br />

Routingwahl verwendet werden. Die blau hinterlegten Spalten dienen<br />

der adaptiven Anpassung von Datenrate <strong>und</strong> Sendeleistung zwischen<br />

zwei Nachbarn. Dargestellt sind einige Einträge aus Sicht vom Knoten<br />

mit der Nummer 1: a) Route-Request von Knoten 1 zu Knoten 2. b)<br />

Nachbarschaft zu Knoten 3. c) Bestehende Route zu Knoten 100 über<br />

4 Hops. d) Route-Request von Knoten 4 zu Knoten 55, welches über 3<br />

bei 1 eingegangen ist. e) Nicht verwendeter Eintrag. . . . . . . . . . . . 39<br />

4.7 Software Deployment Varianten: a) an einzelne Knoten über die serielle<br />

Schnittstelle <strong>und</strong> b) Übertragung an viele Knoten gleichzeitig per Funk. 43<br />

4.8 Automatische Codeerzeugung: Aus der ELF-Datei der Firmware <strong>und</strong><br />

den Headerdateien erzeugt das Konvertier-Skript neuen Code. Dieser<br />

wird zusammen mit dem eigentlichen Anwendungscode kompiliert <strong>und</strong><br />

ergibt so die ELF-Datei der Anwendung. Der automatisiert erzeugte<br />

Code enthält im Wesentlichen Pointer auf die Funktionen der Firmware. 45<br />

4.9 Minimaler Aufbau <strong>eines</strong> Paketes. Das 16 Bit breite Längenfeld wird nur<br />

verwendet, wenn die Paketlänge nicht durch 8 Bit angegeben werden<br />

kann. In diesem Fall wird das reguläre Feld auf 255 gesetzt <strong>und</strong> die<br />

wirkliche Länge im breiteren Längenfeld gespeichert. Dies reduziert den<br />

Overhead für kleine Pakete <strong>und</strong> ermöglicht dennoch Pakete mit einer<br />

Länge von bis zu 64 kByte. . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />

4.10 Aufbau der direkt von der Firmware verwendeten Pakete. . . . . . . . . 48<br />

106


Abbildungsverzeichnis<br />

4.11 Darstellung, der von der Firmware angebotenen Möglichkeiten, der Paketübertragung:<br />

a) Broadcast an alle Empfänger im Empfangsbereich.<br />

b) Unicast an einen bestimmten Empfänger. c) Unicast an einen bestimmten<br />

Empfänger mit Empfangsbestätigung. d) Weckvorgang <strong>eines</strong><br />

Knotens via Wake-on-Radio“. . . . . . . . . . . . . . . . . . . . . . . .<br />

”<br />

4.12 Aufbau der für das kabellose Softwareupdate verwendeten Pakete. . . .<br />

4.13 Ablauf der Softwareaktualisierung über Funk. Die blau hinterlegten Punkte<br />

entsprechen den, im Text beschriebenen, Situationen. Um die Grafik<br />

übersichtlich zu halten, sind nur zwei Empfänger angegeben – es könnten<br />

jedoch H<strong>und</strong>erte sein! Ebenfalls werden nicht alle möglichen Fehlersitua-<br />

50<br />

51<br />

tionen, mit denen das Protokoll umgehen kann, gezeigt. . . . . . . . . .<br />

4.14 Aufbau der Pakete, die zum Erstellen der Nachbarschaftsbeziehungen<br />

52<br />

verwendet werden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />

4.15 Aufbau der für das Verwalten von Routen verwendeten Pakete ( RREQ“,<br />

”<br />

” RREP“ <strong>und</strong> RERR“). . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

”<br />

4.16 Behandlung <strong>eines</strong> eingehenden Route-Request“-Paketes . . . . . . . .<br />

”<br />

4.17 Behandlung <strong>eines</strong> eingehenden Route-Reply“-Paketes . . . . . . . . . .<br />

”<br />

4.18 Behandlung <strong>eines</strong> von Knoten A“ eingehenden Route-Error“-Paketes.<br />

” ”<br />

4.19 Legende der Signalisierung <strong>und</strong> Routenmanagement Grafik . . . . . . .<br />

4.20 Suchen <strong>und</strong> Finden einer Route im Netz: Knoten A fordert eine Route<br />

zum Knoten G an. Es sind hierbei die logischen Schritte dargestellt <strong>und</strong><br />

nicht unbedingt die zeitlich exakte Abfolge. Im grauen Kasten ist die<br />

58<br />

60<br />

61<br />

63<br />

64<br />

Routingtabelle von Knoten A im jeweiligen Schritt gezeigt. . . . . . . .<br />

4.21 Aufbau der zum Nachrichtenaustausch verwendeten Pakete. (DATASE-<br />

64<br />

TUP, DATA <strong>und</strong> DATAFINISH) . . . . . . . . . . . . . . . . . . . . . 65<br />

4.22 Ablauf des Nachrichtenaustauschs zwischen zwei benachbarten Knoten.<br />

Dargestellt ist nur der logische Ablauf, ggf. nötige Übertragungswiederholungen<br />

sind nicht gezeigt! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .<br />

4.23 Übermittlung einer Nachricht von Knoten A zu Knoten G: In Teilbild<br />

c) fällt ein auf dem Pfad liegender Knoten aus. Die Nachricht in Teilbild<br />

d) kann daher nicht zugestellt werden. In Teilbild e) wird nur eine kurze<br />

Fehlermeldung auf dem Pfad zurückgeschickt, nicht jedoch die gesamte<br />

Nachricht. Da Knoten B einen alternativen Pfad kennt, wählt er diesen,<br />

ansonsten wäre die Fehlermeldung einen weiteren Schritt auf dem Pfad<br />

zurückgeschickt worden. Teilbild i) Zeigt den verwendeten Pfad, der auch<br />

in der Nachricht vermerkt ist. Knoten B merkt sich, dass die Route über<br />

C fehlerhaft ist <strong>und</strong> würde bei folgenden Nachrichten direkt den Weg<br />

66<br />

über D wählen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />

5.1 Übersicht über das Verzeichnis der implementierten Software. Mit Ausnahme<br />

der Hauptanwendung sind nur die Unterordner <strong>und</strong> nicht die<br />

Dateien gezeigt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />

5.2 Verteilung der über 22000 Zeilen Programmcode auf Firmware, Hauptanwendung<br />

<strong>und</strong> die übrigen Anwendungen. . . . . . . . . . . . . . . . . 74<br />

107


Abbildungsverzeichnis<br />

5.3 Verschiedene Zugriffsarten auf die Register des Funkchips[36] . . . . . . 75<br />

5.4 Bildschirmfotos während <strong>eines</strong> erfolgreichen Softwareupdate-Durchlaufs 83<br />

5.5 Hauptschleifen der Implementierung des Protokolls für den Sender <strong>und</strong><br />

die Empfänger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83<br />

5.6 Zustandsautomat des Empfängers für die Behandlung eingehender Pakete<br />

des Softwareupdates . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />

5.7 Testnetz aus 30 Knoten . . . . . . . . . . . . . . . . . . . . . . . . . . . 94<br />

5.8 Knoten bei einem realen Test . . . . . . . . . . . . . . . . . . . . . . . 94<br />

5.9 Experiment ” Behandlung von Fehlern auf dem Datenpfad“ in einem Netz<br />

aus 30 Knoten. Die Teilabbildungen zeigen jeweils das noch aktive Netz<br />

(blau, grün), die in diesem Schritt ausgefallenen Knoten (rot) <strong>und</strong> den<br />

Datenpfad, welcher automatisch gef<strong>und</strong>en wurde (Pfeile). . . . . . . . . 96<br />

5.10 Gemessenes Interrupt-Signal der Echtzeituhr von zwei Knoten unmittelbar<br />

nach einer Synchronisierung. Die Genauigkeit von 40s entspricht<br />

etwas über einer Periode des 32768Hz Quarzes der Uhr. . . . . . . . . . 97<br />

5.11 Messung der Übertragungseffizienz <strong>und</strong> der Belastbarkeit des Netzes . . 99<br />

5.12 Messung der Signalstärke <strong>eines</strong> Knotens in Abhängigkeit zur Entfernung<br />

<strong>und</strong> der Ausrichtung des Knotens innerhalb <strong>eines</strong> Gebäudes . . . . . . 101<br />

108


Literaturverzeichnis<br />

[1] H.-W. Gellersen, M. Beigl, H. Krull. The MediaCup: Awareness Technology embedded<br />

in an Everyday Object. Technical report, 1th Int. Sym. Handheld and<br />

Ubiquitous Computing (HUC99) Karlsruhe, 1999.<br />

[2] Raghavendra, S. Cauligi, Sivalingam, M. Krishna; Znati, Taieb (Eds.). Wireless<br />

Sensor Networks. Number 978-1-4020-7883-5. Springer, 2005.<br />

[3] Crossbow. MICA2 Wireless Measurement System.<br />

[4] M. Youssef, N. El-Sheimy. Wireless Sensor Network: Research vs. Reality Design<br />

and Deployment Issues. In CNSR ’07: Proceedings of the Fifth Annual Conference<br />

on Communication Networks and Services Research, pages 8–9, Washington, DC,<br />

USA, 2007. IEEE Computer Society.<br />

[5] Y. Wen, W. Zhang, R. Wolski and N. Chohan. Simulation-based augmented reality<br />

for sensor network development. In SenSys ’07: Proceedings of the 5th international<br />

conference on Embedded networked sensor systems, pages 275–288, New York, NY,<br />

USA, 2007. ACM.<br />

[6] C. Mall, A. Suri, V. Kunchakarra, S. S. Iyengar, R. Kannan, A. Durresi and S.<br />

Sastry. OMNeT++ Discrete Event Simulation System.<br />

[7] R. Wilson R. Villa and Fabio Crestani. Network Simulator ns-2. In Proceedings<br />

of IPMU 2004, International Conference on Information Processing and Management<br />

of Uncertainty in Knowledge-Based Systems, pages 528–535, 2004.<br />

[8] H. N. Pham, D. Pediaditakis, and A. Boulis. Castalia: A Simulator for WSN.<br />

http://castalia.npc.nicta.com.au/.<br />

[9] H. N. Pham, D. Pediaditakis, and A. Boulis. From Simulation to Real Deployments<br />

in WSN and Back. Networks and Pervasive Computing program, National ICT<br />

Australia, 2007.<br />

[10] Crossbow. TelosB Mote Plattform.<br />

[11] J. N. Al-karaki, A. E. Kamal. Routing Techniques in Wireless Sensor Networks:<br />

A Survey. IEEE Wireless Communications, 2004.<br />

[12] G. Ács, L. Buttyán. A Taxonomy of Routing Protocols for Wireless Sensor Networks,<br />

2007.<br />

109


Literaturverzeichnis<br />

[13] J. Park, S. Sahni. Maximum Lifetime Routing In Wireless Sensor Networks, 2005.<br />

[14] A. Manjeshwar, D.P. Agrawal. TEEN: a routing protocol for enhanced efficiency in<br />

wireless sensor networks. IEEE Parallel and Distributed Processing Symposium.,<br />

Proceedings 15th International, 2001.<br />

[15] W. R. Heinzelman, A. Chandrakasan, H. Balakrishnan. Energy-efficient Communication<br />

Protocols for Wireless Microsensor Networks. Proc. Hawaaian Int’l Conf.<br />

on Systems Science, 2000.<br />

[16] T. Armstrong, M. Mende. <strong>Konzeption</strong> <strong>und</strong> Entwurf einer FPGA-basierten<br />

Sensorknoten-Entwicklungsplattform. <strong>Diplomarbeit</strong>, Universität Karlsruhe (TH),<br />

2007.<br />

[17] M. Fischer. <strong>Konzeption</strong> <strong>eines</strong> energieeffizienten Protokolls für ein Kamerasensornetzwerk.<br />

<strong>Diplomarbeit</strong>, Universität Karlsruhe (TH), 2007.<br />

[18] D. Dueck. Anbindung <strong>eines</strong> CMOS Bildsensor an den Hyperion-Sensorknoten.<br />

Studienarbeit, Universität Karlsruhe (TH), 2007.<br />

[19] S.Kobbe. Entwurf <strong>und</strong> Implementierung der Infrastruktur für den FPGA-basierten<br />

Sensorknoten Hyperion. Studienarbeit, Universität Karlsruhe (TH), 2007.<br />

[20] W. Allen, G. Lorincz, K. Ruiz, M. Marcillo, O. Johnson, J. Lees, J. Welsh, M. Div.<br />

of Eng. & Appl. Sci., Harvard Univ., Cambridge, MA, USA. Deploying a wireless<br />

sensor network on an active volcano. In Internet Computing, IEEE, volume 10,<br />

Issue: 2, pages 18– 25. 2006.<br />

[21] R. Murty, G. Mainland, I. Rose, A. R. Chowdhury, A. Gosain, J. Bers, and M.<br />

Welsh. CitySense: A Vision for an Urban-Scale Wireless Networking Testbed.<br />

In Proceedings of the 2008 IEEE International Conference on Technologies for<br />

Homeland Security, Waltham, MA. 2008.<br />

[22] R. Kistler, A. Klappoth, p.a. media Verlag. Das Haus, das vordenkt. 2007.<br />

[23] R. Kistler, S. Knauth and A. Klapproth, Lucerne University of Applied Sciences<br />

and Arts. EnerBee - Example of an Advanced Metering Infrastructure based on<br />

ZigBee, 2008.<br />

[24] A. Chandra-Sekaran, G. Flaig, C. Kunze, W. Stork, K. D. Müller-Glaser. Efficient<br />

Resource Estimation During Mass Casualty Emergency Response Based on<br />

a Location Aware Disaster Aid Network. European Conference on Wireless Sensor<br />

Networks Bologna Italy. Lecture Notes in Computer Science, Springer Berlin /<br />

Heidelberg, 2008.<br />

[25] M. Welsh D. Malan, T. Fulford-jones and Steve Moulton. Codeblue: An ad hoc<br />

sensor network infrastructure for emergency medical care. In In International<br />

Workshop on Wearable and Implantable Body Sensor Networks, 2004.<br />

110


[26] Crossbow. MICAz Wireless Measurement System.<br />

Literaturverzeichnis<br />

[27] Artikel der Zeitschrift Stern über die Betty TV Fernbedienung. http://www.<br />

stern.de/computer-technik/technik/:TV-Fernbedienungen-Daten-Betty/<br />

596541.html.<br />

[28] Boop: Open Source Firmware für die Betty Fernbedienung. http://bettyhacks.<br />

com/wiki/index.php/Boop.<br />

[29] M. Pedram, Q. Wu. Design Considerations for Battery-Powered Electronics, 1999.<br />

[30] D. Panigrahi, C. Chiasserini, S. Dey, R. Rao and K. Lahiri. Battery Life Estimation<br />

of Mobile Embedded Systems. In Proc. Int. Conf. VLSI Design, pages 55–63, 2001.<br />

[31] R. Rao, S. Vrudhula, S. Rakhmatov, University of Arizona. Battery modeling for<br />

energy aware system design, 2003.<br />

[32] M. Zuniga, B. Krishnamachari. Analyzing the transitional region in low power<br />

wireless links. In In First IEEE International Conference on Sensor and Ad hoc<br />

Communications and Networks (SECON, pages 517–526, 2004.<br />

[33] G. Zhou, T. He, S. Krishnamurthy and J. A. Stankovic. Impact of Radio Irregularity<br />

on Wireless Sensor Networks. In in MobiSYS ’04: Proceedings of the<br />

2nd international conference on Mobile systems, applications, and services, pages<br />

125–138. ACM Press, 2004.<br />

[34] Free Software Fo<strong>und</strong>ation. GNU General Public License 3.0, 2007. http://www.<br />

gnu.org/licenses/gpl-3.0.html.<br />

[35] Ronetix Cross Development Toolchain (arm-elf-4.1.1, newlib). http://www.<br />

ronetix.at/software.html.<br />

[36] Chipcon/Texas Instruments. CC1100 Low-Cost Low-Power Sub- 1 GHz RF Transceiver.<br />

[37] E. Belding-Royer C. Perkins and S. Das. Ad hoc On-Demand Distance Vector<br />

(AODV) Routing. RFC 3561 (Experimental), 2003.<br />

[38] B. Awerbuch, D. Holmer and H. Rubens. The pulse protocol: Energy efficient<br />

infrastructure access. Proceedings of IEEE INFOCOM 2004, Hong Kong, China,<br />

2004.<br />

[39] D. Estrin R. Govindan. Directed diffusion: A scalable and robust communication<br />

paradigm for sensor networks. pages 56–67, 2000.<br />

[40] S. Brown, Dept. of Computer Science, National University of Ireland, Maynooth,<br />

C.J. Sreenan, Mobile & Internet Systems Laboratory, Dept. of Computer Science,<br />

University College Cork, Ireland. Updating software in wireless sensor networks:<br />

A survey, 2006. Technical Report UCC-CS-2006-13-07.<br />

111


Literaturverzeichnis<br />

[41] P. Levis, N. Lee, M. Welsh and D. Culler. TOSSIM: Accurate and Scalable Simulation<br />

of Entire TinyOS Applications.<br />

[42] P. Levis and N. Lee. TOSSIM: A Simulator for TinyOS Networks, 2003.<br />

[43] P. Levis, S. Madden, J. Polastre, R. Szewczyk, A. Woo, D. Gay, J. Hill, M. Welsh,<br />

E. Brewer and David Culler. Tinyos: An operating system for sensor networks. In<br />

in Ambient Intelligence. Springer Verlag, 2004.<br />

[44] C.L. Hedrick. Routing Information Protocol. RFC 1058 (Historic), 1988. Updated<br />

by RFCs 1388, 1723.<br />

[45] K. Srinivasan and P. Levis. RSSI is Under Appreciated. In Proceedings of the<br />

Third Workshop on Embedded Networked Sensors (EmNets), 2006.<br />

[46] R. Grossmann, J. Blumenthal, F. Golatowski and D. Timmermann. Localization<br />

in Zigbee-based Sensor Networks.<br />

[47] Chipcon/Texas Instruments. CC2430 System-on-Chip Solution for 2.4 GHz IEEE<br />

802.15.4 / ZigBee.<br />

[48] NXP. UM10114 Volume 1: LPC2210/2220 User Manual.<br />

[49] Networked and Embedded Systems Lab (NESL) at UCLA. SOS: an operating<br />

system for mote-class wireless sensor networks.<br />

112

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!