Diplomarbeit - neophob.com

Transcription

Diplomarbeit - neophob.com
Diplomarbeit
Diplomarbeit „Embedded Linux“
Dokumentation
Autor: Michael Vogt, HFT-SO
Betreuer: R. Moor
Version 1.12
Letzte Änderung: 5.Mai 2008
Michael Vogt
Seite 1 von 89
Diplomarbeit
1. INHALTSVERZEICHNIS
1.
2.
Inhaltsverzeichnis .................................................................................................................................... 2
Diplominfromationen .............................................................................................................................. 4
Diplomand ................................................................................................................................................... 4
Experte......................................................................................................................................................... 4
Betreuer HFT-SO ........................................................................................................................................ 4
Termine ....................................................................................................................................................... 4
3. Aufgabenstellung..................................................................................................................................... 5
4. Evaluation und Analyse ........................................................................................................................... 6
Evaluation MP3 Player................................................................................................................................ 6
Audioplayer Software.............................................................................................................................. 6
LCD Software.......................................................................................................................................... 7
Steuerung des Players .............................................................................................................................. 8
Last.FM Daemon ................................................................................................................................... 10
Verwendete Hardware ........................................................................................................................... 11
Evaluation SSH Gateway .......................................................................................................................... 12
SSH Software ........................................................................................................................................ 12
DynDNS Client...................................................................................................................................... 12
Tunnel Software .................................................................................................................................... 13
5. Technologie ........................................................................................................................................... 14
Was ist OpenWRT..................................................................................................................................... 15
Entwicklungsumgebung ............................................................................................................................ 17
Vorbedingungen .................................................................................................................................... 18
Auschecken der aktuellen SVN Version ................................................................................................... 19
Portierung .................................................................................................................................................. 20
Einfache Portierung ............................................................................................................................... 20
Komplexere Portierung.......................................................................................................................... 21
Patch erstellen........................................................................................................................................ 25
OpenWRT Disklayout / Bootvorgang ....................................................................................................... 26
Aus was besteht die Firmware ............................................................................................................... 26
6. Detailkonzept / Design .......................................................................................................................... 28
Systemübersicht MP3 Player..................................................................................................................... 29
Applikationsübersicht MP3 Player............................................................................................................ 30
MPD ...................................................................................................................................................... 31
MPC....................................................................................................................................................... 32
SCMPD.................................................................................................................................................. 33
CmdPad ................................................................................................................................................. 33
Bemused-MPD-hack.............................................................................................................................. 33
LCD4Linux............................................................................................................................................ 34
Systemübersicht SSH Gateway ................................................................................................................. 35
7. SW-Ergänzungen................................................................................................................................... 36
OpenWRT ................................................................................................................................................. 36
Übersicht................................................................................................................................................ 36
Argtable ................................................................................................................................................. 37
libdaemon .............................................................................................................................................. 37
confuse................................................................................................................................................... 37
scmpc ..................................................................................................................................................... 37
cmdpad................................................................................................................................................... 37
lcd4linux ................................................................................................................................................ 38
MPD ...................................................................................................................................................... 38
MPC....................................................................................................................................................... 38
bluez-libs ............................................................................................................................................... 38
bluez-utils .............................................................................................................................................. 38
bluez-hcidump ....................................................................................................................................... 38
Michael Vogt
Seite 2 von 89
Diplomarbeit
bemused ................................................................................................................................................. 39
OpenSSH ............................................................................................................................................... 39
PTunnel.................................................................................................................................................. 39
http Tunnel............................................................................................................................................. 39
LCD4Linux ............................................................................................................................................... 40
Übersicht................................................................................................................................................ 40
Plugin Entwicklung ............................................................................................................................... 41
Hinweis zu ID3 Tags ............................................................................................................................. 44
Bemused Linux Server .............................................................................................................................. 45
Code Änderungen .................................................................................................................................. 46
JamSE Client ......................................................................................................................................... 47
Cmdpad ..................................................................................................................................................... 47
MPD .......................................................................................................................................................... 48
MPC........................................................................................................................................................... 49
8. Installation ............................................................................................................................................. 50
MP3 Player ................................................................................................................................................ 50
Konfiguration Firmware ........................................................................................................................ 50
Firmware Update ................................................................................................................................... 52
Basis Konfiguration ............................................................................................................................... 54
Konfiguration Netzwerk ........................................................................................................................ 56
Konfiguration MPD ............................................................................................................................... 57
Konfiguration LCD4Linux .................................................................................................................... 58
Konfiguration CmdPad.......................................................................................................................... 61
Konfiguration Bluetooth........................................................................................................................ 62
Konfiguration Bemusedserver ............................................................................................................... 63
Konfiguration OpenNTP ....................................................................................................................... 64
Konfiguration SCMPC .......................................................................................................................... 64
SSH Gateway............................................................................................................................................. 65
Konfiguration Firmware ........................................................................................................................ 65
Update Firmware ................................................................................................................................... 67
Konfiguration......................................................................................................................................... 70
Konfiguration Netzwerk ........................................................................................................................ 72
Konfiguration Wireless.......................................................................................................................... 72
Konfiguration Dynamic DNS ................................................................................................................ 73
Konfiguration Tunneling Clients ........................................................................................................... 73
Konfiguration Wifi-Toggler .................................................................................................................. 74
Status ..................................................................................................................................................... 75
9. Test ........................................................................................................................................................ 76
MP3 Players .............................................................................................................................................. 76
Test Audioqualität ................................................................................................................................. 77
Bilder der MP3 Jukebox ........................................................................................................................ 79
Wireless Treiber .................................................................................................................................... 80
Test SSH Gateway..................................................................................................................................... 81
Test Datendurchsatz............................................................................................................................... 82
10.
Zusammenfassung ........................................................................................................................... 84
Rückblick................................................................................................................................................... 84
Ausblick..................................................................................................................................................... 84
11.
Glossar............................................................................................................................................. 85
12.
Anhang ............................................................................................................................................ 88
Buildumgebung ......................................................................................................................................... 88
Bildverzeichnis .......................................................................................................................................... 89
Michael Vogt
Seite 3 von 89
Diplomarbeit
2. DIPLOMINFROMATIONEN
DIPLOMAND
Michael Vogt
Bierhübeliweg 31
3012 Bern
Mail: [email protected]
Klasse: TIS6
EXPERTE
Stefan Huggenberger
Mail: [email protected]
BETREUER HFT-SO
Richard Moor
Mail: [email protected]
TERMINE
Ausgabe der Arbeit:
Abgabe der Arbeit:
Michael Vogt
21. April 2008
6. Mai 2008
Seite 4 von 89
Diplomarbeit
3. AUFGABENSTELLUNG
Die Aufgabenstellung ist detailliert im Dokument „Pflichtenheft Embedded Linux“ und „Aufgabenstellung
Diplomarbeit 2008“ definiert und wird an dieser Stelle nicht erneut wiederholt.
Michael Vogt
Seite 5 von 89
Diplomarbeit
4. EVALUATION UND ANALYSE
EVALUATION MP3 PLAYER
Audioplayer Software
Zentrales Element des MP3 Players ist der Audioplayer. Dieser sollte folgende Eigenschaften besitzen:
„Muss“ Kriterien:
Geringer Ressourcenbedarf (CPU und RAM)
Portabel
Kein GUI Player, d.h. Command Line Player
Open Source
Wichtige Kriterien:
Unterstützt verschiedene Formate (MP3, Ogg Vorbis, FLAC…)
API vorhanden
Pulseaudio1 unterstützt
Aktives Projekt (Bugfixing, Verbesserungen, Unterstützung weiterer Formate…)
Netzwerkfähig (Client / Server Architektur)
Wird schon für Embedded Systeme eingesetzt
Folgende Player erfüllen die „Muss“ Kriterien:
MOC – Music On Console2
MPD – Music Player Daemon3
XMMS2 – X-platform Music Multiplexing System 24
Mserv5
Lamip6
MOC
Formatvielfalt
API vorhanden
Pulseaudio
unterstützung
Aktives Projekt /
Letztes Release
Netzwerk fähig
Embedded Linux
Erfahrungsbericht
MPD
XMMS2
Mserv
Lamip
16 Formate
Nein
Nein
12 Formate
Ja
Ja
10 Formate
Ja
Ja
12 Formate
Nein
Nein
16 Formate
Nein
Nein
Ja / 25.02.08
Ja / 28.01.08
Ja / 15.11.07
Ja / 09.08.07
Nein
Keiner
gefunden
Ja
Ja7, zusätzlich
als OpenWrt
Paket
vorhanden
Ja
Nicht speziell
dafür
entwickelt
Nein /
23.02.2004
Ja
Keiner
gefunden
Ja
Keiner
gefunden
Hauptsächlich aufgrund geringer CPU Anforderungen und Erfahrungsberichten betreffend MPD und
Embedded Devices habe ich mich für den „Music Player Daemon“ entschieden.
1
http://pulseaudio.org/
http://moc.daper.net/
3
http://www.musicpd.org/
4
http://wiki.xmms2.xmms.se/
5
http://www.mserv.org/
6
http://fondriest.frederic.free.fr/realisations/lamip/index.html
7
http://mpd.wikia.com/wiki/Embedded
2
Michael Vogt
Seite 6 von 89
Diplomarbeit
LCD Software
Um über den aktuellen Status des MP3 Players informiert zu sein, muss ein LCD Display angesteuert
werden. Diese Software sollte folgende Kriterien erfüllen:
„Muss“ Kriterien:
Unterstützt grafische und textbasierende Displays
Unterstützt mehrere Display Typen
Open Source
Wichtige Kriterien:
Plugin Architektur (Input – was für Daten sollten gelesen werden, Darstellung – z.B. Ausgabe als
Text oder Balkenanzeige, Output – wo werden die Daten dargestellt)
Display ist frei konfigurierbar, d.h. Elemente können frei definiert werden
Wird schon für Embedded Systeme eingesetzt
Aktives Projekt (Unterstützung weiterer Display’s, neuere Plugin’s…)
Folgende Applikationen erfüllen die „Muss“ Kriterien:
LCD4Linux8
LCDproc9
Der Hauptunterschied zwischen LCD4Linux und LCDproc ist, dass LCD4Linux auf einem Programm
besteht, während LCDproc als Client / Server Applikation funktioniert. Der Sourcecode von LCDproc ist
mehr als doppelt so gross, wie der Sourcecode von LCD4Linux.
Plugin Architektur
Display ist frei konfigurierbar
Wird schon für Embedded
Systeme eingesetzt
Aktives Projekt / Letztes Release
LCD4Linux
LCDproc
Ja
Ja
Ja10, zusätzlich als OpenWrt
Paket verfügbar
Ja / 30.4.07 (jedoch viele SVN
Änderungen)
Ja
Ja
Nein
Ja / 27.4.07
Auch hier habe ich mich hauptsächlich aufgrund Erfahrungsberichten zufolge für die Software LCD4Linux
entschieden.
8
http://ssl.bulix.org/projects/lcd4linux/
http://lcdproc.omnipotent.net/
10
https://ssl.bulix.org/projects/lcd4linux/wiki/CoolStuff
9
Michael Vogt
Seite 7 von 89
Diplomarbeit
Steuerung des Players
Der Musikplayer muss gesteuert werden. Ich habe mir dazu folgende Überlegungen gemacht:
USB-Keypad Steuerung: Steuerung mit einem USB Keypad. Diese Art der Steuerung ist sehr
einfach zu realisieren, bietet jedoch nur begrenzte Funktionsvielfalt und Ergonomie.
Mobiltelefon Steuerung: Steuerung mit einem Bluetooth Mobiltelefon. Die meisten Personen in
meinem Umkreis verwenden ein Mobiltelefon, die meisten der Mobiltelefone besitzen eine
Bluetooth-Schnittstelle. Ein USB-Bluetooth Dongle kostet ca. 20 SFr. Die Steuerung via
Mobiltelefon ist sicher aufwendiger zu realisieren als mit einem USB Keypad, jedoch bietet diese
Steuerungsart mehr Komfort.
Evaluation USB-Keypad Steuerung:
Diese Applikation ist sehr trivial – Jede gedrückte Taste auf dem Keypad sendet einen Keycode an die
Applikation. Für den Keycode X soll nun Applikation Y gestartet werden.
„Muss“ Kriterien:
Unterstützt USB Keypad’s
Open Source
Wichtige Kriterien:
Berücksichtigung der Tastenaktion (Press, Release, Repeat)
Tasten frei belegbar (beliebiges Programm kann ausgeführt werden)
Folgende Applikationen erfüllen die „Muss“ Kriterien:
cmdpad11
EMPCd12
Berücksichtigung der
Tastenaktion
Tasten frei belegbar
cmdpad
EMPCd
Ja
Ja
Ja
Nein
Obwohl cmdpad nicht mehr aktiv entwickelt wird, habe ich mich für diese Applikation entschieden.
Cmdpad erlaubt es, beliebige Programme auszuführen während EMPCd nur Befehle für den MPD
absetzten kann. Da ich ein Embedded Device verwende, ohne zusätzliche I/O Möglichkeiten, muss ich z.B.
einen Daemon neu starten können.
11
12
http://cmdpad.sourceforge.net/
http://unfix.org/projects/empcd/
Michael Vogt
Seite 8 von 89
Diplomarbeit
Evaluation Mobiltelefon Steuerung:
Die Mobiltelefon Steuerung besteht aus zwei Teilen, dem Serverteil (Interaktion mit dem Musikplayer) und
dem Clientteil (Interaktion mit dem User auf dem Mobiltelefon):
Abbildung 1: Übersicht Mobiltelefon Steuerung
„Muss“ Kriterien:
Client unterstützt mein Mobiltelefon
„Komfortable“ Bedienung
Attraktives und funktionelles GUI für das
Mobiltelefon
Open Source
Wichtige Kriterien:
Client unterstützt verschiedene
Mobiltelefone
Server arbeitet Ressourcen-schonend
Wird schon für Embedded Systeme
eingesetzt
Aktives Projekt
MPD als Musikplayer unterstützt
Folgende Applikationen erfüllen die „Muss“ Kriterien:
Bemused Linux Server13 / JamSE Client14
Remuco15
Hinweis: Bemused Linux Server wird nicht mehr weiterentwickelt, ist jedoch ein etabliertes Produkt. Als
Client kann JamSE benutzt werden, welcher das Bemused-Protokoll für die Kommunikation zwischen
Server und Client verwendet. Remuco hingegen bietet Server und Client aus einer Hand.
Client unterstützt verschiedene
Mobiltelefone
Server arbeitet Ressourcenschonend
Wird schon für Embedded
Systeme eingesetzt
Aktives Projekt
MPD unterstützt
Bemused Linux Server /
JamSE
Remuco
Ja
Ja
Unbekannt
Unbekannt
Ja, Palm Version verfügbar
Nein
Nein / Ja
Nein
Ja
Nein
Da Remuco hauptsächlich auf schwergewichtigere Audioplayer zugeschnitten ist (z.B. Amorak16 oder
Rhythmbox17), habe ich mich für den Bemused Linux Server und JamSE als Client entschieden. Keine der
Applikationen unterstützt den MPD Player „von Haus aus“, daher muss bei beiden Servervarianten CodeÄnderung vorgenommen werden.
13
http://bemused.sourceforge.net
http://jamse.sourceforge.net/
15
http://remuco.sourceforge.net/
16
http://amarok.kde.org/de
17
http://www.gnome.org/projects/rhythmbox/
14
Michael Vogt
Seite 9 von 89
Diplomarbeit
Last.FM Daemon
Eine Beschreibung von Last.fm18 (von Wikipedia19):
Last.fm ist ein Internetradio auf Basis von sozialer Software („personalised online radio station“),
das entwickelt wurde, um Nutzern auf Basis ihrer Hörgewohnheiten neue Musik, Menschen mit
ähnlichem Musikgeschmack und Konzerte in ihrer Umgebung empfehlen zu können. Es ist eine
ehemalige Schwesterseite von Audioscrobbler, mit dem es sich früher eine Musikdatenbank teilte.
Plattenlabel und Musiker werden ermuntert, Last.fm Lizenzen zum Abspielen ihrer Musik zu
erteilen, da dies, zumindest in der Theorie, ihre CD-Verkäufe erhöhen würde. Last.fm hat derzeit
ein Verzeichnis von über 80 Millionen einzelnen Songs und davon über eine Million für sein
Internetradio zum Streaming vorrätig, sowie 150.000 kostenlose MP3-Downloads.
Last.fm fusionierte am 9. August 2005 mit Audioscrobbler und übernahm somit auch dessen
Funktionen. Diese speichern alle auf dem PC abgespielten Musikstücke in einer Datenbank,
erzeugen individuelle oder globale Charts und verbinden Benutzer mit musikalischen Nachbarn.
Bei musikalischen Nachbarn handelt es sich um Personen, welche einen ähnlichen
Musikgeschmack haben. Aus der Datenbank werden Schnittmengen aus den Interpreten der Lieder
innerhalb des angemeldeten Personenkreises errechnet. Stimmen viele Interpreten mit einer
anderen Person überein, wird diese als musikalischer Nachbar bezeichnet.
„Muss“ Kriterien:
Unterstützt MPD
Keine Skriptsprache (z.B. Perl oder Python, aus Performance-Gründen)
Open Source
Wichtige Kriterien:
Crossfading unterstützt
Läuft als Daemon
Nicht übermittelte Lieder werden zwischengespeichert
Folgende Applikationen erfüllen die „Muss“ Kriterien:
scmpc20
mpdscribble21
scmpc
mpdscribble
Crossfading unterstützt
Ja
Läuft als Daemon
Nicht übermittelte Lieder werden
zwischengespeichert
Ja
Ja
Durch einen Hack (nicht sauber
implementiert)
Nein
Ja
Scmpc entstand eigentlich hauptsächlich, weil mpdscribble crossfading nicht richtig implementiert. Da ich
crossfading verwende, habe ich mich für scmpc entschieden.
18
http://www.last.fm/
http://de.wikipedia.org/wiki/Last.fm
20
http://scmpc.berlios.de/
21
http://www.frob.nl/scribble.html
19
Michael Vogt
Seite 10 von 89
Diplomarbeit
Verwendete Hardware
Aufgrund der evaluierten Software ergeben sich folgende Hardware Komponenten:
Basis - Asus Wrt 500GP AP (Version 1)
USB 2.0 Hub (aktive Stromversorgung)
USB Creative Sound Blaster Connect Soundkarte
USB Keypad
USB Memorystick
USB Bluetooth Adapter
USB Display Crystalfontz 634 USB LCD (20x4 Character Display)
Mittlerweile gibt es 2 Versionen des ASUS Wrt 500GP AP, wobei die zweite Version noch nicht
vollständig von OpenWRT unterstützt ist.
Michael Vogt
Seite 11 von 89
Diplomarbeit
EVALUATION SSH GATEWAY
Neben der Funktionalität als Access Point mit WPA2 Verschlüsselung, soll der Router als SSH Server
verwendet werden. Die Software für die Wireless Funktionen sind Bestandteile der OpenWRT Distribution
– eine Evaluation dieser Komponente ist daher nicht nötig.
SSH Software
Eine Evaluation erachte ich auch in diesem Punkt als überflüssig, da eigentlich alle bekannten
Distributionen auf OpenSSH22 als SSH Server setzten. OpenSSH gilt als sichere und stabile SSH
Implementation.
DynDNS Client
Da der Router auch vom Internet aus erreichbar sein muss, verwende ich einen Dynamischen DNS Dienst.
Um den DNS Record zu aktualisieren, reicht eine Web Anfrage mit einem Username und Passwort aus. Ein
„richtiger Client“ ist also nicht nötig. Ich verwende daher das „ddns-scripts“ Package, welches per Default
bei OpenWRT dabei ist.
22
http://www.openssh.org/
Michael Vogt
Seite 12 von 89
Diplomarbeit
Tunnel Software
Ich habe das Bedürfnis, folgende Tunneling Applikationen zu verwenden
HTTPTunnel – viele Firmen verwenden eine Firewall und erlauben nur spezifische Verbindungen
ins Internet, HTTP und HTTPS ist in den meisten Fällen erlaubt. Daher möchte ich einen SSHover-HTTP Tunnel verwenden.
Ping Tunnel – kommerzielle Wireless LAN Anbieter (z.B. Swisscom) erlauben den Zugriff ins
Internet erst, wenn bezahlt wurde. Jedoch sind diverse Dienste wie z.B. Ping/ICMP, DNS
Abfragen (meistens) für jedermann offen. Hier bietet sich ein SSH-over-ICMP Tunnel an.
HTTP Tunnel:
Ich habe bereits im Fach Netzwerk eine SSH Arbeit geschrieben und einen HTTP Tunnel verwendet. Mit
der Software „GNU-httptunnel“23 habe ich Erfahrung und es existiert auch ein Windows Client. Die
Funktionsweise sieht folgendermassen aus:
Abbildung 2: Verbindungsaufbau via HTTPTunnel
Ping Tunnel:
Ich habe bereits im Fach Netzwerk eine SSH Arbeit geschrieben und einen Ping/ICMP Tunnel verwendet.
Mit der Software „Ping Tunnel“24 habe ich Erfahrung und es existiert auch ein Windows Client. Die
Funktionsweise sieht folgendermassen aus:
Abbildung 3: Verbindungsaufbau via PTunnel
Beide Applikationen wurden bereits auf OpenWRT portiert.
23
24
http://www.nocrew.org/software/httptunnel.html
http://www.cs.uit.no/~daniels/PingTunnel/
Michael Vogt
Seite 13 von 89
Diplomarbeit
5. TECHNOLOGIE
Als Distribution wird OpenWRT25 verwendet. Diese Distribution stellt ebenfalls eine (Linux-basierende)
Entwicklungsumgebung zur Verfügung.
OpenWRT verwendet SVN als Versionsmanagement. SVN26 bietet darüber hinaus weitere Vorteile wie z.B.
der Vergleich des lokalen Repositorys mit dem offiziellen Repository (um Patches zu erstellen). SVN wird
in dieser Arbeit nicht beschrieben, da dies den Zeitrahmen dieser Arbeit sprengen würde.
Ich habe bewusst keine OpenWRT-Konfiguration dieser Arbeit beigelegt, da diese innert kürzester Zeit
nicht mehr gültig wäre, da die Konfiguration beinahe täglich ändert.
Wichtiger Hinweis:
Ich verwende in dieser Dokumentation die neuste SVN Version (Bleeding edge27) von OpenWRT. Das
bedeutet, dass einzelne Teile umgestellt werden können und daher die Dokumentation nicht mehr stimmt,
resp. nicht mehr auf dem aktuellsten Stand ist. Hinweise sind auf der OpenWRT Webseite zu finden!
25
http://openwrt.org/
http://subversion.tigris.org/
27
http://en.wikipedia.org/wiki/Bleeding_edge
26
Michael Vogt
Seite 14 von 89
Diplomarbeit
WAS IST OPENWRT
Auf der Webseite von OpenWRT wird kurz und klar definiert, was OpenWRT ist:
Minimalistic Busybox/Linux distribution GPL licensed
Set of Makefiles and tools building an embedded rootfs
Packages and repositories
Hardware donators, package maintainers and kernel hackers community
Abbildung 4: OpenWRT Software Architektur
uClibs:
Im PC-Bereich bezeichnet uClibc eine für Linux-Embedded-Systeme konzipierte, kleine CBibliothek. Es ist freie Software, lizenziert unter der LGPL.
uClibc wurde erstellt, um µClinux, eine Version des Linux-Kernels ohne
Speicherverwaltungseinheit (MMU), zu unterstützen und deshalb eignet es sich für Mikrocontroller
(deshalb das "uC" im Namen).
uClibc ist viel kleiner als glibc, der Standard C Library der meisten Linux-Distributionen.
Während glibc entwickelt wurde, um alle relevanten C-Standards auf einer Vielzahl von
Plattformen voll zu unterstützen, ist uClibc nur auf Linux-Embedded-Systeme fixiert. Funktionen
können aktiviert oder deaktiviert werden, je nachdem wieviel Speicherplatz zur Verfügung steht.
uClibc läuft auf Standard- und MMU-losen Linux-Systemen. Es unterstützt i386, ARM (Big/Little
Endian), AVR32, Blackfin, h8300, m68k, MIPS (Big/Little Endian), PowerPC, SuperH (Big/Little
Endian), Sun SPARC, Nios und v850 Prozessoren.28
28
Quelle: http://de.wikipedia.org/wiki/UClibc
Michael Vogt
Seite 15 von 89
Diplomarbeit
Busybox:
BusyBox ist ein Computerprogramm, das viele Standard-Unix-Dienstprogramme in einer einzelnen,
kleinen ausführbaren Datei vereint. Es stellt die meisten Dienstprogramme bereit, die in der Single
Unix Specification (SUS) gefordert werden; dazu viele weitere, die ein Benutzer eines LinuxSystems erwarten würde. BusyBox wird wegen seiner geringen Größe gewöhnlich in Diskettenund Embedded-Linux-Systemen genutzt. Dank seiner Vorteile für diese Systeme wird es zum
Beispiel in Linux-Systemen auf dem Sharp Zaurus, dem Nokia 770, dem Motorola ROKR Z6, auf
dem Fon-Router "LaFonera", auf AVM-FRITZ!Boxen, dem Acme Systems Foxboard, der Debian
Linux 4.0 Installations CD oder dem GP2X verwendet. Es ist freie Software und unterliegt der
GNU General Public License (GPL).29
Busybox fasst Tools wie tar, gzip, grep, cat, ls, head, vi, dd, mount, ash, kill, touch, netstat… in einem
einzigen binären File zusammen.
UCI:
Universal Configuration Interface, zentrale Konfiguration des Routers, Filebasierend (/etc/config/*).
IPKG:
iPKG ist ein Akronym für „Itsy Package Management System“ (engl., „Klitzekleines Paket
Verwaltungs System“). Das Format wurde als Paketmanager für Computer mit wenigen
Ressourcen entworfen und wird u.a. von Openmoko, Zaurus und OpenWrt verwendet. Auf folgende
Punkte wurde bei der Entwicklung besonderer Wert gelegt:
29
30
Die Kontrollprogramme selbst sind sehr klein.
Die installierten Metadaten beschränken sich auf das Wichtigste.
Die verfügbaren Pakete sind möglichst klein. Der Paketbaum soll sehr fein granuliert
sein.30
Quelle: http://de.wikipedia.org/wiki/Busybox
Quelle: http://de.wikipedia.org/wiki/IPKG
Michael Vogt
Seite 16 von 89
Diplomarbeit
ENTWICKLUNGSUMGEBUNG
Als Entwicklungsumgebung wird das vom OpenWRT Team erstellte „Buildroot-ng“ verwendet.
Das Hauptproblem einer Entwicklungsumgebung für Embedded Device’s ist, dass Embedded Device’s auf
einer anderen Hardware Architektur laufen als die Entwicklungsumgebung. Klassisch wird auf einer X86
oder 64x Machine gearbeitet, während die Embedded Devices auf einer anderen Hardware Plattform laufen,
wie z.B. ARM oder BCM47xx. Um nun Software für ein Embedded Device zu erstellen ist ein Cross
Compiler notwendig, welcher den Code in das entsprechende Embedded Format kompiliert. Ein
schematischer Überblick, wie Buildroot-ng funktioniert:
Cross Compile
Compile
Create
Abbildung 5: Entwicklungsumgebung
Als erstes muss der Embedded Toolchain erstellt werden. Ein Toolchain dient zur Kompilierung von Code
und besteht aus folgenden Komponenten: Compiler, Linker, Assembler, Debugger, Make Tools. Ist der
Toolchain erstellt worden, können nun Programme für die Embedded Architektur erstellt werden.
Das Erstellen einer Cross Compiler Umgebung ist eine komplexe und schwierige Aufgabe, die mit dem
Buildroot-ng System gemeistert wird. Für den Anwender von OpenWRT ist der Cross-Compile Vorgang
transparent.
Die OpenWRT Entwicklungsumgebung besteht aus keinem einzigen binären File, sondern aus Skripts und
Metadaten. Will man eine neue Firmware erstellen, werden die benötigten Source-Files via Internet
heruntergeladen, bei Bedarf gepatched und kompiliert.
Michael Vogt
Seite 17 von 89
Diplomarbeit
Vorbedingungen
Damit eine funktionierende Firmware erstellt werden kann, müssen folgende Applikationen auf der Build
Machine installiert sein:
Autoconf
Autotools
Automake
gcc
g++
zlib
gawk
bison
ncurses
perl
python
wget
svn
bison
flex
unzip
bzip2
tar
Ausserdem darf der ausführende User keine Root-Rechte verwenden. Das dient zur eigenen Sicherheit,
dass keine Daten lokal überschrieben werden. Um zu überprüfen, ob alle Abhängigkeiten erfüllt sind, kann
der Befehl „make prereq“ verwendet werden (nachdem die SVN Version aus dem Trunk ausgecheckt
wurde, siehe nächstes Kapitel).
Michael Vogt
Seite 18 von 89
Diplomarbeit
AUSCHECKEN DER AKTUELLEN SVN VERSION
Um einen aktuellen Build von OpenWRT zu erstellen, kann man die aktuelle Version aus dem SVN
Repository auschecken. Im folgenden Beispiel wird im home Verzeichnis des Users ein
„trunk“ Unterverzeichnis erstellt:
svn checkout https://svn.openwrt.org/openwrt/trunk/ ~/trunk/
cd ~/trunk/
Jetzt müssen noch die Software Packages installiert werden:
./scripts/feeds update
./scripts/feeds install -a
Jetzt ist das gesamte Buildsystem von OpenWRT heruntergeladen und die Firmware kann konfiguriert und
erstellt werden.
Die Konfiguration wird mit dem Befehl „make menuconfig“ erstellt. Bevor ein Dialog erscheint, werden
noch diverse Vorbedingungen überprüft. Im folgenden Menu kann die ganze Firmware konfiguriert werden,
vom Hardware Typ, über Kernel Module bis zu den Applikationen kann alles ausgewählt werden.
Abbildung 6: OpenWRT Firmware Konfiguration
Hier weitere Beispiele:
Erstellen eines einzelnen Packages
make package/<package-name>-compile
Erstellen eines einzelnen Packages im Verbose Modus
Löschen eines einzelnen Packages
make package/<package-name>-compile V=99
make package/<package-name>-clean V=99
Schlägt das Kompilieren nach diversen Änderungen fehl, empfiehlt es sich, den Kernel neu zu
erstellen. Die erfolgt mit folgendem Befehl:
Konfiguration des Kernels
make target/linux/clean
make kernel_menuconfig V=99
Michael Vogt
Seite 19 von 89
Diplomarbeit
PORTIERUNG
Das Hauptproblem bei der Portierung von Applikationen für OpenWRT (oder generell Embedded Systeme)
ist, dass Embedded Devices meistens einen Bruchteil der Rechenkraft eines „normalen“ Desktop Systems
haben.
Um eine Applikation für OpenWRT zu portieren, sind folgende Schritte notwendig:
Erstellen eines Makefile. Hier werden Metadaten über die Applikation gesammelt, d.h. Angaben
wie Name, Version, URL, Checksumme, Konfigurationsoptionen und Installationsoptionen
Evtl. wird für die Applikation eine Code-Änderung benötigt, z.B. muss das (Original) Makefile
angepasst werden. In der Praxis zeigt sich, dass relativ viele Applikationen einen Patch benötigen.
Einfache Portierung
Ein einfaches Beispiel einer portierten Applikation:
#
# Copyright (C) 2008 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=bluez-hcidump
PKG_VERSION:=1.40
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://bluez.sourceforge.net/download
PKG_MD5SUM:=c5793b79c3e7fea3a367c08c26c8e23c
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
include $(INCLUDE_DIR)/package.mk
define Package/bluez-hcidump
SECTION:=utils
CATEGORY:=Utilities
DEPENDS:=+bluez-libs
TITLE:=Bluetooth packet analyzer
URL:=http://www.bluez.org/
endef
define Build/Configure
$(call Build/Configure/Default, \
--with-bluez="$(STAGING_DIR)/usr/include" \
)
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) \
DESTDIR="$(PKG_INSTALL_DIR)" \
all install
endef
define Package/bluez-hcidump/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/hcidump $(1)/usr/sbin/
endef
$(eval $(call BuildPackage,bluez-hcidump))
Zuerst werden Name, Version und URL der Applikation festgelegt. Anschliessend wird der Menueintrag
definiert inklusive Abhängigkeiten von anderen Applikationen. Zum Schluss werden noch die
Konfigurations und Compiler Optionen angegeben.
Für jede Applikation wird im Package Verzeichnis ein Unterverzeichnis erstellt. In diesem Package
Unterverzeichnis ist das Makefile vorhanden. Es gibt zusätzlich ein spezielles Unterverzeichnis namens
„patch“.
Michael Vogt
Seite 20 von 89
Diplomarbeit
Komplexere Portierung
Als komplexere Applikation dient die Applikation LCD4Linux, hier der Aufbau des Verzeichnisses:
michux@fwpiercer:~/trunk/package/utils/lcd4linux$
drwxr-xr-x 3 michux michux 4096 2008-04-10 11:04
drwxr-xr-x 3 michux michux 4096 2008-04-28 13:23
-rw-r--r-- 1 michux michux 3960 2008-04-28 14:29
-rw-r--r-- 1 michux michux 3025 2008-04-28 14:15
ls -al
files
<dir>
patches
<dir>
Config.in
Makefile
michux@fwpiercer:~/trunk/package/utils/lcd4linux$ ls files/ -al
-rw-r--r-- 1 michux michux 22673 2008-04-10 11:04 lcd4linux.conf
-rw-r--r-- 1 michux michux
296 2008-04-10 11:04 lcd4linux.init
michux@fwpiercer:~/trunk/package/utils/lcd4linux$
-rw-r--r-- 1 michux michux
420 2008-04-10 11:04
-rw-r--r-- 1 michux michux
881 2008-04-10 11:04
-rw-r--r-- 1 michux michux
587 2008-04-10 11:04
-rw-r--r-- 1 michux michux 78429 2008-04-12 03:52
ls patches/ -al
100-drv_RouterBoard.patch
120-remove_parport_outb.patch
140-no_repnop_T6963.patch
150-addlibmpdclient.patch
Hier die Beschreibung der einzelnen Files:
lcd4linux / Makefile – das generelle Makefile für diese Applikation
lcd4linux / Config.in – ein Konfigurations-File um einzelne Applikationen auszuwählen
lcd4linux / files / lcd4linux.conf – die Applikationskonfiguration
lcd4linux / files / lcd4linux.init – init File um die Applikation als Daemon automatisch zu starten
lcd4linux / patches / * – Applikationsspezifische Codeänderungen
Das Makefile im Detail:
include $(TOPDIR)/rules.mk
PKG_NAME:=lcd4linux
PKG_REV:=877
PKG_VERSION:=r$(PKG_REV)
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
PKG_SOURCE_URL:=https://ssl.bulix.org/svn/lcd4linux/trunk/
PKG_SOURCE_SUBDIR:=lcd4linux-$(PKG_VERSION)
PKG_SOURCE_VERSION:=$(PKG_REV)
PKG_SOURCE_PROTO:=svn
PKG_FIXUP = libtool
include $(INCLUDE_DIR)/package.mk
define Package/lcd4linux
SECTION:=utils
CATEGORY:=Utilities
DEPENDS:= +libusb
TITLE:=LCD display utility
URL:=http://lcd4linux.bulix.org/
MENU:=1
endef
define Package/lcd4linux/config
menu "Configuration"
depends on PACKAGE_lcd4linux
source "$(SOURCE)/Config.in"
endmenu
endef
define Package/lcd4linux/description
LCD4Linux is a small program that grabs information from the kernel and
some subsystems and displays it on an external liquid crystal display.
endef
define Package/lcd4linux/conffiles
/etc/lcd4linux.conf
endef
LCD4LINUX_DRIVERS:= \
BeckmannEgle \
BWCT \
CrystalFontz \
Michael Vogt
Seite 21 von 89
Diplomarbeit
<...>
USBLCD \
USBHUB \
WincorNixdorf \
X11 \
LCD4LINUX_PLUGINS:= \
apm \
asterisk \
button_exec \
<...>
uname \
uptime \
wireless \
xmms \
LCD4LINUX_CONFIGURE_DRIVERS:= \
$(foreach c, $(LCD4LINUX_DRIVERS), \
$(if $(CONFIG_LCD4LINUX_DRV_$(c)),$(c),) \
)
LCD4LINUX_CONFIGURE_PLUGINS:= \
$(foreach c, $(LCD4LINUX_PLUGINS), \
$(if $(CONFIG_LCD4LINUX_PLUGIN_$(c)),$(c),) \
)
EXTRA_CFLAGS+=-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/include -I$(STAGING_DIR)/usr/l
ib/libiconv/include
EXTRA_LDFLAGS+=-L$(STAGING_DIR)/usr/lib -Wl,-rpath-link,$(STAGING_DIR)/usr/lib -L$(STAGING
_DIR)/usr/lib/libiconv/lib
TARGET_CONFIGURE_OPTS+=\
CC="$(TARGET_CC) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS)"
CONFIGURE_ARGS += \
--without-x \
--without-python \
--with-drivers="$(LCD4LINUX_CONFIGURE_DRIVERS)" \
--with-plugins="$(LCD4LINUX_CONFIGURE_PLUGINS)" \
--disable-rpath \
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) DESTDIR="$(PKG_INSTALL_DIR)" all install
endef
define Package/lcd4linux/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/bin/
$(INSTALL_DIR) $(1)/etc
$(INSTALL_CONF) ./files/$(PKG_NAME).conf $(1)/etc/$(PKG_NAME).conf
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
endef
$(eval $(call BuildPackage,lcd4linux))
Im ersten Teil wird definiert, dass die Source direkt aus dem SVN Repository extrahiert werden soll
(PKG_SOURCE_PROTO:=svn).
Im Menu-Konfigurations Abschnitt wird definiert, dass ein externes File namens „Config.in“ verwendet
werden soll. Dieses „Config.in“ File ist folgendermassen aufgebaut:
comment "LCD4Linux Drivers ---"
config LCD4LINUX_DRV_BeckmannEgle
bool
prompt "BeckmannEgle"
config LCD4LINUX_DRV_Curses
bool
default y
select PACKAGE_libncurses
prompt "Curses (depends on libncurses, you need to install it manually!)"
<...>
comment "LCD4Linux Plugins ---"
config LCD4LINUX_PLUGIN_apm
bool
prompt "apm"
Michael Vogt
Seite 22 von 89
Diplomarbeit
config LCD4LINUX_PLUGIN_gps
bool
select PACKAGE_libnmeap
prompt "gps (depends on libnmeap, you need to install it manually!)"
<...>
Für jeden möglichen Treiber und jedes mögliche Plugin wird ein Menueintrag erstellt. Hier können
zusätzliche Abhängigkeiten direkt erfasst werden (select PACKAGE_name). Folgender Ausschnitt aus dem
Makefile:
LCD4LINUX_CONFIGURE_DRIVERS:= \
$(foreach c, $(LCD4LINUX_DRIVERS), \
$(if $(CONFIG_LCD4LINUX_DRV_$(c)),$(c),) \
)
Überprüft nun, welcher Eintrag ausgewählt wurde, und übergibt diesen String anschliessend dem
Konfigurations Skript.
Bei der Installation der Applikation (define Package/lcd4linux/install) wird das Init-File und das
Konfigurationsfile mitkopiert. Für den Endanwender ist das sehr praktisch, da a) das Default
Konfigurationsfile abgeändert werden kann und b) der Befehl „/etc/init.d/lcd4linux enable“ die Applikation
nach jedem Reboot automatisch startet.
Abbildung 7: Auswahl der Applikation
Abbildung 8: Auswahl der Konfigurationsoptionen
Abbildung 9: Konfiguration der Applikation
Michael Vogt
Seite 23 von 89
Diplomarbeit
Wie oben bereits erwähnt, benötigt LCD4Linux diverse Patch-Files, damit die Applikation kompiliert
werden kann. Hier ein Beispiel eines einfachen Patches namens 100-drv_RouterBoard.patch:
Index: lcd4linux-847/drv_RouterBoard.c
===================================================================
--- lcd4linux-847.orig/drv_RouterBoard.c
2007-12-01 17:15:10.000000000 +0100
+++ lcd4linux-847/drv_RouterBoard.c
2007-12-01 17:15:10.000000000 +0100
@@ -106,7 +106,7 @@
#include <string.h>
#include <errno.h>
#include <unistd.h>
-#include <sys/io.h>
+#include <asm/io.h>
#include "debug.h"
#include "cfg.h"
Dieser Patch korrigiert ein Include-Verzeichnis, welche Kernel-Version abhängig ist.
Ein Patch kann jedoch auch funktionaler Natur sein, der Patch 120-remove_parport_outb.patch entfernt die
Funktion, auf den Parallel Port zugreifen zu können, da kein Router einen Parallel-Port haben wird:
Index: lcd4linux-847/drv_generic_parport.c
===================================================================
--- lcd4linux-847.orig/drv_generic_parport.c
2007-12-01 17:15:10.000000000 +0100
+++ lcd4linux-847/drv_generic_parport.c 2007-12-01 17:15:11.000000000 +0100
@@ -39,16 +39,6 @@
#include <sys/stat.h>
#include <sys/ioctl.h>
-#ifdef HAVE_SYS_IO_H
-#include <sys/io.h>
-#define WITH_OUTB
-#else
-#ifdef HAVE_ASM_IO_H
-#include <asm/io.h>
-#define WITH_OUTB
-#endif
-#endif
#if defined (HAVE_LINUX_PARPORT_H) && defined (HAVE_LINUX_PPDEV_H)
#define WITH_PPDEV
#include <linux/parport.h>
@@ -65,6 +55,11 @@
#define PARPORT_STATUS_BUSY
0x80
#endif
+#ifndef WITH_OUTB
+#define inb(foo) 0
+#define outb(foo,bar) 0
+#endif
+
#if !defined(WITH_OUTB) && !defined(WITH_PPDEV)
#error neither outb() nor ppdev() possible
#error cannot compile parallel port driver
Michael Vogt
Seite 24 von 89
Diplomarbeit
Patch erstellen
Ein Patch wird mit dem Command Line Tool „diff“ erstellt. Ein einfaches Beispiel, es sollen zwei Files
verglichen werden:
File test_a:
ich bin ein file
ich bestehe nur aus
text und solXXXXl die
funktion der applikation
diff aufzeigen
File test_b:
ich bin ein file
ich bestehe nur aus
text und soll die
funktion der applikation
diff aufzeigen
Patch erzeugen:
michux@fwpiercer:/tmp$ diff -urN test_a test_b
--- test_a
2008-04-28 15:48:44.000000000 +0200
+++ test_b
2008-04-28 15:49:16.000000000 +0200
@@ -1,5 +1,5 @@
ich bin ein file
ich bestehe nur aus
-text und solXXXXl die
+text und soll die
funktion der applikation
diff aufzeigen
Um einen Patch zu erstellen, wird das trunk/build_dir/<ARCH>/<PACKAGE> Verzeichnis verwendet.
Das Originalfile wird kopiert und umbenannt (z.B. in myfile.orig), danach werden die Änderungen erledigt.
Nun kann mit dem „diff“ Tool der Patch erstellt werden („diff –urN <PACKAGE>/myfile.orig
<PACKAGE>/myfile.c > mein.patch).
Ein Beispiel, um die Applikation bemused-mpd-hack zu patchen:
~/trunk/build_dir/mipsel$ cp bemused-mpd-r060/main.cpp bemused-mpd-r060/main.orig
[edit bemused-mpd-r060/main.cpp]
~/trunk/build_dir/mipsel$ diff -urN bemused-mpd-r060/main.orig bemused-mpd-r060/main.cpp
--- bemused-mpd-r060/main.orig 2008-04-29 08:24:22.000000000 +0200
+++ bemused-mpd-r060/main.cpp
2008-04-29 08:25:47.000000000 +0200
@@ -27,6 +27,7 @@
void show_usage(void)
{
cout << "Bemused Linux Server v" << VERSION_STRING << endl;
+
cout << "Test Patch" << endl;
cout << "usage: bemusedlinuxserver [-d]" << endl;
cout << "
-d daemonize" << endl;
}
Dieses File kann nun dem Package Patch Verzeichnis hinzugefügt werden, danach kann die Applikation
neu erstellt werden.
Michael Vogt
Seite 25 von 89
Diplomarbeit
OPENWRT DISKLAYOUT / BOOTVORGANG
Quellennachweis: http://forum.openwrt.org/viewtopic.php?id=11304
In den meisten SOHO-Routern sind folgende Komponenten zu finden:
Flash Chip (2MB, 4MB, 8MB)
RAM, meistens 4x Flash Memory grösse
Beim Aufstarten des Routers wird kein ROM benötigt, die CPU führt den Code am Flashbeginn direkt aus.
Dieser Part wird als Bootloader bezeichnet und kann mit dem BIOS eines Computers verglichen werden.
Die Hauptaufgabe des Bootloaders besteht aus der Initialisierung der Hardware und des RAM's, danach
wird die Firmware gebootet. Meistens hat der Bootloader noch einen Recovery-Mechanismus eingebaut,
um die Firmware neu zu flashen. Eine beschädigte oder fehlerhafte Firmware kann also relativ einfach
"repariert" werden und verhindert, dass der Router als teurer Briefbeschwerer endet.
Das ergibt folgendes Bild des Flash Layouts:
Abbildung 10: Flashlayout I
Der Flash Chip besteht aus einem durchgängigen Speicherbereich, es gibt keine Partitionen, sondern nur
"hard coded locations".
Aus was besteht die Firmware
Wie oben bereits bemerkt wurde, führt der Bootloader den Beginn der Firmware-Location aus - es wird
also lediglich ein ausführbarer Code benötigt. Im Normalfall würde hier der Kernel liegen. Da jedoch nur
begrenzt Flash-Speicher zur Verfügung steht und der Kernel relativ gross ist, bietet es sich an, den Kernel
zu komprimieren. OpenWRT komprimiert den Kernel mit dem effizienten LZMA31 Verfahren, somit
ändert sich das Flash Layout:
Abbildung 11: Flashlayout II
Bis jetzt sind noch keine User oder Systemdaten vorhanden. Diese müssen natürlich auf einem Filesystem
abgespeichert werden. OpenWRT verwendet folgende Filesysteme:
SquashFS32: ein komprimiertes READ ONLY Filesystem.
JFFS233: bedeutet "Journaling Flash File System Version 2". Dieses Filesystem ist beschreibbar
und unterstützt "Wear Leveling"34. Wear Leveling versucht, die Lebenszeit der Flash Medien zu
verlängern. Ein Flash Medium besteht aus mehreren Segmenten, jedes Segment kann zwischen
10'000 und 1'000'000 mal überschrieben werden. Wear Leveling versucht nun, Schreibzugriffe
gleichmässig auf alle Segmente zu verteilen und erreicht somit eine höhere Lebensdauer des Flash
Mediums.
31
http://de.wikipedia.org/wiki/Lempel-Ziv-Markow-Algorithmus
http://squashfs.sourceforge.net/
33
http://sources.redhat.com/jffs2/
34
http://en.wikipedia.org/wiki/Wear_levelling
32
Michael Vogt
Seite 26 von 89
Diplomarbeit
Warum 2 Filesysteme?
Die beiden Filesysteme SquashFS und JFFS2 verwenden LZMA um die Daten zu komprimieren. SquashFS
komprimiert jedoch 20-30% besser als das R/W JFFS Filesystem. Die Vorteile jedes File-Systems:
Pro SquashFS: Effizienteste Speichernutzung
Pro JFFS: Beschreibbar, Journaling, Wear Leveling
Diese Vorteile werden nun folgendermassen in OpenWRT genutzt:
Installation des Basis OS Image erfolgt im SquashFS
Installation von weiteren Applikationen (=Packages) und User-Änderungen erfolgen im JFFS2
Filesystem
OpenWRT verwendet das virtuelle Filesystem mini_fo35, welches die SquashFS und JFFS2
Filesysteme zusammenfasst und als ein ganzes Filesystem Linux präsentiert. Wird ein File,
welches in SquashFS enthalten ist, geändert und abgespeichert, redirected mini_fo das File und
speichert dies in der JFFS2 Partition ab. Der Link zum originalen SquashFS wird dann gelöscht,
das File selber bleibt dann als "Leiche" zurück (da SquashFS Read Only ist). Das ist der Grund,
warum möglichst wenige Applikationen im OS Image sein sollten.
Das Ganze hat einen interessanten Nebeneffekt: Es ermöglicht das Booten des Routers im Fail-Safe Mode.
Hat man, warum auch immer, sein JFFS2 Filesystem zerstört oder kann nicht mehr "normal" Booten, kann
man durch Drücken einer Taste am Router während des Bootens in den Fail-Safe Mode schalten. In diesem
Modus verhält er sich wie nach einem reflash - es werden nur Daten auf dem SquashFS berücksichtigt. So
hat er per Default die IP Adresse 192.168.1.1.
Das Flash Layout kann nun wieder erweitert werden:
Abbildung 12: Flashlayout III
Der Bootvorgang im Detail:
kernel boots from squashfs and runs /etc/preinit
/etc/preinit runs /sbin/mount_root
mount_root mounts the jffs2 partition (/jffs) and combines it with the squashfs partition (/rom) to
create a new virtual root filesystem (/)
bootup continues with /sbin/init
35
http://www.denx.de/wiki/Know/MiniFOHome
Michael Vogt
Seite 27 von 89
Diplomarbeit
6. DETAILKONZEPT / DESIGN
Michael Vogt
Seite 28 von 89
Diplomarbeit
SYSTEMÜBERSICHT MP3 PLAYER
Abbildung 13: Übersicht MP3 Player
Michael Vogt
Seite 29 von 89
Diplomarbeit
APPLIKATIONSÜBERSICHT MP3 PLAYER
Einzelne Applikationen haben zur Laufzeit und/oder Kompilierungszeit Abhängigkeiten auf andere
Applikationen. Folgende Abbildung zeigt alle Applikations-Abhängigkeiten des MP3 Players:
Abbildung 14: Detailierte Applikations-Abhängikeiten
Michael Vogt
Seite 30 von 89
Diplomarbeit
MPD
Kurzübersicht:
Zweck:
Netzwerkfähiger Musikserver
Benötigt:
Soundkarte
Musikfiles (lokal oder remote)
Korrekte Systemzeit (ansonsten wird die Uptime falsch angezeigt)
Interface:
Netzwerkport (Port 6600) zur Steuerung des Players
Pulseaudio für abgesetzte Player (Remote Audioausgabe)
Lokale Audioausgabe
MPD (Music Player Daemon) ist, wie auf der Übersicht des MP3 Players (Abbildung 12) zu sehen ist, die
Kernapplikation des MP3 Players. Eine Übersicht, wie der MPD funktioniert36:
Abbildung 15: Übersicht MPD
36
Bildquelle: http://mpd.wikia.com/wiki/What_MPD_Is_and_Is_Not
Michael Vogt
Seite 31 von 89
Diplomarbeit
Wie auf der Abbildung zu sehen ist, ist der MPD netzwerkfähig und kann daher von verschiedenen Clients
verwendet werden.
MPD orientiert sich vom Funktionsumfang her an klassischen *NIX Applikationen – es macht eine Sache
und diese richtig. Es gibt viele verschiedene Clients, vom spartanischen Command Line Client MPC (der
sich sehr gut zum Skripten eignet), über Web Clients bis zu ausgefeilten Desktop-Playern mit Visualisation
und Cover Art Unterstützung ist alles vorhanden.
Für Entwickler sind diverse Libraries vorhanden, die die Interaktion mit dem MPD vereinfachen.
Security: Der (default) MPD Port 6600 ist nicht geschützt, d.h. Clients können ohne Authentifizierung den
Player steuern. Es gibt die Möglichkeit, ein Passwort zu setzen, das ist jedoch auch nur begrenzt sicher
(Plaintext über das LAN). Eine sichere Alternative wäre, SSH zu verwenden. Da das Device jedoch für den
Heim-Gebrauch bestimmt ist und sich im LAN befindet, erachte ich eine solche Massnahme als überflüssig
(siehe auch die MPD Wiki Seite37).
Der MPD erstellt nach jedem Start eine lokale Datenbank (Flat-File). In dieser sind alle vorhanden Songs
im angegebenen Musik-Verzeichnis vorhanden. Das dauert je nach Anzahl der Files eine gewisse Zeit,
jedoch hat man die Gewissheit, dass der Datensatz konsistent ist.
MPC
Kurzübersicht:
Zweck:
Steuerung des Musikservers MPD
Benötigt:
via Netzwerk erreichbarer MPD-Server
Interface:
Skript-fähige, abgesetzte Steuerung des MPD
MPC ist ein sehr vielfältiger und leistungsstarker Client, mit dem MPD gesteuert werden kann. Eine
Übersicht über alle möglichen Befehle ist im MPD-Wiki38 (oder mit „mpc –help“) vorhanden. Hier ein paar
Beispiele:
Alle im Songverzeichnis vorhandenen Files in der Playlist aufnehmen:
# mpc listall | mpc add –
Alle Songs der Band „Morcheeba“ in die Playlist aufnehmen:
# mpc search artist morcheeba | mpc add –
Info: Nach folgenden Informationen kann gesucht werden: artist, album, title, track, name, genre, date,
composer, performer, comment, disc, filename, any
Es gibt einen Windows-Client von MPC39. Damit ist es möglich, den entfernten MPD Server des MP3
Players zu kontrollieren. Beispiel:
C:\_hftso\diplomarbeit\mpc-win32-0.12.1>set MPD_HOST=10.105.66.20
C:\_hftso\diplomarbeit\mpc-win32-0.12.1>mpc
UnitedBreaks.FM - Online Breakbeat Station - www.unitedbreaks.fm: [Johnny CaGe]-(10:08)
[playing] #1/1
3:45/0:00 (100%)
volume:100%
repeat: on
random: on
MPC verwendet die Umgebungsvariable MPD_HOST, um den MPD Server auszulesen.
Hinweis: MPC dient nur zu steuern des MPD Players, eine Audioausgabe mit MPC ist nicht möglich!
37
http://mpd.wikia.com/wiki/Music_Player_Daemon_Security
http://mpd.wikia.com/wiki/MusicPlayerDaemonCommands#search
39
http://mpd.wikia.com/wiki/Client:Mpc-win32
38
Michael Vogt
Seite 32 von 89
Diplomarbeit
SCMPD
Kurzübersicht:
Zweck:
Übermittelt Meta-Daten der abgespielten Songs an Last.fm
Benötigt:
via Netzwerk erreichbarer MPD-Server
aktuelle Systemzeit (via NTP)
Interface:
Dieser MPD Client übermittelt die gespielten Songs auf die Web 2.0 Seite http://www.last.fm/. Wird ein
Song nicht ganz gehört, d.h. vorgespult wird der Song nicht übertragen. Voraussetzung, dass die
Übermittlung akzeptiert wird, ist eine korrekte Systemzeit. Der Router verfügt über keine „Real-TimeClock“ – nach einem Reboot muss die Zeit also via NTP Protokoll aktualisiert werden.
CmdPad
Kurzübersicht:
Zweck:
Steuern des Routers, führt einen Befehl/Skript aufgrund einer gedrückten Taste aus
Benötigt:
HID-fähige Hardware wie z.B. USB Keypad
Interface:
Jede gedrückte Taste auf einem HID fähigen Device erzeugt einen numerischen Keycode. Dieser wird
durch CmdPad ausgewertet und ein entsprechendes Skript oder eine Applikation werden ausgeführt. Dabei
kann CmdPad unterscheiden, ob eine Taste gedrückt wird, losgelassen oder gedrückt gehalten wird.
Bemused-MPD-hack
Kurzübersicht:
Zweck:
Steuern des MPD via Mobiltelefon
Visualisierung von MPD Informationen auf dem Mobiltelefon
Benötigt:
via Netzwerk erreichbarer MPD-Server
Bluetooth Kernel-Modul und Userspace Tools
Client auf dem Mobiltelefon
Bietet:
Serverinterface für Mobiltelefon Client
Der Bemusedserver benötigt einen funktionierenden Bluetooth Stack, welcher in aktuellen Linux Kernel
bereits integriert ist. Ausserdem werden die blueZ-* Userspace Tools40 benötigt. Sind diese
Voraussetzungen erfüllt, kann der Server via serieller-Bluetooth Schnittstelle mit dem Client
(=Mobiltelefon) kommunizieren.
Der Bemusedserver kommuniziert mit dem MPD Server um Informationen abzufragen oder Steuerbefehle
abzusetzen. So ist es möglich, auf einem Mobiltelefon die aktuellen MPD Informationen abzurufen und den
MPD aktiv zu steuern. Hier eine Auswahl an Möglichkeiten:
Steuern des MPD (Play, Pause, Stop, Next Song, Prev Song, Toggle Random, Toggle Repeat…)
Direktauswahl eines Songs aus der Playlist
Playlist bearbeiten
Abspielen von vordefinierten Radio-Streams
Kopieren von Songs direkt auf das Mobiltelefon
40
http://www.bluez.org/
Michael Vogt
Seite 33 von 89
Diplomarbeit
LCD4Linux
Kurzübersicht:
Zweck:
Visualisierung von MPD Informationen
Benötigt:
via Netzwerk erreichbarer MPD-Server
Interface:
Als Datenquelle dienen Plugins, welche entsprechende Informationen abrufen. Die Daten werden mittels
Widgets dargestellt, z.B. mittels eines Text Widgets oder eines Bar Widgets, der Zusammenhang wird hier
aufgezeigt:
Datenquelle
Bsp: MPD Player Stati,
Uptime...
Anzeige-Art
Bsp: Balken, Text...
Steuert Display an
LCD Display
Abbildung 16: LCD4Linux Terminologie
LCD4Linux kann die Anzeige sehr flexibel konfigurieren. Jedes Widget kann frei platziert und ausgerichtet
werden. Hier eine schematische Beispiel-Konfiguration:
Widget 8
Abbildung 17: LCD4Linux konfiguration
Jedes Text-Widget kann dabei einzeln konfiguriert werden, z.B. Textausrichtung, Scrollingart.
Michael Vogt
Seite 34 von 89
Diplomarbeit
SYSTEMÜBERSICHT SSH GATEWAY
Abbildung 18: Übersicht SSH Gateway
Michael Vogt
Seite 35 von 89
Diplomarbeit
7. SW-ERGÄNZUNGEN
OPENWRT
Übersicht
Folgende Changeset’s habe ich dem OpenWRT Projekt hinzugefügt:
Changeset 6661 – add package HTTPTunnel
Changeset 7573 – add package libmpd
Changeset 8155 – add package libnmeap
Changeset 8386 – update package mpd to v0.13.0
Changeset 8467 – update package mpc to v0.12.1
Changeset 9476 – minor update package icmptx, fix display issues
Changeset 9537 – minor update package devio, fix display issues
Changeset 9644 – report bug about hotplug errors
Changeset 9646 – update lcd4linux package to trunk 847 version, add init files
Changeset 9721 – update atheros platform, fix reset button
Changeset 9816 – update package iodine to v0.4.1
Changeset 9818 – update package PTunnel, add iptables rule
Changeset 9855 – report bug about libcurl, fix compile errors
Changeset 9979 – add package scmpc
Changeset 9980 – add package confuse
Changeset 9981 – add package argtable
Changeset 9983 – update mpd package, add init script
Changeset 10023 – update scmpc package, correct depends
Changeset 10035 – add package cmdpad, inkl. Linux 2.6 Patch
Changeset 10064 – update darkstat package, fix init file
Changeset 10085 – update HTTPTunnel package, use hci for config
Changeset 10160 – update PTunnel package, use hci for config
Changeset 10211 – update cmdpad package, no-zombie patch
Changeset 10231 – update bluez package to v3.24 (bluetooth), 4 packages
Changeset 10351 – update mpd package v0.13.1
Changeset 10352 – update mpc package, add pls handler
Changeset 10445 – add package libs/libshout
Changeset 10446 – update openssh package, add ssh-keysign, used for hostbased auth.
Changeset 10561 – add package LIRC
Die Changeset’s können unter https://dev.openwrt.org/ nachgesehen werden.
Quellcode:
Die relevanten OpenWRT Makefiles und Patches sind auf der CD unter \Software\OpenWRT\packages zu
finden. Weiter befindet sich die kompilierte Firmware unter \Software\OpenWRT\Firmware.
Michael Vogt
Seite 36 von 89
Diplomarbeit
Argtable
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Library, Command Line Parser
Die Applikation SCMPC benötigt diese Library
Makefile selber erstellt
Einfach, kein Patch nötig, kein Init-File nötig. Library muss zusätzlich in die
Entwicklungsumgebung kopiert werden (installdev)
libdaemon
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Library, ermöglicht das eine Applikation als Daemon laufen kann
Die Applikation SCMPC benötigt diese Library
Makefile selber erstellt
Einfach, kein Patch nötig, kein Init-File nötig. Library muss zusätzlich in die
Entwicklungsumgebung kopiert werden (installdev)
confuse
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Library, File Parser. Wird z.B. verwendet um Konfigurationsfiles zu lesen
Die Applikation SCMPC benötigt diese Library
Makefile selber erstellt
Einfach, kein Patch nötig, kein Init-File nötig. Library muss zusätzlich in die
Entwicklungsumgebung kopiert werden (installdev)
scmpc
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Last.fm Daemon, übermittelt die gehörten Songs an Last.fm
Anforderung Pflichtenheft (MP3 Player)
Makefile selber erstellt, Patch erstellt, Init-File erstellt
Mittel, Patch nötig damit die Applikation kompiliert werden kann, viele
Abhängigkeiten. Zusätzliches Init-File benötigt.
cmdpad
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Michael Vogt
Liest Keycodes eines HID Devices und führt entsprechend eine Applikation aus.
Anforderung Pflichtenheft (MP3 Player)
Makefile selber erstellt, Patches erstellt, Init-File erstellt
Mittel, Init-File benötigt, Patches nötig weil:
Korrektur Makefile
Unterstützung für 2.6.x Kernel
Ausgeführte Applikationen werden sauber beendet
Seite 37 von 89
Diplomarbeit
lcd4linux
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Visualisierung von Informationen
Anforderung Pflichtenheft (MP3 Player)
Makefile erweitert (Update der Applikation, Menueinträge), Patch erstellt (für
libmpdclient), Init-File erstellt, Plugin erstellt
Schwierig, sehr komplexes OpenWRT Makefile um einzelne Komponenten
auszuwählen (Treiber und Plugins). Patches nötig um die Applikation auf
Embedded Devices auszuführen (nicht von mir erstellt). Zusätzlich ein Init-File
und ein Konfigurations File nötig.
MPD
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Music Player Daemon, Soundserver
Anforderung Pflichtenheft (MP3 Player), Elementare Applikation des MP3 Players
Makefile erweitert, verwenden von Libiconv, Init-File hinzugefügt
Applikation updaten
Mittel, relativ komplexes OpenWRT Makefile (Angabe aller benötigten Libs)
MPC
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Music Player Console, Steuert MPD
Kernapplikation um MPD zu steuern
Makefile erweitert, Skript hinzugefügt um Radio Streams abzuspielen, Applikation
updaten
Einfach, Standart OpenWRT Makefile
bluez-libs
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Bluetooth Library
Die Applikation Bemused benötigt diese Library
Update des Makefiles (neue Version der Applikation)
Einfach, Standart OpenWRT Makefile
bluez-utils
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Bluetooth Tools
Die Applikation Bemused benötigt diese Library
Update des Makefiles (neue Version der Applikation)
Schwierig, diese neue Version verwendet neu dbus, diverse
Konfigurationsänderungen waren nötig, installieren von Konfigurations-Files
bluez-hcidump
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Michael Vogt
Bluetooth Traffic Dumper (Debug Tool)
Troubleshooting bei Bluetooth Problemen
Update des Makefiles (neue Version der Applikation)
Einfach, Standart OpenWRT Makefile
Seite 38 von 89
Diplomarbeit
bemused
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Bluetooth Server um mit MPD zu kommunizieren
Anforderung Pflichtenheft (MP3 Player)
Applikation angepasst, OpenWRT Makefile erstellt, Init-File erstellt,
Patch File erstellt (Libiconv spezifisch), Konfigurations File erstellt
Mittel, viele Abhängigkeiten, viele zusätzliche Files, Patch war nötig
OpenSSH
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
OpenSSH Suite (Client und Server)
Anforderung Pflichtenheft (SSH Gateway)
Makefile erweitert, das Tool ssh-keysign war nicht im Packet, welches für die
host-based authentication nötig ist
Einfach
PTunnel
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
ICMP Tunnel Software
Anforderung Pflichtenheft (SSH Gateway)
Update des Makefiles, Hinzufügen default Konfigurationsfile, Init-File erstellt
welches IPTables rules anpasst, verwenden von UCI (zentrales OpenWRT
Konfigurations-Skript)
Mittel, Standart OpenWRT Makefile jedoch Konfiguration von IPTables,
verwendet UCI
http Tunnel
Applikation:
Grund:
Arbeit:
Schwierigkeitsgrad:
Michael Vogt
http Tunnel Software
Anforderung Pflichtenheft (SSH Gateway)
Makefile erstellt, Hinzufügen default Konfigurationsfile, Init-File erstellt,
verwenden von UCI (zentrales OpenWRT Konfigurations-Skript)
Mittel, Standart OpenWRT Makefile, verwendet UCI
Seite 39 von 89
Diplomarbeit
LCD4LINUX
Übersicht
Diese Applikation dient zur Ansteuerung eines Displays.
Plugin MPD, neu erstellt
Changeset 786 – update mpd plugin, add more functions
Changeset 832 – update mpd plugin, more config options
Changeset 848 – update mpd plugin to v0.7, rewrote plugin
Changeset 850 – update mpd plugin, minor updates (sanity checks)
Changeset 852 – update mpd plugin,to v0.8, use libmpdclient library
Changeset 853 – update mpd plugin,to v0.81, fix connection issues
Changeset 854 – update mpd plugin, add signal handler (SIGPIPE)
Plugin GPS, neu erstellt
Changeset 801 – add gps plugin, first version
Changeset 831 – update gps plugin, add more functions + emulator code
Changeset 841 – update gps plugin to v0.2, major update
Changeset 842 – update gps plugin to v0.3, improved parser + emulator
Changeset 851 – update gps plugin to v0.3, disable default emulator
Plugin FIFO, neu erstellt
Changeset 869 – add FIFO plugin, first version
Changeset 875 – minor update
Changeset 875 – add signal handler (SIGPIPE)
Widget Text (Textanzeige)
Changeset 849 – neue scrolling Art, Ping Pong
Driver Crystalfontz
Changeset 864 – update charset for Crystalfontz Model 632 and 634
Die Changes können unter http://ssl.bulix.org/projects/lcd4linux/ nachgesehen werden.
Quellcode:
Die ganze Source von LCD4Linux ist auf der CD unter \Software\LCD4Linux zu finden.
Michael Vogt
Seite 40 von 89
Diplomarbeit
Plugin Entwicklung
LCD4Linux beschreibt auf der Wiki Seite41, wie man ein neues Plugin erstellt:
How to write new plugins
Writing a new plugin for lcd4linux is quite easy, if you follow these steps:
Get the SVN (Subversion) version: This is very important, because it makes it much easier for
us to commit your changes into the official code. If you need help with SVN, look at the SVN
section at the Download page.
There's no need to keep two seperate directories (one with the original, one with your
modifications): Subversion does this job for you.
Always do a svn up before editing, to ensure you're working on current code.
use plugin_sample.c as a template, but do not simply copy it, but let subversion do the job:
svn cp plugin_sample.c plugin_<yourname>.c
edit plugin_<yourname>.c
add a short description what this plugin is for
add your copyright notice (important: your name and email)
Please do not modify the GPL part! (Yes, you have to put your code under GPL,
otherwise I'll refuse your patch)
do some documentation (I know that real programmers write programs, not
documentation, but...)
use one or more of the example functions as templates for your own functions
register your new functions in the init() function, delete the sample ones
edit plugin.c, add prototypes and the call to your plugin_init_* and plugin_exit_* function
(just search for sample, copy&paste the corresponding areas, but try to keep it in alphabetical
order)
edit Makefile.am and add your plugin_*.c to EXTRA_lcd4linux_SOURCES (again,
copy&paste the sample areas, take care for alphabetical order)
edit plugins.m4 and copy&paste all sample areas (alphabetical order, please)
run ./bootstrap, ./configure and make
test with interactive mode (lcd4linux -i)
run ./indent.sh to apply coding style (this does source code formatting)
send us a patch:
run svn diff >your_patch.diff and send us the file
run svn commit -m "<your log message>" if you have SVN developer access and you
know what you're doing
add documentation to the wiki!!
Neben der eigentlichen Programierarbeit muss also noch das Automake-System angepasst werden und die
ganze Sache im Wiki dokumentiert werden.
41
http://ssl.bulix.org/projects/lcd4linux/wiki/plugin_howto
Michael Vogt
Seite 41 von 89
Diplomarbeit
Das plugin_sample.c (vereinfacht) sieht folgendermassen aus:
/* define the include files you need */
#include "config.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* these should always be included */
#include "debug.h"
#include "plugin.h"
/* sample function 'mul3' takes one argument, a number */
/* multiplies the number by 3.0 */
static void my_mul3(RESULT * result, RESULT * arg1)
{
/* do it all in one line */
double value = R2N(arg1) * 3.0;
/* store result */
SetResult(&result, R_NUMBER, &value);
}
/* sample function 'upcase' takes one argument, a string */
/* returns the string in upper case letters */
static void my_upcase(RESULT * result, RESULT * arg1)
{
char *value, *p;
/* create a local copy of the argument */
/* Do *NOT* try to modify the original string! */
value = strdup(R2S(arg1));
/* process the string */
for (p = value; *p != '\0'; p++)
*p = toupper(*p);
/* store result */
/* when called with R_STRING, it assumes the */
/* next parameter to be a pointer to a string */
/* 'value' is already a char*, so use 'value', not '&value' */
SetResult(&result, R_STRING, value);
/* free local copy again */
/* Note that SetResult() makes its own string copy
free(value);
*/
}
/* plugin initialization, MUST NOT be declared 'static'! */
int plugin_init_sample(void)
{
/* register all our cool functions */
/* the second parameter is the number of arguments */
/* -1 stands for variable argument list */
AddFunction("sample::mul3", 1, my_mul3);
AddFunction("sample::upcase", 1, my_upcase);
}
return 0;
void plugin_exit_sample(void)
{
/* free any allocated memory */
/* close filedescriptors */
}
Jedes Plugin muss eine Initialisierungs- und Cleanup-Funktion implementieren. Jede Plugin spezifische
Funktion muss in der Initialisierungs-Funktion registriert werden (inkl. Anzahl der Argumente).
Michael Vogt
Seite 42 von 89
Diplomarbeit
Das MPD Plugin hat folgende Spezialitäten:
Konfiguration von MPD Server Adresse, Server Port und Update Time (siehe unten) im
LCD4Linux Konfigurations-File.
Verwendet libmpdclient um mit dem MPD Server zu kommunizieren
Jeder Wert, der aus MPD ausgelesen wird, ist im Plugin selber gecachet
Es werden stets alle Daten aktualisiert
Da dieses Plugin auf einem Embedded Device laufen soll, sind Ressourcen generell schonend zu
behandeln. Daher aktualisiert das Plugin die Daten nur alle „Update Time“ ms, per Default alle
500ms.
Eine Anfrage wird von der LCD4Linux Konfiguration ausgeführt, wenn dort z.B. ein Widget
definiert ist, dass alle 100ms den Songtitel anzeigen soll, wird alle 100ms die entsprechende
Funktion im Plugin aufgerufen. Jetzt werden viermal die gecachten Daten angezeigt
(4x100ms < 500ms), beim fünften mal aktualisiert das Plugin dann wieder alle Daten, da die
Update Time abgelaufen ist.
Wird die Verbindung zum MPD unterbrochen, muss diese neu aufgebaut werden (Ignorieren von
SIGPIPE, Broken Pipe Fehler)
Wenn im Betrieb der MPD Server gestoppt wird, zeigt das Plugin die Cache-Daten an. Zusätzlich
wird eine entsprechende Meldung in Syslog gemacht.
Folgende Funktionen sind implementiert:
Funktionsname, Anz. Parameter
Beschreibung (Str=String, Int=Integer)
mpd::artist, 0
mpd::title, 0
mpd::album, 0
mpd::file, 0
mpd::totalTimeSec, 0
mpd::elapsedTimeSec, 0
mpd::bitRate, 0
mpd::getSamplerateHz, 0
mpd::getAudioChannels, 0
mpd::getRepeatInt, 0
mpd::getRandomInt, 0
mpd::getStateInt, 0
mpd::getVolume, 0
mpd::getSongsInDb, 0
mpd::getMpdUptime, 0
mpd::getMpdPlayTime, 0
mpd::getMpdDbPlayTime, 0
mpd::getMpdPlaylistLength, 0
mpd::getMpdPlaylistGetCurrentId, 0
mpd::formatTimeMMSS, 1
mpd::formatTimeDDHHMM, 1
Str: Artistname (ID3 Tag)
Str: Song Titel (ID3 Tag)
Str: Album Titel (ID3 Tag)
Str: Filename
Int: Dauer des Songs in Sekunden
Int: Aktuelle Spielzeit des Songs in Sekunden
Int: Bit-Rate in kHz
Int: Samplerate in Hz
Int: Wieviele Audiochannels
Int: Repeat all aktiviert (1=ja, 0=nein)
Int: Random Play aktiviert
Int: Playerstatus, 0=unknown, 1=play, 2=pause, 3=Stopp
Int: Volume von 0..100
Int: Alle Songs in der Datenbank
Int: Zeit in Sekunden seit MPD gestartet wurde
Int: Zeit in Sekunden wenn MPD im Status PLAY ist
Int: Gesammtspielzeit der aktuellen Playlist
Int: Wieviele Songs sind in der Playlist
Int: Id des aktuellen Songs
Str: Formatiert einen Int Wert in eine HH:MM Anzeige
Str: Formatiert einen Int Wert in eine DD:HH:MM Anzeige
Mithilfe der Uptime-Funktion und einfacher Arithmetik, ist es möglich eine wechselnde Anzeige
darzustellen:
Widget mpd-toggler {
class 'Text'
expression ( (mpd::getMpdUptime()%60)<30 ?
('UP:'.mpd::formatTimeDDHHMM( mpd::getMpdUptime() ) ) :
('TRACK:'.mpd::getMpdPlaylistGetCurrentId().'/'.mpd::getMpdPlaylistLength()) )
width 15
align 'P'
update tack
}
30 Sekunden wird die Uptime angezeigt, danach die aktuelle Song-Nummer.
Michael Vogt
Seite 43 von 89
Diplomarbeit
Hinweis zu ID3 Tags
Das Hauptproblem bei ID3 Tags ist die String Encodierung. Damit die Tags korrekt ausgegeben werden,
muss der String entsprechend umgewandelt werden. Es gibt zwei Versionen von ID3 Tags, ID3v1 und
ID3v2.
ID3v1
Diese Version entstand aus einem Hack, eine „offizielle“ Version gab es nie. Dennoch etablierte sich diese
Version. Alle Strings sollten ISO 8859-1 encodiert werden, in der Praxis sieht dies jedoch häufig anders
aus. Daher ist Mojibake42 (falsche Darstellung von Zeichen) ein häufiges Problem von ID3v1 Tags.
ID3v2
Die Version 2 hingegen ist ein offizieller Standart, Informationen werden unter http://www.id3.org/
veröffentlicht. ID3v2 ist eigentlich eine falsche Bezeichnung, da von dieser Version zwei verschiedene
Varianten existieren.
ID3v2.3, encodiert Strings in ISO 8859-1 und UTF16. Unicode Strings müssen mit dem Unicode BOM
($FF FE oder $FE FF) beginnen, um die Byte order zu definieren. Alle numerischen Strings und URL’s
werden immer mit ISO-8859-1 encodiert.
ID3v2.4, unterstützt zusätzlich UTF-8. Diese Version ist jedoch kaum verbreitet.
Fazit: Es sollte immer das ID3v2.3 Tag Format benutzt werden, weil bei dieser Version die String
Encodierung standardisiert ist.
42
http://en.wikipedia.org/wiki/Mojibake
Michael Vogt
Seite 44 von 89
Diplomarbeit
BEMUSED LINUX SERVER
Leitet Bluetooth Anfragen an den MPD Server weiter. Ursprünglich für Windows entwickelt, danach auf
Linux für den XMMS Player portiert. Der original Source von Bemused ist unter
http://bemused.sourceforge.net/ zu finden.
Ich habe Bemused Linux Server für den MPD Musik Player umgeschrieben. Unter
http://bemused-lnx-mpdhack.origo.ethz.ch/ habe ich eine Projektseite eingerichtet, dort ist auch die aktuelle
Version zu finden.
Mittels eines Java Clients auf einem Mobil Telefon (http://jamse.sourceforge.net/) kann schlussendlich der
MPD gesteuert werden:
Abbildung 19: Bemusedserver in Action
So kann der Player bequem via Mobil Telefon gesteuert werden. Es ist auch möglich, Songs via Bluetooth
direkt auf das Telefon herunterzuladen.
Quellcode:
Die ganze Source von „Bemused linux server“ ist auf der CD unter \Software\ Bemusedlinuxserver zu
finden.
Michael Vogt
Seite 45 von 89
Diplomarbeit
Code Änderungen
Bemused Linux Server besteht aus folgenden Sourcefiles:
BemusedServerDlg.cpp: Hauptapplikation
MpdCtrl.c: Steuerung des MPD Servers
Folgende Bugs wurden behoben:
BemusedServerDlg.cpp: Backport CVS Code aus dem Bemused CVS Server, vor allem für das
Bookmark handling
BemusedServerDlg.cpp: Signalhandler für die Signale SIGHUP, SIGINT, SIGQUIT, SIGTERM
hinzugefügt. Diese Signale werden gesendet wenn z.B. die Applikation mit CTRL+C beendet wird
oder das System herunterfährt. Bevor sich die Applikation beendet, wird die Verbindung zum
MPD Server beendet
BemusedServerDlg.cpp: Verbose Log Mode, mehr Informationen für den User hinzugefügt
BemusedServerDlg.cpp: Das Bookmark-File wurde nach dem Lesen nicht geschlossen
BemusedServerDlg.cpp: Segfault wenn das Bookmark-File / Konfigurations-File fehlerhafte (oder
auch überlange) Einträge enthält. Beispiele fehlerhafter Einträge:
=
=value
test=
BemusedServerDlg.cpp: Remove dead code
BemusedServerDlg.cpp: Entfernen des alten Bluetooth Stack AFFIX (blueZ und AFFIX waren
unterstützt, AFFIX wird jedoch nicht mehr weiterentwickelt)
MpdCtrl.c: Alle Funktionen für den MPD Player mithilfe der Library libmpdclient umgeschrieben,
hier ein der Auszug auf dem MpdCtrl.h File:
void
void
void
void
void
void
void
void
void
void
void
void
void
mpd_remote_playlist_add(char *buffer, int isStream, char *basedir);
mpd_remote_play();
mpd_remote_pause();
mpd_remote_stop();
mpd_remote_set_playlist_pos(gint pos);
mpd_remote_playlist_clear();
mpd_remote_jump_to_time(gint pos);
mpd_remote_set_main_volume(gint v);
mpd_remote_get_info(gint * rate, gint * freq, gint * nch);
mpd_remote_playlist_prev();
mpd_remote_playlist_next();
mpd_remote_toggle_repeat();
mpd_remote_toggle_shuffle();
gboolean mpd_remote_is_playing();
gboolean mpd_remote_is_paused();
gint
gint
gint
gint
gint
mpd_remote_get_output_time();
mpd_remote_get_main_volume();
mpd_remote_get_playlist_time(gint pos);
mpd_remote_get_playlist_length();
mpd_remote_get_playlist_pos();
gchar *mpd_remote_get_playlist_title(gint pos);
gboolean mpd_remote_is_repeat();
gboolean mpd_remote_is_shuffle();
gboolean mpd_remote_is_running();
void close_mpd_connection();
MpdCtrl.c: Anpassen diverser Formatunterschiede, z.B. verwendet XMMS Milisekunden als
Format für Zeitangaben, während MPD Sekunden verwendet.
MpdCtrl.c: Timeout-handling: Sollte der Client aufgrund zu langer IDLE Zeit die Verbindung zum
MPD Server verlieren, muss die Verbindung erneut aufgebaut werden (Broken Pipe handling –
wird dieses Signal nicht bearbeitet, beendet sich die Applikation bei einem Timeout)
MpdCtrl.c: libiconv support hinzugefügt, MPD verwendet intern UTF8 für alle Strings
MpdCtrl.c: Remove dead code
Diverses: LibMpdClient Library dem Projekt hinzugefügt
Diverses: Makefile erstellt und angepasst
Michael Vogt
Seite 46 von 89
Diplomarbeit
JamSE Client
Den JAVA Client habe ich ausführlich getestet und diverse Fehlermeldungen dem Author mitgeteilt:
Backlight Probleme bei s40 3rd Gen Serie von Nokia (Nokia 6500 Slide) – Bug gefixt
Probleme bei grossen Playlists, Test mit 5000+ MP3’s hatte der Client kein Speicher mehr („Out
of Memory“ Exception) – Bug noch offen
Search Song funktioniert, gibt aber einen falschen Pfad zurück, d.h. Song kann nicht in die Playlist
aufgenommen werden – Bug noch offen
Seek auswählen, danach Menutaste drücken und Menu wieder verlassen – Screen wird nicht
refresht – Bug noch offen
CMDPAD
Diese Applikation liest von einem HID Device (wie z.B. USB Keypad) Tastencodes ein und führt
anschliessend ein definiertes Programm aus. Da diese Applikation schon ein wenig älter ist, musste ich
zwei Patches erstellen:
1.) Linux 2.6 support, der Kernel 2.6 spricht Devices anders an als der 2.4er Kernel:
--- cmdpad-0.0.3/src/parse.orig
2008-01-05 23:55:32.000000000 +0100
+++ cmdpad-0.0.3/src/parse.c 2008-01-05 23:56:07.000000000 +0100
@@ -289,6 +289,12 @@
pchEventDevice = strdup( pchValue) ;
return 1 ;
}
+
if( (pchValue != NULL) &&
+
(strncmp( pchValue, "/dev/event", 6) == 0) )
+
{
+
pchEventDevice = strdup( pchValue) ;
+
return 1 ;
+
}
printf( "Option 'device' expects a /dev/input/eventX argument\n");
return -1 ;
}
2.) No Zombie Patch – wenn eine Applikation beendet wurde, wird dieser Prozess auch beendet und
bleibt nicht als „toter Prozess“ (=Zombie) zurück:
--- cmdpad-0.0.3/src/command.c.orig 2003-03-29 17:54:12.000000000 +0100
+++ cmdpad-0.0.3/src/command.c
2008-01-12 05:41:22.000000000 +0100
@@ -68,6 +68,7 @@
void exec( char * command)
{
+
int status;
if( fork() == 0) {
char ** tmp ;
int i ;
@@ -88,6 +89,7 @@
perror( "ERROR: execv") ;
exit( 1) ;
} // end if( fork())
+
wait(&status);
}
int getNumberofEntry()
Quellcode:
Die Patches sind Bestandteile des OpenWRT Packages und auf der CD unter
\Software\OpenWRT\packages\cmdpad zu finden.
Michael Vogt
Seite 47 von 89
Diplomarbeit
MPD
Ein neues Startscript (Shellscript) wurde für MPD erstellt. Bevor der MPD gestartet wird, wird überprüft ob
das Song-Verzeichnis vorhanden ist. Wird das nicht gemacht, besteht die Möglichkeit, dass MPD ohne
Song in der Playlist gestartet wird.
root@(none):/# cat /etc/init.d/mpd
#!/bin/sh /etc/rc.common
# Copyright (C) 2007 OpenWrt.org
START=93
start() {
# Check if Mountdirectory exist
MP3PATH=/mnt/usbdrive/_mp3
COUNT=0
while [ 1 ]; do
[ -d $MP3PATH ] && {
break
}
if [ $COUNT -lt 3 ]; then
/usr/bin/logger -s MPD.init: [WARNING] mount path not ready yet, sleep 1s
let COUNT=COUNT+1
fi
/bin/sleep 1
done
#create mpd db
/usr/bin/mpd --stdout --create-db
#optional export for mpc
export MPD_HOST=127.0.0.1
#start mpd
/usr/bin/mpd
#generate playlist and start to play
/usr/bin/mpc listall | /usr/bin/mpc add /usr/bin/mpc play
/usr/bin/mpc repeat
/usr/bin/mpc random
/usr/bin/mpc crossfade 10
Das sieht dann folgendermassen im Logfile aus:
Jan 1
Jan 1
Jan 1
Jan 1
Jan 1
Jan 1
Jan 1
Jan 1
tv.mp3
02:00:23
02:00:23
02:00:23
02:00:25
02:00:26
02:00:26
02:00:26
02:00:26
OpenWrt
OpenWrt
OpenWrt
OpenWrt
OpenWrt
OpenWrt
OpenWrt
OpenWrt
daemon.info
daemon.info
user.info :
user.notice
user.info :
user.info :
user.info :
user.info :
hcid[882]: Starting security manager 0
hcid[882]: Device hci0 has been activated
MPD.init: [WARNING] mount path not ready yet, sleep 1s
MPD.init: [WARNING] mount path not ready yet, sleep 1s
mounting /dev/sda1 on /mnt/usbdrive
current locale is "C"
setting filesystem charset to ISO-8859-1
added Sneaker Pimps - Bloodsport/01 sneaker pimps - kiro
Danach werden folgende Aktionen erledigt:
MPD Datenbank wird erstellt
Die Umgebungsvariable MPD_HOST wird gesetzt. Das ist wichtig, wenn keine
Netzwerkverbindung vorhanden ist.
Starten von MPD
Default Playlist wird erstellt
MPD spielt Song ab
Repeat, Random und 10s Crossfading wird aktiviert
Quellcode:
Das Skript ist Bestandteil des OpenWRT Packages und auf der CD unter
\Software\OpenWRT\packages\mpd zu finden.
Michael Vogt
Seite 48 von 89
Diplomarbeit
MPC
Ein einfaches Shell-Skript wurde erstellt, um den nächsten Künstler der gegenwärtigen Playlist abzuspielen.
Dieses Skript wird von CmdPad aufgerufen.
#!/bin/sh
#random mode is quite useless here!
mpc random off
OLDARTIST=`mpc | head -n 1 | awk '{print $1}'`
while [ 1 ]; do
mpc next
ARTIST=`mpc | head -n 1 | awk '{print $1}'`
echo OLDARTIST/NEWARTIST: $OLDARTIST/$ARTIST
[ $OLDARTIST != $ARTIST ] && {
break
}
done
echo done
Quellcode:
Das Skript ist auf der CD unter \Software\MPC zu finden.
Michael Vogt
Seite 49 von 89
Diplomarbeit
8. INSTALLATION
MP3 PLAYER
Konfiguration Firmware
Starten der OpenWrt Firmware-Konfiguration
michux@fwpiercer:/home/michux/trunk$ make menuconfig
Als Basis dient die default Konfiguration („Reset to defaults“)
Abbildung 20: Konfiguration MP3 Firmware
Als „Target System“ muss das Model „Broadcom BCM947xx/953xx [2.6]“ ausgewählt werden. Wireless
LAN wird für dieses Model noch nicht unterstützt, daher ist bei der Option „Target Profile“ „No
WiFi“ auszuwählen.
Michael Vogt
Seite 50 von 89
Diplomarbeit
Folgende Zusatz Packages wurden ausgewählt (<M>):
Network / Time Synchronization / openntpd
Kernel modules / Filesystems / kmod-fs-vfat
Kernel modules / Filesystems / kmod-fs-ntfs
Kernel modules / Filesystems / kmod-nls-iso8859-1
Kernel modules / Filesystems / kmod-nls-utf8
Kernel modules / Network Support / kmod-ipv6 (Build-in <*>)
Kernel modules / Other modules / kmod-bluetooth
Kernel modules / Sound Support / kmod-sound-core
Kernel modules / USB Support / kmod-usb-core (Build-in <*>)
Kernel modules / USB Support / kmod-usb-audio
Kernel modules / USB Support / kmod-usb-hid
Kernel modules / USB Support / kmod-usb-serial
Kernel modules / USB Support / kmod-usb-serial-ftdi
Kernel modules / USB Support / kmod-usb-serial-pl2303
Kernel modules / USB Support / kmod-usb-storage (Build-in <*>)
Kernel modules / USB Support / kmod-usb-uhci
Kernel modules / USB Support / kmod-usb2
Utilities / alsa-utils
Utilities / bemusedlinuxserver
Utilities / bluez-utils
Utilities / cmdpad
Utilities / lcd4linux
Utilities / pciutils
Utilities / strace
Sound / mpc
Sound / mpd
Sound / scmpc
Info: Pakete können Abhängigkeiten auf andere Pakete haben. Ein abhängiges Paket wird automatisch
ausgewählt und wird hier nicht aufgeführt. Erklärung der ausgewählten Packages:
openntpd
Zeitsynchronisierung, wird für den SCMPC Daemon benötigt.
kmod-fs-vfat / ntfs
Modul um das FAT / NTFS Dateisystem zu lesen
kmod-nls-iso8859-1
Unterstützung für das iso8859-1 Charset (Latin 1)
kmod-nls-utf8
Unterstützung für das UTF8 Charset
kmod-bluetooth
Bluetooth Modul
kmod-ipv6
Zwingende Abhängikeit, evtl. OpenWRT Bug (Fehler gemeldet)
kmod-sound-core
Generelle Sound Unterstützung
kmod-usb-core
Generelle USB Unterstützung
kmod-usb-audio
USB Sound Unterstützung
kmod-usb-hid
USB Hid Unterstützung (z.B. USB Keypad)
kmod-usb-serial
Generelle USB-to-Serial Unterstützung
kmod-usb-serial-ftdi
Spezifische Unterstützung für den FTDI Chip
kmod-usb-serial-pl2303
Spezifische Unterstützung für den PL2303 Chip
kmod-usb-storage
Generelle USB Storage Unterstützung (z.B. Memorystick)
kmod-usb-uhci
UHCI USB Modul
kmod-usb2
Generelle USB 2 Unterstützung
alsa-utils
Alsa Mixer Applikation
bemusedlinuxserver
Serverteil der Bluetooth-Steuerung
bluez-utils
Bluetooth Tools
cmdpad
Führt Programme anhand gedrückten Tasten aus
lcd4linux
Ansteuerung eines LCD
pciutils
Statustool, um PCI-spezifische Informationen auszulesen
strace
Debug Tool
mpc
Music Player Daemon (MPD) Client
mpd
Music Player Daemon (MPD)
scmpc
Übermittelt die gehörten Songs an Last.fm (nur Metadaten)
Michael Vogt
Seite 51 von 89
Diplomarbeit
Nun die Konfiguration speichern und den Buildprozess starten. Die Option V=99 definiert, dass der
Debugmode aktiviert wird. Das hat den Vorteil, dass man sieht, was gerade kompiliert wird. In Falle eines
Fehlers sieht man, warum der Prozess beendet wurde und was die Fehlermeldung ist.
michux@fwpiercer:/home/michux/trunk$ make V=99
Ist der Build Prozess erfolgreich beendet, liegen im „./bin/mipsel“ Verzeichnis die kompilierten Image
Files und die ausgewählten Packages.
Firmware Update
Quelle: http://wiki.openwrt.org/OpenWrtDocs/Hardware/Asus/WL500GP
Firmware-Update für ASUS WL-500g Premium
Übersicht
Um eine neue Firmware für diesen Router zu installieren, müssen folgende Schritte erledigt werden:
Stromkabel des Routers entfernen
Gekreuztes RJ45 Kabel zwischen Workstation und Router Port LAN1 verbinden (nicht WAN!)
Auf dem Router den RESTORE Knopf gedrückt halten (schwarzer Schalter, nicht der rote
Schalter), danach das Stromkabel wieder mit dem Router verbinden
Wenn das POWER LED langsam blinkt, ist der Router im DIAG Modus - der RESTORE Knopf
muss nun nicht mehr gedrückt werden
Im DIAG Modus hat der Router (per Default) die IP Adresse 192.168.1.1 und akzeptiert neue
Firmware Images
Jetzt kann das "ASUS Firmware Restoration Tool" verwendet werden, um das Image via TFTP auf
den Router zu übertragen. Hinweis: Dieses Tool unterstützt nur eine NIC auf der Workstation daher alle NIC's ausser der verwendeten RJ45 Verbindung deaktivieren (Virtuelle Adapter,
Wireless...). Ist das "ASUS Firmware Restoration Tool" nicht vorhanden, kann auch ein anderer
TFTP Client verwendet werden
Ist die neue Firmware übertragen, darf der Router nicht direkt neu gestartet werden, da der interne
Flash Speicher "partitioniert" wird. Am besten überwacht man den Fortschritt via serielle
Schnittstelle.
Detail
Serial-Output wenn der Router im Diag Modus ist und auf eine neue Firmware wartet:
Reading :: TFTP Server.
Failed.: Timeout occured
Reading :: TFTP Server.
Failed.: Timeout occured
...
Screenshot des Firmware Restoration Tools von ASUS:
Abbildung 21: ASUS Firmware Restoration Tool
Michael Vogt
Seite 52 von 89
Diplomarbeit
Serielle Ausgabe während des Flash-update Prozesses:
Device eth0: hwaddr 00-18-F3-85-6A-9D, ipaddr 192.168.1.49, mask 255.255.255.0
gateway not set, nameserver not set
Failed.: Timeout occured
Reading :: TFTP Server.
Failed.: Timeout occured
Reading :: TFTP Server.
TFTP_BLKLEN!!
Done. 1839104 bytes read
Download of 0x1c1000 bytes completed
Write kernel and filesystem binary to FLASH (0xbfc40000)
flash device 'flash1.trx'
parseflag = 0, the copysize is 1839104
Programming...
Nachdem die Firmware in den Flash-Speicher geschrieben wurde, wird der Router neu gestartet. Nach dem
Boot, wird das jffs2 Filesystem erstellt. Hier auf keinen Fall den Router abstellen oder Prozess abbrechen,
sondern warten bis das Filesystem erstellt wurde:
...
- init Please press Enter to activate this console. b44: eth0: Link is up at 100 Mbps, full duplex.
b44: eth0: Flow control is off for TX and off for RX.
br-lan: Dropping NETIF_F_UFO since no NETIF_F_HW_CSUM feature.
device eth0.0 entered promiscuous mode
device eth0 entered promiscuous mode
SCSI subsystem initialized
br-lan: port 1(eth0.0) entering learning state
br-lan: topology change detected, propagating
br-lan: port 1(eth0.0) entering forwarding state
BFL_ENETADM not set in boardflags. Use force=1 to ignore.
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
PPP generic driver version 2.4.2
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
jffs2_build_filesystem(): unlocking the mtd device... done.
jffs2_build_filesystem(): erasing all blocks after the end marker...
Siehe auch Kapitel „OpenWRT Disklayout“
Michael Vogt
Seite 53 von 89
Diplomarbeit
Basis Konfiguration
Ist OpenWRT als Firmware installiert, muss zuerst die Grundkonfiguration erstellt werden. Dazu verbindet
man sich via Telnet auf die IP 192.168.1.1 und setzt das Root Passwort:
=== IMPORTANT ============================
Use 'passwd' to set your login password
this will disable telnet and enable SSH
-----------------------------------------BusyBox v1.8.2 (2008-04-10 12:28:10 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
_______
________
__
|
|.-----.-----.-----.| | | |.----.| |_
|
|| _ | -__|
|| | | ||
_||
_|
|_______||
__|_____|__|__||________||__| |____|
|__| W I R E L E S S
F R E E D O M
KAMIKAZE (bleeding edge, r10786) ------------------* 10 oz Vodka
Shake well with ice and strain
* 10 oz Triple sec mixture into 10 shot glasses.
* 10 oz lime juice Salute!
--------------------------------------------------root@OpenWrt:/# passwd
Changing password for root
New password:
Retype password:
Password for root changed by root
Diese Aktion hat zur Folge, dass der SSH Daemon aktiviert wird. Nun können die Packages via SCP auf
den Router kopiert werden. Als Ziel sollte /tmp verwendet werden, da dort genügend freier Speicherplatz
vorhanden ist (Ramdisk):
root@OpenWrt:/# df /tmp -h
Filesystem
Size
none
14.6M
Used Available Use% Mounted on
36.0k
14.6M
0% /tmp
Abbildung 22: WinSCP Datentransfer zu OpenWRT
Hinweis: Als SSH Daemon wird eine „abgespeckte“ Variante verwendet, Dropbear. Dieser SSH Server
unterstützt nur SCP (kein SFTP). Wird eine Verbindung mit WinSCP43 aufgebaut, werden diverse
Fehlermeldungen über fehlende Files angezeigt. Diese Fehler können ignoriert werden und stören die
Funktion nicht.
43
http://winscp.net/eng/index.php
Michael Vogt
Seite 54 von 89
Diplomarbeit
Nachdem die Packages auf den Router kopiert sind, können diese installiert werden. Eine Applikation wird
mit dem Befehl „ipkg install /pfad/file.ipk“ installiert. Da Packages gegenseitige Abhängigkeiten haben,
müssen diese in der richtigen Reihenfolge installiert werden, hier eine mögliche Reihenfolge:
1. kmod-usb-core*
2. kmod-usb-serial*
3. kmod-usb-serial-ftdi*
4. kmod-usb-serial-pl2303*
5. kmod-usb-uhci*
6. kmod-usb2*
7. kmod-sound-core*
8. kmod-usb-audio*
9. kmod-bluetooth*
10. kmod-nls-base_2.6.23.16-brcm47xx-1_mipsel.ipk
11. kmod-nls-iso8859-1*
12. kmod-nls-cp437*
13. kmod-nls-utf8*
14. kmod-usb-storage*
15. kmod-fs-vfat*
16. kmod-fs-ntfs*
17. kmod-input-core_2.6.23.16-brcm47xx-1_mipsel.ipk
18. kmod-input-evdev_2.6.23.16-brcm47xx-1_mipsel.ipk
19. kmod-hid_2.6.23.16-brcm47xx-1_mipsel.ipk
20. kmod-usb-hid*
21. pciutils*
22. strace*
23. openntpd_3.9p1-2_mipsel.ipk
24. bluez-libs_3.24-1_mipsel.ipk
25. libpthread_0.9.29-12_mipsel.ipk
26. libexpat_1.95.8-1_mipsel.ipk
27. dbus_1.0.2-2_mipsel.ipk
28. bluez-utils*
29. libncurses_5.6-1_mipsel.ipk
30. alsa-lib_1.0.13-1_mipsel.ipk
31. alsa-utils*
32. cmdpad *
33. libflac_1.1.2-1_mipsel.ipk
34. zlib_1.2.3-5_mipsel.ipk
35. libid3tag_0.15.1b-1_mipsel.ipk
36. libmad_0.15.1b-1_mipsel.ipk
37. libvorbisidec_1.0.2\+svn14261-1_mipsel.ipk
38. libiconv_1.9.1-1_mipsel.ipk
39. mpd*
40. mpc*
41. libusb_0.1.12-1_mipsel.ipk
42. lcd4linux*
43. libdaemon_0.12-1_mipsel.ipk
44. argtable_2.7-1_mipsel.ipk
45. confuse_2.5-1_mipsel.ipk
46. libopenssl_0.9.8e-3_mipsel.ipk
47. libcurl_7.17.1-1_mipsel.ipk
48. scmpc*
49. glib1_1.2.10-1_mipsel.ipk
50. libstdcpp_4.1.2-12_mipsel.ipk
51. bemusedlinuxserver*
Michael Vogt
Seite 55 von 89
Diplomarbeit
Konfiguration Netzwerk
Per Default ist das Netzwerk folgendermassen konfiguriert:
root@OpenWrt:/# ifconfig
br-lan
Link encap:Ethernet HWaddr 00:18:F3:85:6A:9D
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::218:f3ff:fe85:6a9d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1290 (1.2 KiB) TX bytes:1340 (1.3 KiB)
Die Grundkonfiguration ist eine statische IP mit der Adresse 192.168.1.1.
Umkonfigurieren auf DHCP:
root@OpenWrt:/# vi /etc/config/network
#### LAN configuration
config interface lan
option type
option ifname
option proto
option ipaddr
option netmask
#### LAN configuration
config interface lan
option type
option ifname
option proto
ALT
bridge
"eth0.0"
static
192.168.1.1
255.255.255.0
NEU
bridge
"eth0.0"
dhcp
Nach einem Reboot sieht die Netzwerkkonfiguration folgendermassen aus:
root@OpenWrt:/# ifconfig
br-lan
Link encap:Ethernet HWaddr 00:18:F3:85:6A:9D
inet addr:192.168.111.15 Bcast:192.168.111.255 Mask:255.255.255.0
inet6 addr: fe80::218:f3ff:fe85:6a9d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1290 (1.2 KiB) TX bytes:3260 (3.1 KiB)
Hinweis:
Alle Konfigurationsfiles welche im Verzeichnis /etc/config liegen, sind OpenWRT spezifisch. Diese Werte
können entweder klassisch via Texteditor editiert werden oder mit dem Tool UCI (Unified Configuration
Interface). Mit diesem Tool können die Konfigurations-Optionen direkt gesetzt werden.
Michael Vogt
Seite 56 von 89
Diplomarbeit
Konfiguration MPD
Da vom USB Stick nur die MP3 Songs gelesen werden, kann das Automount-Skript angepasst werden, so
dass nur Read-Only gemountet wird. So kann beim Abschalten des Routers das Filesystem auf dem
Memorystick nicht beschädigt oder gar zerstört werden.
File: /sbin/usb-storage
Die Zeile
mount /dev/${node} /mnt/usbdrive
durch folgende ersetzten:
mount /dev/${node} /mnt/usbdrive -o ro
Die Konfiguration des MPD Players erfolgt mit der Datei /etc/mpd.conf. Folgende Änderungen wurden
gemacht:
######################## REQUIRED PATHS ########################
music_directory
"/mnt/usbdrive/_mp3"
playlist_directory
"/tmp"
db_file
"/tmp/mpd.db"
log_file
"/tmp/mpd.log"
error_file
"/tmp/mpd.error"
################################################################
pid_file
"/tmp/mpd.pid"
audio_output {
type
name
device
format
}
"oss"
"My OSS Device"
"/dev/dsp"
# optional
"44100:16:2" # optional
volume_normalization
"yes"
buffer_before_play
"90%"
Alle Daten werden im RAM gehalten (/tmp Verzeichnis), nach jedem Reboot wird die dB neu erstellt.
Damit der MPD Player nach einem Reboot automatisch startet, muss dieser Daemon aktiviert werden:
root@OpenWrt:/tmp# /etc/init.d/mpd enable
Michael Vogt
Seite 57 von 89
Diplomarbeit
Konfiguration LCD4Linux
Die Konfiguration der LCD Anzeige erfolgt mit der Datei /etc/lcd4linux.conf und sieht folgendermassen
aus:
Plugin MPD {
enabled 1
server 'localhost'
port 6600
#
password 'secret'
minUpdateTime 500
}
#
# display artist and album, scrolling
#
Widget mpd-combo {
class 'Text'
expression iconv('UTF-8', 'ISO-8859-1', mpd::artist()) . '/' . iconv('UTF-8', 'ISO-8859-1',
mpd::title())
width 20
align 'P'
speed scroller
update tack
}
#
# display current song id and number of total song
#
Widget mpd-posid {
class 'Text'
expression mpd::getMpdPlaylistGetCurrentId().' of ' .mpd::getMpdPlaylistLength()
width 11
align 'L'
update tack
}
#
# display 30s the mpd uptime (ex. UP:2d03h32m) then 30s the current song id and number of total songs
# (ex. 267 of 734)
#
Widget mpd-toggler {
class 'Text'
expression ( (mpd::getMpdUptime()%60)<30 ? ('UP:'.mpd::formatTimeDDHHMM( mpd::getMpdUptime() ) ) :
('TRACK:'.mpd::getMpdPlaylistGetCurrentId().'/'.mpd::getMpdPlaylistLength()) )
width 15
align 'P'
update tack
}
#
# display playerstate (play, pause, stop, unknown)
#
Widget mpd-playerstatus {
class 'Text'
expression (mpd::getStateInt() == 1 ? 'PLAYING' : '').(mpd::getStateInt() == 2 ? 'PAUSED ' :
'').(mpd::getStateInt() == 3 ? 'STOPPED' : '').(mpd::getStateInt() == 0 ? 'UNKNOWN' : '')
width 7
align 'L'
update tack
}
#
# get repeat/random
# example: REP/RND, REP/---, ---/RND, ---/--#
Widget mpd-reprnd {
class 'Text'
expression (mpd::getRepeatInt()>0 ? 'REP' : '---') . '/' . (mpd::getRandomInt()>0 ? 'RND' : '---')
width 7
align 'L'
update tack
}
Michael Vogt
Seite 58 von 89
Diplomarbeit
#
# display track position example: <00:48/04:33>
#
Widget mpd-tracktime {
class 'Text'
expression mpd::formatTimeMMSS( mpd::elapsedTimeSec() ).'/'.mpd::formatTimeMMSS( mpd::totalTimeSec() )
width 11
align 'L'
update tack
}
#
# small playbar and track time
#
Widget smallMP3Bar_part1 {
class 'Bar'
expression mpd::elapsedTimeSec()
length 14
min 0
max mpd::totalTimeSec()
direction 'E'
style 'H'
update tack
}
#
# display volume
#
Widget mpd-vol {
class 'Text'
expression mpd::getVolume()
width 3
align 'L'
update tack
}
Widget smallMP3Bar_part2 {
class 'Text'
expression '/'.mpd::formatTimeMMSS( mpd::totalTimeSec() )
width 6
update tack
align 'L'
}
Widget mpd-bitrate {
class 'Text'
expression mpd::bitRate().'k'
width 6
update 250
align 'L'
}
Layout L20x4 {
Row1 {
Col1 'mpd-combo'
}
Row2 {
Col1 'smallMP3Bar_part1'
Col15 'smallMP3Bar_part2'
}
Row3 {
Col1 'mpd-reprnd'
Col9 'mpd-playerstatus'
Col17 'mpd-bitrate'
}
Row4 {
Col1 'mpd-toggler'
Col16 'Speaker'
Col17 'SpeakerAni'
Col18 'mpd-vol'
}
}
Widget Speaker {
class 'Icon'
speed 10000
Bitmap {
Row1 '....*'
Row2 '...**'
Row3 '..***'
Row4 '*****'
Row5 '*****'
Row6 '..***'
Row7 '...**'
Row8 '....*'
}
}
Michael Vogt
Seite 59 von 89
Diplomarbeit
Widget SpeakerAni {
class 'Icon'
speed 500
Bitmap {
Row1
Row2
Row3
Row4
Row5
Row6
Row7
Row8
}
'.....|.....|.....|.....|.....|.....|.....|.....|.....|.....'
'.....|.....|*....|.*...|..*..|*..*.|.*..*|..*..|...*.|....*'
'.....|*....|.*...|..*..|*..*.|.*..*|..*..|...*.|....*|.....'
'*....|.*...|..*..|*..*.|.*..*|..*..|...*.|....*|.....|.....'
'*....|.*...|..*..|*..*.|.*..*|..*..|...*.|....*|.....|.....'
'.....|*....|.*...|..*..|*..*.|.*..*|..*..|...*.|....*|.....'
'.....|.....|*....|.*...|..*..|*..*.|.*..*|..*..|...*.|....*'
'.....|.....|.....|.....|.....|.....|.....|.....|.....|.....'
}
Variables {
t_onesec
1000
t_500m
500
tack 500
tick 100
tacku 100
scroller 200
}
Display CFA634 {
Driver
'Crystalfontz'
Model
'634'
Port
'/dev/ttyUSB0'
#
Speed
38400
#70/30
Contrast 68
Backlight 30
Icons 3
}
Display 'CFA634'
Layout 'L20x4'
Damit die LCD Anzeige nach einem Reboot automatisch startet, muss dieser Daemon aktiviert werden:
root@OpenWrt:/tmp# /etc/init.d/lcd4linux enable
Schematisch ist das Display folgendermassen eingeteilt:
Abbildung 23: LCD4Linux Konfiguration
Michael Vogt
Seite 60 von 89
Diplomarbeit
Konfiguration CmdPad
Bearbeiten des Konfigurations-Files:
device=/dev/event0
#mpc basic
command=077,
command=072,
command=076,
command=075,
command=071,
command=073,
command=069,
command=098,
command=055,
command=074,
command=078,
R
R
R
R
R
R
R
R
R
R
R
,/usr/bin/mpc next
,/usr/bin/mpc toggle
,/usr/bin/mpc stop
,/usr/bin/mpc prev
,/usr/bin/mpc seek -00:00:20
,/usr/bin/mpc seek +00:00:20
,/usr/bin/mpc volume -5
,/usr/bin/mpc volume +5
,/usr/bin/mpc random
,/usr/bin/mpc repeat
,/usr/bin/mpc-nextartist.sh > /dev/null
#restart mpd
command=083, R ,/etc/init.d/mpd restart > /dev/null
#restart bluetooth
command=096, R ,/etc/init.d/bemused restart
Bedeutung von P, R und H
„P“ bedeutet Press, also dieses Event wird ausgeführt, wenn die Taste gedrückt wird
„R“ bedeutet Release
„H“ bedeutet Hold (Repeat)
Und der Service wird aktiviert:
/etc/init.d/cmdpad enable
Michael Vogt
Seite 61 von 89
Diplomarbeit
Konfiguration Bluetooth
Servicekonfiguration mit dem File /etc/config/bluetooth:
config hcid
#
option config
option enabled
/etc/bluetooth/hcid.conf
1
config sdpd
option enabled
1
config rfcomm
#
option config
option enabled
/etc/bluetooth/rfcomm.conf
0
Hier müssend die zwei Services hcid und sdpd aktiviert werden. Informationen betreffend dieser Daemons:
hcid: Bluetooth Host Controller Interface Daemon
sdpd: Service Discovery Protocol Daemon – macht das OpenWRT Device auffindbar für
Bluetooth Geräte. Dieser Service veröffentlicht unsere Bluetooth Informationen.
Die Konfiguration des hcid erfolgt im File /etc/bluetooth/hcid.conf:
#
# HCI daemon configuration file.
#
# HCId options
options {
# Automatically initialize new devices
autoinit yes;
# Security Manager mode
#
none - Security manager disabled
#
auto - Use local PIN for incoming connections
#
user - Always ask user for a PIN
#
security auto;
# Pairing mode
#
none - Pairing disabled
#
multi - Allow pairing with already paired devices
#
once - Pair once and deny successive attempts
pairing multi;
# Default PIN code for incoming connections
passkey "1234";
}
# Default settings for HCI devices
device {
# Local device name
#
%d - device id
#
%h - host name
name "%h/%d";
# Local device class
class 0x000100;
#class 0x3e0100;
# Default packet type
#pkt_type DH1,DM1,HV1;
# Inquiry and Page scan
iscan enable; pscan enable;
# Default link mode
#
none
- no specific policy
#
accept - always accept incoming connections
#
master - become master on incoming connections,
#
deny role switch on outgoing connections
lm accept;
# Default link policy
#
none
- no specific policy
#
rswitch - allow role switch
#
hold
- allow hold mode
#
sniff
- allow sniff mode
#
park
- allow park mode
lp rswitch,hold,sniff,park;
}
Einzig der Identifikationsstring (Gelb markiert) wurde geändert.
Michael Vogt
Seite 62 von 89
Diplomarbeit
Jetzt werden die benötigten Services aktiviert:
/etc/init.d/dbus enable
/etc/init.d/bluez-utils enable
Konfiguration Bemusedserver
Die Konfiguration des Bemusedserver wird durch das File /etc/bemused.conf gemacht:
#
#
#
#
bemused config file Version 1.73 (no changes since 1.71)
lines with a # at the beinning are for comments and not readen by the bemusedserver
You only need to set up options which have no default and which ware not optinal
this is a mpd-hack version by [email protected]
# Path to mpd (if mpd is in path only mpd) (default is mpd)
mpddir=/usr/bin/mpd
# channel for what the serial port service is registered (with sdptool look in README)
#(default 10)
# example:
# root@OpenWrt:~# sdptool browse
# Inquiring ...
# <...>
# Service Name: COM 1
# Service RecHandle: 0x10005
# Service Class ID List:
#
"Serial Port" (0x1101)
# Protocol Descriptor List:
#
"L2CAP" (0x0100)
#
"RFCOMM" (0x0003)
#
Channel: 3
<<<
# Language Base Attr List:
#
code_ISO639: 0x656e
#
encoding:
0x6a
#
base_offset: 0x100
channel=3
# directorys where the mp3s are. If more than one seperate them by a m semicolon (must be set)
mp3dir=/mnt/usbdrive/_mp3
# bookmarks file for URLs of net radio stations (optional)
bookmarkfile=/etc/bemused-bookmarks
# speed setting for fast forward and rewind. time for every jump in ms, 10000 is default
#fastforbackspeed=10000
# set to 1 to use connection over TCP/IP (for bluetooth pan or maybe LAN oder internet) set to
# 0 for normal rfcomm bluetooth (default)
#tcp=1
# port to use if you set tcp to 1 for your incomming TCP/IP Connection. (default is 7654 and
# at the moment the only one useable by the client on the phone)
#tcpport=7654
Das File /etc/bemused-bookmarks ist optional und definiert Internet Radiostreams:
#
UnitedBreaks.mp3 = http://74.52.13.138:8000
nubreaks.mp3 = http://208.100.38.52:8419
RauteMusik.mp3 = http://91.121.107.97:10000
punkBeans.mp3 = http://74.208.71.53:8014
UkBassRadio.mp3 = http://87.117.228.59:8288
DigitallyImportetDB.mp3 = http://207.200.96.229:8030
GrooveSaladAmbient.mp3 = http://scfire-nyk-aa01.stream.aol.com:80/stream/1018
LoungeRadio.mp3 = http://195.141.102.212:8040
RadioRABE.mp3 = http://beemy.catatec.ch:8000/radio_rabe_95.6_fm
RadioBE1.mp3 = http://www.radiobe1.ch:8080
Aktivieren des Bemused Daemons:
/etc/init.d/bemused enable
Michael Vogt
Seite 63 von 89
Diplomarbeit
Konfiguration OpenNTP
Bevor mit der Konfiguration von OpenNTP begonnen werden kann, muss zuerst die Zeitzone festgelegt
werden:
root@OpenWrt:/# echo GMT-1 > /etc/TZ
Die Zeitserver werden in der Konfiguration /etc/ntpd.conf definiert.
Nun kann der NTP Client aktiviert werden:
root@OpenWrt:/# /etc/init.d/ntpd enable
Konfiguration SCMPC
SCMPC übermittelt die abgespielten Songs an Last.fm („scrobbeln“). Voraussetzung damit SCMPC richtig
funktioniert ist ein gültiges Datum. Da der Router keine interne Uhr hat, muss die Zeit nach jedem start via
NTP nachgestellt werden.
Die Konfiguration von SCMPC wird in der Datei /etc/scmpc.conf erledigt:
# log_level - Select the amount of logging you would like scmpc to do. Valid options are:
# none, error, info, and debug
#log_level = error
# log_file - The file you would like scmpc to write the log to.
log_file = "/tmp/scmpc.log"
# pid_file - The file in which scmpc will store its process id, in order to check that it
# is only run once. (This file is only used when scmpc is run in daemon mode.)
pid_file = "/tmp/scmpc.pid"
# cache_file - The file in which scmpc will store the unsubmitted songs cache.
cache_file = "/tmp/scmpc.cache"
# queue_length - The maximum number of unsubmitted songs to hold in memory at once. You may
# need to lower this if you find scmpc using too much memory.
queue_length = 20
# cache_interval - The interval _in minutes_ between saving the unsubmitted songs queue, in
# case of a power failure, or any other reason for the program exiting abnormally.
# Set to 0 to turn this off.
#cache_interval = 10
# mpd section - host: The hostname of the mpd server. Can be an IP address as well.
# port: The port that mpd is listening on.
# timeout: The timeout in seconds for connecting to the server
# password: Set this if you need a password to read information from the
#
mpd server.
mpd {
#host = "localhost"
#port = 6600
#timeout = 5
#password =
}
# audioscrobbler
# username: Your
# password: Your
audioscrobbler {
username
password
}
section
audioscrobbler username
audioscrobbler password
= "username"
= "password"
Aktivieren des SCMPC Daemons:
/etc/init.d/scmpc enable
Michael Vogt
Seite 64 von 89
Diplomarbeit
SSH GATEWAY
Konfiguration Firmware
Starten der OpenWrt Firmware Konfiguration
michux@fwpiercer:/home/michux/trunk$ make menuconfig
Als Basis dient die default Konfiguration („Reset to defaults“)
Abbildung 24: Target System ist Atheros 2.6
Als „Target System“ muss das Model „Atheros [2.6]“ ausgewählt werden. Das Wireless LAN Profile wird
automatisch ausgewählt.
Michael Vogt
Seite 65 von 89
Diplomarbeit
Folgende Zusatz Packages wurden ausgewählt (<M>):
Network / Time Synchronization / openntpd
Network / HTTPTunnel
Network / PTunnel
Network / hostapd
Network / hostapd-utils
Network / updatedd
Network / updatedd / updatedd-mod-noip
Network / ssh / openssh-client (Build-in <*>)
Network / ssh / openssh-server (Build-in <*>)
Network / ssh / openssh-sftp-client (Build-in <*>)
Network / ssh / openssh-sftp-client-utils (Build-in <*>)
Network / ssh / openssh-sftp-server (Build-in <*>)
Kernel modules / Filesystems / kmod-nls-base
Kernel modules / Filesystems / kmod-nls-cp1250
Kernel modules / Filesystems / kmod-nls-cp437
Kernel modules / Filesystems / kmod-nls-cp850
Kernel modules / Network Support / kmod-ipv6 (Build-in <*>)
Kernel modules / Other modules / kmod-proc-gpio (#)
Utilities / atheros-wifi-toggler (#)
Hinweis: Pakete, welche mit (#) markiert sind, sind nicht in der offiziellen OpenWRT Distribution dabei,
können aber unter http://www.neophob.com/serendipity/index.php?/archives/140-Openwrt-Atherosrefused-Packages.html heruntergeladen werden.
Folgende Packages werden dem Image entfernt (< >):
Base system / dropbear
Erklärung der ausgewählten Packages:
openntpd
Zeitsynchronisierung, wird für den SCMPC Daemon benötigt.
HTTPTunnel
http Tunnel
PTunnel
Ping (ICMP) Tunnel
hostapd
IEEE 802.1x/WPA/EAP/RADIUS Authenticator
hostapd-utils
Support Tools für hostapd
updatedd
Basis Dienst für Dynamische DNS Dienste
updatedd-mod-noip
Plugin für DNS Dienst no-ip.org
openssh-*
SSH Suite, inkl. SFTP
kmod-nls-base
Unterstützung für das iso8859-1 Charset (Latin 1)
kmod-nls-cp437
Unterstützung für das cp437
kmod-ipv6
Zwingende Abhängikeit, evtl. OpenWRT Bug (Fehler gemeldet)
kmod-proc-gpio
GPIO Kernelmodule, damit können die LED’s gesteuert werden
atheros-wifi-toggler
Skript, damit WLAN via Reset-Button ein und ausgeschaltet werden kann
Nun die Konfiguration speichern und den Buildprozess starten. Die Option V=99 definiert, dass der
Debugmode aktiviert wird. Das hat den Vorteil, dass man sieht, was gerade kompiliert wird. In Falle eines
Fehlers sieht man, warum der Prozess beendet wurde und was die Fehlermeldung ist.
michux@fwpiercer:/home/michux/trunk$ make V=99
Ist der Build Prozess erfolgreich beendet, liegen im „./bin/mips“ Verzeichnis die kompilierten Image Files
und die ausgewählten Packages.
Michael Vogt
Seite 66 von 89
Diplomarbeit
Update Firmware
Nun muss die Firmware auf das Embedded Device kopiert werden. La Fonera verwendet Redboot44 als
Bootloader. Auf dem Mainboard des La Fonera ist ein TTL Serial Port vorhanden. TTL bedeutet Transistor
Transistor Logic und hat einen Spannungsbereich von 0..3.3V. Ein Standard Serial Port hingegen hat einen
Spannungsbereich von -12..12V. Daher muss die Spannung gewandelt werden. Am einfachsten kann dies
mit einem Mobiltelefon-Kabel gemacht werden, welches einen solchen Spannungswandler im Kabel
eingebaut hat. Ich verwende ein Nokia Kabel CA-42 (aka DKU-5). Speziell bei La Fonera ist, dass das
RX/TX Kabel erst eingesteckt werden darf, wenn der Router läuft. Verbindet man das RX/TX Signal und
schaltet den Router ein, bootet dieser nicht. Ich nehme an, dass dieser Port noch als JTAG Port verwendet
werden kann.
Abbildung 25: La Fonera TTL Serial Access
Ein Terminal Programm starten (ich verwende PuTTY), die Geschwindigkeit muss 9600bps sein. Die
Erdungsverbindung kann bereits verbunden werden. Nun La Fonera einschalten und ca. 2 Sekunden später
RX und TX verbinden. Der Redboot Boot Prozess kann mittels CTRL+C unterbrochen werden. Das sollte
folgendermassen aussehen:
+PHY ID is 0022:5521
Ethernet eth0: MAC address 00:18:84:18:13:c8
IP: 192.168.1.2/255.255.0.0, Gateway: 0.0.0.0
Default server: 192.168.1.10
RedBoot(tm) bootstrap and debug environment [ROMRAM]
Non-certified release, version v1.3.0 - built 16:57:58, Aug
7 2006
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
Board: ap51
RAM: 0x80000000-0x81000000, [0x80040450-0x80fe1000] available
FLASH: 0xa8000000 - 0xa87f0000, 128 blocks of 0x00010000 bytes each.
== Executing boot script in 10.000 seconds - enter ^C to abort
^C
44
Redboot Dokumentation: http://ecos.sourceware.org/docs-latest/redboot/redboot-guide.html
Michael Vogt
Seite 67 von 89
Diplomarbeit
Jetzt sind wir im Redboot Boot Menu. Der nicht flüchtige Flashspeicher ist in Partitionen aufgeteilt, welche
mit dem „fis“ Befehl modifiziert werden können. Wir wollen die Userdaten löschen (Kernel und Root
Image):
RedBoot> fis list
Name
FLASH addr Mem addr
Length
Entry point
RedBoot
0xA8000000 0xA8000000 0x00030000 0x00000000
vmlinux.bin.l7
0xA8030000 0x80041000 0x000B0000 0x80041000
rootfs
0xA80E0000 0x80040800 0x00700000 0x80040800
FIS directory
0xA87E0000 0xA87E0000 0x0000F000 0x00000000
RedBoot config
0xA87EF000 0xA87EF000 0x00001000 0x00000000
RedBoot> fis init
About to initialize [format] FLASH image system - continue (y/n)? y
*** Initialize FLASH Image System
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot> fis list
Name
FLASH addr Mem addr
Length
Entry point
RedBoot
0xA8000000 0xA8000000 0x00030000 0x00000000
FIS directory
0xA87E0000 0xA87E0000 0x0000F000 0x00000000
RedBoot config
0xA87EF000 0xA87EF000 0x00001000 0x00000000
RedBoot>
Die Daten werden via TFTP Protokoll auf La Fonera geladen, der Befehl „fconfig –l“ zeigt die aktuellen
Einstellungen an:
RedBoot> fconfig -l
Run script at boot: true
Boot script:
.. fis load -l vmlinux.bin.l7
.. exec
Boot script timeout (1000ms resolution): 10
Use BOOTP for network configuration: false
Gateway IP address: 0.0.0.0
Local IP address: 192.168.1.2
Local IP address mask: 255.255.0.0
Default server IP address: 192.168.1.10
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Wichtig ist die Server IP Adresse – an dieser Adresse muss der TFTP Server laufen. Ich verwende auf
meinem Notebook diese IP Adresse und starte einen TFTP Server45. Der TFTP Server muss noch
konfiguriert werden, damit die Files „openwrt-atheros-vmlinux.lzma“ und „openwrt-atherosroot.squashfs“ (OpenWRT Firmware) gesendet werden können.
Um eine Partition zu speichern, muss diese zuerst in den Speicher geladen werden. Das geschieht mit dem
„load“ Befehl. Anschliessend wird eine neue FID Partition mittels dem Befehl „fis create“ erstellt. Hier der
Output, wenn wir den LZMA Komprimierten Kernel auf La Fonera kopieren:
RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-vmlinux.lzma
Using default protocol (TFTP)
Raw file loaded 0x80040800-0x800f07ff, assumed entry at 0x80040800
RedBoot> fis create -e 0x80041000 -r 0x80041000 vmlinux.bin.l7
... Erase from 0xa8030000-0xa80e0000: ...........
... Program from 0x80040800-0x800f0800 at 0xa8030000: ...........
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot>
Hinweis: Die Variable %{FREEMEMLO} wird von Redboot verwendet, Auszug aus der Redboot
Dokumentation:
To simplify operations that temporarily need data in free memory, the limits of free RAM are also
available as aliases (aligned to the nearest kilo-byte limit). These are named FREEMEMLO and
FREEMEMHI, and can be used in commands like any user defined alias.
45
Ich verwende tftpd32, Webseite: http://tftpd32.jounin.net/
Michael Vogt
Seite 68 von 89
Diplomarbeit
Jetzt muss noch das Root Filesystem kopiert werden. Der einzige Unterschied zum Speichern des Kernels
ist, dass die Länge des freien Speichers herausgefunden werden muss. Der Befehl „fis free“ gibt den freien
Speicherbereich an. Subtrahiert man beide Werte, ergibt dies die Länge des freien Speicherbreichs.
RedBoot> fis free
0xA80E0000 .. 0xA87E0000
RedBoot>
RedBoot> load -r -b %{FREEMEMLO} openwrt-atheros-root.squashfs
Using default protocol (TFTP)
Raw file loaded 0x80040800-0x802407ff, assumed entry at 0x80040800
RedBoot> fis create -l 0x0700000 rootfs
... Erase from 0xa80e00000xa87e0000: ..................................................................................
..............................
... Program from 0x80040800-0x80240800 at 0xa80e0000: ................................
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
Nun läuft La Fonera mit OpenWrt und kann konfiguriert werden.
Michael Vogt
Seite 69 von 89
Diplomarbeit
Konfiguration
Per Default hat ein OpenWrt Device die Standart IP Adresse von 192.168.1.1. Der SSH-Dienst läuft noch
nicht, nur ein Telnet Daemon. Zuerst muss via Telnet eine Verbindung zum OpenWrt Device aufgebaut
werden und das root Passwort muss gesetzt werden. Danach wird der Telnet Daemon deaktiviert und SSH
aktiviert:
=== IMPORTANT ============================
Use 'passwd' to set your login password
this will disable telnet and enable SSH
-----------------------------------------BusyBox v1.8.2 (2008-02-20 04:36:45 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.
_______
________
__
|
|.-----.-----.-----.| | | |.----.| |_
|
|| _ | -__|
|| | | ||
_||
_|
|_______||
__|_____|__|__||________||__| |____|
|__| W I R E L E S S
F R E E D O M
KAMIKAZE (bleeding edge, r10496) ------------------* 10 oz Vodka
Shake well with ice and strain
* 10 oz Triple sec mixture into 10 shot glasses.
* 10 oz lime juice Salute!
--------------------------------------------------root@OpenWrt:/# passwd
Changing password for root
New password:
Retype password:
Password for root changed by root
Ein Reboot des Embedded Devices ist hier empfohlen. Jetzt können die Packages installiert werden. Ich
verwende dazu WinSCP46 um die Packages ins /tmp Verzeichnis zu kopieren.
root@OpenWrt:/tmp# ls *.ipk -al
-rw-r--r-1 root
root 29446
-rw-r--r-1 root
root
3762
-rw-r--r-1 root
root
2895
-rw-r--r-1 root
root
2978
-rw-r--r-1 root
root
2927
-rw-r--r-1 root
root
2955
-rw-r--r-1 root
root 67300
-rw-r--r-1 root
root 19279
-rw-r--r-1 root
root
8870
-rw-r--r-1 root
root 148000
-rw-r--r-1 root
root 22865
-rw-r--r-1 root
root 15283
-rw-r--r-1 root
root
5428
-rw-r--r-1 root
root
5667
46
Feb
Feb
Feb
Feb
Feb
Feb
Feb
Feb
Feb
Feb
Feb
Feb
Feb
Feb
20
20
20
20
20
20
20
20
20
20
20
20
20
20
2008
2008
2008
2008
2008
2008
2008
2008
2008
2008
2008
2008
2008
2008
httptunnel_3.3-1_mips.ipk
kmod-nls-base_2.6.23.16-atheros-1_mips.ipk
kmod-nls-cp1250_2.6.23.16-atheros-1_mips.ipk
kmod-nls-cp437_2.6.23.16-atheros-1_mips.ipk
kmod-nls-cp850_2.6.23.16-atheros-1_mips.ipk
kmod-proc-gpio_2.6.23.16-atheros-1_mips.ipk
libpcap_0.9.4-1_mips.ipk
libpthread_0.9.29-12_mips.ipk
hostapd-utils_20071107-1_mips.ipk
hostapd_20071107-1_mips.ipk
openntpd_3.9p1-2_mips.ipk
ptunnel_0.61-1_mips.ipk
updatedd-mod-noip_2.6-5_mips.ipk
updatedd_2.6-5_mips.ipk
WinSCP: TODO
Michael Vogt
Seite 70 von 89
Diplomarbeit
Diese Packages können mittels „ipkg install xxx.ipk“ installiert werden.
root@OpenWrt:/tmp# ipkg install lib*.ipk
Installing libpcap (0.9.4-1) to root...
Installing libpthread (0.9.29-12) to root...
Configuring libpcap
Configuring libpthread
Done.
root@OpenWrt:/tmp# ipkg install kmod*.ipk
Installing kmod-nls-base (2.6.23.16-atheros-1) to root...
Installing kmod-nls-cp1250 (2.6.23.16-atheros-1) to root...
Installing kmod-nls-cp437 (2.6.23.16-atheros-1) to root...
Installing kmod-nls-cp850 (2.6.23.16-atheros-1) to root...
Installing kmod-proc-gpio (2.6.23.16-atheros-1) to root...
Configuring kmod-nls-base
Configuring kmod-nls-cp1250
Configuring kmod-nls-cp437
Configuring kmod-nls-cp850
Configuring kmod-proc-gpio
gpio_proc: module loaded and /proc/gpio/ created
Done.
root@OpenWrt:/tmp# ipkg install httptunnel_3.3-1_mips.ipk
Installing httptunnel (3.3-1) to root...
Configuring httptunnel
^[[A^[Done.
root@OpenWrt:/tmp# ipkg install pt*.ipk
Installing ptunnel (0.61-1) to root...
Configuring ptunnel
Done.
root@OpenWrt:/tmp# ipkg install up*.ipk
Installing updatedd-mod-noip (2.6-5) to root...
Installing updatedd (2.6-5) to root...
Package updatedd (2.6-5) installed in root is up to date.
Configuring updatedd
Configuring updatedd-mod-noip
Done.
root@OpenWrt:/tmp# ipkg install openntpd_3.9p1-2_mips.ipk
Installing openntpd (3.9p1-2) to root...
Configuring openntpd
adding group ntp to /etc/group
adding user ntp to /etc/passwd
Done.
root@OpenWrt:/tmp# ipkg install hos*.ipk
Installing hostapd-utils (20071107-1) to root...
Installing hostapd (20071107_-1) to root...
Configuring hostapd
Configuring hostapd-utils
Done.
Michael Vogt
Seite 71 von 89
Diplomarbeit
Konfiguration Netzwerk
Die Konfiguration ist im File /etc/config/network gespeichert.
Default Konfiguration:
# Copyright (C) 2006 OpenWrt.org
config interface loopback
option ifname
lo
option proto
static
option ipaddr
127.0.0.1
option netmask 255.0.0.0
config interface lan
option ifname
option type
option proto
option ipaddr
option netmask
eth0
bridge
static
192.168.1.1
255.255.255.0
Konfiguration als DHCP Client:
# Copyright (C) 2006 OpenWrt.org
config interface loopback
option ifname
lo
option proto
static
option ipaddr
127.0.0.1
option netmask 255.0.0.0
config interface lan
option ifname
option type
option proto
eth0
bridge
dhcp
Wurde diese Anpassung gemacht, kann mit dem Befehl „/etc/init.d/network restart“ die Änderung
übernommen werden.
Konfiguration Wireless
Die Konfiguration ist im File /etc/config/wireless gespeichert.
Default Konfiguration:
config wifi-device wifi0
option type
atheros
option channel auto
option disabled 1
config wifi-iface
option device
wifi0
option network lan
option mode
ap
option ssid
OpenWrt
option encryption none
Konfiguration als PSK2 Wireless Client:
config wifi-device wifi0
option type
atheros
option channel auto
option disabled 0
config wifi-iface
option device
wifi0
option network lan
option mode
ap
option ssid
m00m00
option encryption psk2
option key
passwort
Hinweis: Damit die PSK2-Verschüsselung funktioniert, werden Funktionen des hostapd Packages
verwendet. Hat man die Änderungen im Konfig File gemacht, kann mit dem Befehl „wifi“ die Wireless
Funktion neu gestartet werden.
Michael Vogt
Seite 72 von 89
Diplomarbeit
Konfiguration Dynamic DNS
Die Konfiguration ist im File /etc/config/updatedd gespeichert.
Default Konfiguration:
config updatedd
option service
option username
option password
option host
option update
''
''
''
''
''
Konfiguration als No-IP Client:
config updatedd
option service
option username
option password
option host
option update
'noip'
'[email protected]'
'PASSWORT'
'm00m00.no-ip.org'
'1'
Der Befehl „/etc/init.d/updatedd enable“ aktiviert diesen Service nach einem Neustart.
Konfiguration Tunneling Clients
Die Tools HTTPTunnel und PTunnel brauchen keine speziellen Konfigurations-Files, sie können mit dem
OpenWrt Konfigurationstool UCI konfiguriert werden:
root@OpenWrt:/tmp# uci show httptunnel
httptunnel.cfg02c9f9=httptunnel
httptunnel.cfg02c9f9.destination=localhost:443
httptunnel.cfg02c9f9.sourceport=80
root@OpenWrt:/tmp# uci show ptunnel
ptunnel.cfg029998=ptunnel
ptunnel.cfg029998.interface=br-lan
Damit diese Services nach einem Neustart aktiv sind, werden sie aktiviert:
root@OpenWrt:/tmp# /etc/init.d/httptunnel enable
root@OpenWrt:/tmp# /etc/init.d/ptunnel enable
Michael Vogt
Seite 73 von 89
Diplomarbeit
Konfiguration Wifi-Toggler
Damit man Wireless mit einem Knopfdruck ein- und ausschalten kann, müssen folgende files erstellt
werden:
Eine neue UCI Konfigurations Sektion namens „wifitoggler“ wird erstellt. In dieser Sektion wird der
Buttonname definiert, in diesem Beispiel „reset“. So kann dieses Script auch auf anderen Routern
verwendet werden, es muss nur die UCI-Konfiguration geändert werden.
root@OpenWrt:~# cat /etc/config/wifitoggler
config wifitoggle
option button 'reset'
Wird nun eine Taste gedrückt, wird das folgende Script ausgeführt:
root@OpenWrt:~# cat /etc/hotplug.d/button/10-wifitoggle
#!/bin/sh
. /lib/config/uci.sh
. /etc/functions.sh
config_load "wifitoggler"
local section="cfg025715"
config_get "BUTTON_NAME" "$section" "button"
#you may debug your events, write stuff to the eventlog
#logger seen: "$SEEN", button: "$BUTTON" butname: "$BUTTON_NAME"
toggle_radio() {
local section="$1"
config_get "WIFI_RADIOSTATUS" "$section" "disabled"
case "$WIFI_RADIOSTATUS" in
1|"")
logger enable wlan
uci_set "wireless" "wifi0" "disabled" "0"
wifi
# wlan led on
echo 1 > /proc/gpio/2_dir
echo 1 > /proc/gpio/2_out
;;
0)
logger disable wlan
uci_set "wireless" "wifi0" "disabled" "1"
wifi
# wlan led off
echo 1 > /proc/gpio/2_dir
echo 0 > /proc/gpio/2_out
;;
esac
}
if [ "$BUTTON" = "$BUTTON_NAME" ] && [ $SEEN == "0" ] ; then
if [ "$ACTION" = "released" ] ; then
logger keypress detected
config_load "wireless"
config_foreach toggle_radio wifi-device
fi
fi
Michael Vogt
Seite 74 von 89
Diplomarbeit
Status
Freier Disk und Speicherplatz nach der Installation (inkl. Applikationen):
root@OpenWrt:/tmp# df -h
Filesystem
Size
none
6.7M
tmpfs
512.0k
/dev/mtdblock3
5.2M
mini_fo:/jffs
1.8M
root@OpenWrt:/tmp# free
total
Mem:
13640
Swap:
0
Total:
13640
Michael Vogt
used
9508
0
9508
Used Available Use%
204.0k
6.5M
3%
0
512.0k
0%
736.0k
4.5M 14%
1.8M
0 100%
free
4132
0
4132
Mounted on
/tmp
/dev
/jffs
/
shared
0
buffers
320
Seite 75 von 89
Diplomarbeit
9. TEST
MP3 PLAYERS
Überprüfen der „Muss“ Kriterien aus dem Pflichtenheft:
Der MP3-Player sollte folgende Funktionen unterstützen:
TM1 - Bedienung (Input) via Fernbedienung und/oder Tasten (z.B. Keypad)
TM2 - Ausgabe des MP3-Player Status und der aktuellen Songinformationen auf einem
Display
TM3 - Ausgabe der Musik an einem Line-Out, Headphone oder SPDIF Ausgang
TM4 - Übermitteln der gespielten Songs auf Last.fm47, „Scrobbeln“ genannt
TM5 - Verwenden von Open Source Software
TM6 - Erweiterbar, daher muss das Basis-OS modular aufgebaut sein
Überprüfen der „Optionalen“ Kriterien aus dem Pflichtenheft:
Optionale Funktionen des MP3-Players:
TO1 - Streaming von Internet Radio
TO2 - Verwendung von Wireless LAN
TO3 - Verwendung von Bluetooth um den Player zu steuern (z.B. via Mobile Phone)
TO4 - Die gesamte Hardware in ein Retro-Gehäuse verpacken
Überprüfen des „Muss“ Kriteriums aus der Aufgabenstellung:
TM7 - Aussagen puncto erzielter Audio Qualität sind zu treffen
Testname
Erfüllt
TM1
TM2
TM3
TM4
Ja
Ja
Ja
Ja
TM5
Ja
TM6
TM7
Ja
n/a
TO1
Ja
TO2
Nein
TO3
Ja
TO4
Ja
47
Bemerkung
Erfüllt mit der Applikation CmdPad
Erfüllt mit der Applikation LCD4Linux und dem MPD Plugin
Erfüllt mit der verwendeten Soundkarte (Line-Out und SPDIF)
Erfüllt mit der Applikation SCMPC
OpenWRT ist OpenSource, jede Applikation die verwendet wird ist OpenWRT (GPL,
BSD… Lizenz)
Erfüllt mit dem OpenWRT Disklayout (Firmware mit Basis OS und Applikationen)
Siehe Kapitel „Test Audioqualität“
Erfüllt mit der Applikation MPD (Build-in Funktion). Radio Streams sind via JamSE
auswählbar.
Es sind noch keine Linux Treiber vorhanden. Es wäre möglich, die verwendete Wireless
Karte auszutauschen, mit einer Atheros mini-PCI Karte. Siehe auch Kapitel „Wireless
Treiber“
Erfüllt mit der Applikation Bemusedserver und JamSE. Wird eine grössere Playlist
verwendet (>1000 Songs) crasht die Applikation JamSE mit einer „Out of Memory
Exception“. Die JamSE Software hat nur begrenzt Speicher zur Verfügung, daher muss
JamSE und bemusedlinuxserver angepasst werden, dass nur ein Teil der Playlist
übertragen wird.
Erfüllt, siehe Kapitel „Bilder der MP3 Jukebox“
http://last.fm/
Michael Vogt
Seite 76 von 89
Diplomarbeit
Test Audioqualität
Um die Güte des Audiosignals zu bestimmen, werden Sinus-Signale von 30Hz bis 20kHz in acht Schritten
verwendet. Für jede Frequenz wird der Peak Level (Vpp) bestimmt.
Messresultate:
30Hz, Vpp = 5.8V
60Hz, Vpp = 5.8V
4kHz, Vpp = 5.6V
8kHz, Vpp = 5.3V
12kHz, Vpp = ~4.5V..5.3V (pulsierend)
14kHz, Vpp = ~3.9V..5.0V (pulsierend)
16kHz, Vpp = ~1.7V..4.9V (pulsierend)
20kHz, nicht mehr Messbar!
Hinweis: Alle verwendeten Testsounds sind auf der CD im Unterverzeichnis „Testsounds“ zu finden.
Optische Repräsentation des Audiosignals mit einem KO (Vertikaleinstellung KO: 0.1V AC):
Michael Vogt
Abbildung 26: 30Hz
Abbildung 27: 60Hz
Abbildung 28: 4kHz
Abbildung 29: 8kHz
Seite 77 von 89
Diplomarbeit
Abbildung 30: 12kHz (pulsierende Amplitude)
Abbildung 31: 14kHz (pulsierende Amplitude)
Abbildung 32: 16kHz (pulsierende Amplitude)
Fazit:
Laut den Messungen wird das Signal ab ca. 10kHz ein wenig schwächer. Laut dem Motto „Wer misst,
misst Mist“ sind die Resultate nicht zu überbewerten. Jedoch kann mit Sicherheit gesagt werden, dass sich
die verwendete Soundkarte sicherlich nicht im High-End Bereich bewegt, sondern eher im guten Mittelfeld.
Berücksichtigt man die Tatsache, dass relativ günstige Aktiv-Boxen verwendet werden, komme ich zum
Schluss, dass der MP3-Player eine akzeptable Audioqualität liefert und den Ansprüchen genügt.
Michael Vogt
Seite 78 von 89
Diplomarbeit
Bilder der MP3 Jukebox
Einige Bilder der fertigen MP3 Jukebox:
Abbildung 33: Stromanschluss und
Zugentlastung
Abbildung 34: Einbau der Komponenten
Abbildung 35: Jukebox mit montierter
Rückwand
Abbildung 36: Frontansicht mit Keypad
Michael Vogt
Seite 79 von 89
Diplomarbeit
Wireless Treiber
Erschwerend bei der Verwendung des Wireless Treibers ist die Bluetooth Koexistenz.
Bluetooth
Frequenzbereich: Der verwendete Frequenzbereich liegt zwischen 2400 und 2480 Megahertz (MHz).
Sendeleistung:
Klasse I: 100,0 Milliwatt (mW) bei einer Reichweite bis circa 100 Meter. Diese Geräte müssen
eine automatische Leistungsregelung haben: die benötigte Sendeleistung passt sich dem
tatsächlichen Bedarf an.
Klasse II: 2,5 mW im Bereich des Büroarbeitsplatzes bis maximal 50 Meter.
Klasse III: 1,0 mW für Anwendungen im Nahbereich bis etwa 10 Meter.
WLAN
Frequenzbereich: 2400 MHz (wie Bluetooth) sowie im Bereich zwischen 5000 und 6000 MHz, der zurzeit
noch wenig genutzt wird. Sendeleistung:
100 mW bei 2400 MHz,
200 mW bei 5150 bis 5350 MHz bei einer Nutzung innerhalb geschlossener Räume sowie
1000 mW bei 5470 bis 5725 MHz bei einer Nutzung sowohl innerhalb als auch außerhalb
geschlossener Räume.
Die Frequenzen zwischen 5000 und 6000 MHz dürfen nur mit automatischer Leistungsregelung genutzt
werden.
Fazit
WLAN (IEEE 802.11b/g) und Bluetooth verwenden beide die gleiche ISM Frequenz auf 2400MHz. Jedoch
werden verschiedene Access Technologien verwendet.
Bluetooth verwendet "frequency hopping" (1600 hops/s, eingeteilt in 79 1-MHz Channels)
WLAN verwendet einen listen-before-talk (Carrier Sensing Multiple Access) und je nach
verwendetem Standart ein anderes Modulationsverfahren (Siehe Wikipedia
http://en.wikipedia.org/wiki/IEEE_802.11).
Die Bluetooth und WLAN Standards berücksichtigen eine allfällige Koexistenz beider Standards nicht!
Daher muss der WLAN Treiber eine zusätzliche Funktion eingebaut haben, welcher die Bluetooth
Koexistenz sicherstellt.
Quelle:
http://www.broadbandcity.gr/content/modules/downloads/How_80211bg_WLAN_and_Bluetooth_Can_Pla
y_(Philips).pdf
Michael Vogt
Seite 80 von 89
Diplomarbeit
TEST SSH GATEWAY
Überprüfen der „Muss“ Kriterien aus dem Pflichtenheft:
Der SSH Gateway sollte folgende Funktionen unterstützen:
TM1 - Der Wireless Access Point kann weiterhin in seiner Funktion verwendet werden,
inkl. WPA2 –Verschlüsselung
TM2 - SSH Server inkl. Tunnelling Funktion (Application Tunneling)
TM3 - Verwenden eines dynamischen DNS Dienstes wie z.B. DynDNS48
TM4 - Erreichbar via Internet
TM5 - Verwenden von Open Source Software
TM6 - Erweiterbar, daher muss das Basis-OS modular aufgebaut sein
Überprüfen der „Optionalen“ Kriterien aus dem Pflichtenheft:
TO1 - Ein- und Ausschalten des Wireless Signals inkl. Optischem Feedback (z.B. via LED)
TO2 - Weitere Tunnelling Funktionen (z.B. SSH over HTTP, SSH over ICMP, SSH over
DNS)
TO3 - Verschleiern der Funktionalität mittels Port-Knocking – verhindert automatisierte
Angriffe aus dem Internet
Überprüfen des „Muss“ Kriteriums aus der Aufgabenstellung:
TM7 - Aussagen puncto Datenrate (Durchsatz) sind zu definieren.
Diesen Test werde ich mit IPerf durchführen. IPerf ist in der Version 2.0.2 für OpenWRT bereits
vorhanden.
Testname
48
Erfüllt
TM1
TM2
TM3
TM4
Ja
Ja
Ja
Ja
TM5
Ja
TM6
Ja
TM7
TO1
TO2
n/a
Ja
Ja
TO3
Nein
Bemerkung
Erfüllt mit der Applikation HostAP
Erfüllt mit der Applikation OpenSSH
Erfüllt mit der Applikation DDNS
Erfüllt mit der Verwendung eines dynamischen DNS Dienstes und OpenSSH
OpenWRT ist OpenSource, jede Applikation, die verwendet wird, ist OpenWRT
(GPL, BSD… Lizenz)
Erfüllt mit dem OpenWRT Disklayout (Firmware mit Basis OS und
Applikationen)
Siehe Kapitel „Test Datendurchsatz“
Erfüllt mit dem Skript Wireless-Toggle
Erfüllt mit den Applikationen HTTPTunnel und PTunnel
Aufgrund der Erreichbarkeit habe ich mich gegen den Einsatz einer Port-Knocking
Software entschieden. Wenn ich in einer restriktiven Umgebung arbeite und via
HTTPTunnel oder PTunnel auf meinen SSH Server zugreife, kann das Senden der
„Magic Sequence“ hinderlich sein.
http://www.dyndns.com/
Michael Vogt
Seite 81 von 89
Diplomarbeit
Test Datendurchsatz
Um den Datendurchsatz zwischen einem Wireless Access Point und einem Laptop zu ermitteln, haben viele
Faktoren einen Einfluss auf das Resultat:
Raum, hat der AP und der Client Sichtkontakt oder muss das Signal durch Wände? Was für Wände
sind verwendet (Stahl, Beton, Holz…)?
Weitere AP, welche auf dem gleichen Channel arbeiten wie unser AP – kann zu Störungen führen.
Güte des Clients, Antenne, Treiber etc.
Ich verwende in diesem Test einen Windows XP Client mit einer Intel PRO/Wireless 2200BG (Treiber
v9.0.4.37) Wireless Karte. Der AP und der Client haben keinen direkten Sichtkontakt, jedoch ist die
Signalqualität laut Intel Wireless Tool „Ausgezeichnet“:
Abbildung 37: Verbindung mit dem AP
Performance Test mit IPerf:
Auf dem AP wird IPerf im Server Mode gestartet:
root@OpenWrt:~# iperf -s
Auf dem Windows Client wird IPerf im Client Mode gestartet
C:\Program Files\iperf-2.0.2\bin>iperf -c 192.168.111.88 -d -t 180
-----------------------------------------------------------Server listening on TCP port 5001
TCP window size: 8.00 KByte (default)
----------------------------------------------------------------------------------------------------------------------Client connecting to 192.168.111.88, TCP port 5001
TCP window size: 63.0 KByte (default)
-----------------------------------------------------------[ 4] local 192.168.111.25 port 3849 connected with 192.168.111.88 port 5001
[ 4] 0.0-180.0 sec
224 MBytes 10.4 Mbits/sec
[ 4] local 192.168.111.25 port 5001 connected with 192.168.111.88 port 59773
Ausgabe auf dem AP:
-----------------------------------------------------------Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
-----------------------------------------------------------[ 4] local 192.168.111.88 port 5001 connected with 192.168.111.25 port 3842
root@OpenWrt:~# iperf -s
-----------------------------------------------------------Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
-----------------------------------------------------------[ 4] local 192.168.111.88 port 5001 connected with 192.168.111.25 port 3849
[ 4] 0.0-180.1 sec
224 MBytes 10.4 Mbits/sec
Michael Vogt
Seite 82 von 89
Diplomarbeit
Dieses Resultat ist relativ niedrig, das hat folgenden Grund; die CPU auf dem AP wird mit IPerf voll
ausgelastet, eine Ausgabe des Tools „Top“:
Mem: 11364K used, 2276K free, 0K shrd, 268K buff, 3808K cached
CPU:
1% usr
7% sys
0% nice
1% idle
0% io
5% irq 84% softirq
Load average: 0.49 0.12 0.05
PID PPID USER
STAT
VSZ %MEM %CPU COMMAND
4891 4876 root
R
1676 12% 95% iperf -s
4897 4894 root
R
2416 18%
1% top
4892
555 root
S
6864 50%
1% sshd: root@pts/1
4874
555 root
S
6864 50%
0% sshd: root@pts/0
Auf http://www.cablemodem.ch/speedtest/speedtest.html führte ich den Speed-Test durch, die
Downloadrate war durchschnittlich bei 17'386 kbit/s
Abbildung 38: Geschwindigkeitstest AP
Fazit:
Eine eindeutige Obergrenze des Datendurchsatzes konnte aufgrund der CPU Belastung nicht durchgeführt
werden. Der Datendurchsatz des AP reicht jedoch aus, um die Anbindung an das Kabelmodem (Internet) zu
gewährleisten.
Michael Vogt
Seite 83 von 89
Diplomarbeit
10. ZUSAMMENFASSUNG
RÜCKBLICK
Die Diplomarbeit war herausfordernd und abwechslungsreich. Diese Arbeit setzte sich in etwa aus je einem
Drittel Evaluation und Analyse, Programmierung und Konfiguration zusammen.
Mit dem Endresultat bin ich sehr zufrieden und ich kann meine beiden Anfordungen ganz erfüllen.
AUSBLICK
Der SSH-Gateway genügt meinen Anforderungen und braucht keine Erweiterung mehr. Anders sieht dies
beim MP3-Player aus. Folgende Punkte möchte ich in Zukunft noch ändern:
Wireless LAN:
Entweder die Mini-PCI Karte durch eine OpenWRT unterstützte Karte ersetzten (z.B. Atheros, ca. 30Fr.)
oder warten bis ein stabiler Treiber für die Hardware (b43) veröffentlicht wird. Bestrebungen betreffend
des Treibers sind im Gange, jedoch kann betreffend einem Endtermin keine Aussage gemacht werden.
Pulseaudio support:
Beschreibung von der Pulseaudio Web Seite49:
PulseAudio is a sound server for POSIX and Win32 systems. A sound server is basically a proxy for
your sound applications. It allows you to do advanced operations on your sound data as it passes
between your application and your hardware. Things like transferring the audio to a different
machine, changing the sample format or channel count and mixing several sounds into one are
easily achieved using a sound server.
PulseAudio has been tested on Linux, Solaris, FreeBSD, Windows 2000 and Windows XP. It should
also run on all other POSIX and Windows systems, but may require new backends to handle their
sound systems.
Mit Pulseaudio würde es möglich werden, von einer Basis-Station aus mehreren abgesetzten Teilnehmern
mit einem Audiosignal zu beliefern. Zusammen mit Wireless LAN würde sich hier ein interessantes
Anwendungsgebiet eröffnen.
JamSE / Bemusedserver:
Zusammen mit dem JamSE Entwickler möchte ich das Problem, welches momentan existiert (Playlist
browsing funktioniert nicht bei grossen Playlists) beheben. Vom technischen Aspekt her ist das nicht ein
grosses Problem, die Übermittlung der Playlist müsste in mehrere Teilschritte unterteilt werden. Die
Problematik dabei ist, dass man dadurch nicht mehr 100% kompatibel zum originalen Bemused Protokoll
ist.
49
http://www.pulseaudio.org/
Michael Vogt
Seite 84 von 89
Diplomarbeit
11. GLOSSAR
API
BOM (Unicode)
Daemon
DNS
FS
HID
HTTP
ICMP
Idle
IR
ISM
Eine Programmierschnittstelle ist eine Schnittstelle, die von einem Softwaresystem
anderen Programmen zur Anbindung an das System zur Verfügung gestellt wird. Oft
wird dafür die Abkürzung API (für engl. application programming interface, deutsch:
„Schnittstelle zur Anwendungsprogrammierung“) verwendet. Im Gegensatz zu einer
Binärschnittstelle (ABI) definiert eine API nur die Verwendung der Schnittstellen auf
Quelltextebene.50
Als Byte Order Mark (BOM, dt. „Bytereihenfolge-Markierung“) wird das UnicodeZeichen an Position U+FEFF (zero width no-break space) bezeichnet, wenn es
verwendet wird, um die Byte-Reihenfolge einer in UTF-16 oder UTF-32 kodierten
UCS/Unicode Zeichenkette anzugeben und/oder um den entsprechenden Text als in
UTF-8, UTF-16 oder UTF-32 kodiert zu markieren.
Bei den Kodierungen UTF-16 und UTF-32 muss die Byte-Reihenfolge angegeben
werden, da die Zeichen jeweils mindestens entweder in 16 oder 32 Bit großen Werten
kodiert sind und damit mehrere Bytes benötigen. Das Byte-Order-Mark kennzeichnet
dabei, in welcher Reihenfolge die Bytes ausgewertet werden müssen. Diese
Markierung wird immer dann besonders wichtig, wenn Daten zwischen
unterschiedlichen Computersystemen ausgetauscht werden.51
Als Daemon bzw. Dämon (auch häufig in der Schreibweise Demon) bezeichnet man
unter Unix und seinen Derivaten ein Programm, das im Hintergrund abläuft und
bestimmte Dienste zur Verfügung stellt. Benutzerinteraktionen finden hierbei nur auf
indirektem Weg statt, zum Beispiel über Signale oder Pipes. Der Begriff Daemon wird
auch als Abkürzung von disk and execution monitor interpretiert, was jedoch ein
Backronym ist.52
Domain Name System – bezeichnet die „Übersetzung“ eines Namens (z.B.
www.example.ch) in eine IP Adresse (z.B. 62.112.33.12).
File System, auf deutsch Dateisystem. Ein Filesystem beschreibt die
Ablageorganisation eines Datenträgers. Beispiele FAT16, FAT32, NTFS, EXT2,
SquashFS…
HID (Human Interface Device) ist eine Geräteklasse des USB-Standards für Computer,
welche Geräte beschreibt, die direkt mit dem Benutzer interagieren. Meist wird HID
bei Geräten wie Tastatur, Maus, Joystick und Grafiktabletts verwendet.53
Hypertext Transfer Protocol – ein Protokoll zur Übertragung von Daten über ein
Netzwerk. Das World Wide Web (WWW) verwendet dieses Protokoll.
Das Internet Control Message Protocol (ICMP) wird verwendet um Fehler- und
Statusmeldungen zu verschicken. Die berühmteste Anwendung dafür dürfte wohl das
Diagnostik Tool „Ping“ sein.
English für „untätig“. Wenn ein Computersystem Idle ist, ist es nicht ausgelastet
InfraRot – Signalübertragung, welche Sichtkontakt benötigt. Die meisten TV Geräte
mit einer Fernbedienung verwenden IR Signale.
Als ISM-Bänder (Industrial, Scientific, and Medical Band) werden Frequenzbereiche
bezeichnet, die durch Hochfrequenz-Geräte in Industrie, Wissenschaft, Medizin, in
häuslichen und ähnlichen Bereichen genutzt werden können. Entsprechende ISMGeräte wie Mikrowellenherde und medizinische Geräte zur Kurzwellenbestrahlung
benötigen dabei nur eine allgemeine Zulassung.54
50
Quelle: http://de.wikipedia.org/wiki/Programmierschnittstelle
Quelle: http://de.wikipedia.org/wiki/Byte_Order_Mark
52
Quelle: http://de.wikipedia.org/wiki/Daemon
53
Quelle: http://de.wikipedia.org/wiki/Human_Interface_Device
54
Quelle: http://de.wikipedia.org/wiki/ISM-Band
51
Michael Vogt
Seite 85 von 89
Diplomarbeit
Kernel
KO
MP3
OpenWRT
OS
SIP
SPDIF
SoC
SSH
SVN
TTL
Tunnel
VPN
WDS
Ein elementarer Bestandteil eines Betriebssystems, Schnittstelle zur Hardware.
Kathodenstrahl-Oszilloskop. Ein Oszilloskop ist ein elektronisches Messgerät zur
optischen Darstellung voneinander unabhängiger Spannungen in einem
zweidimensionalen Koordinatensystem55.
MPEG-1 Audio Layer 3 (MP3) ist ein Dateiformat zur nicht-verlustfreien
Audiodatenkompression. MP3 bedient sich dabei der Psychoakustik mit dem Ziel, nur
für den Menschen bewusst hörbare Audiosignale zu speichern. Dadurch wird eine
Datenkompression möglich, welche die Audioqualität nicht oder nur gering
beeinträchtigt. Das Format ist ein indirekter Vorgänger qualitativ und funktionell
überlegener Formate wie AAC oder Vorbis56.
OpenWrt ist eine Linux-Distribution für bestimmte WLAN-Router, die häufig anstelle
der vorinstallierten Firmware eingesetzt wird. Im Gegensatz zu einer statischen
Firmware setzt OpenWRT auf ein voll beschreibbares Dateisystem sowie einen
Paketmanager und ermöglicht es somit, einen WLAN-Router flexibel um ursprünglich
nicht vom Hersteller vorgesehene Funktionen zu erweitern.57
Operating System – Betriebssystem. Beispiele: Windows, Linux, BSD, Solaris, Tru64,
MAC OS/X, etc…
Session Initiation Protocol (SIP). In der IP-Telefonie ist das SIP ein häufig
angewandtes Protokoll.
Sony/Philips Digital Interface (S/P-DIF). Eine digitale Schnittstelle um Audiogeräte
miteinander zu verbinden.
System on Chip (SoC), auf Deutsch ein Ein-Chip-System. Dieses Ein-Chip-System
beinhaltet folgende Komponenten: Prozessor, Speicher und interne Einheiten wie z.B.
Timer, Interruptcontroller, serielle Schnittstelle, etc.
Secure Shell (SSH) ist sowohl ein Netzwerkprotokoll als auch eine Applikation. Die
aktuelle Version des SSH Protokolls ist 2.0. SSH ermöglicht eine sichere,
authentifizierte und verschlüsselte Verbindung zwischen zwei Rechnern über ein
unsicheres Netzwerk. SSH kann grob gesagt für drei Anwendungs-Szenarien
verwendet werden: Secure System Administration, Secure File Transfer und Secure
Application Tunneling.
Subversion (SVN) ist eine Open-Source-Software zur Versionsverwaltung von Dateien
und Verzeichnissen. Ein „besseres“ CVS System mit mehr Features.
Transistor Transistor Logic. Ein serielles Signal. Der Spannungsbereich eines TTL
Signals ist zwischen 0V und 3.3V, während der Spannungsbereich eines RS232
seriellen Signals zwischen -12V und +12V liegt. Um das TTL Signal an einer seriellen
Schnittstelle zu verwenden, muss das Signal konvertiert werden. Viele Datenkabel für
Mobil-Telefone haben solche Spannungswandler verbaut.
Ein Tunnel bezeichnet in der Informationstechnik eine Technik zum Verbinden zweier
Rechnernetze über ein drittes Netz, bei dem der Transitverkehr vom Datenverkehr des
zwischengeschalteten Netzes isoliert wird. Tunnel werden verwendet, um
üblicherweise gesicherte und/oder verschlüsselte Verbindungen über ungesicherte
Computernetze aufzubauen (siehe VPN) oder um Firewalls und andere
Sicherheitsmaßnahmen zu umgehen.58
Virtual Private Network (VPN). In der Praxis werden zwei Netzwerke (z.B. Hauptsitz
und Zweigstelle) miteinander verbunden. Dazu wird via Internet ein sicherer Tunnel
(siehe Tunnel) erstellt.
Wireless Distribution System (WDS) – bezeichnet ein drahtloses Netzwerk aus
mehreren Zugriffspunkten (Wireless Access Point, AP).59
55
Quelle: http://de.wikipedia.org/wiki/Oszilloskop
Quelle: http://de.wikipedia.org/wiki/MP3
57
Quelle: http://de.wikipedia.org/wiki/OpenWRT
58
Quelle: http://de.wikipedia.org/wiki/Tunneling
59
Quelle: http://de.wikipedia.org/wiki/Wireless_Distribution_System
56
Michael Vogt
Seite 86 von 89
Diplomarbeit
WEP
WPA2
Michael Vogt
Wired Equivalent Privacy (WEP). Der ursprüngliche Verschlüsselungsstandart für
Wireless LAN, dieser sollte die Vertraulichkeit und Integrität der Übertragenen Daten
sicherstellen. Dieser Standart gilt als unsicher und der Schlüssel (Ciphertext) kann
nach wenigen Minuten herausgefunden werden – diese Verschlüsselungsmethode
sollte also nicht mehr verwendet werden.
Wi-Fi Protected Access 2 (WPA2). Die Wireless Verbindung wird basierend auf dem
Advanced Encryption Standard (AES) verschlüsselt und gilt heutzutage als sicherste
W-LAN Verschlüsselung.
Seite 87 von 89
Diplomarbeit
12. ANHANG
BUILDUMGEBUNG
Um OpenWRT Images zu erstellen habe ich VMware Workstation v5.5.0 build-18463 mit einem Debian
GNU/Linux 4.0 verwendet, hier einige Versions-Informationen
michux@fwpiercer:~/trunk$ cat /etc/debian_version
4.0
michux@fwpiercer:~/trunk$ uname -a
Linux fwpiercer 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31 UTC 2008 i686 GNU/Linux
michux@fwpiercer:~/trunk$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang -prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-includedgettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit -enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --with-tune=i686 --enablechecking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
michux@fwpiercer:~/trunk$ automake --version
automake (GNU automake) 1.10
Written by Tom Tromey <[email protected]>
and Alexandre Duret-Lutz <[email protected]>.
Für die OpenWRT Buildumgebung sollte mindestens 6GB Diskspace eingeplant werden:
michux@fwpiercer:~/trunk$ du -h --max-depth=1 /home/michux/trunk/
2.3M
/home/michux/trunk/scripts
164M
/home/michux/trunk/dl
138M
/home/michux/trunk/feeds
22M
/home/michux/trunk/tmp
80M
/home/michux/trunk/target
2.4M
/home/michux/trunk/tools
300K
/home/michux/trunk/docs
16M
/home/michux/trunk/toolchain
120K
/home/michux/trunk/.svn
34M
/home/michux/trunk/package.save
4.1G
/home/michux/trunk/build_dir
122M
/home/michux/trunk/bin
548K
/home/michux/trunk/include
350M
/home/michux/trunk/staging_dir
5.0G
/home/michux/trunk/
Michael Vogt
Seite 88 von 89
Diplomarbeit
BILDVERZEICHNIS
Abbildung 1: Übersicht Mobiltelefon Steuerung ............................................................................................ 9
Abbildung 2: Verbindungsaufbau via HTTPTunnel ..................................................................................... 13
Abbildung 3: Verbindungsaufbau via PTunnel............................................................................................. 13
Abbildung 4: OpenWRT Software Architektur ............................................................................................ 15
Abbildung 5: Entwicklungsumgebung .......................................................................................................... 17
Abbildung 6: OpenWRT Firmware Konfiguration ....................................................................................... 19
Abbildung 7: Auswahl der Applikation ........................................................................................................ 23
Abbildung 8: Auswahl der Konfigurationsoptionen ..................................................................................... 23
Abbildung 9: Konfiguration der Applikation ................................................................................................ 23
Abbildung 10: Flashlayout I.......................................................................................................................... 26
Abbildung 11: Flashlayout II ........................................................................................................................ 26
Abbildung 12: Flashlayout III ....................................................................................................................... 27
Abbildung 13: Übersicht MP3 Player ........................................................................................................... 29
Abbildung 14: Detailierte Applikations-Abhängikeiten................................................................................ 30
Abbildung 15: Übersicht MPD...................................................................................................................... 31
Abbildung 16: LCD4Linux Terminologie..................................................................................................... 34
Abbildung 17: LCD4Linux konfiguration..................................................................................................... 34
Abbildung 18: Übersicht SSH Gateway........................................................................................................ 35
Abbildung 19: Bemusedserver in Action ...................................................................................................... 45
Abbildung 20: Konfiguration MP3 Firmware ............................................................................................... 50
Abbildung 21: ASUS Firmware Restoration Tool ........................................................................................ 52
Abbildung 22: WinSCP Datentransfer zu OpenWRT................................................................................... 54
Abbildung 23: LCD4Linux Konfiguration.................................................................................................... 60
Abbildung 24: Target System ist Atheros 2.6 ............................................................................................... 65
Abbildung 25: La Fonera TTL Serial Access................................................................................................ 67
Abbildung 26: 30Hz ...................................................................................................................................... 77
Abbildung 27: 60Hz ...................................................................................................................................... 77
Abbildung 28: 4kHz ...................................................................................................................................... 77
Abbildung 29: 8kHz ...................................................................................................................................... 77
Abbildung 30: 12kHz (pulsierende Amplitude) ............................................................................................ 78
Abbildung 31: 14kHz (pulsierende Amplitude) ............................................................................................ 78
Abbildung 32: 16kHz (pulsierende Amplitude) ............................................................................................ 78
Abbildung 33: Stromanschluss und Zugentlastung....................................................................................... 79
Abbildung 34: Einbau der Komponenten...................................................................................................... 79
Abbildung 35: Jukebox mit montierter Rückwand ....................................................................................... 79
Abbildung 36: Frontansicht mit Keypad ....................................................................................................... 79
Abbildung 37: Verbindung mit dem AP ....................................................................................................... 82
Abbildung 38: Geschwindigkeitstest AP ...................................................................................................... 83
Michael Vogt
Seite 89 von 89