Diplomarbeit ? Konzeption und Evaluierung eines ... - CES
Diplomarbeit ? Konzeption und Evaluierung eines ... - CES
Diplomarbeit ? Konzeption und Evaluierung eines ... - CES
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