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