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.

LinuxUser 08/2006 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: