Datenaustausch mit ObexFTP und der Bash

Aus LinuxUser 08/2006

Datenaustausch mit ObexFTP und der Bash

Im übertragenen Sinne

ObexFTP hilft beim Austausch von Dateien zwischen Mobiltelefon und PC. Mit einigen Zeile Shellcode rundherum macht es Ihr Handy auch gleich zum Fotoalbum oder zur Jukebox.

Mobiltelefone werden immer mehr zum ständigen Begleiter der Menschen, sie haben sich von der tragbaren Telefonzelle längst zu hochintegrierten Multimediageräten entwickelt. Dies eröffnet jedoch auch neue Anforderungen beim Dateiaustausch: Die Bilder der Handy-Kamera müssen aufgrund der beschränkten Speichermedien langfristig auf dem heimischen PC archiviert werden. Auch der MP3-Player des Mobiltelefons benötigt hin und wieder frische Titel.

Herkömmliche Synchronisationsprogramme wie Kitchensync oder Multisync können diese Aufgaben nicht erfüllen. Sie gleichen lediglich Termine und Kontakte ab. Eine einfache Lösung zum individuellen Datenaustausch stellt daher ein einfaches Bash-Skript dar. Den Austausch der Dateien zwischen Handy und Notebook via Bluetooth, Infrarot oder USB übernimmt dabei das Kommandozeilenprogramm obexftp[1]. Da sich ObexFTP komplett über Parameter steuern lässt und keine interaktiven Eingaben erwartet, eignet es sich ideal für Skripte.

Bluetooth individuell

ObexFTP kann nicht nur mit Bluetooth-Geräten umgehen, es kommuniziert auch mit per Infrarot oder seriellem Kabel angeschlossenen Handys und Organizern. Während man bei Infrarot-Verbindungen lediglich den Parameter -i angegeben muss, benötigt ObexFTP für den Datenaustausch per Bluetooth neben dem Parameter -b die Bluetooth-ID der Gegenstelle. Die ermitteln Sie mit dem Aufruf hcitool scan, wobei Sie keine Root-Rechte benötigen:

$ hcitool scan
Scanning …
   00:01:E3:53:29:68   SK65
   00:16:20:63:1C:40   W300i

Die Bluetooth-ID der ersten Spalte ist genau wie die MAC-Adresse einer Netzwerkkarte für jedes Gerät einmalig und identifiziert das Handy zuverlässig. Indem Sie den Synchronisationsvorgang stets davon abhängig machen, dass das angebundene Gerät genau diese Bluetooth-ID besitzt, können Sie vermeiden, dass Ihr Rechner plötzlich mit dem Handy eines zufällig anwesenden Besuchers Daten austauscht.

Für aktuelle Mobiltelefone sollten sie unbedingt die neueste Version von ObexFTP übersetzen und installieren, da die in den meisten aktuellen Distributionen enthaltene Version 0.10.7 etwa mit dem Sony-Ericsson W300i und dem W700i nicht funktioniert (siehe Artikel S. 42). Mit der der bei Redaktionsschluss aktuellen Version 0.20 gibt es hingegen keine Probleme.

Datenaustausch per FTP

Die wichtigsten Funktionen von ObexFTP sind ls, get und put. Die passenden Parameter auf der Kommandozeile lauten -l, -g und -p, jeweils gefolgt vom Verzeichnispfad oder den Dateinamen. Während ObexFTP get– und put-Anfragen selbst bearbeitet, indem es die Dateien direkt auf die Festplatte schreibt oder von dort auf das Handy überträgt, schreibt die ls-Funktion die vom Handy übertragene XML-Datei mit den Verzeichnisinformationen unverändert auf die Standardausgabe. Listing 1 zeigt die Verzeichnisstruktur des Memorysticks auf einem Sony-Ericsson W300i.

Listing 1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE folder-listing SYSTEM "obex-folder-listing.dtd">
<!--
 XML Coder, Apr 30 2006, 18:51:19, (C) 2001 Sony Ericsson Mobile Communications AB
