Konzipierung und Implementierung von automatisiertem WLAN

Transcription

Konzipierung und Implementierung von automatisiertem WLAN
Fachbereich Informatik
Bachelorarbeit
Konzipierung und Implementierung von automatisiertem
WLAN–Verbindungsaufbau im KFZ
Dirk Andres
Matrikelnummer: 646066
Darmstadt, 17. Oktober 2005
Betreuende Professoren:
Prof. Dr. Joachim Wietzke
Prof. Dr. Klaus Kasper
Inhaltsverzeichnis
1. Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1 Motivation der Bachelorarbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.1
Konventionelle WLAN–Szenarien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.2
Neue Möglichkeiten und Einsatzgebiete . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2 Aufbau der Bachelorarbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3 Inhalt der beigefügten CD–ROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2. Einführung in die WLAN–Technologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.1 WLAN–Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.2 Einordnung der WLAN–Technologie im ISO OSI Schichtenmodell . . . . . . . . . . . . . . .
6
2.3 Infrastrukturmodi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3.1
Infrastruktur–Modus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3.2
Ad–hoc–Modus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.4 SSID und BSSID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.5 Sicherheit im WLAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
3. Anforderungen an WLAN–Lösungen im KFZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.1 Wahl und Integration geeigneter Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.2 Übersichtliche grafische Anwendungsrealisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.3 Spezifizierung der WLAN–Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.4 Konfliktfreier Wechsel der Betriebsmodi und zustandsabhängige Benutzerinteraktion
12
3.4.1
Automatisierte IP–Adressvergabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.4.2
Zustandsabhängige Verbindungsvisualisierung . . . . . . . . . . . . . . . . . . . . . . .
13
3.5 Dynamischer Verbindungsaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
4. Verifizierung vorhandener Connection Manager Lösungen . . . . . . . . . . . . . . . . . . . . .
15
4.1 Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
4.2 Der Pocket PC 2003 Connection Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
4.2.1
Aufwandsbetrachtung im Infrastrukturszenario . . . . . . . . . . . . . . . . . . . . . . .
16
4.2.2
Aufwandsbetrachtung im Ad–hoc–Szenario . . . . . . . . . . . . . . . . . . . . . . . . . .
17
4.3 Zusammenfassende Bewertung für den Einsatz im KZF . . . . . . . . . . . . . . . . . . . . . . .
18
ii
5. Vorbetrachtungen im allgemeinen WLAN–Szenario . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
5.1 Notwendigkeit einer individuellen Softwarelösung . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
5.2 Programmiersprache und Entwicklungsumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
5.3 Anmerkungen zur Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
5.4 Grundlegende Konzipierungsüberlegungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
5.5 Die Wireless Zero Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
5.6 802.11–Netzwerktreiber–Architektur und NDIS USER MODE I/O PROTOCOL . . . . .
24
5.6.1
802.11–Netzwerktreiber–Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
5.6.2
Implementierungsaspekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
5.6.3
Wireless Research API (WRAPI) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
6. WLAN–Verbindungsaufbau im Ad–Hoc–Szenario . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
6.1 IP–Adressen–Problematik und Lösung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
6.1.1
Bewertung konventioneller Verfahren zur IP–Adressvergabe . . . . . . . . . . . .
29
6.1.2
Abwandlung von APIPA durch Registrierungsmanipulation . . . . . . . . . . . . . .
30
6.1.3
IP–Adresszuweisung mittels IPHelper Funktionen . . . . . . . . . . . . . . . . . . . . .
34
6.2 Adapterkonfiguration über das NDISUIO–Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . .
36
6.2.1
Setzen des Infrastrukturmodus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
6.2.2
Setzen des Authentifizierungsmodus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
6.2.3
Setzen der SSID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
6.3 Netzwerkscan und dynamischer Verbindungsaufbau . . . . . . . . . . . . . . . . . . . . . . . . .
42
6.4 Integration einer 3rd Party VOIP–Anwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
6.4.1
Voraussetzungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
6.4.2
Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
6.4.3
Testdurchführung und Bewertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
7. WLAN–Verbindungsaufbau im Infrastruktur–Szenario . . . . . . . . . . . . . . . . . . . . . . . .
48
7.1 Adapterkonfiguration über das NDISUIO–Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . .
48
7.2 Dynamischer Verbindungsaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
7.3 Integration einer Informationsanwendung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
8. Anmerkungen zur Entwicklung unter Windows XP . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
8.1 NDISUIO–Schnittstellendefinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
8.2 Enumeration der WLAN–Adapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
8.3 Assoziation des Adapters mit dem NDISUIO Handle . . . . . . . . . . . . . . . . . . . . . . . . .
57
iii
9. Prioritätsgesteuerter WLAN–Verbindungsaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
9.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
9.2 802.11–Netzwerkscan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
9.3 Implementierung eines BSSID List Scans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
9.4 Verwertung der gesammelten Geräteinformationen . . . . . . . . . . . . . . . . . . . . . . . . . .
64
10. WLAN–Integration eines Embedded Automotive Frameworks unter QNX . . . . . . . . .
67
10.1 Systembedingte Voraussetzungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
10.2 Realisierung mittels WLAN–Karte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
68
10.2.1 Verbindungsaufbau mittels Systembefehlen . . . . . . . . . . . . . . . . . . . . . . . . . . .
68
10.2.2 Integration der Systemkommandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
10.2.3 Verbindungsaufbau mittels DeviceControl–Zugriffen . . . . . . . . . . . . . . . . . . . . .
73
10.3 Realisierung mittels Ethernet–WLAN–Bridge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
10.3.1 Beschaffenheit der Netzwerkgeräte und Integration in das bestehende
Kabelnetzwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
10.3.2 Interface–Bridging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
10.3.3 Konfiguration des Access Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
10.3.4 Konfiguration der Ethernet–WLAN–Adapter . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
10.3.5 Dynamische IP–Adresszuweisung für Endgeräte . . . . . . . . . . . . . . . . . . . . . . .
77
10.4 Verbindungsgesteuerte Client–Server–Kommunikation . . . . . . . . . . . . . . . . . . . . . . . .
78
11. Ergebnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
11.1 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
11.2 Bewertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
11.3 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
A
Abbildungsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
B
Screenshots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
C
Listings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
D
Quellenverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
E
Eigenständigkeitserklärung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
iv
1. Einleitung
1.1
Motivation der Bachelorarbeit
Die WLAN-Technologie erstreckt sich heutzutage auf viele Bereiche unseres Alltages. Dabei
werden längst nicht alle Möglichkeiten dieser Technologie genutzt. Ziel der vorliegenden
Arbeit ist es, denkbare WLAN–basierte Szenarien und Lösungen von praktischer und
softwaretechnischer Seite zu beleuchten.
1.1.1
Konventionelle WLAN–Szenarien
Das Hautpeinsatzgebiet von WLAN–Lösungen beschränkt sich bisher weitgehend auf privat
installierte Access Points, zu denen ausschließlich mit dem eigenen Laptop oder PC
verbunden wird. Die Konfiguration der Geräte erfolgt im Idealfall einmal, was den Anwender
in vielen Fällen schon einiges an Zeit und Geduld kosten kann.
Der Vorteil der WLAN–Technologie wird hierbei in der kabellosen Installation gesehen.
Lästiges Kabelgewirr oder Wanddurchbrüche gehören der Vergangenheit an. Auch die
Internetanbindung des Laptops aus dem heimischen Garten kann begeistern.
Die Einsatzgebiete dieser sich immer weiter etablierenden Technologie sind dabei jedoch
bei weitem nicht ausgenutzt. Tausende von Tank– und Raststättenbetreiber haben diesen
Gedanken bereits aufgegriffen und WLAN Basisstationen installiert. Gegen Bezahlung steht
es dem Kunden frei mit eigenen Systemen ins Internet zu gehen. Die Einrichtungsarbeit
bleibt dem Anwender selber überlassen. Innovative Nutzungsmöglichkeiten wurden bisher
jedoch nicht umgesetzt.
1.1.2
Neue Möglichkeiten und Einsatzgebiete
Die bereits eingerichteten Netzwerkschnittstellen könnten einen zentralen Einstiegspunkt in
ein weiteres, viel versprechendes Anwendungsgebiet ermöglichen: Der Einsatz von WLAN–
Anwendungen im KFZ.
Viele Leute besitzen bereits heute das nötige Equipment: Ein WLAN–fähiger Laptop, ein
handelsüblicher PDA oder ein Handy, welches mit Festplatte und Wireless–LAN–Adapter
ausgerüstet ist.
Der Einsatz eines Softwaremoduls, welches über die Möglichkeit verfügt, spezifische
WLAN–Profile zu verwalten und je nach Bedarf Netzwerkanbindungen anzustreben,
erschließt eine Vielzahl von realisierbaren Szenarien. Ein Beispiel wäre das Angebot eines
digitalen Bonusprogrammes. Beim Anfahren einer Tankstelle wird automatisiert eine
-1-
Einleitung
Verbindung zu einem Tankstellenserver hergestellt, welcher den Besuch registriert und den
treuen Kunden mit digitalen Prämien, wie mp3s oder Spielen, beschenkt. Werbespots oder
Angebotsinformationen weisen den Kunden auf Sonderaktionen im Tankstellenshop hin.
Selbst das Bezahlen über digitale Zertifikate könnte realisiert werden. Hierbei verbindet sich
das Programm eigenständig mit der benutzen Zapfsäule, welche die getankte Benzinmenge
in Rechnung stellt und von dem entsprechenden Konto abbucht.
Befindet sich das Kraftfahrzeug wieder auf der Straße ist es mit einer Anwendung möglich
mit anderen Fahrern per WLAN–Telefonie zu kommunizieren. Über die vollständige
Automatisierung ist ein Voice over IP Telefonat ohne Aufmerksamkeitsdefizit möglich.
Die Anwendung ließe sich weiterhin auf In Car Systeme ausweiten. Beim Besuch einer
Werkstatt werden gespeicherte Daten genutzt um Wartungsarbeiten einzuplanen und
Angebote einzuholen. Softwareupdates werden bei Bedarf drahtlos und ohne Wartezeit
installiert.
1.2
Aufbau der Bachelorarbeit
Nach einer kurzen technischen Einführung in die WLAN–Technologie werden grundlegende
Anforderungen an den Verbindungsaufbau im KFZ erarbeitet.
Danach folgt die Betrachtung einer systemeigenen Software unter PocketPC 2003 zur
Verbindungsverwaltung nach erstellten Kriterien. Eine abschließende Bewertung weist auf
Schwachstellen des Programms im Bezug auf den Einsatz in einem Kraftfahrzeug hin und
motiviert für den Einsatz einer individuell erstellten Software.
Der Kernteil der Arbeit beleuchtet den automatisierten WLAN–Verbindungsaufbau im KFZ
aus verschiedenen Perspektiven.
Auf einem Handheld unter PocketPC 2003 wurde eine Software entwickelt, welche versucht
den gestellten Anforderungen gerecht zu werden. Gesammelte Erfahrungen bei der
Auseinandersetzung
mit
der
WLAN–Technologie
boten
Eckpfeiler
der
Konzipierungsüberlegungen.
Die WLAN–Treiber–Architektur und das NDISUI–Protokoll dienen als Grundlage für die
Implementierung des Verbindungsaufbaues in verschiedenen Betriebsmodi.
Automatisierte IP–Adresszuweisung im Ad–hoc–Netzwerk und die Suche nach verbundenen
Geräten bilden eine weitere Komponente einer erfolgreichen Netzwerkkommunikation und
werden ausführlich an Hand von Quelltextauszügen vorgestellt.
Danach
werden
ausgesuchte
Anwendungsszenarien
und
ihre
Softwareumsetzung
fokussiert.
Nach grundlegenden Anmerkungen zur Implementierung unter Windows XP und variabler
Hardware geht die Arbeit auf Aspekte des prioritätsgesteuerten WLAN–Verbindungsaufbaus
ein. Hierbei werden Informationen verfügbarer drahtloser Netzwerke ausgelesen und
verwertet.
-2-
Einleitung
Die Anwendung wählt selbsttätig zwischen vorhandenen Alternativen in Abhängigkeit von
Signalstärke, Infrastrukturmodus oder Netzwerkkennung.
Vorliegende Arbeit wendet sich nun einer Plattform zu, welche ausschließlich für den Einsatz
in einem Kraftfahrzeug konzipiert wurde. Es handelt sich hierbei um ein Embedded
Automotive Framework unter dem echtzeitfähigen Betriebssystem QNX 6.3.
Dieses zeichnet sich durch einige systembedingte Besonderheiten aus. Da WLAN–Treiber
und systemeigene Verwaltungsmöglichkeiten kaum vorhanden sind, nimmt sich die
Abhandlung im Weiteren den aufgetretenen Problemen und Lösungsansätzen im Bezug auf
die drahtlose Netzwerkanbindung an. Die Integration von WLAN–Karten wird ebenso
berücksichtigt wie die Anbindung externer Ethernet–WLAN–Brücken.
Softwaregesteuerte Konfiguration und Verbindungserkennung steht bei der Betrachtung im
Vordergrund.
Ebenso wird ein Anwendungsszenario entworfen, welches auf einer automatisierten Client–
Server–Kommunikation basiert.
Die Arbeit bemüht sich die vorgestellten Sachverhalte verständlich von allgemeinen
Grundlagen bis hin bis zu sehr speziellen Aspekten, die für die Implementierung relevant
sind, zu beleuchten.
Da das Thema einen sehr starken Praxisbezug aufweist und vorgestellte Ideen bereits im
Vorfeld
realisiert
Anmerkungen
zur
wurden,
kann
das
vorliegende
Implementierungstechnik
und
Manuskript
den
durch
beigefügten,
umfangreiche
kommentierten
Quelltextauszügen als Einführung und Leitfaden in die Implementierung softwaregesteuerter
WLAN–Adapterkonfigurationen, speziell unter Windows, Verwendung finden.
1.3
Inhalt der beigefügten CD–ROM
Auf der beigefügten, selbstständig startenden, CD–ROM befindet sich eine HTML Version
der vorliegenden Arbeit. Querverweise sind mit Hyperlinks zu den betreffenden Stellen
versehen. Ebenso werden Verweise auf Software und Quelltexte, welche in den Kapiteln
Erwähnung finden, eingebunden.
Diese Softwaresektion enthält frei verfügbare Programme für den Einsatz auf PocketPC
2003, Windows XP und QNX. Einige Programme liegen zusätzlich in Form von Quelltexten
vor. Weiterhin sind der vollständige Quelltext und eine kompilierte Version der eigens
entwickelten Software gespeichert. Dies beinhaltet ein Programm zur automatisierten WLAN
Verbindungsherstellung unter PocketPC 2003, welches für den HP iPAQ 5500 entwickelt
wurde,
weiterhin
eine
Software,
welche
sich
mit
dem
hardwareunabhängigen,
prioritätsgesteuerten Verbindungsaufbau unter Windows XP beschäftigt und eine Client–
Server–Anwendung mit WLAN–Verbindungsdedektion unter QNX.
Die Softwareauswahl gliedert sich nach Kapiteln, Betriebssystem und Plattform. Die
Programme und Quelltexte können über den Browser auf der lokalen Festplatte gespeichert
-3-
Einleitung
und ausgeführt werden. Informationen zur Installation werden innerhalb der HTML–
Dokumentation angeboten, so wie in beigelegten readme.txt Dateien.
Eine
Linksammlung
liefert
Hintergrundinformationen
zu
implementierungsrelevanten
Aspekten.
Abrundend wird ein recht populistischer Artikel vorgestellt, welcher für die Veröffentlichung in
einem Computermagazin geschrieben wurde.
-4-
2. Eine Einführung in die WLAN–Technologie
Der Begriff WLAN steht als Akronym für "Wireless Local Area Network".
Man versteht hierunter ein "drahtloses" lokales Funknetzwerk, welches sich durch räumliche
Flexibilität,
innerhalb
eines
vorgegebenen
Empfangsbereiches,
auszeichnet.
Verkabelungsprobleme und Kabelgewirr können elegant umgangen werden. Der Einsatz
einer kabellosen Netzwerktechnik für tragbare Geräte, wie Notebooks oder Handhelds,
bringt erhebliche Vorteile mit sich, allerdings auch einige Nachteile.
Im Folgenden möchte ich auf einige Grundlagen und Begrifflichkeiten, sowie auf einige
technische Details der Wireless–LAN–Architektur eingehen.
Sicherlich erhebt diese kurze Einführung in Technologie drahtloser Netzwerke keinen
Anspruch auf Vollständigkeit. Es wird hierbei lediglich auf Aspekte eingegangen, welche für
den automatisierten Verbindungsaufbau von Bedeutung sind und das Verständnis, der im
Weiteren beschriebenen Verfahren, fördert.
2.1
WLAN–Standards
Die Bezeichnung WLAN bezieht sich im Grunde genommen auf drahtlose Netzwerke im
Allgemeinen und umfasst Standardisierungen wie HiperLan/2, Bluetooth, DECT, HomeRF
und IrDA.
Technisch korrekt beschäftigt sich diese Arbeit ausschließlich mit dem IEEE 802.11
Standard. Das Institute of Electrical and Electronics Engineers (IEEE) verabschiedete seit
1997 zahlreiche standardisierte Spezifikationen. Diese wurden in Abhängigkeit von der
zeitlichen Reihenfolge alphabetisch, von 802.11a bis hin zu 802.11i (2005), gekennzeichnet.
Es handelt sich hierbei größtenteils um regional unterschiedliche Anpassungen sowie
technische Erweiterungen.
Die in Deutschland am häufigsten vorzufindenden Varianten sind der 802.11b und der
802.11g Standard. Beide Ableger der 802.11–Technologie stellen 13 Kanäle in Deutschland
zur Verfügung und senden im 2.4 - 2.4835 GHz Band [MLMMS04]. Ein gravierender
Unterschied zeigt sich jedoch in den Datenraten und der daraus resultierenden
Übertragungsgeschwindigkeit. Während der b–Standard lediglich maximal 11 Mbit/s
Datendurchsatz bietet, kann der abwärtskompatible g–Standard mit bis zu 54 Mbit/s
aufwarten. Allerdings sind diese Werte rein theoretischer Natur. In der Praxis muss
berücksichtigt werden, dass sich alle Geräte im Netzwerk diese Bandbreite teilen. Zudem
wird diese durch einschränkende Faktoren wie z.B. Stahlwände oder störende Funksignale
auf einen reellen Nettowert reduziert.
-5-
Eine Einführung in die WLAN–Technologie
2.2
Einordnung des 802.11–Technologie im ISO OSI Schichtenmodell
Betrachtet man das OSI–Referenzmodell, welches 7 Schichten zum Aufbau einer
Netzkommunikation, unabhängig von der Art der eingesetzten Protokolle, kennt, so siedelt
man die WLAN–Technik in den Schichten 1 und 2 an. Bei Schicht 1 handelt es sich um die
Bitübertragungsschicht.
Diese
stellt
die
physikalischen
Grundlagen
für
eine
Netzwerkkommunikation zur Verfügung. Elektrische Signale, optische Signale sowie in
unserem Fall, elektromagnetische Wellen, werden zur Kodierung eines Bitstromes
verwendet. Die Sicherungsschicht, als zweite Ebene des Referenzmodelles, gewährleistet
die weitgehend fehlerfreie Übertragung der zu sendenden Informationen. Hierzu werden die
Bitströme fragmentiert, also in Pakete aufgeteilt, und mit Folgenummern und Prüfsummen
versehen. Der Empfänger wertet diese Informationen bei dem Erhalt der Pakete aus und
kann bei erkannten fehlerhaften Zustellungen die wiederholte Übertragung des Paketes
anfordern. Die Bedeutung dieser OSI Schichten für den automatisierten Verbindungsaufbau
von WLAN Geräten wird schnell ersichtlich. Neben der Steuerung der zwei untersten
Schichten ist für eine erfolgreiche Netzkommunikation ebenso der Einsatz der abstrakteren
Schichten obligatorisch. Da alle Ebenen des Referenzmodelles völlig unabhängig
voneinander arbeiten, benötigt die Manipulation der höheren Schichten eine eigenständige
Realisierung.
Konkret handelt es sich hierbei um das Anbinden eines Netzwerkprotokolles, ohne das keine
verwertbaren Informationen gesendet werden können [WIOSI05].
OSI 7
Application
Application
layer
HTTP
OSI 6
Presentation
OSI 5
Session layer
OSI 4
OSI 4
Transport layer
Transport layer
OSI 3
OSI 3
Network layer
Network layer
OSI 2
LLC Layer
LLC Layer
Data Link
MAC Layer
Ethernet 802.3
CSMA/CA
OSI 1
OSI 1
10 BASE-2,
DSSS, FHSS,
Physical layer
Physical layer
10 BASE-T
Infrared
TCP
IP
Pair cable,
coax cable
OSI
OSI angepasst
LAN
Abbildung 2.1 : Einordnung von IEEE 802.11 im ISO OSI Kommunikationsmodell
-6-
Air
IEEE 802.11
Eine Einführung in die WLAN–Technologie
2.3
Infrastrukturmodi
Ein WLAN–Adapter kann in zwei verschiedenen Infrastrukturmodi betrieben werden. Zum
einen im Infrastrukturmodus und zum anderen im Ad–Hoc–Modus.
2.3.1
Infrastruktur–Modus
Bei dem Betrieb im Infrastruktur–Modus dient ein Access Point (AP) als vermittelnde
Komponente zwischen Funknetzwerk und Festnetz. Der Zusammenschluss mehrer
Funkstationen ist als Basic Service Set (BSS) bekannt. Sind, wie in Abbildung 2.2
dargestellt, zwei oder mehrere Funkzellen über das Kabelnetzwerk miteinander verbunden,
spricht man von einem Extended Service Set (EES) [MLMMS04].
Abbildung 2.2 : Infrastruktur Szenario
Aufgabe des Access Points ist die zentrale Verwaltung und Konfiguration von WLAN–
Verbindungen, sowie das Routing in angebundene Netzwerke. Alle relevanten Einstellungen
werden direkt auf diesem Gerät vorgenommen. Des Weiteren bietet ein solcher Access
Point in der Regel eine Reihe höherer Dienste zur Netzwerkverwaltung an. So können die
Geräte, welche sich auf den niedrigeren OSI–Schichten Zugang verschafft haben, optional
über einen integrierten DHCP–Server mit einer netzkompartiblen IP–Adresse versehen
werden. Doppelte oder fehlerhafte IP–Adressvergabe kann somit profilaktisch unterbunden
werden.
-7-
Eine Einführung in die WLAN–Technologie
2.3.2
Ad–Hoc–Modus
Will man zwei oder mehrere Endgeräte ohne den Einsatz eines zentralen Routers
miteinander verbinden, so geschieht dies über das Ad–Hoc–Protokoll.
Abbildung 2.3 : Ad–hoc–Szenario
Es erfolgt ein loser, unbeständiger Zusammenschluss dieser Geräte innerhalb begrenzter
Reichweite. Der Ad–Hoc Einsatz eignet sich somit für den schnellen, ungeplanten Einsatz.
Alle Stationen agieren hierbei gleichberechtigt und unterliegen keinerlei zentraler Steuerung
und Verwaltung. Es lassen sich hierbei lediglich Peer–to–Peer oder Ende–zu–Ende
Verbindungen einrichten, was heißt, dass ein Gerät ausschließlich mit Stationen
kommunizieren kann, welche sich in direkter Signalreichweite befinden. Eine Gruppe von
Stationen, welche auf einer einheitlichen Funkfrequenz miteinander kommunizieren, nennt
man Independent Basic Service Set (IBSS) [MLMMS04].
Der Einsatz von Routingmechanismen in solchen Peer–to–Peer–Netzwerken existiert zurzeit
nur im Experimentalstadium. Ein solcher Zusammenschluss, bei dem jeder Teilnehmer als
Router fungieren muss, nennt man Mesh–Netz. Ziel dieser mobilen Mesh–Netze ist es,
Kommunikation zwischen Geräten zu ermöglichen, welche sich nicht in direkter
Signalreichweite befinden, sondern einen Verbindungspfad über dazwischen liegende
Stationen aufbauen [WIMAH05].
-8-
Eine Einführung in die WLAN–Technologie
2.4
SSID und BSSID
Ein Wireless LAN, unabhängig ob im Ad–hoc– oder im Infrastrukturmodus, identifiziert sich
in erster Linie über eine bis zu 32 Zeichen lange Netzwerkkennung, genannt SSID (Service
Set ID) oder ESSID (Extended Service Set ID). Grundlage für einen Netzwerkverbund auf
der Grundlage des 802.11 Standards ist die Kenntnis der SSID, welche in einem
Zusammenschluss unter Verwendung einer übergeordneten Infrastruktur sowohl auf dem
Client als auch auf dem Access Point eindeutig sein muss. Die Verwendung des
Betriebsmodus „Any“ erlaubt Geräten mit beliebiger SSID den Zugriff auf das Funknetzwerk.
Ein Zugangspunkt ist in der Regel so eingestellt, dass die SSID eines Funknetzwerkes aktiv
als Broadcast in den „Äther“ geschickt wird um das Auffinden und Einrichten der Verbindung
zu vereinfachen.
Ähnlich der SSID identifiziert sich ein Access Point über eine weitere Kennung, der BSSID
(Basic Service Set Identifier). Diese entspricht immer der 48 Bit umfassenden MAC–Adresse
des WLAN–Adapters und ist unmanipuliert in jedem Falle weltweit eindeutig. Alle Clients
müssen sich auf diese BSSID einigen um eine Kommunikation auf unterster OSI–Ebene zu
ermöglichen. Wenn mehrere Verbindungspunkte eine gleiche SSID vorweisen, kann über
das gezielte Einstellen dieser Kennung selektiv verbunden werden. Im Falle eines
infrastrukturellen Verbundes nehmen alle Teilnehmer die BSSID des Access Points an, in
einem Peer–to–Peer–Netz wird die BSSID dynamisch generiert, muss jedoch auf allen
Geräten identisch sein [MSDN05].
2.5
Sicherheit im WLAN
Im Weiteren möchte ich auf standardisierte Sicherheitsmechanismen eingehen, welche
Vertraulichkeit, Integrität und Authentizität in Funknetzwerken sichern sollen.
Als eine recht schwache Sicherheitsmassnahme, welche die sichere Zuordnung des
Senders gewährleisten soll, kann das Rundsenden der SSID auf einigen Access Points
unterbunden werden. Nur Netzwerkadapter, bei welchen eine kompatible Konfiguration
vorgenommen wurde, erlangen Zugriff. Dieses Verfahren ist jedoch nicht standardkonform.
Weiterhin wird die Netzwerkkennung in allen gesendeten Paketen unverschlüsselt mit
übertragen, so dass es möglich ist, diese mit Hilfe eines Paketfilters auszulesen.
Eine Access Control List (ACL) kann den Netzwerkzugang zusätzlich auf spezifizierte MAC–
Adressen beschränken. Geräte mit fremder Kennung werden vom Access Point
grundsätzlich abgewiesen. Diese Liste wird manuell auf dem Access Point verwaltet. Es
kann jedoch nicht sichergestellt werden, dass eine solche Kennung eindeutige Rückschlüsse
auf die Authentizität der Station ziehen lässt, da die MAC–Adresse eines Netzwerkadapters
systemintern manipuliert werden kann.
-9-
Eine Einführung in die WLAN–Technologie
Das Wired Equivalent Privacy (WEP)–Protokoll dient sowohl der Sicherung von
Vertraulichkeit und Integrität als auch der Authentifizierung. Passive Angriffsmethoden wie
das Abhören des Datenverkehrs sollen durch Verschlüsselung der Daten unterbunden
werden.
Über
den
RC4–Algorithmus,
welcher
einen
Schlüssel
und
einen
Initialisierungsvektor als Eingabe benötigt, wird die paketweise Verschlüsselung des
Datenstromes durchgeführt. Der Schlüssel, der optional eine Länge von 40 oder 104 Bit
aufweisen muss, ist für alle Komponenten des Funk–LANs zwingend. Seine Vergabe findet
direkt auf dem Access Points statt. Der Initialisierungsvektor wird systemintern für jedes
Datenpaket generiert und der eigentlichen Nachricht bei der Übertragung vorangestellt.
Dieses Verfahren gilt jedoch als mathematisch unsicher.
Bei der Authentisierung wird der gleiche Schlüssel wie bei der Integritätssicherung genutzt.
Wird der Authentisierungsmodus mit „Shared Key“ gewählt, so erfolgt der Zugriff nach dem
Challenge–Response–Verfahren. Alternativ erfolgt im „Open“–Modus keine Kontrolle.
Im IEEE 802.11 Standard wird als Nachfolger des WEP–Protokolls Wi–Fi Protected Access
(WPA) und WPA2 eingeführt [MLMMS04.
- 10 -
3. Anforderungen an WLAN–Lösungen im KFZ
Bei der Aufarbeitung der Problemstellung hinsichtlich des in der Einleitung dargestellten
Szenarios, sowie im Laufe der Implementierung und der anschließenden Testphasen,
kristallisierten sich elementare Anforderungen an Software und Peripherie heraus. Die
erarbeiteten Punkte stellen im Weiteren eine wichtige Orientierungshilfe bei der Bewertung
vorhandener Softwarelösungen dar und sind dem Verständnis von Konzipierungsgrundlagen
bezüglich der geleisteten Implementierungsarbeit von enormem Nutzen.
3.1
Wahl und Integration geeigneter Hardware
Wahl und Integration geeigneter Hardware meint hierbei äußere Faktoren, welche für den
Betrieb von WLAN–Lösungen in einem Kraftfahrzeug von grundlegender praktischer
Bedeutung sind und die Thematik dieser Arbeit lediglich streifen. Aus Gründen der
Vollständigkeit wird im Folgenden kurz auf Anforderungen eingegangen, welche in der
Praxis Berücksichtigung finden sollten. Generell kann die Realisierung einer WLAN–Lösung
auf internen Komponenten, also dauerhaft in das Fahrzeug integrierter Hardware, oder auf
externen mobilen Geräten, wie Handhelds, PocketPCs oder Laptops, durchgeführt werden.
Allgemein ist zu sagen, dass vor allem die Positionierung und Bemessung der
Bedienelemente im Cockpit besondere Aufmerksamkeit erfahren sollte. Der Anwender
benötigt direkten Zugang zu den Elementen, welche so übersichtlich wie möglich skaliert
sind um den Konzentrationsaufwand für die Bedienung minimal zu halten. Handelt es sich
um ein mobiles Gerät, in welchem alle Peripherie in einem kompakten Gehäuse integriert ist
und die Bedienung über einen Touch–Screen erfolgt, so bietet sich eine Montage über eine
Docking–Lösung mit integrierter Stromzufuhr an. Vom Betrieb über den geräteeigenen
Akkumulator sollte abgesehen werden, da der WLAN–Adapter einen enormen Energiebedarf
aufweist. Das systemeigene Powermanagement, welches bei einigen Betriebssystemen
sinnvollerweise regulierend eingreift, drosselt die gerätespezifische Energiespeisung und
führt zu unerwünschten Leistungseinbußen. Der Einsatz spezieller WLAN–Antennen, welche
die Übertragungsreichweite deutlich erhöhen, ist empfehlenswert
3.2
Übersichtliche grafische Anwendungsrealisierung
Das grundlegende Augenmerk liegt auch hier wieder auf dem Bedienkomfort und der
Aufwandsminimierung.
Grafische
Elemente
wie
Softbuttons,
Textfelder
und
Zustandsindikatoren müssen überlegt und funktionell gestaltet angeordnet sein. Eine
Zusammenfassung von Bedienelementen nach Funktionsgruppen ist in jedem Falle von
Vorteil und erhöht die intuitive Bedienbarkeit.
- 11 -
Es werden lediglich Kernfunktionen
Anforderungen an WLAN–Lösungen im KFZ
angeboten. Detaillierte Dialoge verwirren und verleiten zu konzentrationsintensiver Suche.
Eine geeignete, aussagekräftige Farbgebung der Elemente erleichtert die Bedienung
zusätzlich. Eine Ein–Dialog–Benutzeroberfläche enthält alle wesentlichen Elemente, welche
für die Auswahl des gewünschten drahtlosen Netzwerkes und der Verbindungsüberwachung
notwendig sind.
3.3
Spezifizierung der WLAN–Konfiguration
Sinn der automatisierten WLAN–Verbindungsherstellung im KFZ ist es, Zugriff auf
Netzwerke zu erlangen, welche den Bedürfnissen der Anwendung entsprechen. Greift man
das
einleitende
Tankstellenszenario
erneut
auf,
so
wird
ersichtlich,
dass
der
Tankstellenbetreiber Software zur Verfügung stellt, welche ausschließlich Zugang zu seinen
eindeutig konfigurierten Zugangsstationen und den von ihm zur Verfügung gestellten
Diensten gewährt. Soll über das an der Tankstelle erhaltene Programm im Peer–to–Peer
Modus verbunden werden, so ist dies auch nur zu den Geräten mit identischer Konfiguration
möglich. Ähnlich verhält es sich in Firmennetzwerken oder zu Hause. Ein automatisierter
Verbindungsaufbau zu fremden Geräten ist weder erwünscht noch programmatisch
realisierbar. Die Informationen, welche für die Einrichtung des WLAN–Zugangs benötigt
werden, müssen dabei nicht weitergegeben und veröffentlicht werden. Die Konfiguration des
WLAN–Adapters bleibt im Quellcode verborgen, was eventuell sogar vor Missbrauch der
Verbindungsdaten schützen kann.
Dabei werden die drahtlosen 802.11 Netzwerke über fest vorgegebene Parameter
spezifiziert, welche ein Wireless Local Area Network eindeutig definieren. Elementare
Parameter
sind
hierbei
der
Infrastrukturmodus,
die
SSID
oder
BSSID,
der
Authentifizierungsmodus und eventuelle Sicherheitsmerkmale wie die 64– oder 128–Bit
WEP–Verschlüsselung.
3.4
Konfliktfreier Wechsel der Betriebsmodi und zustandsabhängige
Benutzerinteraktion
Eine Anwendung, welche Zugriff auf WLAN–Ressourcen benötigt, kann diesen im
Infrastrukturmodus, sowie im Ad–hoc–Modus erfordern. Ein direkter Wechsel der
Infrastrukturmodi wird entweder automatisiert über die Software erfolgen oder durch
Interaktion des Anwenders. In beiden Fällen muss diese Anforderung sofort bedient werden.
Ein Verbindungswechsel zwischen zwei oder mehreren Access Points ist auf Grund der
ähnlichen verbindungsspezifischen Voraussetzungen ohne weiteres zu bewerkstelligen.
Anders verhält es sich bei dem angesprochenen Wechsel von Netzwerken mit
verschiedenartiger Infrastruktur.
- 12 -
Anforderungen an WLAN–Lösungen im KFZ
3.4.1
Automatisierte IP–Adressvergabe
Fand die IP–Adresszuweisung bei der Verbindung zu einem Access Point problemlos über
einen DHCP–Server statt, so steht dieser bei einem Independent Basic Service Set, sprich
Ad–Hoc–Netzwerk, nicht mehr zur Verfügung. Es müssen eventuell zeitkritische
Protokolloperationen durchgeführt werden, um dieses Problem zu lösen.
3.4.2
Zustandsabhängige Verbindungsvisualisierung
Ist die Anwendung darauf ausgelegt, dass der Anwender in Abhängigkeit des aktuellen
Verbindungszustandes mit der grafischen Benutzeroberfläche interagiert, so muss über
aussagekräftige grafische Elemente darauf Aufmerksam gemacht werden, wann welche
Aktion ausgeführt werden kann. So kann eine rot eingefärbte Schaltfläche die
Verbindungsbereitschaft anzeigen falls bisher noch kein Verbindungsaufbau zu Stande
kommen konnte. Eine grün eingefärbte Schaltfläche signalisiert eine erfolgreiche
Netzwerkanbindung.
Der Anwender ist somit in der Lage allein durch visuelle Überprüfung zu Erkennen, wann
netzwerkabhängige Aktionen ausgeführt werden können oder wann eine
erfolgreich
durch
die
Software
bewältigt
wurde.
Weiterhin
können
Aufgabe
Softbuttons
programmatisch deaktiviert werden falls die über dieses Element auszuführende Funktion
auf Grund fehlender Netzwerkgegenstellen keinen Sinn machen würde. Dieses Verfahren
schützt den Anwender vor nutzlosen Eingabevorgängen am Gerät und Leichtfertigkeit auf
der Straße.
3.5
Dynamischer Verbindungsaufbau
Eine Grundvoraussetzung für den erfolgreichen Einsatz von WLAN–Lösungen im KFZ ist die
periodische und flexible Erkennung von in Reichweite befindlichen Netzwerkpartnern und die
daraus resultierende Verbindungsherstellung, bzw. Unterbrechung.
Auch diese Anforderungen lassen sich recht anschaulich am Tankstellenszenario
nachvollziehen. Fährt der Anwender eine Tankstelle an mit der Absicht einen
Verbindungsaufbau zur Basisstation herzustellen wird er auf Grund der eingeschränkten
Signalreichweite zunächst noch nicht in der Lage sein eine sofortige praktikable Verbindung
aufzubauen. Er versetzt sein WLAN–Gerät zunächst in Bereitschaft im Infrastruktur–Modus
zu verbinden. Erst wenn die physikalischen Voraussetzungen erfüllt sind, signalisiert ein
grafischer Indikator die bestehende Netzanbindung, verweist auf mögliche Interaktion oder
nimmt diese selbstständig in Angriff.
Durch den schnellen Ortswechsel der potentiellen WLAN–Partner und die ständig
variierende Signalstärke muss die Software, welche für die Herstellung und Erhaltung von
- 13 -
Anforderungen an WLAN–Lösungen im KFZ
Verbindungen verantwortlich ist, automatisiert nachprüfen ob eine Verbindung neu erkannt
wurde, ob eine bereits eingerichtete Verbindung beständig bleibt oder ob diese dauerhaft
unterbrochen wurde. Auf Grund der Ergebnisse werden programmatisch entsprechende
Reaktionen eingeleitet.
Die Anforderungen an die Dynamik werden auch im mobilen Ad–hoc–Einsatz deutlich.
Angenommen zwei Fahrzeuge fahren in angemessenem Abstand hintereinander her. Das
hintere Fahrzeug verringert aus nicht näher bekannten Gründen seine Geschwindigkeit und
gerät für eine kurze Zeit außer Reichweite. Obwohl die Software einen Verbindungsverlust
erkennt, wirkt sich dieser erst nach einer bestimmten Verzögerungszeit auf den Zustand des
Programms aus, indem der grafische Indikator eine Trennung meldet und erneut auf die
Suche nach einem Netzwerkpartner geht.
- 14 -
4. Verifizierung vorhandener Connection Manager
Lösungen
4.1
Übersicht
WLAN–Lösungen existieren in unterschiedlichen Formen. Die meisten herkömmlichen PC–
Systeme lassen sich mit PCI–WLAN–Karten oder USB–WLAN–Adaptern ausrüsten.
Notebooks oder Tablet–PCs werden durch PCMCIA–Steckkarten WLAN–fähig. Viele Pocket
PCs und Handhelds sind bereits ab Werk mit integrierten WLAN–Adaptern ausgerüstet.
Die physikalische Beschaffenheit dieser unterschiedlichen Geräte ist für die folgenden
Betrachtungen von geringer Bedeutung, da sich alle Adapter festgelegten Standards
unterwerfen müssen und sich im Einsatz weitgehend identisch verhalten.
Unterschiedliche Betriebssysteme greifen abhängig von dem bereitgestellten Befehlssatz auf
die Hardware zu und bieten systemeigene Verwaltungswerkzeuge zur Konfiguration.
Ein Betriebssystem, auf welchem vorgestellte Szenarien und Lösungen zum großen Teil
implementiert wurden, ist Pocket PC 2003, eine Variante von Windows CE. Entwickelt für
mobile Endgeräte, bietet Pocket PC 2003 hauptsächlich Schnittstellen und Methoden,
welche konkret auf die Hardwareanforderungen bezüglich integrierter Peripherie und
Funktionsumfang dieser kompakten Geräte zugeschnitten wurden. Mobile Endgeräte, wie
der zur Entwickelung genutzte HP iPAQ 5500, auf welchem das angesprochene
Betriebssystem zum Einsatz kommt, eignen sich auf Grund ihrer kompakten Größe und des
leistungsstarken XScale Prozessors hervorragend für den Einsatz in einem Fahrzeug. Das
Gerät lässt sich über einen Touchscreen bedienen und ist mit einem integrierten WLAN–
Adapter ausgerüstet, welcher den 802.11b Standard unterstützt. Die folgende Bewertung
systemeigener Software zur Verwaltung von IEEE 802.11 Netzwerken soll zum einen
Aufschluss über Verhaltensweisen bei der Verwaltung von drahtlosen Netzwerken liefern
und zum anderen zeigen, ob die erarbeiteten Anforderungen an den automatisierten WLAN–
Verbindungsaufbau im KFZ aus Kapitel 3 umsetzbar sind.
4.2
Der Pocket PC 2003 Connection Manager
Die zentrale Instanz zur Verwaltung von Netzwerkadaptern und Verbindungen unter dem
Betriebssystem Pocket PC 2003 übernimmt alle für die Vernetzung des Gerätes relevanten
Aufgaben.
So lassen sich Programme mit Netzwerkbedarf generell zwei Einsatzgebieten zuordnen:
Internet oder Firma. Über konfigurierbare Profile wird die Art des Verbindungsaufbaus in
Abhängigkeit des Einsatzgebietes definiert. Greift eine Anwendung auf ein Firmennetzwerk
zu, so wird das dafür reservierte Profil aktiviert. Konfigurierbar sind Einwählverbindungen
- 15 -
Verifizierung vorhandener Connection Manager Lösungen
über Modem, Bluetooth und Infrarot. Weiterhin kann ein VPN–Zugang und ein Proxyserver
spezifiziert werden. Um den Verbindungsmanager aufzurufen, muss durch einige, nicht
immer intuitiv auffindbare, Menüs navigiert werden. Ist die Wireless–Option „WLAN“ aktiviert,
so findet man hier auch die Verwaltungsinstanz für drahtlose Netzwerke.
Um eine neue WLAN–Verbindung zu konfigurieren oder eingerichtete Konfigurationen zu
verwalten, ist aufgeführte Menüstruktur abzuarbeiten:
Start –> Einstellungen –> Verbindungen –> Verbindungen –> Erweitert –> Netzwerkkarte –>
Drahtlos
Hier werden alle verfügbaren WLAN–Netzwerke aufgeführt. Über Selektion und die Option
„Verbinden“ werden Informationen zu Einsatzgebiet und Authentifizierung abgefragt. Werden
diese korrekt spezifiziert, erfolgt der Verbindungsaufbau.
Alternativ ist das Einrichten eines neuen, nicht erkannten, Netzwerkes möglich. Benötigt
werden
Angaben
zum
Netzwerknamen,
Infrastrukturmodus,
Einsatzgebiet
und
Authentifizierungsmerkmale.
Da das alleinige Auffinden des Verwaltungsdialoges schon recht kompliziert werden kann,
reagiert das System bei Erkennung eines neuen Netzwerkes in Form eines Assistenten. Da
zu einer funktionstüchtigen TCP/IP–Kommunikation auch eine netzkompartible IP–Adresse
an den Adapter gebunden werden muss, fließt dieser Aspekt ebenfalls in die Betrachtung mit
ein.
Die
TCP/IP–Konfiguration
der
integrierten
Adapter
erfolgt
im
Untermenü
„Netzwerkkarten“, an gleicher Stelle wie der Konfigurationsdialog der drahtlosen Netzwerke.
Ist die Bezeichnung des betreffenden WLAN–Adapters bekannt, kann hier zwischen
dynamischer und manueller Adressvergabe gewählt werden. Vorgegeben ist die dynamische
Zuweisung über einen DHCP–Server. Das Verhalten und Zusammenspiel dieser
Komponenten soll nun im Folgenden untersucht werden.
4.2.1
Aufwandsbetrachtung im Infrastrukturszenario
Betrachtet werden soll der Aufwand, der benötigt wird um eine WLAN–Verbindung zu einem
Access Point herzustellen. Als Testvoraussetzung wird angenommen, dass bisher noch
keine Konfiguration getätigt wurde, der WLAN–Adapter eingeschaltet ist und sich in direkter
Signalreichweite befindet.
Erkennt der Verbindungsmanager einen neuen Access Point, so erscheint selbstständig ein
Assistent, welcher dazu auffordert, die Art der Verwendung zu definieren. Zur Auswahl steht
„Internet“ oder „Firma“. Bei einer VPN–Verbindung zu einem Firmennetzwerk soll ebenfall
die „Internet“–Option gewählt werden.
Betätigt man nun die „Verbinden“–Schaltfläche, so fordert der Dialog zur Eingabe des auf
dem Access Point konfigurierten WEP–Schlüssels auf. Nach entsprechender Eingabe stellt
der WLAN–Adapter eine Verbindung her. Der Verbindungsstatus wird über eine LED in der
- 16 -
Verifizierung vorhandener Connection Manager Lösungen
oberen rechten Ecke des Gehäuses signalisiert. Verbunden blinkt diese grün, andernfalls
rot.
Werden bei Aktivierung des Gerätes oder des Adapters zwei oder mehrere Access Points
vorgefunden, so kann die Verbindung selektiv erfolgen. Ist das Gerät aktiv verbunden und
ein weiterer Access Point kommt in Reichweite, so wird dies ignoriert. Auch nach
Verbindungsverlust zu dem vormals aktiven Access Point wird keine Verbindung zu dem neu
erkannten Netzwerkknoten angestrebt.
Bei zwei oder mehreren eingerichteten Verbindungen und ohne bereits aktivierte
Netzanbindung wird die Verbindung vom Connection Manager nach Verfügbarkeit aktiviert.
Das beschriebene Verhalten erfolgt automatisiert und komfortablerweise unter Verwendung
eines selbständig erscheinenden Assistenzdialoges.
Da die meisten Netzwerke über einen separaten DHCP–Server verfügen, oder ein solcher
im Access Point integriert ist, erfolgt die IP–Adressvergabe dynamisch. Identifizieren sich die
Hosts im Netzwerk über einen Dynamic Name Server (DNS) und orientiert sich die
Anwendung an der Geräteidentifikation, spielt die erhaltene IP–Adresse lediglich eine
untergeordnete Rolle, da der Name dynamisch mit der entsprechenden Adresse verknüpft
wird.
Befindet sich das Gerät nicht im Signalbereich des gewünschten WLAN–Netzwerkes, muss
die Einrichtung von Hand erfolgen. Eine solche Situation kann sich ergeben, wenn die
Verbindung im Vorfeld eingerichtet wird, um einen automatisierten Netzwerkzugang bei
Bedarf zu gewährleisten. Hierzu ist es nötig sich in das Konfigurationsmenü drahtloser
Verbindungen zu begeben. Nach Eingabe aller nötigen Parameter, wie in Kapitel 4.2
beschrieben, befindet sich das Profil in Bereitschaft und verhält sich wie eine über den
Assistenten konfigurierte Verbindung im Bezug auf die Dedektion weiterer WLAN–Zellen
oder Verbindungsverlust.
4.2.2
Aufwandsbetrachtung im Ad–hoc–Szenario
Das Einrichten einer Ad–hoc–Verbindung über den Assistenten oder die Anzeige
verfügbarer drahtloser Netzwerke kann nur durchgeführt werden, wenn sich bereits
mindestens ein Gerät im Ad–hoc–Modus befindet und diesbezüglich konfiguriert wurde.
Dies erfolgt über die manuelle Einrichtung einer neuen Verbindung. Sucht der Connection
Manager nach gemischten Infrastrukturmodi, so kann die Anzeige verfügbarer Netzwerke
recht widersprüchlich erscheinen. Der Ad–hoc–Verbindungsaufbau ist gänzlich unmöglich,
wenn das Gerät infrastrukturell eingebunden ist.
Das Bereitstellen der Parameter für die erkannte Verbindung wird ähnlich der Konfiguration
einer infrastrukturellen Konfiguration vorgenommen. Wechselt das Gerät, welches die
Verbindung anfänglich signalisierte in den verbindungslosen Zustand, so ergibt sich beim
Partnergerät keine Änderung. Es scheint weiterhin aktiver Teilnehmer eines Independent
Basic Service Sets zu sein. Dieses Verhalten liegt in der Natur des Ad–hoc–Protokolls. Da
- 17 -
Verifizierung vorhandener Connection Manager Lösungen
ein solcher loser Netzwerkverbund keinerlei zentraler Kontrolle untersteht, kann eine aktive
Netzwerkanbindung nicht erkannt werden. Die WLAN–Adapter wechseln in den Ad–hoc
Modus und sind bereits eigenständige, aktive Netzwerkstationen.
Ist das Gerät einmal verbunden, so kann es nie von selbst in einen verbindungslosen
Zustand
wechseln
und
die
Verbindung
zu
einem,
in
Reichweite
befindlichen,
infrastrukturellen Netzwerk anstreben. Wenn ein uneinheitlicher WEP–Schlüssel vergeben
wird, bauen beide Geräte ein unabhängiges Ad–hoc–Netz auf, auf welches die Geräte
gegenseitig nie Zugriff erlangen werden.
4.3
Zusammenfassende Bewertung für den Einsatz im KZF
Bewertet man die erzielten Ergebnisse nach den Kriterien für den automatisierten
Verbindungsaufbau im KFZ, so kann gesagt werden, dass der Connection Manager über
sehr weitreichende Funktionalität verfügt, jedoch den Anforderungen an den mobilen Einsatz
im KFZ nicht gerecht wird.
Von grundlegendem Nachteil ist auf jeden Fall die komplizierte Menüführung, welche sich
durch den enormen Funktionsumfang ergibt. Der Assistenzdialog, welcher bei der
Erkennung von neuen WLAN–Netzwerken erscheint, erleichtert zwar die Konfiguration, lässt
sich aber nicht an die individuellen Bedürfnisse des Anwenders anpassen.
Ähnlich verhält es sich mit der systeminternen Netzwerkverwaltung. In Abhängigkeit von der
aktuellen Einstellung, werden verfügbare WLAN–Knoten nicht immer erkannt oder lassen
sich nicht anwählen.
Weiterhin kann das Verbindungsverhalten kaum beeinflusst werden. Will ein Anwender,
welcher bereits mit einem WLAN–Knoten verbunden ist, auf ein alternatives Netzwerk
ausweichen, so sind umfangreiche Konfigurationsvorgänge vorzunehmen. Bei einem Betrieb
im Ad-hoc–Modus muss die IP–Adressvergabe zusätzliche Berücksichtigung finden.
Meistens kommt man um manuelle Konfiguration nicht herum. Der bei dem Betrieb im KFZ
obligatorische dynamische Verbindungsaufbau kann ebenfalls nicht realisiert werden. Wird
nach Abarbeitung aller Infrastrukturkonfigurationen keine Verbindung hergestellt, so stellt
sich der WLAN–Adapter auf den Ad–hoc–Modus ein. Dies macht im konventionellen Einsatz
Sinn, ist jedoch für das behandelte Szenario von Nachteil.
Intelligente Verbindungsverwaltung, welche auf die Anforderungen der Anwendung eingeht,
kann daher nur durch eine individuelle Softwarelösung umgesetzt werden.
- 18 -
5. Vorbetrachtungen im allgemeinen WLAN–
Szenario
5.1
Notwendigkeit einer individuellen Softwarelösung
Aus der Erkenntnis, dass vorhandene Softwarelösungen unzureichend und mit den
Anforderungen für den Einsatz im KFZ nicht in Einklang zu bringen waren, entstand die
Notwendigkeit ein individuelles Softwaremodul zu entwickeln.
Es wurde nach einer Lösung gesucht WLAN–Verbindungen softwareintern zu verwalten und
zu überwachen, um dynamisch auf gegebene Zustände reagieren zu können. Diese
Zustände ergeben sich aus dem aktuellen Status des WLAN–Adapters, der Verfügbarkeit
möglicher WLAN–Netzwerkpartner und dem konkreten Bedarf an Netzwerkzugriffen.
Eine Kommunikationsanwendung muss beispielsweise erkennen können, ob eine Ad–hoc–
Verbindung zu einem Partnergerät möglich ist, um eine Voice over IP (VOIP) Sitzung mit
dem entsprechenden Gerät mit individueller IP–Adresse herzustellen. Ist dies nicht der Fall,
wird entweder aktiv ein Verbindungsaufbau mit spezifischen, vorgegebenen Parametern
eingeleitet, auf eine alternative Verbindungsvariante umgestiegen oder signalisiert, dass sich
kein kompatibles Gerät in Reichweite befindet .
Diese Aktionen müssen dem Benutzer durch Automatisierung in vollem Umfang
abgenommen werden.
Bei komplexeren Anwendungen kann die Notwendigkeit bestehen mehrere Netzwerke oder
Infrastrukturmodi prioritätsgesteuert zu verwalten. Eine solche Aufgabe ist nur mit einer
entsprechend intelligenten Software zu bewältigen.
5.2
Programmiersprache und Entwicklungsumgebung
Bei der Entscheidungsfindung für die Wahl einer geeigneten Programmiersprache waren
einige hinreichende Kriterien zu bedenken.
Der zu entwickelnde Quellcode sollte durch ein hohes Maß an Modularität problemlos in
bestehende oder neue Anwendungen im mobilen Einsatz integrierbar und auch auf
unterschiedliche Betriebssysteme portierbar sein.
Die Programmiersprache muss von dem eingesetzten Betriebssystem, in unserem Falle der
Windows CE Variante Pocket PC 2003, in vollem Umfang unterstützt werden.
Des Weiteren ist eine modulare, objektorientierte Softwarearchitektur wünschenswert, um
den Quelltext übersichtlich und verständlich zu halten.
- 19 -
Vorbetrachtungen im allgemeinen WLAN–Szenario
Die oben genannten Faktoren sowie der Wunsch, dass der zu entwickelnde Quelltext auf
das echtzeitfähige, in unseren Projektframeworks eingesetzte Betriebssystem QNX1
portierbar sein sollte, bildeten die Grundlage der Entscheidung für die Programmiersprache
C++.
Bei der Suche nach einer Entwicklungsumgebung fiel die Wahl auf das Embedded Visual
Studio 4.0 in Kombination mit dem Pocket PC 2003 Software Development Kit2 (SDK) von
Microsoft. Dieses SDK unterstützt die Entwicklung auf vorgegebener primärer Zielplattform,
welche sich durch die Verwendung des iPAQ H5500 Pocket PCs ergab. Es ergänzt die
Basisfunktionalität der Entwicklungsumgebung um betriebssystemspezifische APIs in Form
von Header–Dateien und Bibliotheken, welche spezielle Hardwareeigenschaften von
unterstützten mobilen Endgeräten berücksichtigen und ermöglicht das Übersetzen des
Quellcodes für Prozessoren mit ARM4 Befehlssatz. Zusätzlich wird der Service Pack 4 für
das Visual Studio benötigt.
Die Möglichkeit kompilierte Quelltexte aus der IDE (Integrated Development Environment)
auf dem externen System auszuführen und zu debuggen, ermöglicht direkten Zugang zum
Zielsystem. Hierbei werden die Programmdateien mittels Active Sync Software3 auf das
mobile Endgerät transferiert, zur Ausführung gebracht und der Programmablauf im
Debugging–Modus ausgewertet. Der Pocket PC ist dabei über USB oder seriell mit dem
Entwicklungs-PC verbunden.
Zusätzliche Werkzeuge helfen bei der Verwaltung und der Systemüberwachung. Mit Hilfe
des Remote Registry Editors lässt sich die Windows–Registrierung auf dem verbundenen
Gerät bearbeiten. Über den Remote Process Viewer erlangt man Kontrolle über Prozesse,
Threads und Module und kann diese gegebenenfalls terminieren. Will man Screenshots des
externen Gerätes erstellen, so bemüht man das Remote Zoom In Werkzeug.
5.3
Pocket
Anmerkungen zur Implementierung
PC
2003
unterstützt
ohne
Installation
von
Zusatzsoftware
keine
Konsolenanwendungen. Es ist zwar theoretisch möglich diese mit Hilfe eines speziellen
Software Delevopment Kits4 (SDK) zu implementieren und auf den Geräten auszuführen,
jedoch würde die Bedienung der Software zu unübersichtlich und für den praktischen
Einsatz im KFZ kaum praktikabel. Nützliche Konsolenanwendungen wie „ipconfig“, um die
IP–Konfiguration auszulesen und die „ping“–Anwendung, um die Funktionalität von
Verbindungen zu überprüfen, wurden beim Entwickeln und Testen zu Rate gezogen.
1
www.qnx.com
www.microsoft.com
3
www.microsoft.com/windowsmobile/downloads/activesync38.mspx
4
www.symbolictools.de/public/pocketconsole/developers/portsdk.htm
2
- 20 -
Vorbetrachtungen im allgemeinen WLAN–Szenario
Möglich wurde dies nach dem Aufspielen eines Konsolen–Gerätetreibers5, der eigentlichen
Konsolenanwendung6 und den "Nettools"7.
Es wurde bereits im Anfangsstadium entschieden eine grafische Benutzeroberfläche zu
entwerfen, welche es dem Benutzer möglich machen sollte, per Softbutton optional in
Bereitschaft zu wechseln, entweder im Ad–hoc–Modus oder im Infrastruktur–Modus nach
potentiellen Netzwerkpartnern zu suchen und eine Verbindung zu diesen herzustellen.
Die übersichtliche grafische Aufbereitung des Verbindungsstatus zählt ebenfalls zu den
gestellten Anforderungen und spricht zusätzlich für den Einsatz grafischer Elemente.
Die Entwicklung der grafischen Benutzeroberfläche (GUI) wurde mittels Microsoft
Foundation Classes (MFC) realisiert. Diese beinhalten eine Sammlung von objektorientierten
Klassenbibliotheken und ermöglichen dem Programmierer vereinfachten Zugriff auf niedere,
zur Erstellung von grafischen Elementen notwendige, System–APIs [WIMFC05].
Die Implementierung der grafischen Komponente dient dem Zweck Benutzereingaben
entgegenzunehmen und Systemausgaben zu visualisieren und ist der Logik des Programms
kaum dienlich. In den folgenden Ausführungen wird auf wesentliche, für das Verständnis des
Programms wichtige Implementierungsaspekte eingegangen. Da die MFC-Programmierung
für das Thema der Arbeit lediglich aus gestalterischer Sicht von Interesse ist, wird
diesbezüglich auf detaillierte Kommentare verzichtet.
Bei den Quelltext–Listings wurde darauf geachtet, logisch zusammenhängende und
ausführlich kommentierte Befehlssequenzen aufzubereiten. Die Deklarationen wichtiger
Variablen
und
Header–Dateien,
sowie
eingebundene
Bibliotheksmodule
werden
vorangestellt um die praktische Verwertbarkeit zu garantieren. Der komplette Quelltext der
entwickelten „WLANConnector“–Anwendung für Pocket PC 2003 ist auf der beigefügten
CD–ROM zu finden.
5.4
Grundlegende Konzipierungsüberlegungen
Die Erkenntnis, das die komplette systeminterne Verbindungsverwaltung über den
ausführlich diskutierten Connection Manager abgehandelt wird, legte die Vermutung nahe,
dass WLAN–Verbindungen mittels der im Betriebssystem Pocket PC 2003 SDK integrierten
Connection Manager–APIs definiert und aktiviert werden können [PPCDG05].
Bei der Auseinandersetzung mit diesem Befehlssatz wurde jedoch deutlich, dass diese
Funktionssammlung für unser primäres Ziel kaum von Nutzen sein kann. Innerhalb des
Connection Managers, welcher sowohl Einwählverbindungen über Modem oder serielle
Schnittstellen
verwaltet
und
diese
Verbindungen
generell
zwei
verschiedenen
Anwendungsbereichen, nämlich „Internet“ oder „Firmennetzwerk“ zuordnet, erfolgt die
Verbindungskonfiguration auf sehr abstrakter Ebene.
5
www.symbolictools.de/public/pocketconsole/index.htm#download
www.symbolictools.de/public/pocketconsole/applications/cmd/index.htm
7
http://www.symbolictools.de/public/pocketconsole/applications/nettools/index.htm
6
- 21 -
Vorbetrachtungen im allgemeinen WLAN–Szenario
Dabei kommt einer untergeordneten Instanz, welche als unabhängiges Modul in den
Connection Manager eingebunden ist, die Steuerung der WLAN–Komponenten zu.
5.5
Die Wireless Zero Configuration
Diese Instanz ist als Wireless Zero Configuration bekannt. Dieser systemeigene Dienst dient
der Konfiguration von drahtlosen Netzwerken auf den meisten Windows–Systemen und ist
für
das
Verhalten
bei
der
Erkennung
von
WLAN–Netzen
sowie
bei
der
Verbindungsherstellung zu selbigen verantwortlich.
Ein Implementierungsbeispiel der Wireless Zero Configuration, geschrieben in C++, kann
dem Windows CE.NET 4.2 Platform Builder8 entnommen werden. Bei Windows 2000 oder
Windows XP wird die WZC in einer Liste von verfügbaren Diensten innerhalb des
Dienstemanagers geführt und kann hier explizit gestartet oder gestoppt werden.
Bei deutschsprachigen Betriebssystemsversionen lautet die entsprechende Bezeichnung
"Konfigurationsfreie drahtlose Verbindung". Hersteller von WLAN–Adaptern schaffen mit
alternativer, individueller Konfigurationssoftware eine Möglichkeit der benutzerfreundlicheren
Installation ihrer WLAN–Karte, in einigen Fällen mit Hilfe von Assistenten, welche durch den
Einrichtungsvorgang führen. Der Einsatz dieser Programme ist erfahrungsgemäß nicht
immer intuitiv und empfehlenswert. Eingerichtete Verbindungen werden in manchen Fällen
bei einem Neustart des Rechners nicht automatisch wiederhergestellt und benötigen erneute
Aufmerksamkeit. Dieses Konfigurations–Utility, das bei der Integration der meisten WLAN–
Adapter optional installiert werden kann, ersetzt und beendet die WZC und stellt deren
"Starttyp" auf "manuell" um.
Angesprochenes Vorgehen ist in jedem Falle erforderlich, wenn mittels Fremdsoftware
manipulativ auf die WLAN–Adapterkonfiguration zugegriffen wird, und dient der Vermeidung
von internen Komplikationen [WRAPI05]. Da das Betriebssystem Pocket PC 2003, welches
auf dem HP iPAQ beheimatet ist, keinen Dienstmanager kennt, kann das Starten des
Dienstes wie folgt unterbunden werden: Ein Eintrag in der Windows CE Registrierung
verweist auf die Dynamic Link Library namens „WZCSVC.dll“, welche die Implementierung
des
WZC–Dienstes
verkörpert.
Ändert
man
diese
Zeichenkette,
welche
im
Registrierungspfad "HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ZeroConfig" zu finden ist,
geringfügig um und führt einen Systemneustart durch, so kann die DLL nicht mehr gefunden
werden. Der Dienst wird folglich nicht gestartet und der Connection Manager für die
Konfiguration von WLAN–Verbindungen unbrauchbar [PPCDF05].
8
www.microsoft.com
- 22 -
Vorbetrachtungen im allgemeinen WLAN–Szenario
Screenshot 5.1 : WZC–DLL in der Windows CE Registrierung
Es empfiehlt sich den Dienst bei der ersten Initialisierung der Anwendung zu beenden. Der
Aufruf der entwickelten „disableWZC“–Funktion9 wurde innerhalb der OnInitDialog–
Funktion10 der MFC–Anwendung platziert. Dies bewirkt das Abarbeiten der Befehlssequenz
bei der Initialisierung des Basisdialoges. Programmatisch wird dies durch folgende
Implementierung erreicht:
1
#include <Winreg.h>
2
3
void disableWZC()
4
{
5
HKEY hKey = NULL;
6
DWORD dwDisposition = 0;
7
CString wzc = _T("WZCSVC.dllx");
8
9
RegCreateKeyEx(
10
HKEY_LOCAL_MACHINE,
11
_T("Drivers\\BuiltIn\\ZeroConfig"),
12
0,
13
NULL,
14
0,
15
KEY_EXECUTE|KEY_READ|KEY_ALL_ACCESS,
16
NULL,
17
&hKey,
18
&dwDisposition );
19
20
21
22
9
WLANConnector – IpSwapper.cpp
WLANConnector – WLANConnectorDlg.cpp
10
- 23 -
Vorbetrachtungen im allgemeinen WLAN–Szenario
23
24
RegSetValueEx (
25
hKey,
26
TEXT ("Dll"),
27
0,
28
REG_SZ,
29
(LPBYTE)(LPCTSTR)wzc,
30
_tcslen(wzc)*2+1);
31
}
LISTING 5.1 : Deaktivieren der Wireless Zero Configuration
11
Bei Beendigung der Anwendung sollte die Ausgangssituation wiederhergestellt werden um
bei Bedarf die volle Funktionalität des Connection Managers zu reaktivieren. Diese resultiert
aus
der
Abarbeitung
der
oben
dargestellten
Befehlssequenz
mit
der
DLL–
Originalbezeichnung.
So lange das System mit der Individualkonfiguration arbeitet ergibt sich bei erneutem
Ausführen der Anwendung keine Änderung, da die Originaleinstellungen erst mit einem
Neustart des Gerätes übernommen werden.
Sind die Vorkehrungen für die erfolgreiche Manipulation der WLAN–Adapter durch
Deaktivierung des WZC–Dienstes getroffen können die eigentlichen Gerätezugriffe
angegangen werden.
5.6
Das
NDIS-Benutzermodus-E/A-Protokoll (NDISUIO)
NDIS-Benutzermodus-E/A-Protokoll
(NDISUIO)
ermöglicht
Netzwerkadapter–
manipulationen durch Anwendungen auf Benutzerebene.
In diesem Kapitel werden NDISUIO–Implementierungsgrundlagen vermittelt, die Einordnung
dieser
Protokollzugriffe
innerhalb
der
Windows
802.11–Netzwerktreiber–Architektur
beleuchtet und ein zu wissenschaftlichen Zwecken frei nutzbares Softwaremodul vorgestellt,
welches den praktischen Einsatz dieser Hardwareschnittstellen an Hand von Quelltexten
demonstriert.
5.6.1
802.11–Netzwerktreiber–Architektur
Der so genannte Miniport–Treiber oder MAC–Treiber agiert auf hardwarenähester Ebene
und ist für eine Reihe von elementaren Aufgaben konzipiert. Er leistet die Weiterleitung von
Paketen an die Netzwerkadapterhardware zur physikalischen Übertragung. Er ruft Pakete
ab, welche von der WLAN–Adapterhardware empfangen werden, verwaltet Interrupts und ist
11
WLANConnector – IpSwapper.cpp
- 24 -
Vorbetrachtungen im allgemeinen WLAN–Szenario
für die Durchführung von Hardware–Kontrolloperationen dienlich. Der Miniport–Treiber
kommuniziert mit dem so genannten Intermediate–Treiber, welcher auf einer höheren Ebene
Schnittstellen für Protokolltreiber zur Verfügung stellt um den Adapter zu konfigurieren und
um Pakte über das Netzwerk zu senden und zu empfangen.
Abbildung 5.1 : Windows 802.11 Netzwerktreiber–Architektur
12
Ein solcher Protokoll–Treiber ist das NDIS–Benutzermodus–E/A–Protokoll (NDISUIO). Über
die Network Driver Interface Specification, kurz NDIS, werden Schnittstellen zwischen
Miniport–Treiber, Intermediate–Treiber und Protokoll–Treiber definiert. Der Intermediate–
Treiber übernimmt dabei eine vermittelnde Position [WPDN03].
Da das NDIS–Interface sowohl den Miniport–Treiber als auch den Intermediate–Treiber
umschließt, wird oft von einem NDIS Wrapper (Hülle) gesprochen. Erste Versionen der
Network Driver Interface Specification wurden in Zusammenarbeit von Microsoft und 3COM
proprietär für alle gängigen Windows–Systeme entwickelt [WINDIS05].
Um grundsätzliche 802.11–Dienste zu unterstützen werden eine Reihe von NDIS Object
Identifiern (OIDs) definiert, welche über NDISUIO Zugriff auf den Miniport–Treiber
ermöglichen. Mit Hilfe dieser OIDs können Informationen ausgelesen werden und
Adapterkonfigurationen vorgenommen werden, mit welchen es möglich ist, WLAN–
Verbindungen zu konkretisieren und Verbindungen aufzubauen. Dabei wird ein fest
vorgegebenes Verhalten auf physikalischer Ebene vorausgesetzt [WPDN203].
12
www.filseclab.com/eng/products/sourcetech.htm
- 25 -
Vorbetrachtungen im allgemeinen WLAN–Szenario
5.6.2
Implementierungsaspekte
Im Folgenden wird zunächst auf allgemeine Implementierungsaspekte im Umgang mit den
NDIS–APIs eingegangen, welche sowohl für den Ad–Hoc–Modus sowie für den
Infrastruktur–Modus gelten. Des Weiteren schließt sich eine gesonderte Betrachtung der
beiden Infrastruktur–Modi an, in welcher verbindungsspezifische Anforderungen für den
Betrieb im KFZ in den Vordergrund gerückt werden.
Da bei der Softwareentwicklung gesteigerter Wert auf Modularität gelegt wurde, erfolgte die
Implementierung der Adapterzugriffe über NDISUIO in der Klasse DeviceControl13. Die
„DeviceControl“–Klassenfunktionen „setAdHoc“ und „setInfrastructure“ versetzen das
WLAN–Netzwerkinterface
in
die
jeweilige
Verbindungsbereitschaft
und
werden
in
unterschiedlichen Kontexten der MFC–Anwendung aufgerufen.
Die Basis für den Zugriff auf einen Gerätetreiber bildet die Erzeugung einer abstrakten
Referenz auf ein Datenobjekt, genannt Handle, welche typisiert und mit entsprechenden
Zugriffsrechten versehen werden muss. Diese Datei fungiert als Stellvertreter oder Proxy
und wird unter Windows CE vorläufig noch nicht konkretisiert. Es wird lediglich festgelegt,
dass es sich um einen NDIS fähigen Protokolltreiber handelt [MSDN05].
Listing 5.1 zeigt eine Implementierungsvariante um das Handle „m_hDeviceHandle“ zu
erzeugen.
1
DWORD m_dwBytesReturned = 0;
2
bool
retval;
3
4
HANDLE m_hDeviceHandle = CreateFile(
5
NDISUIO_DEVICE_NAME,
6
GENERIC_READ | GENERIC_WRITE,
7
FILE_SHARE_READ | FILE_SHARE_WRITE,
8
NULL,
9
OPEN_EXISTING,
10
FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED,
11
(HANDLE)INVALID_HANDLE_VALUE
12
);
14
LISTING 5.2 : Erzeugung eines NDISUIO Handles
Um hardwareorientierte Operationen auf einem Gerät auszuführen wird mit Hilfe der
DeviceIoControl–API aus der „Winbase.h“ ein Kontrollcode und dessen Spezifizierung in
Form eines Datenpuffers an den Gerätetreiber weitergegeben.
Zur Anwendung kommen zwei Gerätekontrollcodes, oder IOCTLs (Ein–/Ausgabekontrolle):
Die IOCTL–Struktur „IOCTL_NDISUIO_SET_OID_VALUE“ wird zur Konfiguration verwendet
und
13
14
„IOCTL_NDISUIO_QUERY_OID_VALUE“
WLANConnector – DeviceControl.cpp
WRAPIb2.0 – WRAPI.cpp
- 26 -
zum
Auslesen
eines
angeforderten
Vorbetrachtungen im allgemeinen WLAN–Szenario
Datenpuffers [MSDN05]. Diese und weitere IOCTL–Strukturen sind in der „nuioser.h“15
definiert. Der bei diesen Befehlen übertragene Datenpuffer birgt nun den gewünschten NDIS
Object Identifier (OID) in sich.
Da es sich bei der DeviceIoControl–Funktion16 um eine recht dominante und redundante
Operation bei der Interaktion mit dem Miniport–Treiber handelt, möchte ich im Folgenden
näher auf die benötigten Parameter und ihre Datentypen eingehen:
1
BOOL DeviceIoControl(
2
// Der Rückgabewert als Boolean: Bei erfolgreicher Ausführung die '0'
3
HANDLE hDevice,
4
// Handle/Verweis auf das Zielgerät – Erzeugung mittels CreateFile()
5
DWORD dwIoControlCode,
6
// Der IOCTL–Kontrollcode: IOCTL_NDISUIO_SET_OID_VALUE oder
7
// IOCTL_NDISUIO_QUERY_OID_VALUE
8
LPVOID lpInBuffer,
9
// Long–Zeiger auf den Datenpuffer, welcher die OID beinhaltet
10
DWORD nInBufferSize,
11
// Größe des Eingabepuffers in Bytes
12
LPVOID lpOutBuffer,
13
// Long–Zeiger auf den Ausgabepuffer bei "IOCTL_NDISUIO_QUERY_OID_VALUE"–Operationen
14
DWORD nOutBufferSize,
15
// Grösse des Ausgabepuffers in Bytes
16
LPDWORD lpBytesReturned,
17
// LongPointer auf eine Variable, welche die Grösse der Datenmenge im Ausgabepuffer
18
LPOVERLAPPED lpOverlapped
19
// Wird ignoriert und mit NULL festgesetzt
20
);
LISTING 5.3 : DeviceIOControl inklusive typisierter Parameter [MSDN05]
Die NDIS–OIDs werden innerhalb eines betriebssystemsspezifischen Header–Files mit der
Bezeichnung "ntddndis.h" konkretisiert. Es handelt sich hierbei um eine Liste von Define
Befehlen, welche eine textuelle Ersetzung der OID–Bezeichnung durch ein 32–Bit Datenwort
in hexadezimaler Darstellung vornehmen.
1
#define OID_GEN_HARDWARE_STATUS
LISTING 5.4 : Beispiel für die Definition einer NDIS–OID
0x00010102
17
„nuioser.h“ und „ntddndis.h“ müssen im Quellcode inkludiert sein um mit den NDIS User
Mode I/O Protocol arbeiten zu können [WPDN203].
15
nuioser.h - Pocket PC 2003 SDK
winbase.h – Embedded Visual Studio 4
17
ntddndis.h – Pocket PC 2003 SDK
16
- 27 -
Vorbetrachtungen im allgemeinen WLAN–Szenario
5.6.3
Wireless Research API18 (WRAPI)
Bei der Wireless Research API, welche 2002 von der University of California entwickelt
wurde, handelt es sich um eine Softwarebibliothek, welche es Programmierern ermöglicht
Konfigurationen von 802.11–Netzwerkadaptern auszulesen und diese zu konfigurieren.
Die komplette Implementierung basiert auf NDISUIO–Protokollzugriffe und kann als DLL in
eigenen C++ Quellcode integriert werden.
WRAPI wurde explizit für den Einsatz unter Windows XP entwickelt. Da NDISUIO auf dem
NDIS 5.1 Standard arbeitet, wird weitgehende Hardwareunabhängigkeit erreicht. Der
Quellcode ist frei zugänglich und kann zu wissenschaftlichen Zwecken nach Belieben
genutzt und abgeändert werden. Das vorgefundene Softwaregerüst war eine große Hilfe bei
der Erstellung der entwickelten Software und ermöglichte einen konkreten Einblick in die
abstrakte NDIUIO–Funktionalität.
So
konnten
benötigte
Variablendeklarationen
weitgehend
übernommen
und
den
Anforderungen entsprechend angepasst werden. Die enthaltenen Funktionen wurden
ausgewertet und softwareintern verarbeitet.
Hierbei muss berücksichtigt werden, dass die einzelnen Funktionen an sich lediglich
einzelne Ausprägungen der 802.11–Adapterkonfiguration auslesen oder konkretisieren. Erst
durch die Verwendung im richtigen Kontext wird ein verwertbares Ergebnis erzielt.
Weiterhin musste der untersuchte Quelltext auf die Eigenheiten des Betriebssystems Pocket
PC 2003 angepasst werden. Kapitel 8 geht daher speziell auf die Besonderheiten unter
Windows XP ein.
Das komplette WRAPIb2.0–Projekt liegt der angefügten CD–ROM bei.
18
http://sysnet.ucsd.edu/pawn/wrapi/
- 28 -
6. WLAN–Verbindungsaufbau im Ad–hoc–Szenario
6.1
IP–Adressen–Problematik und Lösung
Die reine Verbindungsherstellung auf physikalischer / DataLink Ebene reicht für eine
praktikable Anwendung noch nicht aus. Es muss weiterhin ein Protokoll definiert und an den
Adapter gebunden werden.
Folgende Anforderungen müssen an die TCP/IP–Konfiguration gestellt werden: Die IP–
Adressen der Netzwerkadapter müssen in einem kompatiblen Netzwerksegment liegen,
dürfen jedoch nicht identisch sein.
Weiterhin muss die Möglichkeit gegeben sein die Netzwerkadresse der verbundenen Geräte
zu verbreiten und untereinander weiterzugeben. Da die IP–Problematik elementarer
Bestandteil des automatisierten Verbindungsaufbaus im KFZ ist, muss auch sie
automatisiert und softwaregesteuert gelöst werden.
6.1.1
Bewertung konventioneller Verfahren zur IP–Adressvergabe
IP–Adressen werden generell auf zwei Arten zugewiesen: Entweder man trägt diese
inklusive Subnetzmaske und Gateway im entsprechenden Netzwerkkonfigurationsdialog ein
oder man wählt die
Konfiguration über einen DHCP–Server. Legt man sich auf das
dynamische Zuweisungsverfahren fest und wird kein entsprechender Dienst im Netzwerk
angeboten, würde dem Adapter keine funktionelle Adresse zugewiesen.
Die meisten Windows–Systeme gehen auf diese Problematik ein, indem sie auf eine so
genannte Auto–IP zurückgreifen. Hierbei handelt es sich um eine in der Registrierung
abgelegte
IP–Adresse
aus
einem
speziell
festgelegten
Netzwerksegment.
Dieses
„Automatic Private IP Addressing“ (APIPA) genannte Verfahren vergibt Adressen aus dem
Bereich von 169.254.0.0 bis 169.254.255.255, welcher sich bei einer Subnetzmaske von
255.255.0.0. ergibt [AWAP02].
Obwohl diese Automatisierung einen brauchbaren Ansatz für die Lösung der entstandenen
IP Problematik bietet, erweist sich die enorme Anzahl potentieller Zuweisungen als
nachteilig. Die Tatsache, dass Verbindungen innerhalb TCP/IP–Netzwerken mit Hilfe des
bekannten „ping“–Programms überprüft werden können, führte zu der Idee eines
Netzwerkscans mittels ICMP–Echo–Requests. Kann dieser Befehl unter Verwendung der zu
verifizierenden IP–Adresse erfolgreich ausgeführt werden so kann auf einen erfolgreichen
Verbindungsaufbau
geschlossen werden.
Ein
solcher
Scan wäre bei
65025 zu
überprüfenden Möglichkeiten grenzenlos überfordert und würde eine enorme, nicht zu
tolerierende Zeitspanne benötigen. Identische Adresszuweisungen werden per Address
Resolution Protocol (ARP) verhindert [AWAP02]. Dennoch spricht Einiges für die
- 29 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Verwendung der Auto–IP Option: Da die IP–Adresse bei Betrieb im Infrastruktur–Modus per
DHCP geschieht, ist keinerlei Modifizierung der Einstellungen nötig. Der Protokoll–Treiber
erkennt den entsprechenden Service, ignoriert die Auto–IP Einstellungen und bezieht die
Adresse dynamisch. Doppelte Zuweisungen können hier prinzipiell ausgeschlossen werden.
Des Weiteren kann programmatisch eine neue Adresse angefordert werden.
Über die Konsole geschieht dies über die Eingabe von „ipconfig /renew“ [MSDN05]. Aus
dieser Erkenntnis entstand die Idee, die IP–Adresse als „Auto–IP“ in die Registrierung zu
schreiben und dann eine erneute Zuweisung zu erzwingen. Die Werte werden hierbei
innerhalb einer überschaubaren Spanne zufällig generiert. Ihre Eindeutigkeit wird überprüft
und sichergestellt.
6.1.2
Abwandlung von APIPA durch Registrierungsmanipulation
IP–Adressen
können
aus
praktischer
Erfahrung
in
der
Registrierung
für
jeden
Netzwerkadapter separat festgelegt werden.
Hier wird eine Sammlung von Konfigurationsparametern verwaltet und persistent abgelegt.
Diese Erkenntnis macht sich die erstellte Anwendung zu Nutzen, indem, mittels aus der
Deaktivierung des WZC–Dienstes bekannten Befehlen, entsprechende Werte in die
Registrierung eingetragen werden.
Dieses Vorgehen wurde zunächst im Registrierungseditor getestet. Screenshot 6.1 zeigt
rotumrandet alle Parameter, welche für die automatisierte Adresszuweisung über das
APIPA–Verfahren relevant sind.
Während in Screenshot 6.1, Ausschnitt 1, die über die automatisierte IP–Adressvergabe
zugewiesenen Werte spezifiziert werden, definieren die Werte aus Ausschnitt 2 die Art der
Zuteilung.
Der boolesche Wert 1 im Wertefeld „EnableDHCP“ aktiviert die dynamische IP–
Adresszuweisung
über
„DhcpDefaultGateway“,
einen
DHCP–Server,
„DhcpServer“,
welcher
„DhcpSubnetMask“
durch
und
die
Felder
„DhcpIPAddress“
konkretisiert wird.
Ist im Wertefeld „AutoCfg“ eine 1 eingetragen, so wird die IP–Konfiguration aus Ausschnitt 1
angewandt. Hierbei nimmt die „DhcpIPAddress“ den im „AutoIP“–Feld eingetragenen Wert
an, welcher der letztendlich zuzuweisenden Adresse entspricht. Die Adressspezifikation des
DHCP Servers nimmt mit der 255.255.255.255 („DhcpServer“) und der Subnetzmaske
(„DhcpSubnetMask“) 255.255.255.0 einen für den Broadcast typischen Wert, was lediglich
bedeutet das dieser unbekannt ist und nicht spezifiziert wird.
- 30 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Screenshot 6.1 : Definition der "WZC"–DLL in der Windows CE – Registrierung
Zunächst wird mittels Random–Befehl19 eine Zufallszahl generiert. Über den Modulo–
Operator wird ein möglicher Wertebereich von 0 bis 30 erzwungen (Listing 6.1, Zeile 3). Es
gibt also 30 mögliche verschiedene IP–Adressen, welche dem Netzwerkadapter zugewiesen
werden können. Dieser Wert wurde gewählt, da die Wahrscheinlichkeit, dass zwei
Netzwerkadapter identisch adressiert werden recht gering (p = 0,03) und die Anzahl der im
schlechtesten Falle zu durchlaufenden Scan–Vorgänge in einem überschaubaren Rahmen
bleibt. Die Zahl 0 wird über die Addition der 1 bewusst ausgeklammert, da die 0 an letzter
Stelle das komplette Subnetz definiert.
1
int CIpSwapper::createIp()
2
{
3
int checkIp = Random()%30+1;
4
return checkIp;
5
}
20
LISTING 6.1 : Generierung einer Zufallszahl für letztes Segment der IP–Adresse
19
20
winbase.h – Embedded Visual Studio 4
WLANConnector – IpSwapper.cpp
- 31 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Der generierte Zufallswert ist vom Datentyp Integer und ist Rückgabewert der createIP–
Funktion21. Dieser wird im Hauptdialog als Parameter an die folgende Funktion „swapIp“22
weitergereicht, welche nun die Manipulation der entsprechenden Registrierungseinträge
vornimmt. Ziel ist die Vergabe einer IP–Adresse aus der Spanne von 192.168.1.1 bis
192.168.1.31. In Zeile 9 des Listings 6.2 wird der übergebene Wert an den statischen Teil
der IP–Adresse angefügt und bildet die zu manifestierende String–Zuweisung. Wie aus
Screenshot 6.1 ableitbar, müssen alle Werte welche die Auto–IP spezifizieren an die
entsprechende Stelle in der Registrierung geschrieben werden.
Dabei handelt es sich um die IP–Adresse („Auto–IP“) an sich, das verwendete Subnetz
(„AutoSubnet“) und die Subnetzmaske („AutoMask“).
1
void CIpSwapper::swapIp(int j)
2
{
3
HKEY hKey = NULL;
4
DWORD dwDisposition = 0;
5
DWORD dwSizeIp=13;
6
DWORD dwSizeSub=12;
7
DWORD dwSizeMask=14;
8
CString ip;
9
ip.Format(_T("192.168.1.%d"),j);
10
CString subnet = _T("192.168.1.0");
11
CString mask = _T("255.255.255.0");
12
CString dhcpip = ip;
LISTING 6.2 : Deklaration der Variablen innerhalb der swapIP–Funktion
Die Funktion RegCreateKeyEx23 erstellt einen neuen spezifizierten Key oder öffnet ihn, falls
dieser bereits existiert.
Der erste Parameter (Listing 6.2, Zeile 3) repräsentiert ein Handle (Verweis) auf einen
eigens zu spezifizierenden Hauptschlüssel oder einen vordefinierten Eintrag, in unserem Fall
HKEY_LOCAL_MACHINE, welcher konfigurationsspezifische Daten des Rechners enthält.
Der zu öffnende oder zu erstellende Key ist diesem untergeordnet. Der Begriff Key bezieht
sich hierbei auf einen Pfad innerhalb einer dateisystemsähnlichen Ordnerstruktur und ist
nicht mit den darin enthaltenen Werten zu verwechseln.
Es
sei
angemerkt,
dass
der
Registrierungspfad
(Listing
6.3,
Zeile
3)
„Comm\\vnetusba1\\Parms\\TCPIP” nicht allgemein gültig ist.
Der Parameter „vnetusba1“ steht konkret für die in HP iPAQ 5500 integrierten WLAN–
Adapter. Soll die Anwendung für andere Adapter angepasst werden, so muss die
Bezeichnung dynamisch ausgelesen werden. Dies kann mit geeigneten NDISUIO–APIs
geschehen (Kapitel 8.2).
21
WLANConnector – IpSwapper.cpp
WLANConnector – IpSwapper.cpp
23
Winreg.h – Embedded Visual Studio 4
22
- 32 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Das auf der beiliegenden CD enthaltene Programm „ndistools2003“24 liest ebenfalls die
Bezeichnungen von aktiven an das NDISUIO–Protokoll gebundenen WLAN–Adaptern auf
Pocket PC 2003 Systemen aus und kann bei der Verifizierung von Ergebniswerten
Verwendung finden.
1
RegCreateKeyEx(
2
HKEY_LOCAL_MACHINE,
3
_T("Comm\\vnetusba1\\Parms\\TCPIP"),
4
5
0,
NULL,
0,
6
KEY_EXECUTE|KEY_READ|KEY_ALL_ACCESS,
7
NULL,
8
&hKey,
9
&dwDisposition );
LISTING 6.3 : Erstellen oder Öffnen eines Registry Keys
In Zeile 8 der RegCreateKeyEx–Funktion (Listing 6.3) wird ein Zeiger auf eine Variable
gesetzt, welche das Handle auf den geöffneten Key empfängt.
Dieses Handle findet nun in der RegSetValueEx–Methode verwendung, indem es den
Schlüssel spezifiziert, in welchem ein Wertefeld manipuliert oder erstellt wird. Listing 6.4
erläutert das Verfahren an der Veränderung des Datenfeldes mit der in Zeile 3 definierten
Bezeichnung „AutoIP“.
Der Zeiger auf den Datensatz, welcher an die angegebene Stelle geschrieben werden soll,
wird in Zeile 6 parametrisiert. Hierbei wird die Zeichenkette aus der Initialisierung der
Variablen „ip“ (Listing 6.2, Zeile 8) zu einem entsprechenden Datentyp gecastet, was einer
Neuinterpretation des Datensatzes entspricht. Beachtung muss hierbei der Informationstyp
des Datensatzes finden. In Zeile 5 des Listings 6.4 wird dieser in konkretisiertem Falle als
REG_SZ Wert festgelegt, was einer null terminierten Unicode–Zeichenkette entspricht.
1
RegSetValueEx (
2
hKey,
3
TEXT ("AutoIP"),
4
0,
5
REG_SZ,
6
(LPBYTE)(LPCTSTR)ip,
7
_tcslen(ip)*2+1);
LISTING 6.4 : Schreiben der AutoIP–Variablen in CE Registrierung
24
www.pcausa.com/Utilities/ndistools.htm
- 33 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Das Schreiben der Werte für „AutoSubnet“, „AutoMask“ und „DhcpIPAddress“ erfolgt starr
nach diesem Muster und wird deshalb im Weiteren nicht näher beschrieben. Es ist lediglich
die Zeichenkette in Zeile 3 des Listings 6.4 entsprechend abzuändern.
Wird das Handle auf den geöffneten Registrierungsschlüssel nicht mehr gebraucht, sollte es
durch den RegCloseKey–Befehl wieder freigegeben werden (Listing 6.5) [PPCDA05]. Dies
bewirkt das Aufheben einer Zugriffssperre und erlaubt Manipulation durch andere Prozesse.
1
RegCloseKey(hKey);
LISTING 6.5 : Freigabe des Handles auf einen geöffneten Key[PPCDA05]
Die IP–Adresse des WLAN–Adapters im Ad–Hoc Modus
ist somit eindeutig festgelegt,
jedoch noch nicht aktiv übernommen. Bevor dies in die Tat umgesetzt werden kann wird
zunächst der eigentliche Verbindungsaufbau in die Wege geleitet.
6.1.3
IP–Adresszuweisung mittels IP–Helper–Funktionen
Die nun folgenden Operationen basieren auf einer Microsoft Bibliotheksdatei namens
„iphlpapi.lib“25, welche die Verwendung der Internet Protocol Helper API ermöglicht.
Diese Funktionen stehen dem Anwendungsentwickler innerhalb der zu inkludierenden
Headerdatei „Iphlpapi.h“ zur Verfügung und unterstützen das Auslesen von Informationen
über lokale Netzwerkadapter. Weiterhin dienen sie der Modifizierung der IP–Konfiguration
[MSDN05].
Im Fokus steht die Verwaltung von IP–Adressen auf dem WLAN–Adapter. Es geht darum,
die in der Registrierung abgelegte IP–Konfiguration über die DHCP–Adresszuweisung an
das entsprechende Device zu binden und somit für die Netzwerkommunikation über das
TCP/IP–Protokoll zu aktivieren.
Über die Funktion IpRenewAddress aus der „iphlpapi.lib“ „mietet“ sich der Netzwerkadapter
eine für ihn bereitgestellte Adresse von einem DHCP–Server. Dieses Verfahren wird in
entwickelter Software dazu eingesetzt, eine bereits in der lokalen Registrierung angelegte
IP–Konfiguration über Automatic Private IP Addressing (APIPA) umzusetzen.
Ein frei verfügbares Programm namens „MyIpConfig“26, welches auf beigelegter CD als
Executable und im Quelltext abgelegt wurde, arbeitet mit dieser Bibliothek und wurde zu
einer Wrapperklasse umgeschrieben und an die konkreten Anforderungen angepasst. Die
angepasste Klasse „CIpHelper“27 wurde in das „WLANConnector“ Embedded Visual Studio
Projekt eingebunden.
25
iphlpapi.lib – Embedded Visual Studio 4
http://sourceforge.net/projects/myipconfig
27
WLANConnector – IpHelper.cpp
26
- 34 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Die
enthaltene
renew–Funktion28
wird
nach
erfolgtem
WLAN–Verbindungsaufbau
aufgerufen. Dies macht Sinn, da sich der Adapter erst im Ad–hoc Modus auf die
Verwendung des APIPA–Verfahrens einstellt.
Da der Adapter eine kurze Zeitspanne zur Verbindungsherstellung im Ad–hoc–Modus
benötigt, wurde die Programmausführung über die Sleep–Funktion29 um drei Sekunden
verzögert.
30
In Zeile 6 des Listings 6.6 werden durch die GetAdaptersInfo–Funktion
verfügbare
Netzwerkadapter enumeriert und in einem Array von IP_ADAPTER_INFO–Strukturen31
verwaltet. Diese Strukturen enthalten Informationen wie den Namen des Adapters,
Beschreibung, IP–Adresse, Gateway, DHCP Server Adresse usw.
Die find–Funktion aus Zeile 7 weist der Variablen „a“ vom Typ „IpAdapter“ den WLAN–
Adapter mit Namen „VNETUSBA1“ zu, auf welchem in Zeile 11 die IpRenewAddress–
Operation durchgeführt wird.
Der Übergabeparameter dieser Funktion ist eine vorgegebene Zeitspanne in Sekunden, in
welcher die Adresszuweisung abgeschlossen werden muss. Wird dieser Wert überschritten
wird die Operation abgebrochen und ein Fehlercode zurückgegeben.
1
CString CIpHelper::renew()
2
{
3
IpAdapter
currentAdapter;
4
IpAdapters*
pAdapterInfo;
5
6
pAdapterInfo = IpAdapters::GetAdaptersInfo();
7
IpAdapter a = pAdapterInfo–>find("VNETUSBA1");
8
9
Sleep(3000);
10
11
a.IpRenewAddress(3);
12
}
LISTING 6.6 : IpRenewAddress – Internet Protocol Helper API
28
WLANConnector – IPHelper.cpp
winbase.h – Embedded Visual Studio 4
30
WLANConnector – IpHelper.cpp
31
iptypes.h – Embedded Visual Studio 4
29
- 35 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
6.2
Der
Ad–hoc–Adapterkonfiguration über NDISUIO
Verbindungsaufbau
innerhalb
der
ersten
zwei
Schichten
des
OSI
Kommunikationsmodells wird mittels der in Kapitel 5.6.2 erläuterten NDISUIO–Operationen
durchgeführt.
IOCTL–Kontrollnachrichten
werden
innerhalb
der
angesprochenen
DeviceIoControl–Befehle an den Adapter weitergeleitet und versetzen das WLAN–Device in
den gewünschten Zustand auf hardwarenaher Ebene.
Nachdem, wie in Kapitel 5.6.2 dokumentiert, ein Device–Handle erzeugt und an das
NDISUIO–Protokoll gebunden wird, können die Network Driver Interface Specification Object
Identifier geschrieben werden. Es ist dabei von der Hardware der WLAN–Adapter abhängig,
welche OID–Varianten unterstützt werden.
Jede dieser OIDs bewirkt eine in sich gekapselte Konfigurationsänderung. Die folgende
Auflistung der Vorgänge und der dazugehörigen OIDs erläutert die Reihenfolge, welche bei
der Implementierung Verwendung fand.
Es zeigte sich, dass lediglich das Schreiben der SSID die abschließende Operation sein
sollte, da mit dieser Aktion Änderungen übernommen werden und der Adapter einen
Verbindungsversuch in die Wege leitet [WPDN203].
• Setzen des Infrastrukturmodus
[OID_802_11_INFRASTRUCTURE_MODE]
• Setzen des Authentifizierungsmodus
[OID_802_11_AUTHENTICATION_MODE]
• Setzen des WEP Schlüssels (optional)
[OID_802_11_ADD_KEY]
• Aktivieren der WEP Verschlüsselung
[OID_802_11_ADD_WEP]
• Setzen der SSID / BSSID / IBSSID
[OID_802_11_SSID]
Î Adapter übernimmt Netzwerk Konfiguration
Um den Umgang mit den OIDs in den angeführten Quelltextauszügen zu verstehen macht
es Sinn, sich deren Struktur etwas näher zu betrachten.
In Zeile 7, Listing 6.7 wird eine Variable vom Typ PNDISUIO_SET_OID32 deklariert.
Die Variablenbezeichnung lässt darauf schließen, dass es sich hierbei um eine Struktur
handelt, welche schreibend, also konfigurierend, zugreift. Für Leseoperationen wird der
ebenfalls in der „nuiouser.h“ definierte Typ PNDISUIO_QUERY_OID verwendet.
Es handelt sich hier wieder um einen Datentyp, welcher untergeordnete Strukturen
umschließt und mit zusätzlichen Informationen versehen, in abstrakterem Kontext
weiterverwendet [MSDN05].
Wie der Strukturdefinition aus Listing 6.7 zu entnehmen ist, umschließt die
PNDISUIO_SET_OID–Struktur die Ausprägung des eigentlichen Object Identifiers vom Typ
NDIS_OID (Zeile 2).
32
nuiouser.h – Pocket PC 2003 SDK
- 36 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Weiterhin ist ein Zeiger auf einen Datencontainer, welcher den Namen des zu
manipulierenden Gerätes entspricht (Zeile 4) und einen Puffer für OID–Werte und
Rückgabedaten (Zeile 6) beinhaltet.
Das ifdef aus Zeile 3 sagt aus, dass der Gerätename lediglich bei Windows CE und
Varianten zur Verfügung steht. Das Kapitel 9 geht näher auf diese Besonderheit ein.
1
typedef struct _NDISUIO_SET_OID {
2
NDIS_OID Oid;
3
#ifdef UNDER_CE
4
PTCHAR ptcDeviceName;
5
#endif
6
UCHAR Data[sizeof(ULONG)];
7
} NDISUIO_SET_OID,
LISTING 6.7 : Struktur NDISUIO_SET_OID
6.2.1
33
Setzen des Infrastrukturmodus
Der erste Konfigurationsvorgang bezieht sich auf die Spezifikation des Infrastruktur–Modus.
Betätigt man den Softbutton, welcher die Verbindungsbereitschaft im Ad–hoc–Modus
aktiviert, so wird die Funktion setAdhoc ausgeführt. Diese Methode ist der Klasse
„DeviceControl“ zugehörig und enthält alle NDISUIO–spezifischen Operationen. Alle nötigen
Netzwerkparameter sind in diese Funktion statisch integriert.
In den Zeilen 9 bis 11, Listing 6.8, wird die NDISUIO_SET_OID–Struktur gefüllt, welche in
Zeile 9 dem in den Zeilen 5 bis 6 reservierten Speicherplatz zugeordnet wird.
Die Zuweisung des Gerätenamens erfolgt in Zeile 10, wohingegen in Zeile 11 der Object
Identifier festgelegt wird.
In Zeile 14 und 15 wird der Wert der OID in den Datenpuffer kopiert. Dessen Ausprägung
entspricht bei Setzen des Infrastrukturmodus einem Integer Wert, welcher in Zeile 2
festgelegt wird.
Die Variablendeklaration Ndis802_11IBSS steht für das Independent Basic Service Set und
findet seine Wertezuweisung in der Header–Datei „ntddndis.h“. Mögliche Ausprägungen,
welche
die
OID_802_11_INFRASTRUCTURE_MODE–OID
Ndis802_11IBSS
für
die
Ad–hoc–Variante,
annehmen
Ndis802_11Infrastructure
kann
sind
für
den
Verbindungsaufbau zu einem AccessPoint und Ndis802_11AutoUnknown, was bedeutet,
dass der 802.11–Netzwerkadapter zwischen Ad–hoc und Infrastruktur je nach Bedarf
wechseln kann [MSDN05].
Die memcpy34–Funktion kopiert hierbei Binärdaten einer festgelegten Größe von einer durch
einen Zeiger definierten Speicheradresse zu einer anderen. Der erste Parameter steht für
33
34
nuiouser.h – Pocket PC 2003 SDK
stdlib.h – Embedded Visual Studio 4
- 37 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
die Zieladresse, der zweite Parameter für die Quelladresse, an welcher der zu kopierende
Datensatz abgelegt wird und der dritte Parameter bestimmt dessen Größe in Bytes
[MSDN05].
Über die DeviceIoControl–Funktion in Zeile 17 wird der bereits gefüllte Puffer an das durch
das Handle spezifizierte Device weitergegeben.
Eine Ausführliche Abhandlung des Befehles und seine Funktion innerhalb der NDISNetzwerktreiber-Architektur wurde in Kapitel 5.6.2 gegeben. Zur Vereinfachung des
Debuggens werden in Zeile 26 bis 30 Fehler bei der Ausführung der DeviveIoControl–
Funktion als Rückgabewert der „setAdhoc“–Methode35 ausgegeben.
1
int* pnNetworkMode;
2
int NMode = Ndis802_11IBSS;
3
pnNetworkMode = &NMode;
4
5
UCHAR SetBufferNetM[sizeof(NDIS_OID)+
6
sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE) + sizeof(DWORD)];
7
PNDISUIO_SET_OID
pSetOidNetM;
8
9
pSetOidNetM = (PNDISUIO_SET_OID) &SetBufferNetM[0];
10
pSetOidNetM–>ptcDeviceName = TEXT("VNETUSBA1");
11
pSetOidNetM–>Oid = OID_802_11_INFRASTRUCTURE_MODE;
12
13
14
memcpy(&pSetOidNetM–>Data[0],
15
pnNetworkMode,sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE));
16
17
retval = DeviceIoControl(m_hDeviceHandle,
18
IOCTL_NDISUIO_SET_OID_VALUE,
19
(LPVOID) &SetBufferNetM[0],
20
sizeof(SetBufferNetM),
21
(LPVOID) &SetBufferNetM[0],
22
0,
23
&m_dwBytesReturned,
24
NULL);
25
26
if(!retval)
27
{
28
DWORD m_dwError = GetLastError();
29
return ("Nach Ad–Hoc failed");
30
}
LISTING 6.8 : Setzen des Infrastrukturmodus auf Ad–hoc
35
36
WLANConnector – DeviceControl.cpp
Anpassung der WRAPIb2.0 – WRAPI.cpp
- 38 -
36
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
6.2.2
Setzen des Authentifizierungsmodus
Nachdem, nach Abarbeitung der obigen Befehlssequenz, die Ausprägung der Infrastruktur
festgelegt wurde, erfolgt im nächsten Schritt das Setzen des Authentifizierungsmodus
(Listing 6.9).
Die Implementierung kann hierbei fast identisch aus Listing 6.8 übernommen werden.
Das hier zu definierende Merkmal bestimmt die Art der Zugangskontrolle zu einem
Netzwerk, beispielsweise über einen RADIUS (Remote Authentication Dial–In User Service)
Server. Sicherheitsmaßnahmen innerhalb kabelloser Netzwerke wurden in Kapitel 2.5
erläutert und sind für diese Arbeit nur am Rande von Bedeutung.
Dennoch handelt es sich bei der Verwendung dieser OID um eine obligatorische
Maßnahme, ohne die kein Verbindungsaufbau eingeleitet werden kann.
Die Ausprägung der NDIS–OID OID_802_11_AUTHENTICATION_MODE über den Wert
Ndis802_11AuthModeOpen führt zur Verwendung eines Protokolls für Systeme ohne
weitere Zugangskontrolle und wurde in entwickelter Software eingesetzt.
Der Einsatz von WEP als Verschlüsselungsstandard wird hierbei nicht beeinflusst
[MSDN05].
1
int pnAuthMode = Ndis802_11AuthModeOpen;
2
UCHAR SetBufferAuth[sizeof(NDIS_OID) +
3
sizeof(NDIS_802_11_AUTHENTICATION_MODE)+sizeof(DWORD)];
4
PNDISUIO_SET_OID
pSetOidAuth;
5
6
pSetOidAuth = (PNDISUIO_SET_OID) &SetBufferAuth[0];
7
pSetOidAuth–>Oid = OID_802_11_AUTHENTICATION_MODE;
8
pSetOidAuth–>ptcDeviceName = TEXT("VNETUSBA1");
9
10
memcpy(&pSetOidAuth–>Data[0],
11
&pnAuthMode,sizeof(NDIS_802_11_AUTHENTICATION_MODE));
12
13
if (!DeviceIoControl(
14
m_hDeviceHandle,
15
IOCTL_NDISUIO_SET_OID_VALUE,
16
(LPVOID) &SetBufferAuth[0],
17
sizeof(SetBufferAuth),
18
(LPVOID) &SetBufferAuth[0],
19
0,
20
&m_dwBytesReturned,
21
22
NULL))
{ DWORD m_dwError = GetLastError(); }
LISTING 6.9 : Setzen des Authentifizierungsmodus (Anpassung der WRAPI)
37
Anpassung der WRAPIb2.0 – WRAPI.cpp
- 39 -
37
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
6.2.3
Setzen der SSID
Um den 802.11–Netzwerkadapter endgültig in den Ad–hoc–Modus zu versetzen wird der
Service Set Identifier des zu assoziierenden Netzwerkes an den Miniport–Treiber
weitergegeben.
Unabhängig von der Präsenz eines potentiellen Ad–hoc–Partners wird eine aktive Sende–
und Empfangsbereitschaft in die Wege geleitet. Dieses Verhalten liegt in der Natur eines
unabhängigen Netzwerkverbundes und unterscheidet sich maßgeblich von einem
Verbindungsversuch zu einem AccessPoint, bei welchem ein Statuswechsel von einem
verbindungslosen zu einem verbundenen Zustand nur bei Assoziation mit einem
entsprechend konfigurierten WLAN–Knoten stattfindet.
Die Ausprägung der OID_802_11_SSID wird in diesem Falle nicht durch einen ganzzahligen
Wert definiert, sondern über eine eigene Struktur namens NDIS_802_11_SSID.
Der Aufbau dieser Struktur sei in Listing 6.10 aufgeschlüsselt. Da die SSID durch eine
Zeichenkette von bis zu 32 Buchstaben gebildet werden kann, werden als Strukturelemente
zum einen das Unsigned Char Arrays, welches die Zeichenkette beinhaltet (Zeile 4), und
zum anderen dessen Länge (Zeile 3) benötigt.
1
typedef struct _NDIS_802_11_SSID
2
{
3
4
5
ULONG
SsidLength;
UCHAR
Ssid[32];
} NDIS_802_11_SSID, *PNDIS_802_11_SSID;
LISTING 6.10 : Struktur NDIS_802_11_SSID
38
In Zeile 12 wird eine Instanz dieser Struktur ins Leben gerufen, welcher in Zeile 18 die Länge
der SSID Zeichenkette und in Zeile 20 den Inhalt mit Hilfe des vertrauten memcpy–Befehls
(vgl. Kapitel 6.2.1) zugewiesen wird. Der weitere Ablauf unterliegt bekanntem Schema.
1
char strSSID[5];
2
strcpy(strSSID,"AdhocNet");
3
4
ULONG ISSIdLength;
5
ISSIdLength = strlen(strSSID);
6
7
UCHAR *pSSId = (UCHAR*)strSSID;
8
ULONG& lSSIdLength = ISSIdLength;
9
38
10
UCHAR SetBuffer[sizeof(NDIS_OID) + sizeof(NDIS_802_11_SSID)];
11
PNDISUIO_SET_OID
pSetOid;
ntddndis.h – Embedded Visual Studio 4
- 40 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
12
NDIS_802_11_SSID
SSID;
13
14
pSetOid = (PNDISUIO_SET_OID) &SetBuffer[0];
15
pSetOid–>ptcDeviceName = TEXT("VNETUSBA1");
16
pSetOid–>Oid = OID_802_11_SSID;
17
18
SSID.SsidLength = ISSIdLength;
19
20
memcpy(&SSID.Ssid[0],pSSId,ISSIdLength);
21
memcpy(&pSetOid–>Data[0], &SSID, sizeof(NDIS_802_11_SSID));
22
23
retval = DeviceIoControl(
24
m_hDeviceHandle,
25
IOCTL_NDISUIO_SET_OID_VALUE,
26
(LPVOID) &SetBuffer[0],
27
sizeof(SetBuffer),
28
(LPVOID) &SetBuffer[0],
29
0,
&m_dwBytesReturned,
30
NULL);
31
32
33
if(!retval) return ("Set SSID failed");
39
LISTING 6.11 : Setzen der SSID / BSSID / IBSSID
Der Adapter wechselt nun in den Ad–hoc–Modus und übernimmt alle spezifizierten
Merkmale.
Da das charakteristische Ad–hoc–Verhalten auf Grund des auslesbaren Verbindungsstatus
keinen Aufschluss über die Existenz eines Gegenübers liefert, musste ein anderweitiger
Lösungsansatz entwickelt werden, welcher im nächsten Kapitel erläutert wird.
39
Anpassung der WRAPIb2.0 – WRAPI.cpp
- 41 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
6.3
Netzwerkscan und dynamischer Verbindungsaufbau
Da das aktive Scannen nach Netzwerkpartnern ein Vorgang sein sollte, welcher unabhängig
von dem Interaktionsprozess auf grafischer Ebene und fortlaufend im Hintergrund
geschehen sollte, wurde ein so genannter Worker Thread implementiert.
Unter einem Worker Thread versteht man ein unabhängiges Softwaresegment, welches
quasi parallel zum eigentlichen Main Thread eine sequentielle Befehlsabarbeitung
durchführt.
Da
das
Testen
auf
Verfügbarkeit
von
Kommunikationspartnern
innerhalb
einer
Endlosschleife geschieht, würde die grafische Interaktion mit der Software solange
unterbunden werden, bis ein vordefiniertes Event das Durchlaufen der Schleife beendet.
Man spricht hierbei von aktivem Polling. Dies bedeutet, dass es im Stadium des Suchens
keine Möglichkeit gäbe, das Programm in einen anderen Zustand zu versetzen.
Ruft man sich die grundlegenden Anforderungen an den automatisierten WLAN–
Verbindungsaufbau aus Kapitel 3 ins Gedächtnis zurück, so erkennt man hier die Erfüllung
der Notwendigkeit des konfliktfreien Wechsels der Infrastrukturmodi aus Abschnitt 3.4.2.
Weiterhin
muss
es
der
Software
möglich
sein,
selbst
nach
einem
erfolgreich
abgeschlossenen Suchvorgang weiterhin auf Vorhandensein eines Gegenübers zu prüfen
um Verbindungsverluste innerhalb einer vorgegebenen Latenzzeit zu erkennen und
entsprechende Maßnahmen zu einzuleiten. Dies entspricht der Anforderung an den
dynamischen Verbindungsaufbau aus Kapitel 3.5.
Die Threadfunktion „ScanIP“40 wird bei der Initialisierung des Hauptdialoges aufgerufen.
Das Starten des Programmfadens (Threads) entspricht folgenden Programmzeilen:
1
DWORD dwThreadID1 = 0;
2
hThread2 = CreateThread(NULL, 0,ScanIP, this, 0, &dwThreadID1);
LISTING 6.12 : Erzeugen des Worker Threads mit der Threadfunktion ScanIP
Parameter 3 konkretisiert die auszuführende Funktion.
Über den this–Operator aus Zeile 2 wird ein Zeiger auf das aktuelle Objekt, aus dessen
Kontext die CreateThread–Funktion aufgerufen wird, übergeben. Dies ist in konkretem Falle
ein Zeiger auf eine Instanz der „CWLANConnectorDlg“–Klasse, welche die Implementierung
des MFC–Dialoges verkörpert. Damit wird dem Thread Zugriff auf klasseninterne Funktionen
und Variablen ermöglicht [PPCDG05].
Innerhalb der übergeordneten Endlosschleife wird zunächst geprüft, ob sich der Adapter im
Ad–hoc–Modus befindet und ob eine aktive Verbindung besteht.
Dies wäre nicht der Fall, wenn zwar eine Ad–hoc–Bereitschaft angestrebt, jedoch noch nicht
erfolgreich in die Wege geleitet wurde.
40
WLANConnector – WLANConnectorDlg.cpp
- 42 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Erst wenn diese beiden Bedingungen erfüllt sind, wird der eigentliche Schleifenkörper in die
Befehlsabarbeitung einbezogen. Auch eine Lösung über Mutexe, bzw. Semaphoren oder
aktionsabhängiges Starten und Beenden des Threads wären denkbare Ansätze.
Über die Zustandsvariable „foundDevice“ wird gespeichert, ob ein Scanvorgang zum Erfolg
führte. Der Initialisierungswert ist „keine Verbindung“, also der Zahlenwert 0. In einem
Durchlauf der endlosen while–Schleife soll die komplette IP–Adressspanne potentieller
Partner überprüft werden.
Dies erfolgt innerhalb einer eingebetteten for–Schleife, welche in jedem der 30 Durchläufe
einen ICMP Echo Request auf eine Adresse absetzt.
Die Schleife startet bei der IP–Adresse 192.168.1.1 und endet im letzten Durchlauf mit der
192.168.1.30. Der Rückgabewert der IcmpSendEcho–API–Funktion41 signalisiert den Erhalt
eines ICMP Echo Reply Paketes und damit das Vorhandensein eines antwortenden Ad–
hoc–Gerätes.
Ist dies der Fall, wird die Zustandsvariable („foundDevice“) auf den Wert 1 eingesetzt und die
gefundene IP–Adresse inklusive Signalstärke ausgegeben.
Des Weiteren merkt sich das Programm, dass eine Antwort innerhalb des aktuellen
Durchlaufes erhalten wurde, in dem ein Fehlerzähler („failureCounter“) auf den Wert 0
zurückgesetzt wird.
Diese Information wird genutzt um kurzzeitige Verbindungsunterbrechungen innerhalb der
angesprochenen Latenzzeit zu berücksichtigen. Der Wert der Variable wird bei Austritt aus
der for–Schleife inkrementiert und speichert die Anzahl erfolgloser Durchläufe.
Er wird erst wieder auf 0 zurückgesetzt, wenn eine erneute Antwort eines Hosts eintrifft. Die
Zustandsvariable
„foundDevice“
nimmt
nach
einer
bestimmten
Anzahl
erfolgloser
Netzwerkscans den Wert „nicht verbunden“ an. Die Latenzzeit kann über Änderung der
Rücksetzbedingung dieser Variable gesteuert oder völlig deaktiviert werden.
Nach jedem kompletten Scandurchlauf wird die Statusanzeige aktualisiert, in dem die
Variable „foundDevice“ grafisch ausgewertet wird. Da ein Quelltext–Listing der „ScanIP“–
Funktion42 an dieser Stelle zu umfangreich und unübersichtlich wäre, verdeutlicht das
Struktogramm
aus
Abbildung
6.1
das
dargestellte
Verhalten.
Funktionen
und
Wertezuweisungen werden innerhalb der abgerundeten Rechtecke visualisiert. Die Rauten
weisen auf Programmverzweigungen hin, welche sich durch Erfüllung der jeweiligen
Bedingungen an den Pfaden ergeben. Die Ausgabeaktionen sind farbig unterlegt, was der
Farbgebung der Indikatorelemente in der entwickelten Software „WLANConnector“
entspricht. Die Farbe grün weist auf das Vorhandensein eines Ad–hoc–Partners hin,
während die Farbe rot dessen Fehlen symbolisiert. Das Inkrementieren der IP–Adresse
beschränkt sich in der Abbildung der Einfachheit halber auf das letzte Segment dieses
Konstruktes, welches softwareintern an seinen statischen Teil angefügt wird. Auch die
Parameterübergabe der IcmpSendEcho–Funktion wurde auf das Wesentliche, nämlich den
variierende Teil der IP–Kennung, reduziert.
41
42
icmpapi.h – Embedded Visual Studio 4
WLANConnector – WLANConnectorDlg.cpp
- 43 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Abbildung 6.1 : Erzeugen des Worker Threads mit der Threadfunktion ScanIP
- 44 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
6.4
SCREENSHOT 6.2 :WLANConnector
SCREENSHOT 6.3 : WLANConnector
Ad–hoc Netzwerkscan
Ad–hoc verbunden
Integration einer 3rd Party Voice over IP Anwendung
Zum Testen der aufgebauten Ad–hoc–Verbindung wurde eine Voice over IP (VOIP)
Anwendung gewählt.
Gründe dafür waren der enorme praktische Nutzen für den Einsatz in einem Kraftfahrzeug
und der starke Bezug zu einleitendem Tankstellenszenario.
6.4.1
Voraussetzungen
Vorraussetzung an die Anwendung war der mögliche Betrieb im Ad–hoc–Modus und die
Unterstützung des Betriebssystems Pocket PC 2003.
Da die Entwicklung einer eigenen Software den Rahmen dieser Arbeit sprengen und eine
eigenständige Abhandlung füllen würde, wurde auf Vorhandenes zurückgegriffen. Das
softwarebasierte
VOIP–Telefon
SJphone®
von
SJ
Labs43
erfüllt
die
gestellten
Voraussetzungen und bietet zudem hervorragende Ergebnisse bezüglich der erreichbaren
Sprachqualität.
Die Software Skype44 schied bei Betrachtung der oben gestellten Kriterien aus, da ein
Betrieb nur mit vorhandener Internetanbindung möglich ist.
43
44
www.sjlabs.com/sjp.html
www.skype.com/products/skype/pocketpc/
- 45 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
Die Installation der gewählten VOIP–Anwendung wird mit Hilfe von Active Sync45 auf dem
Handheld durchgeführt.
Ideal wäre das softwareinterne Starten des VOIP–Telefons mit der IP–Adresse des
Netzwerkpartners
als
Parameter.
Unvorteilhafterweise
ist
diese
Option
von
den
Programmierern nicht vorgesehen. Um potentielle Gesprächspartner ausfindig zu machen,
arbeitet das Telefon mit dem Neighbourhood Discovery Protocol, welches im Internet
Protocol Version 6 (IPv6) Verwendung findet.
Eine Telefonkonferenz lässt sich bei gestarteter Anwendung mit einigen wenigen Aktionen
einleiten. Dies entspricht nicht dem Idealfall, ist aber zu Zwecken der Verifikation des
Verbindungsaufbaues und der Übertragungsqualität im mobilen Einsatz ausreichend.
6.4.2
Implementierung
Die Softwareintegration wird durch die „OnTalk“–Funktion46 aus Listing 6.13 umgesetzt.
Diese Funktion wird aufgerufen, wenn der entsprechende Softbutton im MFC–Hauptdialog
betätigt wird.
Die
Schaltfläche
wird
erst
aktiviert,
wenn
sich
der
Adapter
in
aktiver
Kommunikationsbereitschaft, entweder im Ad–hoc– oder im Infrastruktur–Modus, befindet.
In Zeile 7 wird mit Hilfe der CreateProcess–Funktion ein neuer Prozess gestartet, welcher
die in Zeile 8 spezifizierte Anwendung ausführt.
Die PROCESS_INFORMATION–Struktur aus Zeile 5 enthält Identifikationsinformationen
über den neuen Prozess, welche in Zeile 17 geschrieben werden. Alle weiteren Parameter
sind nicht weiter von Belang und können bei Bedarf in der Microsoft Developer Network
(http://msdn.microsoft.com/) nachgeschlagen werden.
1
#include <Winbase.h>
2
3
void CWLANConnectorDlg::OnTalk()
4
{
5
PROCESS_INFORMATION pInfo;
6
45
46
7
CreateProcess(
8
_T("\\Programme\\SJphone\\SJphone.exe"),
9
NULL,
10
NULL,
11
NULL,
12
FALSE,
13
0,
14
NULL,
www.microsoft.com/windowsmobile/downloads/activesync38.mspx
WLANConnector – WLANConnectorDlg.cpp
- 46 -
WLAN–Verbindungsaufbau im Ad–hoc–Szenario
15
NULL,
16
NULL,
17
&pInfo);
}
LISTING 6.13 : Sofwareinternes Starten der VOIP Anwendung mit Hilfe von CreateProcess
6.4.3
Testdurchführung und Bewertung
Das erstellte Programm wurde nach der Integration des VOIP–Telefons einem Praxistest
unterzogen. Zwei Autos wurden mit je einem HP iPAQ mit identisch aufgespielter Software
ausgestattet. Innerorts und auf der Landstraße sollte eine aktive Ad–hoc–Verbindung
hergestellt und die IP–Adresse des Gerätes in dem anderen Fahrzeug ausgelesen werden.
Weiterhin sollte dann eine Telefonkonferenz mittels VOIP–Software hergestellt und genutzt
werden. Das Ergebnis war recht zufrieden stellend. Bei getesteten Geschwindigkeiten von
bis zu 100 km/h war eine Kommunikation möglich. Die überbrückbare Entfernung lag bei
circa 50 Metern, wobei unregelmäßiges Annähern und Entfernen des Öfteren Grund für
Verbindungsunterbrechungen waren. Die für den Einsatz in einem Kraftfahrzeug relativ
geringe Signalreichweite scheint unbefriedigend. Der Einsatz von externen Antennen und
Stromversorgung könnte Abhilfe schaffen.
SCREENSHOT 6.4 : VOIP Telefon SJphone
47
47
www.sjlabs.com/sjp.html
- 47 -
7. WLAN–Verbindungsaufbau im Infrastruktur–
Szenario
7.1
Adapterkonfiguration über NDISUIO
Die Konfiguration des WLAN–Adapters für die Verwendung im Infrastruktur–Modus
entspricht den in Kapitel 6.2 erläuterten DeviceIoControl–Operationen. Die verwendeten
OIDs sind identisch. Es müssen lediglich die Ausprägungen der NDIS Object Identifier an
den infrastrukturellen Verbindungsaufbau angepasst werden.
Beim
Setzen
des
Infrastrukturmodus
unter
Verwendung
des
OID_802_11_INFRASTRUCTURE_MODE Object Identifier wird der Integer–Wert, welcher
durch die Bezeichnung Ndis802_11Infrastructure konkretisiert wird, in den Datenpuffer der
instantiierten
PNDISUIO_SET_OID–Struktur
kopiert
und
an
den
WLAN–Adapter
weitergegeben.
Danach wird nach gewohntem Muster mit dem Authentifizierungsmodus verfahren.
Änderungen sind hier nicht notwendig.
Das Schreiben der SSID entspricht ebenfalls dem Quelltextauszug aus Listing 6.11 mit
angepasster SSID. Wie im Ad–Hoc–Modus wird nach diesem Vorgang die Konfiguration
vom Adapter übernommen.
Allerdings ändert sich das Verhalten bei der Verbindungsherstellung grundlegend. Während
im Ad–hoc–Modus generell und unabhängig von in Reichweite befindlichen WLAN–Geräten
Sende– und Empfangsbereitschaft hergestellt wurde, erfolgt ein Verbindungsaufbau nur bei
Vorhandensein eines kompatibel konfigurierten Access Points.
Wenn bereits eine Bindung zu einem Access Point mit anderer SSID besteht, so erfolgen
Verbindungstrennung und Statuswechsel. Der WLAN–Adapter befindet sich nun in
verbindungslosem
Zustand.
Dies
kann
über
eine
Abfrage
mit
Hilfe
der
OID_GEN_MEDIA_CONNECT_STATUS–OID überprüft werden, wie im nächsten Kapitel
beschrieben. Im Weiteren versucht sich der Adapter mit einem Netzwerk mit vorgegebener
SSID zu verbinden. Entspricht sich die Konfiguration, so wird dieser Vorgang erfolgreich
abgeschlossen. Dies resultiert in einem Zustandswechsel. Wird die OID geschrieben, wenn
eine Assoziation mit einem Netzwerk mit übereinstimmender SSID besteht, so wirkt sich dies
in einer Verbindungstrennung und einem erneuten Verbindungsvorgang zu diesem Access
Point aus. Dies muss sich nicht in einem Statuswechsel erkenntlich zeigen. Wird nicht
explizit über die OID_802_11_NETWORK_TYPE_IN_USE–OID ein Netzwerktyp wie
802.11b oder 802.11g festgelegt und sind alternative Netzwerkentsprechungen vorhanden,
so kann der Netzwerkadapter autonom nach bestimmten Kriterien, wie Signalstärke oder
Lebensdauer der Batterie, entscheiden [MSDN05].
- 48 -
WLAN–Verbindungsaufbau im Infrastruktur–Szenario
7.2
Dynamischer Verbindungsaufbau
Ist der Verbindungsversuch nach Schreiben der SSID nicht erfolgreich, so verbleibt der
Adapter in unverbundenem Zustand. Verbindungsversuche müssen daher wiederholt
eingeleitet werden bis ein entsprechender Access Point gefunden wurde.
Zu diesem Zweck wurde ein weiterer Worker Thread, welcher die Thread–Funktion
„ScanAP“48 ausführt, implementiert.
Innerhalb einer Endlosschleife wird hierbei der Verbindungsstatus abgefragt. Wenn sich die
Software in infrastruktureller Verbindungsbereitschaft befindet und die Statusabfrage ergibt,
dass keine Netzwerkanbindung besteht, bemüht sich das Programm erneut um
Verbindungsaufbau.
Eine Verzögerung von fünf Sekunden innerhalb eines Schleifendurchlaufes gewährleistet,
dass dem WLAN–Adapter genügend Zeit zur Verfügung gestellt wird, um eine erfolgreiche
Access Point Anbindung in die Wege zu leiten. Wird die Verzögerung zu kurz bemessen,
wird eine erneute Adapterkonfiguration vorgenommen obwohl ein Verbindungsversuch zu
einer verfügbaren Basisstation bereits initiiert wurde.
Abbildung 7.1 : Auslesen des Verbindungsstatus über NDISUIO
48
WLANConnector – WLANConnectorDlg.cpp
- 49 -
WLAN–Verbindungsaufbau im Infrastruktur–Szenario
Das
SCREENSHOT 7.1 :WLANConnector
SCREENSHOT 7.2 : WLANConnector
Infrastruktur Netzwerkscan
Infrastruktur verbunden
Testen
auf
Verbindung
übernimmt
die
in
Listing
7.1
zusammengefasste
Befehlssequenz. Über eine IOCTL–Struktur wird diesmal lesend auf den Miniport–Treiber
zugegriffen. Das Kopieren der Ausprägungen in den Datenpuffer vor Ausführung des
DeviceIoControl–Befehles entfällt daher. In Zeile 6 wird ein Abfragepuffer angelegt und in
Zeile 7 eine Instanz einer PNDISUIO_QUERY_OID–Struktur erstellt. Die enthaltene OID
wird
mit
OID_GEN_MEDIA_CONNECT_STATUS
konkretisiert
(Zeile
11).
Die
Rückgabedaten werden in den Datenpuffer geschrieben (Zeile 17) und in Zeile 22 in den
Adressbereich der hierfür erstellten Variable vom Typ NDIS_MEDIA_STATE kopiert.
Dieser Datentyp kann zwei Ausprägungen annehmen: „NdisMediaStateConnected“ oder
„NdisMediaStateDisconnected“. Der Rückgabewert der Funktion wird in den Zeilen 24 bis 29
bestimmt. Ist der Netzwerkadapter verbunden so wird ein „wahr“, also eine 1
zurückgegeben, andernfalls ein „falsch“ in Form einer 0.
1
DWORD
2
bool retval;
m_dwBytesReturned = 0;
3
4
NDIS_MEDIA_STATE conn;
5
6
UCHAR QueryBufferCheckCon[1024];
7
PNDISUIO_QUERY_OID pQueryOidCheckCon;
8
9
pQueryOidCheckCon = (PNDISUIO_QUERY_OID)&QueryBufferCheckCon[0];
10
pQueryOidCheckCon–>ptcDeviceName = TEXT("VNETUSBA1");
11
pQueryOidCheckCon–>Oid = OID_GEN_MEDIA_CONNECT_STATUS;
12
- 50 -
WLAN–Verbindungsaufbau im Infrastruktur–Szenario
13
retval = DeviceIoControl(m_hDeviceHandle,
14
IOCTL_NDISUIO_QUERY_OID_VALUE,
15
(LPVOID) &QueryBufferCheckCon[0],
16
sizeof(QueryBufferCheckCon),
17
(LPVOID) &QueryBufferCheckCon[0],
18
sizeof(QueryBufferCheckCon),
19
&m_dwBytesReturned,
20
NULL);
21
22
memcpy(&conn,&pQueryOidCheckCon–>Data[0],sizeof(NDIS_STATUS));
23
24
if (conn == NdisMediaStateConnected)
25
{
return 1;
26
27
}
28
else return 0;
29
}
LISTING 7.1: Auslesen des Verbindungsstatus über NDISUIO
7.3
49
Integration einer Informationsanwendung
Bei der Realisierung eines geeigneten Testszenarios wurde ein Weg gesucht, Dateien sowie
Informationen von einem Server in einem konventionellen Kabelnetzerk an den Client im
KFZ zu senden. Eine Möglichkeit wäre die Implementierung von TCP/IP–Sockets, über
welche Datenpakete jeglicher Form übermittelt werden könnten. Um die Informationen
verwertbar zu machen müsste dann jedoch eine ausgeklügelte Navigation umgesetzt
werden. Eine Software, welche die übersichtliche, strukturierte Visualisierung von
Informationen von Natur aus beherrscht, ist der Internetbrowser. Dieser ist zudem noch auf
allen gängigen Systemen in der Grundausstattung inbegriffen.
Ein Webserver, welcher sich hinter dem Access Point in das Netzwerk integriert, publiziert
Daten in Form von HTML–Strukturen und hostet alle Arten von Daten. Über eine
angebundene
Datenbank
lassen
sich
dynamische
Inhalte
verwalten.
Auch
eine
Zugriffsverwaltung ist hier problemlos umsetzbar.
Die ideale Technik ist vorhanden und muss lediglich in die Anwendung integriert werden.
Vergibt man eine spezifizierte IP–Adresse, so lassen sich Webserver an unterschiedlichen
Lokalitäten gleichermaßen ansprechen. Listing 7.2 zeigt eine Abwandlung der aus Kapitel
6.4 bekannten CreateProcess–Funktion.
Neben dem Konsolenbefehl zum Ausführen des Executables in Zeile 6 werden in Zeile 7
zusätzliche Parameter angegeben. Diese spezifizieren das Protokoll und die IP–Adresse des
Servers, von welchem Daten abgerufen werden sollen. Beim Abarbeiten dieser Funktion
49
Anpassung der WRAPIb2.0 – WRAPI.cpp
- 51 -
WLAN–Verbindungsaufbau im Infrastruktur–Szenario
wird der Internet Explorer gestartet und nimmt automatisch Kontakt zum Host mit der IP–
Kennung 192.168.1.100 (Zeile 7) auf. Da sich der Internet Explorer stets an der gleichen
Stelle im Dateisystem befindet, ist der Pfad aus Zeile 6 universell gültig.
1
void CWLANConnectorDlg::OnInfo()
2
{
3
PROCESS_INFORMATION pInfo;
4
5
CreateProcess(
6
_T("\\Windows\\iexplore.exe"),
7
_T("http://192.168.1.100"),
8
NULL,
9
NULL,
10
FALSE,
11
0,
12
NULL,
13
NULL,
14
NULL,
15
&pInfo);}
LISTING 7.2 : Sofwareinternes Starten des Internet Explorers mit spezifizierter Zielhost
Um vorgestelltes Verfahren zu testen wurde ein Apache50 Webserver auf einem Windows
Rechner installiert.
HTML–Dokumente, welche Nachrichten, Verkehrsmeldungen, Wetterinformationen und
Musikdateien präsentieren, wurden erstellt und auf dem Server abgelegt.
Über ein Navigationsmenü war ein strukturierter, gezielter Zugang zu gewünschten
Dokumenten und Software möglich.
Die Tatsache, dass es sich bei diesem Browser um ein systemeigenes Werkzeug handelt,
bietet
weiterhin
eine
komfortable
Möglichkeit
zum
ersten
Aufspielen
der
Anwendungssoftware. Wird über einen Hyperlink eine Datei angewählt, so wird dem
Anwender über einen Dialog ermöglicht, diese Datei mit der zugeordneten Anwendung
sofort zu öffnen oder an einer Stelle der Wahl im Dateisystem abzulegen.
Es wurden Überlegungen unternommen, diese Option auf eine Aktion zu reduzieren um die
Interaktion mit dem System zu minimieren.
50
www.apache.org/
- 52 -
WLAN–Verbindungsaufbau im Infrastruktur–Szenario
SCREENSHOT 7.3 : Informationsanwendung mittels Webservers
- 53 -
8. Anmerkungen zur Entwicklung unter Windows XP
8.1
NDISUIO Schnittstellendefinition
Um die Abhandlung der softwareinternen WLAN–Steuerung über das NDISUIO–Protokoll
nicht auf Windows CE zu beschränken wird im Folgenden auf Adapterzugriffe unter anderen
aktuellen Windows–Varianten eingegangen.
Konkret erfolgte eine Portierung der erarbeiteten Softwarefunktionalität auf Windows XP
SP1. Diesbezüglich wurde die Konsolenanwendung „WLANConSol“ entwickelt, welche
verfügbare Instanzen von 802.11–Adaptern ausliest, diese zur Anzeige bringt und für die
weitere Verwertung vorbereitet. Quelltext und ausführbare Programmdatei sind beigelegter
CD–ROM zu entnehmen.
Um mittels NDISUIO–Zugriffen auf die WLAN–Hardware zuzugreifen, wird in jedem Falle
zuerst ein Handle benötigt. Dieses wird als Rückgabewert der CreateFile-Funktion erzeugt
und einer Variablen von Typ Handle zugewiesen. Anschließend können unter Pocket PC
2003 Konfigurations- und Informationsbeschaffungsvorgänge durchgeführt werden, indem
die Adapterbezeichnung, im Falle des untersuchten HP iPAQ 5500 Pocket PCs „vnetusba1“,
in den Strukturen PNDISUIO_SET_OID und PNDISUIO_QUERY_OID platziert wird.
Die Variable „ptcDeviceName“, welche einen Zeiger auf einen, den Namen der
Adapterinstanz enthaltenden, Puffer empfängt, wird allerdings nur für Windows CE zur
Verfügung gestellt.
Wird diese konkretisiert, so sind die implementierten DeviceIoControl–Zugriffe nur auf
spezifiziertem Gerät durchführbar. Soll der Code variabel gestaltet werden, so kann die
„ptcDeviceName“ –Struktur mit dem Wert nur „NULL“ initialisiert werden. Dieses Vorgehen
ist auch unter Windows CE praktikabel.
Die spezifische Übergabe des Gerätenamens legt die Funktionalität des Quelltextes fest und
macht Operationen unnötig, welche für die geräteunabhängige Implementierung eingesetzt
werden müssen [MSDN05].
8.2
Enumeration der WLAN–Adapter
Im Vorfeld macht es Sinn, zuerst alle verfügbaren WLAN–Netzwerkadater zu enumerieren
und in einer Liste zu veralten.
Die gewünschte Hardwareselektion erfolgt in einer separaten Funktion und kann sowohl
durch Mensch–Maschine–Interaktion, als auch automatisiert erfolgen.
Wird
der
IOCTL–Kontrollcode
IOCTL_NDISUIO_QUERY_BINDING
innerhalb
der
DeviceIoControl–Funktion eingesetzt, so wird es einer Anwendung ermöglicht, den Namen
- 54 -
Anmerkungen zur Entwicklung unter Windows XP
und die Bezeichnung aller an NDISUIO gebunden Netzwerkschnittstellen des ausführenden
Systems auszulesen.
Die Ergebnisdaten werden in den in Zeile 7 (Listing 8.1) initialisierten Datenpuffer
geschrieben. Dieser wird der DeviceIoControl–Funktion in Zeile 20 als Parameter übergeben
und verweist auf eine Instanz der NDISUIO_QUERY_BINDING–Struktur, welche die
Variablen
für
den
Namen
und
die
Beschreibung
der
Adapter
enthält.
Das
NDISUIO_QUERY_BINDING–Element „BindingIndex“ dient als Enumerationsindex. In der
for–Schleife aus Zeile 15, welche kein eigenes Abbruchkriterium kennt, wird dieser so lange
inkrementiert, bis der Rückgabewert der
DeviceIoControl–Funktion auf die erfolgte
Abarbeitung aller Adapter schließen lässt (Zeile 18) und die break–Anweisung aus Zeile 52
greift.
Innerhalb des Schleifenkörpers werden die Adapterdefinitionen mittels memcpy–Operationen
in ein Array (Liste) von WRAPI_NDIS_DEVICE–Strukturen, welche den Namen (Zeile 33 bis
35) und die Beschreibung (Zeile 37 bis 39) der Geräte verwalten, eingefügt. Eine variable
Zuordnung des benötigten Speicherplatzes für jede Adapterdefinition wird in Zeile 28 bis 31
über die malloc–Funktion vorgenommen.
Die Variable lItems, welche in Zeile 2 deklariert und mit dem Wert 0 initialisiert wird, enthält
die Anzahl der geführten Listenelemente.
1
WRAPI_NDIS_DEVICE
*pDeviceList = NULL;
2
long
lItems = 0;
3
4
WRAPI_NDIS_DEVICE **ppDeviceList = &pDeviceList;
5
long *plItems = &lItems;
6
7
CHAR
Buf[1024];
8
DWORD dwBytesWritten, i = 0;
9
10
m_pQueryBinding = (PNDISUIO_QUERY_BINDING)Buf;
11
12
*ppDeviceList = (WRAPI_NDIS_DEVICE *) malloc(NUM_DEVICES *
13
sizeof(WRAPI_NDIS_DEVICE));
14
15
for (m_pQueryBinding->BindingIndex = i;;m_pQueryBinding->BindingIndex =
16
++i)
17
{
18
if (DeviceIoControl(
19
m_hFileHandle,
20
IOCTL_NDISUIO_QUERY_BINDING,
21
m_pQueryBinding,
22
sizeof(NDISUIO_QUERY_BINDING),
23
Buf,
24
sizeof(Buf),
25
&dwBytesWritten,
- 55 -
Anmerkungen zur Entwicklung unter Windows XP
NULL))
26
{
27
28
(*ppDeviceList)[i].pDeviceName = (WCHAR *)
29
malloc(m_pQueryBinding->DeviceNameLength);
30
(*ppDeviceList)[i].pDeviceDescription = (WCHAR *)
31
malloc(m_pQueryBinding->DeviceDescrLength);
32
33
memcpy((*ppDeviceList)[i].pDeviceName,
34
(PUCHAR)m_pQueryBinding+m_pQueryBinding->DeviceNameOffset,
35
m_pQueryBinding->DeviceNameLength);
36
37
memcpy((*ppDeviceList)[i].pDeviceDescription,
38
(PUCHAR)m_pQueryBinding+m_pQueryBinding->DeviceDescrOffset,
39
m_pQueryBinding->DeviceDescrLength);
40
memset(Buf, 0, sizeof(Buf));
41
42
}
43
else
44
{
45
m_dwError = GetLastError();
46
if (m_dwError != ERROR_NO_MORE_ITEMS)
{
47
48
printf("EnumerateDevices:\n terminated abnormally, error
49
%d\n", m_dwError);
50
m_hRes = E_FAIL;
51
}
break;
52
53
}
54
*plItems = i + 1;
55
}
LISTING 8.1 : Enumeration der WLAN–Adapter
51
Name und Beschreibung der enumerierten Adapter können nun ausgegeben werden.
1
for ( int j = 0; j < lItems; j++)
2
{
3
printf("Enumerierte NDIS Devices:\n %ws\n
4
pDeviceList[j].pDeviceDescription, pDeviceList[j].pDeviceName);
5
}
LISTING 8.2 : Ausgabe der enumerierten WLAN–Adapter über die Konsole
51
52
Anpassung der WRAPIb2.0 – WLANConSol.cpp
WLANConSol – WLANConSol.cpp
- 56 -
52
- %ws\n",
Anmerkungen zur Entwicklung unter Windows XP
8.3
Assoziation des Adapters mit dem NDISUIO Handle
Um ohne OID–interne Adapterzuweisung zu arbeiten, muss das erzeugte Geräte–Handle
(Kapitel 5.6, Listing 5.2) mit der Hardware assoziiert werden.
Dies erfolgt innerhalb eines Hardwarezugriffes in Form einer DeviceIoControl–Funktion,
welche durch den IOCTL–Kontrollcode IOCTL_NDISUIO_OPEN_DEVICE definiert wird.
Weitere relevante Parameter sind ein Zeiger auf den Adapternamen (Zeile 16) und die
Größe des Namenspuffers (Zeile 17) in Bytes.
Jede Anwendung kann dabei nur einen Adapter zur selben Zeit beanspruchen [MSDN05].
Listing 8.3 schließt nahtlos an das vorangegangene Listing 8.2 an und bezieht sich auf
dessen Geräteenumeration „pDeviceList“. In Zeile 1 wird das Element mit dem Array–Index
1 selektiert. Dieses wird in der for–Schleife (Zeilen 6 bis 9) in den Zeichen–Container
„wNdisDeviceName“ transferiert, wobei sich die Länge des Strings in der Variablen
„wNameLength“ entsprechend anpasst.
DEVICE_LENGTH aus Zeile 2 ist über eine define–Operation dauerhaft mit der Zahl 47
verknüpft, was bedeutet, dass sich die Länge der Gerätebezeichnung auf diesen Wert
beschränkt.
In Zeile 12 wird die binäre 0 an den String angefügt, um den Abschluss der Zeichenkette zu
signalisieren.
Nach Ausführung der DeviceIoControl–Operation (Zeilen 14 bis 21), beziehen sich alle
weiteren NDISUIO–Zugriffe auf diesen WLAN-Adapter.
1
WCHAR *pwDeviceName = pDeviceList[1].pDeviceName;
2
WCHAR wNdisDeviceName[DEVICE_LENGTH] = {0};
3
int wNameLength, h = 0;
4
wNameLength = 0;
5
6
for ( h = 0; h < DEVICE_LENGTH-1; h++ )
7
{
8
wNdisDeviceName[h] = pwDeviceName[h];
9
wNameLength++;
10
}
11
12
wNdisDeviceName[h] = L'\0';
13
14
if (!DeviceIoControl(m_hFileHandle,
15
IOCTL_NDISUIO_OPEN_DEVICE,
16
(LPVOID) &wNdisDeviceName[0],
17
sizeof(WCHAR)*wNameLength,
18
NULL,
19
0,
20
&m_dwBytesReturned,
21
NULL))
- 57 -
Anmerkungen zur Entwicklung unter Windows XP
22
{
23
m_dwError = GetLastError();
24
printf("Could not open NDIS Device, error %d\n", m_dwError);
25
m_hRes = E_FAIL;
26
}
27
else
28
{
29
printf("\n\n\nDevice %ws\nerfolgreich geoeffnet\n",
30
pDeviceList[1].pDeviceDescription);
31
}
LISTING 8.3 : Assoziation des Handles mit dem WLAN-Adapter
53
Anpassung der WRAPIb2.0 – WLANConSol.cpp
- 58 -
53
9. Prioritätsgesteuerter WLAN–Verbindungsaufbau
9.1
Motivation
Die bisherigen Konzipierungsüberlegungen zielten darauf ab, durch vorgegebene Merkmale
spezifizierte WLAN–Profile softwaregesteuert oder manuell zu aktivieren und dynamisch auf
erfolgten Verbindungsaufbau zu prüfen. Hierbei entscheiden die Ressourcenanforderungen
des Programms oder der Mensch, welcher Netzwerkzugang angestrebt wird.
Die nachstehenden Überlegungen binden einen zusätzlichen Faktor ein: Softwareinterne
Selektion
des
angestrebten
WLAN-Netzwerkes
nach
priorisierten
externen
Voraussetzungen.
Die folgenden Beispiele sollen diesen Gedankengang verdeutlichen. Angenommen eine
Anwendung beliebiger Art benötigt Zugriff auf eine Netzwerkressource. Es besteht Kenntnis
darüber, dass die Ressource über mehrere, eventuell gekoppelte, WLAN–Knoten erreichbar
ist, jedoch eine Netzwerkanbindung nach dem Least Cost Prinzip bevorzugt wird. Gründe
hierfür
können
variierende
Übertragungsgeschwindigkeiten,
Verbindungskosten,
Signalstärke oder generelle Verfügbarkeit sein.
Auch softwareinterne Aufgaben können priorisiert werden. Das Versenden einer Mail muss
schneller erfolgen als das Empfangen der aktuellen Staumeldungen. Die Software soll nun
im Vorfeld sondieren, welche äußeren Bedingungen gegeben sind und diese Auswerten.
Senden zwei oder mehrere Zugangspunkte im aktuellen Signalbereich, wird die Verbindung
hergestellt, welche das Senden von Mails unterstützt, obwohl ebenfalls Verkehrsnachrichten
über ein anderes
Netzwerk angerufen werden könnten. Erkennt der Algorithmus
unterschiedliche Anbindungsmöglichkeiten mit variierender Signalstärke, so wird der
Verbindungsaufbau, der zur besten Übertragungsleistung führt, initiiert.
Lässt die Signalstärke darauf schließen, dass ein Positionswechsel stattgefunden hat,
reagiert das Programm und präsentiert entsprechende Informationen.
Bei einer Messerundfahrt könnten mit Hilfe dieses Verfahrens standortabhängige Funktionen
ausgeführt werden.
Die Anwendung reagiert weiterhin dynamisch auf Veränderungen der gegebenen
Voraussetzungen. Ein Netzwerk, welches sich an einer Stelle durch hervorragende
Signalstärke ausgezeichnet hat, kann nach einer Positionsänderung kaum mehr erreichbar
sein. Dies wird programmatisch verwertet und eine günstigere Alternative angepeilt.
- 59 -
Prioritätsgesteuerter WLAN–Verbindungsaufbau
9.2
802.11 Netzwerkscan
Um einen prioritätsgesteuerten Verbindungsaufbau in Abhängigkeit von Verfügbarkeit,
Signalstärke oder SSID zu ermöglichen, müssen diese Informationen im Vorfeld
softwareintern gesammelt werden. Die 802.11–Adapterhardware wird hierbei als Sensor
genutzt. Grundsätzlich können Netzwerkscans auf verschiedene Arten durchgeführt werden.
Wird ein aktiver Netzwerkscan in die Wege geleitet, so sendet die 802.11–Adapterhardware
periodisch Sondierungsanfragen über einen selektierten Kanal an die Broadcast–Adresse
und wartet auf die Antwort von erreichten WLAN–Stationen.
Eine weitere Variante ist das passive Scannen. In diesem Fall verbreitet der Adapter keine
Anfragen, sondern verbleibt in untätigem Zustand bis Rundsendeinformationen von
verfügbaren Stationen bei ihm eintreffen.
Ein WLAN–Gerät identifiziert sich gegenüber seiner Umwelt mittels so genannter Beacons
(Leuchtfeuer). Diese Datenpakete sind für die Netzwerksynchronisation zuständig und
werden in vorgegebenen Intervallen ausgesendet um Steuersignale zu übermitteln und das
Auffinden von drahtlosen Netzwerken zu erleichtern. Auf einigen Access Points können
diese Intervalle individuell angepasst werden.
Empfängt
ein
Adapter
ein
solches
Leuchtfeuer
oder
eine
Antwort
auf
eine
Sondierunganfrage, so hinterlegt er diese Informationen in einer BSSID–Liste [MSDN05].
9.3
Implementierung eines BSSID List Scans
Dies wird über einen Gerätezugriff mittels OID_802_11_BSSID_LIST_SCAN veranlasst.
Erhält ein Adapter diese Kontrollstruktur, so reagiert er nach vorgegebenem Schema.
Zunächst wird der bisherige Inhalt der geführten BBSID–Liste verworfen. Unabhängig vom
aktuellen Infrastrukturmodus werden sowohl infrastrukturelle, als auch Ad–hoc–Netzwerke
gesucht. Hierbei werden alle Frequenzkanäle und Netzwerktypisierungen mit einbezogen.
Um die korrekte Initialisierung dieser Operation bereits nach kurzer Zeit zu evaluieren,
erfolgt eine Statusrückmeldung schon bevor der Scanvorgang beendet wurde.
Die erhaltenen Informationen werden in die dafür reservierte Speicherstruktur eingepflegt.
Listing 9.1 zeigt die konkrete Implementierung für eine Anwendung unter Windows XP.
Die folgenden Quelltextauszüge wurden größtenteils der „GetAPList“–Funktion aus der
Wireless Research API entnommen und an das eigens erstellte Programmgerüst
„WLANConSol“ angepasst.
Die OID–Spezifikation wird in bekannter PNDISUIO_QUERY_OID–Struktur abgelegt
(Zeile 5) und innerhalb der DeviceIoControl–Funktion an den Adapter gesendet
(Zeile 7 bis 14).
- 60 -
Prioritätsgesteuerter WLAN–Verbindungsaufbau
1
PNDISUIO_SET_OID
pSetOidList;
2
UCHAR QueryBuffer[1024];
3
4
pSetOidList = (PNDISUIO_SET_OID) &QueryBuffer[0];
5
pSetOidList->Oid = OID_802_11_BSSID_LIST_SCAN;
6
7
DeviceIoControl(m_hFileHandle,
8
IOCTL_NDISUIO_SET_OID_VALUE,
9
(LPVOID) &QueryBuffer[0],
10
sizeof(QueryBuffer),
11
(LPVOID) &QueryBuffer[0],
12
0,
13
&m_dwBytesReturned,
14
NULL);
LISTING 9.1 : Initiierung eines BSSID LIST SCANS
54
Aktives als auch passives erneuern der BSSID_LIST–Struktur führ zu einer vollständigen
Auffrischung des Tabelleninhaltes. Man spricht deshalb von expliziter Netzwerkerkundung.
Weiterhin führt das 802.11–Device implizite Scans durch. Dies bedeutet, dass der Adapter
eine eigenständige Aktualisierung der BSSID–Liste durchführt. Auf das Aussenden von
Broadcast–Nachrichten wird verzichtet. Die Einträge werden hierbei lediglich ergänzt. Greift
man innerhalb von sechs Sekunden nach Initiierung eines Scans lesend auf den BSSID–
Cachespeicher zu, so wird dessen vollständiger Inhalt zurückgegeben. Das Auslesen erfolgt
über eine OID mit der Ausprägung OID_802_11_BSSID_LIST.
Wird der Zugriff nach der erwähnten Zeitspanne durchgeführt, so muss das Ergebnis alle,
auch durch implizite Abfragen erlangte, Einträge preisgeben.
Wurde zuvor kein expliziter Scan in die Wege geleitet, werden WLAN–Knoten in
Abhängigkeit der aktuellen Konfiguration ausgegeben. Wenn sich der Adapter im Ad–hoc–
Modus befindet, beschränkt sich der zurückgegebene Inhalt daher auf Peer–to–Peer–
Knoten [MSDN05].
Das
vorangegangene
Listing
PNDISUIO_SET_OID–Struktur,
9.1
erläutert
wohingegen
den
schreibenden
das
Zugriff
nachfolgende
über
Listing
die
über
PNDISUIO_QUERY_OID lesend auf den WLAN-Adapter zugreift. Es müssen daher erst
einmal Container bereitgestellt werden, um die ausgelesenen Daten unterzubringen.
Es handelt es sich hierbei um ein Array von Informationsstrukturen, welche den
auszulesenden
Daten
entsprechen
müssen.
Nach
erfolgtem
Gerätezugriff
über
DeviceIoControl (Zeilen 17 bis 24), werden die bisher untypisierten Rückgabedaten, wie
gewohnt, in den dafür angelegten „QueryBuffer“ (Zeile 9) geschrieben.
In Zeile 26 wird der Inhalt des Datensegmentes als PNDIS_802_11_BSSID_LIST–Struktur
interpretiert und dem dafür dynamisch allokierten Speicherbereich (Zeile 7) zugewiesen. Die
PNDIS_802_11_BSSID_LIST–Spezifikation enthält einen „NumberOfItems” –Zähler und ein
54
Anpassung der WRAPIb2.0 – WLANConSol.cpp
- 61 -
Prioritätsgesteuerter WLAN–Verbindungsaufbau
Array von NDIS_WLAN_BSSID–Strukturen, dessen Aufbau in Listing 9.2 aufgeschlüsselt
wird. Wie der Rest der für das NDISUIO–Protokoll relevanten Strukturen findet auch dieses
Element ihre Definition im „ntddndis.h“ Header–File.
Die enthaltenen Merkmale treffen eine Aussage darüber, welche Informationen über
erkundete WLAN–Devices ausgelesen werden können. Es handelt sich hierbei um die
MAC–Adresse (Zeile 3), die SSID (Zeile 5), die Signalstärke (Zeile 7), den Netzwerktyp
(Zeile 8), die Konfigurationsspezifikationen (Zeile 9), den Infrastrukturmodus (Zeile 10) und
die unterstützten Übertragungsraten (Zeile 11). Alle diese Merkmale können beim
priorisierten Verbindungsaufbau Berücksichtigung finden.
1
struct _NDIS_WLAN_BSSID {
2
ULONG Length;
3
NDIS_802_11_MAC_ADDRESS MacAddress;
4
Uchar Reserved[2];
5
NDIS_802_11_SSID Ssid;
6
ULONG Privacy;
7
NDIS_802_11_RSSI Rssi;
8
NDIS_802_11_NETWORK_TYPE NetworkTypeInUse;
9
NDIS_802_11_CONFIGURATION Configuration;
10
NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode;
11
NDIS_802_11_RATES SupportedRates;
12
} NDIS_WLAN_BSSID, *PNDIS_WLAN_BSSID;
LISTING 9.2 : Aufschlüsselung der NDIS_WLAN_BSSID–Struktur
55
Die Daten müssen anschließend für die weitere Verwendung aufbereitet und in
entsprechenden Variablen gespeichert werden. Die BSSID–Liste ist nicht beständig, da sie
vom Adapter eigenständig aktualisiert wird.
Zu diesem Zweck ist das Erstellen eigener Datencontainer nötig. In konkreten Falle handelt
es sich um ein Array von „AP_DATA“–Strukturen, welches in Zeile 1 mit einem Zeiger auf
den Speicherbereich versehen wird. wird. Die long–Variable „lItemsList” zählt dessen
Elemente.
Der Aufbau von „AP_DATA“ wird innerhalb der „WLanExports.h“–Datei, welche dem
Quelltext der WRAPI beiliegt, definiert und den Bedürfnissen entsprechend angepasst. Es
werden nur Informationen übernommen, welche für die Weiterverwendung von Bedeutung
sind. Der hierfür benötigte Speicherplatz wird in den Zeilen 30 und 31 allokiert.
In der for–Schleife von Zeile 33 bis 47 wird das Array gefüllt. Diese wird sooft durchlaufen,
wie WLAN–Geräte eingelesen wurden. Die eingebettete Schleife von Zeile 35 bis Zeile 39
liest hierbei die MAC–Adresse in ein Array ein, wohingegen die Schleife von Zeile 41 bis 45
für die SSID zuständig ist.
55
ntddndis.h – Windows XP SP1 DDK
- 62 -
Prioritätsgesteuerter WLAN–Verbindungsaufbau
Für die entwickelte Testapplikation wurde zusätzlich eine Strukturvariable „ssid“ für das
Speichern des Service Set Identifiers integriert (Zeile 46). Da die Strukturen mehrfach
ineinander verschaltet sind, ist es bei der Auswertung der Informationen notwendig, dessen
Elemente bis auf die unterste Ebene der Grunddatentypen zu durchleuchten. Bei der SSID
handelt es sich beispielsweise um ein Array von bis zu 32 uchar–Werten (unsigned
character). Die SSID lässt sich auf ein Array von sechs unsigned char Werten zurückführen
und die Signalstärke besteht aus einer long–Zuweisung.
1
AP_DATA *pAP_data = NULL;
2
long
3
AP_DATA **ppAP_data =&pAP_data;
4
long *plItemsList =&lItemsList;
lItemsList;
5
6
PNDISUIO_QUERY_OID
pQueryOid;
7
PNDIS_802_11_BSSID_LIST
pBssid_List;
8
9
UCHAR QueryBuffer[1024];
10
11
ULONG k = 0;
12
Int l = 0;
13
14
pQueryOid = (PNDISUIO_QUERY_OID) &QueryBuffer[0];
15
pQueryOid->Oid = OID_802_11_BSSID_LIST;
16
17
DeviceIoControl(m_hFileHandle,
18
IOCTL_NDISUIO_QUERY_OID_VALUE,
19
(LPVOID) &QueryBuffer[0],
20
sizeof(QueryBuffer),
21
(LPVOID) &QueryBuffer[0],
22
sizeof(QueryBuffer),
23
&m_dwBytesReturned,
24
NULL);
25
26
pBssid_List = (PNDIS_802_11_BSSID_LIST)pQueryOid->Data;
27
28
*plItemsList = pBssid_List->NumberOfItems;
29
30
*ppAP_data = (AP_DATA *)calloc(pBssid_List->NumberOfItems,
31
sizeof(AP_DATA));
32
33
for ( k = 0; k < pBssid_List->NumberOfItems; k++ )
34
{
35
for ( l = 0; l < 6; l++ )
36
{
37
(*ppAP_data)[k].mac_addr[l] =
- 63 -
Prioritätsgesteuerter WLAN–Verbindungsaufbau
38
(pBssid_List->Bssid[k]).MacAddress[l];
39
}
40
41
for ( l = 0; l < 32; l++ )
42
{
43
(*ppAP_data)[k].ssid[l] =
44
(pBssid_List->Bssid[k]).Ssid.Ssid[l];
45
}
46
(*ppAP_data)[k].Rssi = (pBssid_List->Bssid[k]).Rssi;
47
}
LISTING 9.3 : Auslesen der in der BSSID–Liste enumerierten WLAN–Geräte
9.4
56
Verwertung der gesammelten Geräteinformationen
Das folgende Listing 9.4 demonstriert den prioritätsgesteuerten Verbindungsaufbau an Hand
einer SSID–Auswertung. Der Service Set Identifier lässt hierbei auch auf den
Infrastrukturmodus schließen.
Das vorgestellte Programmgerüst (Listing 9.4) bezieht sich direkt auf das Anstoßen des
aktiven BSSID_LIST_SCAN–Vorgangs (Listing 9.1) und das Auslesen der BSSID–Liste
(Listing 9.3). Das Array, welches durch den Zeiger „pAP_data” gekennzeichnet wird, wurde
in
Listing
9.3
mit
Variablendeklarationen
Informationen
seien
in
über
angestelltem
verfügbare
WLAN–Geräte
Softwaregerüst
auf
Grund
gefüllt.
seines
exemplarischen Charakters außen vor gelassen. Der Quelltextauszug ist Teil der
entwickelten „WLANConSol“–Anwendung, welche auf beigefügter CD–ROM zu finden ist.
Das Verhalten der Anwendung lässt sich wie folgt beschreiben: Wird beim Auslesen der
BSSID–Liste ein Device mit der SSID „AdhocNet“ oder „InfraNet“ erkannt, so wird eine
entsprechende Verbindung angestrebt. Sind beide WLAN–Konfigurationen auffindbar, so
wird das „AdhocNet“ höher priorisiert. Dies wirkt sich dahingehend aus, dass selbst wenn
zuvor eine Assoziation mit den „InfraNet“ besteht, diese Netzwerkanbindung durch
eingeleiteten Verbindungsaufbau zu entdecktem „AdhocNet“ unterbrochen wird. Ist bereits
eine
Anbindung
im
Sinne
der
vergebenen
Prioritäten
erfolgt,
werden
weitere
Verbindungsoperationen unterbunden.
Die rahmende for–Schleife arbeitet alle in der
„AP_data“–Liste geführten Einträge
sequentiell ab.
Die if–Abfrage aus Zeile 3 vergleicht zunächst die SSID des ausgewählten Geräteeintrags
aus der „AP_data“–Liste mit dem String „AdhocNet“. Wird eine Entsprechung erkannt, so
wird der Verbindungsstatus geprüft. Befindet sich der 802.11–Adapter bereits in
kompatiblem Zustand, so wird dies lediglich durch eine Konsolenausgabe visualisiert
56
Anpassung der WRAPIb2.0 – WLANConSol.cpp
- 64 -
Prioritätsgesteuerter WLAN–Verbindungsaufbau
(Zeile 7). Ist dies nicht der Fall wird eine Konfigurationsänderung eingeleitet (Zeile 13) und
die Zustandsvariable angepasst (Zeile 14).
Die verwendeten Methoden „setAdhoc“ und „setInfrastructure“ wurden in Kapitel 6.2
ausführlich behandelt. Führt der if–Vergleich (Zeile 3) nicht zum Erfolg wird das else–Modul
(Zeilen 17 bis 30) in die Programmausführung mit einbezogen. Über eine weitere strcmp–
Funktion (string compare) in Zeile 18 wird nun getestet, ob die SSID des zu überprüfenden
Gerätes der Zeichenkette „InfraNet“ gleichsetzbar ist. Bei Rückgabe des Wertes true wird ein
entsprechender infrastruktureller Verbindungsaufbau in die Wege geleitet (Zeile 27), falls
dies noch nicht geschehen ist (Zeile 20).
1
for (m = 0;m< k; m++)
2
{
3
if(!strcmp((const char*)pAP_data[m].ssid,"AdhocNet"))
4
{
5
if(status==1)
6
{
printf("\nBereits im Ad-Hoc Modus ...");
7
8
}
9
else
10
{
11
printf("\nEs wurde ein priorisiertes Device gefunden\n
12
Initiiere Ad-Hoc Modus\n");
13
setAdHoc();
14
status = 1;
}
15
16
else
17
{
18
if(!strcmp((const char*)pAP_data[m].ssid,"InfraNet"))
19
{
20
if(status == 2)
21
{
22
printf("\nBereits im Infrastruktur Modus ...");
23
}
24
else
25
{
26
printf("\nInitiiere Infrastruktur Modus\n");
27
setInfrastructure();
28
status = 2;
}
29
30
}
31
}
LISTING 9.4 : Prioritätsgesteuerter Verbindungsaufbau
57
WLANConSol – WLANConSol.cpp
- 65 -
57
Prioritätsgesteuerter WLAN–Verbindungsaufbau
Um den priorisierten Verbindungsaufbau dynamisch zu gestalten, müssen innerhalb eines
vorgegebenen Zeitfensters neu erkannte WLAN–Adapter aufgespürt und verwertet werden.
Dies kann mit Hilfe einer übergeordneten Endlosschleife geschehen, in welcher der
Netzwerkscan,
das
Auslesen
der
BSSID–Liste
und
prioritätsgesteuerten Verbindungsaufbau integriert werden.
- 66 -
der
Algorithmus
für
den
10. WLAN–Integration eines Embedded Automotive
Frameworks unter QNX
10.1
Systembedingte Voraussetzungen
Ein weiterer Aspekt meiner Untersuchungen beschäftigt sich mit der kabellosen
Netzwerkanbindung von Embedded Automotive Frameworks unter dem echtzeitfähigen
Betriebssystem QNX.
Diese Systeme, ausgerüstet mit einem SH4 Prozessor, bieten eine experimentelle Plattform
für die Softwareentwicklung auf ressourcenbeschränkter Hardware und sind für die
Steuerung von Multimediaelementen im KFZ ausgelegt.
Grundsätzlich besteht ein solches Infotainment–System aus einer Headunit, welche die
Rechenarbeit übernimmt und darüber hinaus diverse Bedienelemente inklusive Display zur
Verfügung
stellt,
sowie
typischen
Multimediakomponenten
(Audiokomponenten,
Videokomponenten, Kommunikationsdevices, Navigationssystem, etc.) [JW04].
Auf Grund des experimentellen Charakters dieser Geräte entsteht die Notwendigkeit
Hardwarekomponenten hinzuzufügen, Software aufzuspielen und Prozessabläufe zu
überwachen. Da das eigentliche Framework keine Schnittstellen für die Manipulation von
Programmen
und
Kontrolle
von
Systemzuständen
oder
Abläufen
bietet
ist
die
Kommunikation mit externen Entwicklungssystemen obligatorisch.
Hierzu wird ein Ethernet–Netzwerk verwendet, welches alle Framework–Targets umfasst,
sowie eine Reihe von konventionellen Rechnern, welche mit der QNX Momentics IDE58
(Integrated Development Environment) ausgestattet sind um das Ausführen und Debuggen
von Programmen über das Netzwerkinterface zu ermöglichen.
Im Gegensatz zu statischen Netzwerkknoten eines herkömmlichen Kabelnetzwerkes in
einem Labor, stellt der Einsatz in einer mobilen Umgebung weit komplexere Anforderungen
an das Kommunikationsmedium.
Der Notwendigkeit einer kabellosen Netzwerkanbindung, welche auch über größere
Entfernungen und unabhängig von physikalischen Hindernissen wie Wänden oder
Karosserie aufrecht erhalten werden kann, wird man im Folgenden durch den Einsatz von
WLAN gerecht.
58
www.qnx.com
- 67 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
Auch das bereits in der Einleitung angeführte Tankstellen–Szenario soll entsprechend den
erarbeiteten Anforderungen an den automatisierten Verbindungsaufbau im KFZ nachgebildet
werden
können.
So
soll
die
Infotainmenteinheit
an
speziell
eingerichteten
Verteilungspunkten Zugriff auf digitale Medieninhalte wie mp3s, Software, Informationen,
Systemupdates und Patches erlangen.
Die folgenden Ausführungen basieren auf praktischen Erfahrungen, welche im Laufe des
Projektseminares gesammelt wurden, und sollen ein grundlegendes Verständnis für die
Integration von Netzwerkkomponenten im Allgemeinen, sowie WLAN–Geräten auf einem
eingebetteten System unter dem Betriebssystem QNX im Speziellen vermitteln. Ebenso wird
auf im Laufe der Entwicklung auftretende Probleme und Fragen eingegangen um einen
einführenden Leitfaden für Installation, Integration und Implementierung bei ähnlichen
Problemstellungen zu vermitteln.
10.2
Realisierung mittels WLAN Karte
Da die Mainboards sowohl mit einer PCMCIA–Schnittstelle, sowie mit einem PCI–Interface
ausgestattet sind, konzentrierten sich die Bemühungen zunächst auf die Installation interner
Steckkarten.
10.2.1
Verbindungsaufbau mittels Systembefehlen
Einen einschränkenden Faktor bei der Inbetriebnahme und Installation stellt die Tatsache
dar, dass sämtliche Kommandos von einem zweiten Rechner mit entsprechenden Ein– und
Ausgabeeinheiten abgesetzt werden müssen. Dies bedeutet, dass die Funktionstüchtigkeit
des Ethernet–Interfaces in jedem Falle gewährleistet bleiben muss, um die Kontrolle über
die Geräte aufrechtzuerhalten.
Gravierende Änderungen der Netzwerkkonfiguration können dazu führen, dass die Einheit
von Außen nicht mehr zugänglich ist und ein Wiederaufspielen eines Systemimages nötig
wird.
Die
Befehle
zum
Starten
der
benötigten
Netzwerkdienste
und
Aktivierung
der
Netzwerkkarten werden während des Bootvorganges über ein Bootscript abgearbeitet.
Befehle, die während der Systemlaufzeit ausgeführt werden sollen, werden innerhalb einer
Telnet–Session abgesetzt. Der Telnet–Dienst basiert auf einem unverschlüsselten
eigenständigen Protokoll auf der Anwendungsschicht und ermöglicht den Zugang auf die
Kommandozeile eines Fremdrechners via TCP/IP [WITEL05].
Unter QNX, ähnlich wie bei anderen Variationen von UNIX Systemen, bietet der IO–NET–
Dienst die Basis für grundsätzliche Netzwerkfunktionen. Ist dieser Dienst gestartet können
entsprechende Geräte gemountet werden. Unter diesem Begriff versteht man in der Regel
das optionale Einbinden von Ein– und Ausgabegeräten. Ein gemountetes Device kann über
- 68 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
den unmount–Befehl wieder aus dem System entfernt werden. Alle Devices, welche in ein
laufendes System eingebunden wurden, sind als symbolische Einträge an statisch definierter
Stelle im Dateisystem zu finden. Der Pfad zu den Netzwerkkarten ist in unserem System
\dev\io–net\.
Jedes
Device
benötigt
eine
spezifische
Beschreibung
seiner
individuellen
herstellerabhängigen Hardwarezugriffsfunktionen. Eine solche Sammlung von APIs wird
durch ein so genanntes Shared Objekt File zur Verfügung gestellt und ist mit der
Dateiendung .so versehen. Abstrakt gesehen handelt es sich hierbei um einen Gerätetreiber.
Shared Objects können als Pendant zu DLLs unter Windows gesehen werden und sind ein
C++ Kompilat meist mehrerer Quellcode–Dateien, welche sich an fest vorgegebenen
Strukturen und Funktionen orientieren müssen um eine standardisierte Systemintegration zu
ermöglichen. Wird eine .so–Datei ohne expliziten Speicherort beispielsweise innerhalb eines
mount–Befehles angegeben, so wird diese in ihrem Standardpfad \etc\dll\ gesucht. Es
empfiehlt sich diese Vorgabe bei der Installation von Drittanbieter–Treibern zu übernehmen,
um die Verwirrung nicht zusätzlich zu steigern [QNX05].
Treiber für WLAN–Karten werden von QNX nur bedingt zur Verfügung gestellt. Einige fertig
kompilierte Treiber–Dateien werden bei der lizenzierten Version von QNX Momentics 6.3
distributiert und unterstützen diverse WLAN–Karten59 einiger weniger Hersteller.
Eine weiterführende Problematik ergibt sich aus der Tatsache das Treiber für QNX auf
Grund des Nischencharakters kaum von den Herstellerfirmen direkt angeboten werden.
Oben angesprochene Shared Object Dateien für WLAN–Karten, welche bei QNX auf der
Liste der unterstützen Hardware zu finden sind, können ausschließlich von X86er
Prozessoren verarbeitet werden. Quellcodes werden aus kommerziellen Gründen nicht
publiziert und können daher nicht auf andere Architekturen, wie unsere SH4 Prozessoren
übertragen werden.
Der Versuch im Internet veröffentlichte Quellcodedateien60 anzupassen und zu kompilieren
scheiterte an internen Architekturänderungen, welche im Laufe von Versionsweiterführungen
des QNX Frameworks durchgeführt wurden. Bei den zum freien Download angebotenen
Quellen handelte es sich um Portierungen von Linux–Treibern für WLAN–Karten mit
Chipsatz der Firma ATMEL, welcher auf einigen Karten unterschiedlicher Hersteller zum
Einsatz kommt. Diese Erkenntnis wurde zusätzlich durch Korrespondenz mit dem
Entwickler61 untermauert.
Ein Treiber im Experimentalstadium, welcher von der Firma Becker entwickelt und vertrieben
wurde, führte ebenfalls nicht zum gewünschten Ziel.
Zur Verfügung standen eine PCI– und eine PCMCIA-WLAN-Karte. Nach umfangreichen
Bemühungen in Zusammenarbeit mit dem laborinternen Systemintegrationsteam, die Karte
mit unterschiedlichsten Parametern zu mounten, konnte lediglich das PCI–Gerät erkannt
59
www.qnx.com/developers/hardware_support/
www.qnxzone.com/%7Ephearbear/?go=Atmel%20Wi-Fi
61
[email protected]
60
- 69 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
werden. Jedoch wurde der Adapter nicht als Netzwerk–Device an entsprechender Stelle im
System angezeigt und konnte daher nicht konfiguriert und in Betrieb genommen werden.
Um einen erfolgreichen mount–Vorgang zu bewerkstelligen müssen unter Umständen
etliche Parameter wie IRQ, Speicherbereiche, usw. angegeben werden. Dies ist größtenteils
vom Grad der automatisierten Hardwareerkennung abhängig und kann sich bei jedem Gerät
individuell unterscheiden [QNX05].
Die folgenden Ausführungen wurden auf Grund der oben dargestellten Treiberproblematik
theoretisch erarbeitet und teilweise mit herkömmlichen Ethernetkarten, für welche
bekanntermaßen funktionstüchtige Treiber existieren, auf QNX–Systemen getestet. Wie
bereits erwähnt basiert jeglicher Netzwerkkartenbetrieb unter QNX auf dem IO–NET–Dienst.
Ist bereits ein Netzwerk–Device in das System integriert und wird dieses beim Bootvorgang
initialisiert, so ist dieser Dienst bereits gestartet. Im Falle unserer Projekt–Frameworks wird
dieser Vorgang innerhalb eines Skriptes, welches beim Hochfahren der Systeme ausgeführt
wird, sequentiell abgearbeitet.
Ist der Service noch nicht gestartet, so kann dies mit angeführtem Kommando geschehen:
/ io–net $
Ebenso können bei der Ausführung dieses Befehls zusätzliche Parameter angegeben
werden um direkt angegebene Netzwerkgeräte über ihre Shared–Objekt–Files zu mounten.
Das Präfix der Shared Object Bezeichnung „devn“ weißt darauf hin, dass es sich um ein
Netzwerkdevice handelt. Wird dieser Befehl erfolgreich ausgeführt, werden die Geräte
symbolisch innerhalb des Dateisystems als typisiertes Modul geführt.
/ io–net /lib/dll/devn-bcm43xx.so
Läuft bereits eine Instanz von IO–NET, so ist das erneute Starten dieses Dienstes nicht
ratsam. Es kann zu Systeminstabilität führen und die komplette Netzwerkanbindung
beeinträchtigen. Alternativ ist es praktikabel in einem solchen Falle den mount–Befehl zu
bemühen. Der Parameter „–T io-net“ spezifiziert das angegebene Gerät als Netzwerkdevice.
/ mount -T io-net /lib/dll/devn-bcm43xx.so
Wird das Entfernen eines Netzwerkgerätes angestrebt, kann dies über die unmount–
Anwendung geschehen. Die Typisierung des Gerätes wird über die explizite Angabe des
symbolischen Pfades im Dateisystem konkretisiert. Hierbei steht die Modulbezeichnung
„en0“ für das Ethernet–Modul mit Index 0.
/ umount /dev/io-net/en0
- 70 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
Anders als bei Windows–Systemen muss keine komplizierte Adapterkonfiguration
vorgenommen werden, da das Device in einem konkreten Zustand gemountet werden kann.
Alle für die Definition eines WLAN–Netzwerkes relevanten und aus vorangestellten Kapiteln
dieser Arbeit wohl vertrauten Parameter können hierbei übergeben werden. Es handelt sich
hierbei um die SSID, den Infrastruktur–Modus, den Authentifizieruns–Modus und die
Verschlüsselung. Optionale gerätespezifische Parameter können durch Voranstellen des „-o“
–Flags angegeben werden. Das angestellte Systemkommando mountet eine Netzwerk
Interface Card (NIC), konkretisiert dessen SSID mit der Kennung „work“ und setzt den
Infrastrukturmodus durch Angabe von „mode=ibss“ auf Ad–hoc (Independent Basic Service
Set). Weiterhin wird die Authentifizierung mittels „authtype=open“ deaktiviert.
Das Flag „-p“ spezifiziert die Art des anzubindenden Protokolls, in konkretem Falle den
kompletten TCP/IP–Protokollstapel [QNX05].
/ mount -T io-net /lib/dll/devn-bcm43xx.so -o ssid=work mode=ibss
authtype=open -p tcpip
Eine ähnliche Konfiguration im Infrastruktur–Modus wird durch Ändern der „mode“–
Ausprägung auf „bss“ (Basic Service Set) erzielt.
/ mount -T io-net /lib/dll/devn-bcm43xx.so -o ssid=work mode=bss
authtype=open -p tcpip
Will man beispielsweise vom Ad–Hoc–Modus in den Infrastruktur–Modus wechseln muss
man lediglich das Device, welches auf IBBS konfiguriert wurde mit Hilfe des unmount–
Kommandos aus dem System entfernen um es im nächsten Schritt mit den Parametern für
den Infrastruktur–Modus einzubinden.
Der Zugriff über komplizierte APIs, wie bei der Network Driver Interface Specification unter
Windows, wird weitgehend unnötig.
Auch das Zuweisen einer kompatiblen IP–Adresse ist von erstaunlicher Einfachheit:
/ ifconfig en0 192.168.1.3
Die erläuterten Operationen können innerhalb eines QNX–Skriptes zusammengefasst und
ausgeführt werden. Aber auch eine softwareinterne Verwertung ist denkbar. Damit können
die Systemaufrufe in Abhängigkeit von Programmzuständen automatisiert werden, wir das
nächste Kapitel zeigt.
- 71 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
10.2.2
Integration der Systemkommandos
Will man aufgeführte Konsolenkommandos programmatisch verwerten, so kann man sich
der C++ system–Funktion bedienen und die Rückgabewerte abfragen, um auf Erfolg zu
prüfen.
Das angestellte C++ Quellcode–Fragment demonstriert das Starten des IO–Net–Dienstes,
das Einbinden eines WLAN–Adapters und das Zuweisen einer IP–Adresse auf
entsprechendem Interface.
Um die Quellcodefragmente so verständlich wie möglich zu halten wird auf Embedded
Speicherkonzepte, wie das Verbot dynamischer Speicherallokation verzichtet.
1
if((rc = system("mount -T io-net devn-speedo.so"))== -1)
2
{
printf("Kommando konnte nicht ausgeführt werden\n");
3
4
}
5
else
6
{
printf("Network Device Unmount erfolgreich\n\n");
7
8
};
9
10
srand((int) time( NULL ));
11
12
int IPlast = rand()%50;
13
14
char cd1[30];
15
char ddest[40];
16
17
strcpy(cd1,"ifconfig en0 192.168.1.");
18
19
sprintf(ddest,"%s%d",cd1,IPlast);
20
21
if((system(ddest))== -1)
22
{
printf("Kommando konnte nicht ausgefuehrt werden\n");
23
24
}
25
else
26
{
27
printf("IP Adressvergabe auf 192.168.1.%d erfolgreich\n\n",IPlast);
28
};
Listing 10.1 : Softwareinterne Integration von WLAN–Systembefehlen
62
WLANConCheck – WLANConCheck.cpp
- 72 -
62
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
Aufgeführte Systemkommandos ermöglichen eine recht unkomplizierte Konfiguration der
WLAN–Devices. Jedoch kann die volle Funktionalität der Gerätezugriffe nach Art der NDIS–
APIs mit Konsolenkommandos nicht erreicht werden. Es ist nicht möglich erweiterte
Informationen auszulesen oder in die Konfiguration zu schreiben, wie in entsprechendem
Kapitel erläutert. Weiterhin kann es von Nachteil sein bei jeder Modusänderung das
komplette Device aus dem System zu entfernen um es mit anderen Einstellungen wieder zu
integrieren.
10.2.3
Verbindungsaufbau mittels DeviceControl Zugriffen
Auf Unix–Systemen und speziell unter QNX bietet die devctl–Funktion eine Möglichkeit
Geräte nach NDISUIO–Art zu manipulieren. Diese DeviceControl–Funktion sendet
gerätespezifische Kommandos an verwaltende Prozesse, welche als File–Handles in Form
einer symbolischen Datei erzeugt werden.
Eine Portierung des unter Linux verfügbaren Programms "iwconfig"63, welches unter der
GNU LGPL im Internet zu finden war zeigt die Art und Weise dieser Zugriffe und ist auf
beigelegter CD–ROM abgelegt.
Bei Einsatz der Software wird vorausgesetzt dass der Netzwerkadapter bereits vom System
erkannt und in der Netzwerkgeräteliste im Pfad /dev/io–net/ aufgeführt wird. Das Programm
konnte daher bei der WLAN–Anbindung der Framework–Targets nicht eingesetzt werden.
10.3
Realisierung mittels Ethernet–WLAN–Bridge
Da manche Systeme, welche grundsätzlich über Ethernet–Funktionalität verfügen, auf
Grund einschränkender Faktoren, welche sowohl auf verfügbare Hardware als auch
Software zurückzuführen sind, nicht systemintern erweiterbar sind, bieten Ethernet–WLAN–
Brücken dennoch die Möglichkeit einer räumlich flexiblen Netzwerkanbindung.
10.3.1
Beschaffenheit der Netzwerkgeräte und Integration in das bestehende
Kabelnetzwerk
Um sowohl infrastrukturelle als auch Ad–Hoc–Szenarien nachbilden zu können, werden zwei
Ethernet–WLAN–Adapter und ein Access Point benötigt. Die Ethernet–WLAN–Brücken sind
für den Betrieb an je einem Framework gedacht, der Access Point soll die Verbindung zum
bestehenden Kabelnetzwerk herstellen.
63
www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html
- 73 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
Die kompakten Adapter sind jeweils mit zwei Netzwerkschnittstellen oder Interfaces
ausgestattet und fungieren als "externe" WLAN–Karten. Das 802.11–Interface übernimmt
die
eigentliche
WLAN–Funktionalität,
wohingegen
die
Ethernet–Schnittstelle
die
kabelgebundene Überbrückung der Geräte gewährleistet. Die Kombination von Ethernet–
WLAN–Adapter
und
Framework
ergibt
einen
in
sich
geschlossenen,
mobilen
Netzwerkknoten [WIEW05].
Abbildung 10.1 stellt die Einbindung der WLAN–fähigen Targets in das bestehende
Labornetzwerk an Hand eines Netzwerkdiagrammes dar.
Da sich die Framework–Targets, als auch die Labor–PCs in einem eigenständigen
Netzwerksegment befinden, wird die netzübergreifende Kommunikation mit Hilfe eines
Routers realisiert. Die Targets agieren hierbei im Netz 172.16.166.0, während die
Workstations IP–Adressen aus dem 141.100.47.0 Segment zugewiesen bekommen. Die IP–
Adressvergabe erfolgt in beiden Fällen durch einen DHCP–Server mit der Adresse
141.100.47.200. Über das Gateway 141.100.47.254 erfolgt die Anbindung an das
Hochschulnetz, welches den Internetzugang des Labors gewährleistet.
Ziel der Target–WLAN–Integration ist die vollständige Erhaltung der bestehenden
Funktionalität im Kabelnetz. Dies bezieht sich auf die Erreichbarkeit der Workstations,
dynamische Konfiguration über den DHCP–Server und Zugang zu übergeordneten Netzen,
wie Hochschulnetz und Internet.
Da die Targets für den Betrieb in einem Kraftfahrzeug konzipiert wurden, schafft man durch
eine drahtlose Netzwerkanbindung eine
praxisnahe Testumgebung. Unter realen
Bedingungen können entwickelte Erweiterungen verifiziert und an den mobilen Einsatz
angepasst werden. Weiterhin wird es möglich hardwarespezifische Anforderungen zu
erkennen und umzusetzen.
Die Konfiguration der Ethernet–WLAN–Brücken und des Access Points wird in den
folgenden Kapiteln beschrieben.
- 74 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
Abbildung 10.1 : WLAN Integration ICM Labor FH–Darmstadt
- 75 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
10.3.2
Interface–Bridging
Jedem Interface ist eine weltweit eindeutige Netzwerkkennung zugewiesen.
Bei den vorliegenden Geräten werden die Netzwerkschnittstellen über das so genannte
Bridging–Verfahren überbrückt. So werden zwei physikalische Interfaces mit nur einer IP–
Kennung adressiert. Das geräteinterne Routing der Daten–Pakete wird somit verschleiert
und die Konfiguration vereinfacht. Für jeden kabellosen Netzwerkteilnehmer müsste
ansonsten eine eigene Adresse für das Ethernet Interface und zwei für die Schnittstellen des
Adapters
reserviert
werden,
was
bei
mehreren
Geräten
zu
einem
enormen
Verwaltungsaufwand führen kann.
10.3.3
Konfiguration des AccessPoints
Auf dem Access Point werden alle nötigen Netzwerkparameter vergeben. Die Clients, in
diesem Fall die Ethernet–WLAN–Brücken, müssen dieser Konfiguration vollständig
entsprechen.
Da das Gerät ab Werk mit einer vorgegebenen IP–Adresse konfiguriert ist, kann es noch
nicht in das vorhandene Netzwerk integriert werden. Ist das Gerät physikalisch über ein
Netzwerkkabel in das LAN eingegliedert, muss der Rechner, welcher für die Konfiguration
genutzt werden soll, mit einer kompatiblen Netzwerkkennung versehen werden.
Identifiziert sich der Access Point beispielsweise über die Adresse 192.168.2.5 bei einer
Subnetzmaske von 255.255.255.0, so muss die IP–Kennung des Netzwerkpartners aus dem
Bereich 192.168.2.X gewählt werden, wobei der Variablen X eine Zahl zwischen 1 und 254
zugewiesen werden kann. Die 5 muss ausgeklammert werden, da die Pakete ansonsten
kollidieren würden. Die 0 und die 255 dürfen nicht vergeben werden, da es sich hierbei um
reservierte Adressen handelt, welche für die Netzwerkverwaltung von Bedeutung sind. Die 0
spezifiziert das komplette Netzwerksegment und die 255 definiert einen Broadcast. Über das
ping–Kommando kann nun die Kommunikation getestet werden.
Der Konfigurationsdialog des Access Points kann mit jedem beliebigen HTTP–Browser
geöffnet werden, in dem die entsprechende IP–Adresse in das Adressfeld eingegeben wird.
In den meisten Fällen ist ein Standardpasswort vergeben, welches der beiliegenden
Konfigurationsanleitung zu entnehmen ist. Ist der Zugang gewährleistet wird das drahtlose
Netz eingerichtet. Obligatorisch ist die Spezifikation der SSID, über welche sich das
Netzwerk identifiziert. Das Rundsenden dieser Kennung kann optional unterbunden werden.
Weiterhin kann der Netzwerktyp spezifiziert werden. Hierbei wird zwischen dem 802.11b
oder dem abwärts kompatiblen 802.11g Standard gewählt. Im Weiteren muss eine
netzinterne IP–Adresse vergeben werden. Diese wird aus dem Adressbereich des
Kabelnetzwerkes gewählt und muss auf jeden Fall individuell sein. Um grundlegende
Sicherheitsvorkehrungen zu treffen wird danach eine Verschlüsselungs– und
- 76 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
Authentifizierungsvariante64 spezifiziert. Hat man sich diesbezüglich festgelegt kann der
Access Point in Betrieb genommen werden.
10.3.4
Konfiguration der Ethernet–WLAN Adapter
Die Vergabe der IP–Adressen kann entweder manuell oder per DHCP erfolgen.
In jedem Fall müssen die vergebenen IP–Adressen zwingenden Vorgaben entsprechen. Sie
müssen sich alle im selben Subnetz befinden, was einer fest vorgegebenen Spanne von
Adressfolgen entspricht. Die Anzahl der möglichen Adressierungen ergibt sich aus der
Subnetzmaske.
In unserem speziellen Falle wurde die manuelle Zuweisung vorgezogen um über die
spezifische Adresse einfacher auf den integrierten Webserver zwecks Konfiguration
zuzugreifen.
Wenn eine beständige Integration der Geräte erfolgreich abgeschlossen wurde, können
diese jedoch auch ohne weiteres auf dynamisch vergebene IP–Adressen umgestellt werden,
da ein expliziter Zugriff nur noch bei Änderung der Einstellungen von Nöten ist.
Der Zugang zu den eigentlich wichtigen Endgeräten wird in beiden Fällen über deren
statische Adressierung gewährleistet. Diese sind von jedem Netzwerknoten aus erreichbar.
10.3.5
Dynamische IP–Adresszuweisung für Endgeräte
Im Kabelnetzwerk wurden die Automotive Frameworks über den DHCP Server mit einer
eindeutigen IP–Adresse versorgt. Der Netzwerkadapter identifiziert sich im Laufe des
Verbindungsvorganges über seine MAC Kennung. Der eigentliche Vorteil dieser etwas
umständlich erscheinenden Zuweisungsvariante liegt darin, dass die Konfiguration von
zentraler Stelle durchgeführt, geändert und überwacht werden kann.
Gerade bei Systemen, welche nur indirekt gewartet werden können und das Einstellen von
Parametern umfangreiche Arbeitsvorgänge erfordert, geht man dazu über, identische
Images zu erstellen und aufzuspielen.
Die individuelle IP–Adresse ergibt sich dann aus der hardwareabhängigen MAC
Adressierung.
64
siehe Kapitel 2.5
- 77 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
10.4
Verbindungsgesteuerte Client–Server–Kommunikation
Unabhängig der 802.11–Anbindungsrealisierung der Embedded Automotive Framework
Targets soll nun im Folgenden das Prinzip einer verbindungsgesteuerten Client–Server–
Anwendung unter QNX erläutert werden.
Hierbei
nimmt
das
Target
die
Rolle
des
Clients
ein,
Netzwerkanbindung eine TCP/IP–Socketvebindung initiiert und
welcher
bei
erkannter
eine Anfrage an einen
Server sendet.
Dieser kann Bestandteil eines Kabelnetzes sein und reagiert auf die empfangene Nachricht,
in dem ein Datenstrom an den Client gesendet wird. Das Target nimmt die Daten entgegen
und legt sie in seinem Speicher ab. Dies kann sowohl die Festplatte, als auch der
Arbeitsspeicher des Gerätes sein. Angedacht ist die Übertragung einer digitalen Bilddatei,
welche automatisiert auf dem Human–Machine–Interface (HMI) zur Anzeige kommt.
Die softwaretechnische Realisierung dieses Szenarios wird in fünf logische Komponenten
zerlegt:
o
WLAN–Verbindungsaufbau
o
Identifikation des Netzwerkpartners
o
Initiierung einer Socket–Verbindung
o
Übertragung einer Datei
o
Anzeige der Datei auf der HMI
Der WLAN–Verbindungsaufbau wird über die Ethernet–WLAN–Brücken bewerkstelligt. Es ist
sowohl
ein
Einsatz
im
Ad–Hoc–Modus
denkbar,
als
auch
eine
infrastrukturelle
Netzwerkanbindung. Auf Grund des Client–Server–Prinzips ist die Verwendung einer
Access–Point–Lösung vorzuziehen, da mehrere Clients zu einem Server verbinden können
und findet Entsprechung im einleitenden Tankstellenszenario.
Die Einstellungen der Ethernet–WLAN–Adapter werden im Vorfeld der Konfiguration des
Access Points angepasst. Bei Installation der Targets inklusive Ethernet–WLAN–Brücken im
Kraftfahrzeug erfolgt ein Verbindungsaufbau, wenn sich die mobile WLAN–Station innerhalb
des Signalbereiches des Access Points befindet.
Durch die externe WLAN–Lösung ist es dem Target nicht möglich durch Gerätezugriffe auf
einen erfolgten Verbindungsaufbau zu prüfen.
Dies wird über die bekannten ICMP Echo Requests gelöst. Beim Einsatz der
infrastrukturellen Netzwerkanbindug erfolgt die IP–Adressvergabe über den eingebundenen
DHCP–Server oder manuell.
Die Identifikation des Netzwerkpartners ist trivial, da die IP–Adresse des Servers eindeutig
spezifiziert wurde. Es wäre beispielsweise eine Vergabe der 192.168.0.1 denkbar.
Das Target beschränkt sich daher lediglich auf die Erkennung von ICMP Echo Replys dieser
IP–Kennung.
- 78 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
Auf der Server–Seite ist das Auslesen der Client–IP–Adresse belanglos, da die
softwareinterne Angabe dieser nur beim Initiieren der Socket–Verbindung durch den Client
angegeben werden muss. Der Server ist so konfiguriert, dass ein Verbindungsaufbau von
jeder beliebigen Adresse akzeptiert wird. Eine einfache Verbindungserkennung über eine
spezifizierte IP–Adresse könnte folgendermaßen implementiert werden (Listing 10.2).
Der hier implementierte Netzwerkscan orientiert sich an der Windows CE Lösung aus Kapitel
6.3, Listing 6.12, und erlaubt das Erkunden von ganzen Adressbereichen. Innerhalb einer
Endlosschleife (Zeile 6) wird die komplett verfügbare Adressspanne durchlaufen. Dies
geschieht im Körper der for–Schleife (Zeile 9 bis 38). Der Schleifenzähler „j“ definiert sowohl
die Anzahl der durchgeführten Schleifendurchläufe, als auch das letzte Segment der zu
testenden IP–Adresse. Über diesen Indexwert kann die zu testende Adressspanne beliebig
angepasst werden.
Die ICMP Echo Requests werden durch Integration des ping–Kommandos, welches
softwareintern mit Hilfe der system–Funktion (Zeile 20) ausgeführt wird, durchgeführt.
In den Zeilen 11 bis 14 werden char–Arrays initialisiert, welche durch das strcpy–Kommando
gefüllt (Zeile 16 bis 18) und in Zeile 19 im Container „cdest“ mit Hilfe der sprintf–Funktion
zusammengeführt werden. Der daraus resultierende String enthält das komplette
Systemkommando „ping -c 1 -w 1 192.168.1.j >NULL“, wobei „j“ durch den aktuellen Wert
des Schleifenzählers ersetzt werden muss.
Die Parameter des ping–Befehls lassen sich wie folgt aufschlüsseln:
-c 1
Abbruch nach senden „eines“ ECHO_RESPONSE Paketes
-w 1
Abbruch nach „einer“ Sekunde Zeitüberschreitung
Die Zeitspanne zwischen zwei ping–Vorgängen wird durch Anagabe dieser Parameter
wesentlich verkürzt, was ein schnelleres Auffinden des WLAN–Partners garantiert.
Über Angabe von „>NULL“ wird die komplette Konsolenausgabe ins Nichts umgeleitet.
Der Rückgabewert des system–Befehls, welcher als Integer–Wert interpretierbar ist, lässt
auf den Erfolg der eingebetteten Anwendung schließen. Ist dieser -1, so konnte das
Kommando nicht ordnungsgemäß ausgeführt werden.
Andernfalls kann über das WEXITSTATUS–Macro (Zeile 28) der Status des spezifizierten
Kommandos ermittelt werden. Dieser wird in Zeile 28 ausgewertet. Bei Rückgabe des
Wertes 0 wurde ein ICMP Echo Response Paket empfangen und ein Netzwerkpartner
identifiziert (Quelle: QNX Momentics V6.3 Documentation).
- 79 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
1
int rz;
2
int j = 0;
3
4
printf("Scanne nach WLAN Partnern\n");
5
6
while(true)
7
{
8
9
for(j=1;j<=50;j++)
10
{
11
char cs1[20];
12
char cs2[10];
13
char cs3[5];
14
char cdest[40];
15
16
strcpy(cs1,"ping -c 1 -w 1 ");
17
strcpy(cs2,"192.168.1.");
18
strcpy(cs3,">NULL");
19
sprintf(cdest,"%s%s%d%s",cs1,cs2,j,cs3);
20
rz = system(cdest);
21
22
if( rz == -1 )
23
{
printf( "Kommando konnte nicht ausgefuehrt werden\n" );
24
25
}
26
else
27
{
28
if(WEXITSTATUS( rz )==0)
29
{
30
printf("WLAN Device 192.168.1.%d verfuegbar\n",j);
31
break;
32
}
33
else
34
{
printf("Scanning... IP 192.168.1.%d\n",j);
35
}
36
}
37
}
38
39
40
}
41
42
printf("Socketverbindung zu Server wird initiiert...\n");
Listing 10.2 : Softwareinterne Identifikation des Netzwerkpartners
- 80 -
WLAN–Integration eines Embedded Automotive Frameworks unter QNX
Das in Listing 10.2 dargestellte Schleifenkonstrukt ist auf der angehängten CD–Beilage im
Quelltext der „WLANConCheck“–Anwendung eingebunden, welches eigenständig zu
Testzwecken entwickelt wurde.
Nachdem eine Netzwerkanbindung erkannt wurde (Zeile 28 bis 32) kann der Schleifenkörper
über eine break–Anweisung verlassen werden. Das Programm ist nun in Kenntnis der Server–
IP–Adresse und kann den entsprechenden Socket aufbauen.
Hierzu können die ebenfalls beiliegenden Quelltexte für Client und Server in das Projekt
integriert werden, welche ebenfalls für die Datenübertragung verwendet werden.
Der Client schickt hierbei nach Initiierung der Socket–Verbindung eine Anfrage in Form von
GETFILE [Dateiname], auf welche der Server entweder mit NOTFOUND reagiert, falls die
Datei nicht vorhanden ist, oder die Datenübertragung in die Wege leitet. Die Datei wird hierbei
in Pakete von 1024 Bytes unterteilt. Die Anzahl der Pakete lässt sich daher als Quotient der
Dateilänge in Bytes und dem Wert 1024 bestimmen.
Abschließend werden die empfangenen Daten interpretiert und auf der HMI mit Hilfe des
systemeigenen QNX Photon microGUI Windowing-Systems zur Anzeige gebracht.
Beschriebene
verbindungsgesteuerte
Client–Server–Anwendung
wurde
bis
dato
komponentenweise realisiert und getestet, eine vollständige Realisierung und Präsentation
befindet sich in Arbeit.
- 81 -
11. Ergebnis
11.1
Zusammenfassung
Ziel der Arbeit war es die WLAN–Technologie im Bezug auf den Einsatz im KFZ zu
durchleuchten und softwaretechnische Lösungsstrategien aufzuzeigen.
Eine Verifizierung vorhandener Verbindungsmanager nach speziellen Kriterien, welche der
mobile Einsatz im Kraftfahrzeug mit sich bringt, bot hierbei die Grundlage für die
entwickelten Implementierungsstrategien. Die Notwendigkeit eine softwareinterne WLAN–
Verbindungsverwaltung zu schaffen um Netzwerkanbindungen in Abhängigkeit von
spezifischen Zuständen und Anforderungen anzustreben, führte zur Entwicklung der
Anwendung "WLANConnector" für das Embedded Betriebssystem Pocket PC 2003.
Hierbei bot das NDISUIO–Protokoll die benötigten Schnittstellen zur hardwarenahen
Manipulation der WLAN–Adapter. Der Umgang mit diesen APIs stellte sich dabei als recht
kompliziert heraus, da sich die Gerätezugriffe über mehrfach verschachtelte Strukturen als
sehr abstrakt erwiesen. Das Microsoft Developer Network (MSDN) bot hierbei zwar eine
recht ausführliche Beschreibung des Befehlssatzes und seiner Funktion, jedoch wurde dies
kaum mit praxisnahen Beispielen und Quelltextausschnitten untermauert.
Zusätzliche Korrespondenz in fachspezifischen Foren65 erwies sich als außerordentlich
hilfreich. Die bei umfangreichen Internetrecherchen ausfindig gemachte Wireless Research
API (WRAPI), welche wesentliche WLAN–spezifische NDISUIO–Operationen in modularer
Form enthält, konnte als implementierungstechnische Grundlage genutzt werden.
Hierbei wurden die aufgeführten Funktionen, welche für den Einsatz auf Windows XP
entwickelt wurden, an das Betriebssystem Pocket PC 2003 angepasst und in den
entsprechenden Kontexten verwertet. Unterschiede, die sich bei der Nutzung auf diesen
Plattformen ergaben, wurden berücksichtigt und sind in dieser Arbeit ausführlich
dokumentiert. Die Tatsache, dass sich das Verhalten von WLAN–Geräten in den zwei
Infrastrukturmodi grundlegend unterscheidet, führte zu gesonderter Untersuchung und
Softwarekonzipierung. Das Bestreben, eine vollständig einsatzfähige Anwendung zu
entwickeln, welche Benutzerinteraktion weitgehend vermeidet, band die weiterführende
Betrachtung der IP-Adressvergabe in das Projekt ein.
Die entwickelte Software konnte durch Integration von softwareintern eingebundenen
Anwendungskomponenten auf Praktikabilität getestet werden. Schwachstellen wurden daher
in den verschiedenen Implementierungsphasen erkannt und ausgemerzt.
Eine Portierung des entwickelten Softwaregerüstes für den Einsatz in einem Embedded
Automotive Framework, unter den Betriebssystem QNX, wurde durch grundlegende
systemspezifische Faktoren beeinträchtigt.
65
www.pocketpcdn.com/forum/
- 82 -
Ergebnis
Der Versuch interne WLAN–Adapter einzubinden scheiterte an der Tatsache, dass keine
funktionstüchtigen Treiber zur Verfügung standen.
Um einen Einstieg in die Geräteverwaltung im Allgemeinen und den Umgang mit
Netzwerkadaptern im Besonderen zu bieten, setzt sich die Arbeit im Weiteren mit
systemspezifischen Kommandos und ihren Funktionen auseinander.
Eine alternative Lösung zur drahtlosen Netzwerkanbindung wurde durch den Einsatz von
externen Ethernet–WLAN–Adaptern geschaffen. Damit war eine vollständige WLAN–
Integration in das vorhandene Labornetzwerk möglich. Nachteilig an diesem Verfahren ist
die eingeschränkte Konfigurierbarkeit dieser Geräte. Dem angeschlossenen Target sind
keine Möglichkeiten gegeben Adapterkonfigurationen vorzunehmen. Hiermit konnte das
einleitende Tankstellenszenario nachgebildet werden. Über eine Anwendung, welche eine
hergestellte Netzwerkanbindung dynamisch erkennt, wird eine Client-Server-Kommunikation
in die Wege geleitet, welche die Möglichkeit bietet automatisiert Daten auf das Target zu
transferieren.
11.2
Bewertung
Es wurde bewiesen, dass der WLAN–Einsatz in Kraftfahrzeugen mit individuellen
Softwarelösungen problemlos realisierbar ist.
Weiterhin konnten vorteilhafte Nutzungsszenarien vorgestellt werden, welche auf Tank– und
Raststätten, ebenso wie im privaten oder geschäftlichen Umfeld, umsetzbar sind und eine
komfortable dynamische WLAN–Netzwerkanbindung ermöglichen.
11.3
Ausblick
Beständige Weiterentwicklung des WLAN–Standards im Bezug auf Dynamik und
Signalreichweite erhöhen die Attraktivität der vorgestellten Lösungen.
So soll die Entwicklung eines 802.11p Standards speziell für den Einsatz im KFZ
zugeschnitten werden. Hierbei kommen eigens entwickelte Routingprotokolle zum Einsatz,
welche die Kommunikation über mehrere Netzwerkstationen hinweg ermöglichen sollen.
Diese so genannten Mesh–Netze [WIMAH05] wurden bereits in der Einleitung erwähnt.
Durch
erweiterte
Abtastverfahren,
Netzwerkpartnern
erkundet
Sekundenbruchteilen
wird,
ermöglicht
bei
denen
soll
eine
werden.
Ein
66
Geschwindigkeiten wird dadurch realisierbar.
die
Umgebung
Kommunikation
nach
verfügbaren
innerhalb
Verbindungsaufbau
bei
von
hohen
Einige Ansätze, welche auch bei der
Erforschung dieser zukunftsorientierten Technik von Bedeutung sind, wurden in dieser Arbeit
aufgezeigt und erläutert.
66
siehe: http://www.funkschau.de/heftarchiv/pdf/2005/fs13/fs_0513_s45.pdf
- 83 -
Ergebnis
Ein weiterer Vorzug der WLAN–Technologie ist die Unabhängigkeit von kommerziellen
Vermittlungsinstanzen.
UMTS (Universal Mobile Telecommunications System) bietet Datenübertragungsraten von
bis zu 2 Mbit/s und ist deutschlandweit großflächig verfügbar. Internetzugang kann somit fast
von überall erlangt werden. Die Tatsache, dass die Kommunikation über zentrale
Vermittlungsstellungen
gesteuert
wird,
schließt
jegliche
direkte
Interaktion
mit
Netzwerkknoten von vorneherein aus und ist daher für das behandelte Einsatzgebiet
bedeutungslos.
Abschließend kann gesagt werden, dass der WLAN–Technologie, gerade im mobilen
Bereich eine viel versprechende Zukunft prophezeit werden kann.
WLAN – Eine Technik mit Zukunft
- 84 -
A Abbildungsverzeichnis
2.1
Einordnung von IEEE 802.11 im ISO OSI Kommunikationsmodell . . . . . . . . . .
6
2.2
Infrastruktur–Szenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3
Ad–hoc–Szenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
5.1
Windows 802.11 Netzwerktreiber–Architektur . . . . . . . . . . . . . . . . . . . . . . . . . .
25
6.1
Erzeugen des Worker Threads mit der Threadfunktion „ScanIP“ . . . . . . . . . . . .
44
7.1
Auslesen des Verbindungsstatus über NDISUIO . . . . . . . . . . . . . . . . . . . . . . . .
49
10.1
WLAN Integration ICM Labor FH–Darmstadt . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
B Screenshots
5.1
WZC–DLL in der Windows CE Registrierung . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
6.1
Definition der "WZC"–DLL in der Windows CE – Registrierung . . . . . . . . . . . . .
31
6.2
WLANConnector – Ad–hoc Netzwerkscan . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
6.3
WLANConnector – Ad–hoc verbunden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
6.4
VOIP Telefon SJphone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
7.1
WLANConnector – Infrastruktur Netzwerkscan . . . . . . . . . . . . . . . . . . . . . . . . .
50
7.2
WLANConnector – Infrastruktur verbunden . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
7.3
Informationsanwendung mit Webserver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
- 85 -
C Listings
5.1
Deaktivieren der Wireless Zero Configuration . . . . . . . . . . . . . . . . . . . . . . . . . .
23
5.2
Erzeugung eines NDISUIO–Handles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
5.3
DeviceIoControl inklusive typisierter Parameter [MSDN05] . . . . . . . . . . . . . . . .
27
5.4
Beispiel für die Definition einer NDIS–OID . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
6.1
Generierung einer Zufallszahl für letztes Segment der IP–Adresse . . . . . . . . . .
31
6.2
Deklaration der Variablen innerhalb der swapIP–Funktion . . . . . . . . . . . . . . . . .
32
6.3
Erstellen oder Öffnen eines Registry Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
6.4
Schreiben der AutoIP–Variablen in CE Registrierung . . . . . . . . . . . . . . . . . . . .
33
6.5
Freigabe des Handles auf einen geöffneten Key . . . . . . . . . . . . . . . . . . . . . . . .
34
6.6
IpRenewAddress – Internet Protocol Helper API . . . . . . . . . . . . . . . . . . . . . . . .
35
6.7
Struktur NDISUIO_SET_OID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
6.8
Setzen des Infrastrukturmodus auf Ad–hoc . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
6.9
Setzen des Authentifizierungsmodus (Anpassung der WRAPI) . . . . . . . . . . . . .
39
6.10
Struktur NDIS_802_11_SSID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
6.11
Setzen der SSID / BSSID / IBSSID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
6.12
Erzeugen des Worker Threads mit der Threadfunktion „ScanIP“ . . . . . . . . . . . .
42
6.13
Sofwareinternes Starten der VOIP–Anwendung mit Hilfe von CreateProcess . .
46
7.1
Auslesen des Verbindungsstatus über NDISUIO . . . . . . . . . . . . . . . . . . . . . . . .
51
7.2
Sofwareinternes Starten des Internet Explorers mit spezifizierter Zielhost . . . . .
52
8.1
Enumeration der WLAN–Adapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
8.2
Ausgabe der enumerierten WLAN–Adapter über die Konsole . . . . . . . . . . . . . .
56
8.3
Assoziation des Handles mit dem WLAN-Adapter . . . . . . . . . . . . . . . . . . . . . . .
57
9.1
Initiierung eines BSSID LIST SCANS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
9.2
Aufschlüsselung der NDIS_WLAN_BSSID–Struktur . . . . . . . . . . . . . . . . . . . . .
62
9.3
Auslesen der in der BSSID–Liste enumerierten WLAN–Geräte . . . . . . . . . . . . .
64
9.4
Prioritätsgesteuerter Verbindungsaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
10.1
Softwareinterne Integration von WLAN–Systembefehlen . . . . . . . . . . . . . . . . . .
72
10.2
Softwareinterne Identifikation des Netzwerkpartners . . . . . . . . . . . . . . . . . . . . .
80
- 86 -
D Quellenverzeichnis
[AWAP02]
Arnold Willemer: APIPA – Automatic Private IP Addressing
http://www.willemer.de/informatik/net/apipa.htm
[JW04]
Joachim Wietzke, Manh Tien Tran: Softwareentwicklung für Embedded
Systeme, 2004
[MLMMS04] Dr. Marie-Louise Moschgath: Script zur Vorlesung „Sicherheit in der
Mobilkommunikation“, 2004
[MSDN05]
Microsoft Developer Network – http://msdn.microsoft.com/
[PPCDG05]
Pocket PC 2003 Help - Pocket PC 2003 Development Guide
[PPCDA05]
Pocket PC Developer Network – Article: Working with registry on Pocket PC
http://www.pocketpcdn.com/articles/registry.html
[PPCDF05]
PC Developer Network – Forum – http://www.pocketpcdn.com/forum/
[QNX05]
QNX Momentics (v6.3) Documentation
[WIEW05]
http://de.wikipedia.org/wiki/Wireless_Adapter
[WIOSI05]
http://de.wikipedia.org/wiki/ISO-OSI-Referenzmodell
[WIMFC05]
http://de.wikipedia.org/wiki/Microsoft_Foundation_Classes
[WINDIS05]
http://de.wikipedia.org/wiki/NDIS
[WIMAH05]
http://de.wikipedia.org/wiki/Mobiles_Ad-hoc-Netzwerk
[WITEL05]
http://de.wikipedia.org/wiki/Telnet
[WPDN103]
Windows Platform Design Notes - Native 802.11 Frameworks for IEEE 802.11
Networks, Microsoft 2003
[WPDN203]
Windows Platform Design Notes - IEEE 802.11 Network Adapter Design
Guidelines for Windows XP
[WRAPI05]
WRAPI Documentation
http://sysnet.ucsd.edu/pawn/wrapi/doc.html
- 87 -
E Eigenständigkeitserklärung
Hiermit erkläre ich, dass ich die vorliegende Bachelorarbeit selbständig und nur mit den
angegebenen Hilfsmitteln erstellt habe.
Darmstadt, den 18. Oktober 2005
Dirk Andres
- 88 -