-->
<folder-listing version="1.0"><parent-folder/>
<file name="MEMSTICK.IND" size="0"/>
<file name="MSTK_PRO.IND" size="0"/>
<folder name="DCIM"/>
<folder name="MP3"/>
<folder name="MSSEMC"/>
</folder-listing>

Ein Manko des Obex-Protokolls ist, dass es keine Wildcards kennt. Das macht das Herunterladen etwa aller Fotos der im Handy eingebauten Kamera aufwändig: Sie müssen zunächst das betreffende Verzeichnis nach den Dateien durchsuchen und sie dann für ObexFTP auflisten. In Listing 1 sehen Sie neben den Dateien MEMSTICK.IND und MSTK_PRO.IND (Zeile 7 und 8) die Verzeichnisse DCIM mit den Bildern der Kamera, MP3 für die Musik sowie MSSEMC für Videos und andere Multimedia-Dateien (Zeile 9 bis 11), Sie müssen also die XML-Datei analysieren, um an die Datei- und Verzeichnisnamen heranzukommen.

XML-Verarbeitung

Listing 2 zeigt, wie einfach sich XML mit Hilfe von eingebauten Bash-Funktionen analysieren lässt. Das Programm listet die Einträge eines als Parameter eingegebenen Handy-Verzeichnisses. Dabei unterscheidet es zwischen Dateien, die stets im <file>-Tag stehen, und Verzeichnissen in <folder>-Tags. Das Format der Obex-XML-Datei ist in [2] ausführlich beschrieben.

Listing 2

#!/bin/bash
IFS=""
Newline=$'\n'
BluetoothID="00:16:20:63:1C:40"
XML="$(obexftp -b ${BluetoothID} -l $1 2>/dev/null)"
XML="${XML#*<folder-listing*>}"
XML="${XML%</folder-listing>*}"
IFS=$Newline
for Z in $XML; do
  Z="<${Z#*<}"
  if [ "${Z:1:4}" == "file" ]; then
    Name="${Z#*<* name=\"}"
    Name="${Name%%\"*/>*}"
    echo "Dateiname: ${Name}"
  elif [ "${Z:1:6}" == "folder" ]; then
    Name="${Z#*<* name=\"}"
    Name="${Name%%\"*/>*}"
    echo "Verzeichnis: ${Name}"
  fi
done

Das Programm bedient sich einiger Kniffe aus der String-Verarbeitung der Bash. Laut Standard [2] stehen die für uns interessanten Verzeichniseinträge immer zwischen den <folder-listing>-Tags – das bedeutet, dass der Rest der XML-Datei inklusive der <folder-listing>-Tags überflüssig ist und entfernt werden kann.

Da ObexFTP die XML zeilenweise ausgibt, müsste ein Skript alle Zeilen verwerfen, bis das erste Mal ein <folder-listing>-Tag auftaucht, die folgenden Zeilen dann herausgreifen und die restlichen Zeilen ab </folder-listing> wieder ignorieren. Viel einfacher ist es allerdings, die gesamte Ausgabe von ObexFTP samt Zeilenumbrüchen in eine einzige Variable einzulesen. Damit die Bash nicht an jedem Zeilenende abbricht, gilt es die Trennzeichen-Variable IFS in Zeile 2 zunächst zu leeren. Ohne Trennzeichen liest Zeile 5 die Ausgabe von ObexFTP in die Variable XML.

Die Bluetooth-ID der Gegenstelle wird in Listing 2 fest eingestellt – sie würde sich nur dann ändern, wenn Sie ein anderes Handy verwenden. Daher ist es einfacher, sie von Hand mit hcitool zu ermitteln und per Editor im Skript einzutragen, als eine fehleranfällige Routine einzubauen, die bei jedem Aufruf des Skripts nach dem richtigen Handy sucht.

String-Verarbeitung

Die String-Funktionen der Bash in den Zeilen 6 und 7 entfernen nun alle Zeichen vom Beginn bis einschließlich des <folder-listing>-Tags, sowie ab dem </folder-listing>-Tag bis zum Ende der Variablen XML. Übrig bleiben also nur die Zeilen mit den Verzeichniseinträgen, die es nun nacheinander abzuarbeiten gilt.

Da die Verzeichniseinträge stets in einer Zeile stehen, arbeitet das Skript dazu den verbliebenen Inhalt der XML-Datei zeilenweise ab Als einziges Trennzeichen gilt der in der Variable IFS in Zeile 8 definierte Zeilenumbruch.

Zeile 10 entfernt alle Tabulator- oder Leerzeichen, die vor den <file>– oder <folder>-Tags stehen, so dass das Tag in jedem Fall am Zeilenanfang beginnt. Dies ist für die Vergleiche in den Zeilen 11 und 15 notwendig, hier unterscheidet das Skript die einzelnen Verzeichniseinträge.

Das Herauslösen des Dateinamens aus dem <file>– oder <folder>-Tag übernehmen die Zeilen 12 und 13 sowie 16 und 17, sie sind für beide Tags identisch. Die Obex-Spezifikation löegt fest, dass der Dateiname stets hinter dem String name= steht und in Anführungszeichen eingeschlossen ist – demnach können Zeile 12 und Zeile 16 alle Zeichen inklusive name= und dem Anführungszeichen löschen.Die Befehle in den Zeilen 13 und 17 entfernen alle Zeichen vom ersten Anführungszeichen bis zum Ende der Zeile, so dass letztlich nur noch der Datei- oder Verzeichnisname übrig bleiben.

Miniatur-Fotoalbum

Listing 3 zeigt ein kleines Programm, das mit den Methoden aus Listing 2 Fotos aus einem bestimmten Verzeichnis des Handys auf die Festplatte verschiebt, verkleinerte Vorschaubilder erzeugt und diese auf das Handy zurück transferiert. Auf diese Weise mutiert das Handy zum Miniatur-Fotoalbum, auf dem Sie – ohne viel Speicherplatz zu verbrauchen – ihre gesamte Fotosammlung stets dabei haben. Das Skript begrenzt die Größe des Vorschaubilds auf maximal 240×240 Pixel (Zeile 35). Je nach Größe des Handy-Displays sollten Sie die Auflösung weiter verringern, um Speicherplatz auf dem Telefon zu sparen. Ist der Speicher einmal voll, löschen Sie die Vorschaubilder mit dem Dateibrowser. Bei der nächsten Synchronisation erzeugt das Skript nur Thumbnails der neuen Bilder und legt sie auf dem Telefonspeicher ab.

Listing 3

#!/bin/bash
IFS=""
Newline=$'\n'
BluetoothID="00:16:20:63:1C:40"
PhoneDir="Telefonspeicher/Bilder/camera_semc/100MSDCF"
LocalDir="${HOME}/Bilder"
function GetObexFiles()
{
  XML="${1#*<folder-listing*>}"
  XML="${XML%</folder-listing>*}"
  OLDIFS=$IFS
  IFS=$Newline
  for Z in $XML; do
    Z="<${Z#*<}"
    if [ "${Z:1:4}" == "file" ]; then
      Name="${Z#*<* name=\"}"
      Name="${Name%%\"*/>*}"
      echo "${Name}"
    fi
  done
  IFS=$OLDIFS
}
XML="`obexftp -b ${BluetoothID} -l ${PhoneDir} 2>/dev/null`"
Files="`GetObexFiles $XML`"
IFS=$Newline
cd ${LocalDir}
for f in ${Files}; do
  if [ "${f:0:1}" == "T" ]; then
    continue
  fi
  obexftp -b ${BluetoothID} -c ${PhoneDir} -G ${f} >/dev/null 2>/dev/null
  convert -geometry 240x240 ${f} T${f:1}
  obexftp -b ${BluetoothID} -c ${PhoneDir} -p T${f:1} >/dev/null 2>/dev/null
done

Der Aufruf der Funktion GetObexFiles() in Zeile 26 liefert mit den in Listing 2 besprochenen Methoden die Dateinamen aus dem angegebenen Handy-Verzeichnis. In Zeile 29 wechselt das Skript dann in das Zielverzeichnis, das die Bilder aufnehmen soll – das ist nötig, da ObexFTP derzeit sämtliche Dateien im aktuellen Verzeichnis speichert.

Bildertransfer

Die for-Schleife von Zeile 30 bis 37 kopiert die Bilder vom Handyspeicher auf den Computer und löscht sie anschließend auf dem Mobiltelefon (Zeile 34). Nun werden Vorschaubilder mit einer Größe von maximal 240×240 Pixel erzeugt (Zeile 35). Die Thumbnails erkennen Sie daran, dass der Dateiname mit “T” beginnt, während die Bilder typischerweise Dateinamen wie DSC00002.JPG tragen. Sie müssen je nach Handy die Thumbnails so benennen, dass Sie sie einerseits von den Originalbildern des Handys unterscheiden können und andererseits der Dateibrowser des Mobiltelefons die Thumbnails auch als Fotos erkennt. In Zeile 36 transferiert ObexFTP schließlich die Vorschaubilder zurück auf das Handy.

In den Zeilen 34 und 36 tauchen die Parameter -c, -G und -p erstmals auf, die Bedeutung dieser und anderer wichtiger ObexFTP-Parameter finden Sie in der Tabelle “ObexFTP-Parameter”.

ObexFTP-Parameter

Parameter Beschreibung
-l Pfad Listet den Inhalt des durch den Pfad angegebenen Verzeichnisses als XML-Datei auf.
-c Pfad Wechselt vor der Ausführung der Befehle in das durch den Pfad angegebene Verzeichnis.
-C Pfad Wie -c, legt das Verzeichnis jedoch falls nötig an.
-g Datei(en) Lädt eine oder mehrere Dateien vom Handy herunter und speichert sie im aktuellen Verzeichnis auf der Festplatte. Das Verzeichnis muss mit -c übergeben werden.
-G Datei(en) Wie -g, löscht jedoch die Dateien nach der Übertragung aus dem Handyspeicher.
-p Datei(en) Überträgt eine oder mehrere Dateien auf das Handy, das Zielverzeichnis wird mit -c angegeben.
-k Datei(en) Löscht eine oder mehrere Dateien aus dem Handyspeicher, das Zielverzeichnis wird mit -c angegeben.

Das Miniatur-Fotoalbum fürs Handy ist längst nicht das Ende der Fahnenstange, sondern nur ein kleiner Einblick in die Möglichkeiten selbstgeschriebener Synchronisationsprogramme. Weitere Features liegen auf der Hand – etwa ständig eine Auswahl der neuesten oder beliebtesten MP3-Dateien auf das Handy zu übertragen oder den Telefonspeicher als mobilen Datenträger für Präsentationen und wichtige Dateien zu nutzen. Die wichtigsten Synchronisationsaufgaben – den Abgleich von Terminen und Kontaktdaten – kann ObexFTP allerdings nicht leisten. Dazu müssen Sie ein separates Synchronisationsprogramm bemühen. Die wichtigsten davon stellt der Artikel “Terminabgleich” vor.

ObexFTP aktualisieren

Um ObexFTP aus den Quellen neu zu übersetzen, benötigen Sie zunächst ein System mit Compiler und Kernelquellen. Dazu installieren Sie unter Suse Linux die Auswahlen C/C++ Compiler und Werkzeuge sowie Kernel Entwicklung nach. Daneben benötigen Sie noch das Paket python nebst Development-Paket python-devel sowie openobex-devel mit den Headerdateien der Bibliotheken.

Im ersten Schritt übersetzen Sie OpenObex [1], indem Sie ./configure und make im Quellenverzeichnis aufrufen. Fehlen Ihnen keine weiteren Bibliotheken oder Entwicklungspakete, installiert make install einige Bibliotheken und Programme in /usr/local/lib und /usr/local/include, weshalb Sie den Bibliotheken-Cache per ldconfig aktualisieren sollten.

Haben Sie OpenObex installiert – bei Redaktionsschluss war Version 1.3 aktuell – übersetzen Sie obexftp auf gleiche Weise. Per make install landet das Programm dann im Verzeichnis /usr/local/bin und ist einsatzbereit.

Infos

[1] OpenObex und ObexFTP: http://openobex.triq.net/

[2] XML-Spezifikation für Obex: http://www.it.lut.fi/~doc/bluetooth/OBEX12.pdf

LinuxUser 08/2006 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben