Mobiltelefon & USB-IRDA
Daten zwischen PC und Mobliltelefon auszutauschen funktioniert
wahlweilse mittels Memory-Card, Infrarot, Bluetooth oder seriellem Kabel.Nicht alle Möglichkeiten werden von jedem Handy unterstützt und die Kommunikation über ein serielles Kabel funktioniert aufgrund proprietärer Protokolle häufig nicht unter Linux.
Deshalb beschäftigt sich dieser Artikel mit der günstigen und am häufigsten unterstützten Kommunikationsmöglichkeit über Infrarot (IrDA).
IrDA steht für Infrared Data Association und beschriebt ein Gruppe
von Geräten, die aufgrund eines standardisierten Protokolls (z.B. OBEX)
über eine Infrarot-Verbindung Daten austauschen können.
Die zugehörigen IRDA-Adapter für einen Anschluss an den USB-Port gibt es
mittlerweile für ca. 20 Euro bei jedem Elektronikhändler. Manchmal hat man
Glück und findet sogar einen Adapter, der bereits auf der Verpackung
mit Linux-Unterstützung wirbt, was
aber leider noch immer die Ausnahme ist. Ansonsten muß man etwas hoffen und
zunächst versuchen den benutzen Chipsatz des Adapters herauszufinden, um dann
die richtigen Treiber zu installieren.
Chipsatz herausfinden
Der gekaufte Adapter auf dem obigen Bild hatte weder offizielle Unterstützung
für Linux noch stand irgendwo in der Anleitung, welcher Chipsatz benutzt wird.
Also musste man zunächst ausprobieren.
Das ganze passiert auf einem
mittlerweile angestaubten Fedora Core 2 mit Kernel 2.4.22-1.2199nptl.
Als root wird durch
>> tail -f /var/log/messagesmitgehört was passiert, wenn der USB-Stick eingesteckt wird:
Mar 16 12:49:42 jpsi kernel: hub.c: new USB device 00:07.2-1, assigned address 2
Mar 16 12:49:42 jpsi kernel: usb.c: USB device 2 (vend/prod 0x66f/0x4210) is
not claimed by any active driver.
Mar 16 12:49:49 jpsi usb.agent[7871]: ... no modules for USB product 66f/4210/1001
Offentsichtlich haben wir Pech. Ein USB-Gerät wird zwar erkannt, aber keine zugehörigen
Treiber gefunden oder installiert. Also machen wir uns zunächst auf die Suche
nach dem integrierten Chipsatz:
>> cat /proc/bus/usb/devices T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0 D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0000 ProdID=0000 Rev= 0.00 S: Product=USB UHCI Root Hub S: SerialNumber=6800 C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=255ms T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=066f ProdID=4210 Rev=10.01 S: Manufacturer=SigmaTel, Inc. S: Product=STIr42xx S: SerialNumber=0002F0F02CAC5527 C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 2 Cls=fe(app. ) Sub=02 Prot=00 Driver=(none) E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=01(O) Atr=02(Bulk) MxPS= 64 Ivl=0msHier finden wir etwas mehr Informationen zum IrDA-Stick. Der Chipsatz kommt offentsichtlich vom Hersteller SigmaTel, welche mittlerweile sehr häufig eingesetzt werden. Die Zeile Product=STIr42xx zeigt, daß der Chipsatz aus der 42xx-Reihe stammt, und wer genau hinschaut, kann sich auch gleich denken, daß die vollständige Chipsatz-Nummer 4210 lautet. (Dies spart einem unmengen an Zeit, da die Treiber für 4200 nicht mit denen vom 4210 kompatibel sind.)
Treiber installieren
Wer jetzt auf der Liste von
http://www.tuxmobil.org/ir_misc.html
nachschaut, wie es mit der Treiberunterstüzung für SigmaTel aussieht, wird zunächst
einen Schreck bekommen, da diese Geräte anscheinend noch nicht unterstützt werden. Aber
das stimmt so nicht mehr. Die Liste ist in diesem Punkt etwas veraltet. Stattdessen
erhält man die benötigten Kernel-Module mittlerweile sogar direkt von der
Hompage des Herstellers.
Nach einer kurzen Google-Suche findet man die Seite
http://www.sigmatel.com/products/tech-support.htm
und dort die Linux-Treiber
http://www.sigmatel.com/documents/Linux_Driver-0-2.tar.
Zusätzlich benötigt man noch die Patch-Dateien
http://www.sigmatel.com/documents/stir4210_4220_4116_patch_files.tar.gz
um die Firmware des Sticks zu modifizieren, wie im Folgenden noch gezeigt werden soll.
Entpackt und kompiliert werden die Treiber mit
>> tar xvf Linux_Driver-0-2.tar >> cd irda4210 >> make >> cd..Man erhält dadurch die Kernel-Module irda-usb.o und irda4210.o. Als erstes muß das alte irda-usb-Modul entfernt werden, da es sich mit dem neuen zusammen nicht verträgt, u.U. vor dem richtigen Modul automatisch geladen wird.
Also entfernen wir das alte Modul
>> mv /lib/modules/2.4.22-1.2199.nptl/kernel/drivers/net/irda/irda-usb.o ~/irda-usb.oldDie Patch-Dateien installieren wir gleich mit in das von den Treibern erstellte irda4210-Verzeichnis:
>> tar zxvf stir4210_4220_4116_patch_files.tar.gz -C irda4210/tools/Sollte das alte irda-usb-Modul nicht geladen sein, was man schnell mit einen Blick in die /proc/modules/ überprüfen kann:
>> cat /proc/moduleskönnen wir mit der Installation fortfahren, ansonsten sollte das IrDA-System einmal mit dem zugehörigen Init-Skript neu gestartet werden, um die Module sauber zu entfernen:
>> /etc/init.d/irda restartJetzt werden schrittweise die benötigten Module geladen, um den USB-IrDA Adapter anzusprechen; Zunächst die allgemeinen IrDA-Treiber
>> /sbin/isnmod irda Using /lib/modules/2.4.22-1.2199.nptl/kernel/net/irda/irda.oAls nächstes das selbstkompilierte IrDA-USB-Modul
>> /sbin/insmod ./irda4210/irda-usb.oBevor man den Treiber für den eigentlichen Chipsatz lädt, muss dessen Firmware gepatcht werden, ansonsten funktionert das Ansprechen des Adapters als Device nicht.
Hierfür liegt im tools-Verzeichnis das Programm sgtlpatch zusammen mit den dorthin kopierten Patch-Dateien 42101001.sb und 42101002.sb:
>> cd irda4210/tools/ >> ./sgtlpatch >> cd ..Hierdurch wird die Firmware automatisch gepatcht und wir können das irda0-Device starten, über welches später die Kommunikation ganz ähnlich wie über ein normales Netzwerkdevice laufen wird:
>> /usr/bin/irattach irda0 -sIn der Log-Datei /var/log/messages sollte sich nun ein Eintrag der Form
Mar 16 13:43:18 jpsi kernel: usb.c: registered new driver irda4210 Mar 16 13:47:54 jpsi irattach: executing: '/sbin/modprobe irda0' Mar 16 13:47:54 jpsi irattach: + modprobe: Can't locate module irda0 Mar 16 13:47:54 jpsi irattach: Trying to load module irda0 exited with status 255 Mar 16 13:47:54 jpsi irattach: executing: 'echo jpsi > /proc/sys/net/irda/devname' Mar 16 13:47:54 jpsi irattach: executing: 'echo 1 > /proc/sys/net/irda/discovery' Mar 16 13:47:54 jpsi irattach: Starting device irda0finden. Wichtig ist nur die allerletzte Zeile, daß das irda0-Device gestartet wurde. Denn dann können wir endlich den selbstkompilierten Treiber für den Chipsatz laden:
>> /sbin/insmod ./irda4210.o
Kommunikation
Das IRDA-Gerät sieht ganz analog zu einem Netzwerkdevice aus, und befindet
sich jetzt (neben den eventuell vorhanden Netzwerkkarten und dem Loopback-Device)
unter
>> /sbin/ifconfig
irda0 Protokoll:IrLAP Hardware Adresse 90:fd:61:5e
UP RUNNING NOARP MTU:2048 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:686 errors:0 dropped:0 overruns:0 carrier:0
Kollisionen:0 Sendewarteschlangenlänge:8
RX bytes:0 (0.0 b) TX bytes:12250 (11.9 Kb)
Man erkennt, daß das Device bereits mehrere Pakete verschickt, aber noch keine
empfangen hat. Dies liegt daran, daß das IrDA-Protokoll in Sekundenabständen
in die Umgebung sendet um sich dort vorhandenen Geräten bekannt zu machen.Diese Kommunikation sollten wir spaßeshalber einfach mal abhären, um so nähere Informationen zu erlauschen.
>> /usr/bin/irdadump 12:55:27.952623 xid:cmd 90fd615e > ffffffff S=6 s=0 (14) 12:55:28.042610 xid:cmd 90fd615e > ffffffff S=6 s=1 (14) 12:55:28.132718 xid:cmd 90fd615e > ffffffff S=6 s=2 (14) 12:55:28.222613 xid:cmd 90fd615e > ffffffff S=6 s=3 (14) 12:55:28.312612 xid:cmd 90fd615e > ffffffff S=6 s=4 (14) 12:55:28.402618 xid:cmd 90fd615e > ffffffff S=6 s=5 (14) 12:55:28.492608 xid:cmd 90fd615e > ffffffff S=6 s=* jpsi hint=0400 [ Computer ] (20)Der Computer schickt regelmäßig Pakete in seine Umgebung, empfangen wird aber noch nichts. Legt man nun ein Handy mit aktiviertem IrDA-Port in die Nähe des IrDA-Adapters, so ändert sich dies zu
12:57:55.402627 xid:cmd 90fd615e > ffffffff S=6 s=5 (14)
12:57:55.475858 xid:rsp 90fd615e < 56a63704 S=6 s=5 SAGEM hint=9025 [ Modem
Telephony IrCOMM IrOBEX ] (22)
12:57:55.492634 xid:cmd 90fd615e > ffffffff S=6 s=* jpsi hint=0400 [ Computer ] (20)
12:57:57.952642 xid:cmd 90fd615e > ffffffff S=6 s=0 (14)
12:57:58.025384 xid:rsp 90fd615e < 56a63704 S=6 s=0 SAGEM hint=9025 [ Modem
Telephony IrCOMM IrOBEX ] (22)
Man erkennt jetzt, wie sich das Handy (ein Sagem myV-55) im Gegenzug beim
USB-Adapter anmeldet und zusätzlich mitteilt, welche Fähigkeiten und
Protokolle es unterstüzt.
Datenaustausch - OpenOBEX
Aber wie kann man nun Daten zwischen PC und Mobiltelefon austauschen?
Hierfür gibt es das OBEX-Protokoll. Unter Linux existiert die frei verfügbare
Variante OpenOBEX, welche
als Sourceforge-Projekt entwickelt wird: http://openobex.sourceforge.net/.
Man benötigt zunächst die OBEX-Bibliotheken (momentan aktuell in der Version
openobex-1.0.1.tar.gz)
und dann zusätzlich die Applikationen (OpenOBEX-Apps) zum Datenaustausch (momentan aktuelle Version
openobex-apps-1.0.0.tar.gz).
Entpacken, kompilieren und installieren der Bibliotheken wie gewohnt:
>> tar zxvf openobex-1.0.1.tar.gz >> cd openobex-1.0.1 >> ./configure >> make >> make install >> cd..Dies erstellt und installiert die libopenobex-Bibliotheken.
Danach können die Applikationen kompiliert werden
>> tar zxvf openobex-apps-1.0.0.tar.gz >> cd openobex-apps-1.0.0 >> ./configure >> make >> make install >> cd src/Im src-Verzeihcnis befinden sich u.a. die beiden Programme irxfer und irobex_palm3 zum Datenaustausch.
Startet man irxfer und lauscht gleichzeitig mit irdadump das Protokoll ab, so erhält man einerseits auf der Konsole die Ausgabe
>> ./irxfer Send files to and receive files from win95 Waiting for filesUnd bei der Ausgabe von irdadump nun den modifizierten Eintrag
>> /usr/bin/irdadump
13:33:01.492619 xid:cmd 90fd615e > ffffffff S=6 s=* jpsi hint=8420 [ Computer
IrOBEX ] (21)
Man erkennt, daß der Computer nun zusätzlich das Protokoll IrOBEX
der Gegenseite mit angibt.Schickt man nun eine Datei vom Handy an den Computer, so wird diese vom irxfer-Programm empfangen und auf dem Computer abgespeichert.
Leider funktionert genau dies nicht mit dem Sagem-Handy.
13:36:28.305118 xid:cmd ffffffff < 0da20d25 S=6 s=* SAGEM hint=9025 [ Modem
Telephony IrCOMM IrOBEX ] (22)
13:36:28.356098 snrm:cmd ca=fe pf=1 90fd615e < 0da20d25 new-ca=98
LAP QoS: Baud Rate=115200bps Max Turn Time=500ms Data Size=512B Window
Size=1 Add BOFS=3 Min Turn Time=5000us Link Disc=40s (32)
13:36:28.356261 ua:rsp ca=98 pf=1 90fd615e > 0da20d25
LAP QoS: Baud Rate=115200bps Max Turn Time=500ms Data Size=2048B
Window Size=4 Add BOFS=0 Min Turn Time=1000us Link Disc=12s (31)
13:36:28.461086 rr:cmd < ca=98 pf=1 nr=0 (2)
13:36:28.461256 rr:rsp > ca=98 pf=1 nr=0 (2)
13:36:28.470080 i:cmd < ca=98 pf=1 nr=0 ns=0 LM slsap=01 dlsap=00 CONN_CMD (6)
13:36:28.470333 i:rsp > ca=98 pf=1 nr=1 ns=0 LM slsap=00 dlsap=01 CONN_RSP (6)
13:36:28.482077 i:cmd < ca=98 pf=1 nr=1 ns=1 LM slsap=01 dlsap=00
GET_VALUE_BY_CLASS: "OBEX" "IrDA:TinyTP:LsapSel" (30)
13:36:28.482246 i:rsp > ca=98 pf=1 nr=2 ns=1 LM slsap=00 dlsap=01
GET_VALUE_BY_CLASS: No such class (11)
13:36:28.495103 i:cmd < ca=98 pf=1 nr=2 ns=2 LM slsap=01 dlsap=00
GET_VALUE_BY_CLASS: "OBEX" "IrDA:TinyTP:LsapSel" (30)
13:36:28.495312 i:rsp > ca=98 pf=1 nr=3 ns=2 LM slsap=00 dlsap=01
GET_VALUE_BY_CLASS: No such class (11)
Man erkennt zwar, daß eine Verbindung aufgebaut wird mit der maximal möglichen
Baudrate von 115200bps, Aber dann übermittelt das Handy dem PC seine unterstützen
Protokolle zum Datentransfer
GET_VALUE_BY_CLASS: "OBEX" "IrDA:TinyTP:LsapSel"
Womit irxfer allerdings nichts anfangen und dankend ablehnt:
GET_VALUE_BY_CLASS: No such class (11)
Abhilfe schafft hier das Programm irobex_palm3, welches eigentlich zum
Datenaustausch mit Palm3-Geräten gedacht ist, aber im Gegensatz zu irxfer
mit dem Sagem-Handy kommunizieren kann.
Empfangen der Dateien funktioniert mit
>> ./irobex_palm3 Send and receive files to Palm3 Waiting for files ....................................................... ................HEADER_LENGTH = 34501 put_done() Skipped header 42 Filename = Bild 0077.JPG Wrote /tmp/Bild 0077.JPG (34501 bytes)Die empfangenen Dateien werden dabei in das /tmp-Verzeichnis kopiert. Das hochladen einer Datei funktioniert mit
>> ./irobex_palm3 /tmp/usb-irda-1.jpg Send and receive files to Palm3 name=/tmp/usb-irda-1.jpg, size=12176 ........................ PUT successfulSollte das eigene Handy mit dem irxfer-Programm zusammenarbeiten, so kann man die Dateien auch komfortabler zwischen Handy und PC austauschen.
Hierfür existieren einerseits das Konsolen-Programm irCP und das einem FTP-Client angelehnte Programm OpexFTP.
Serielle Kommunikation
Natürlich kann man auch unter Linux sein Handy als GPRS-Modem zu benutzen. Hierbei wird es wie ein normales serielles tty-Device angesprochen. Man benötigt nur die beiden Module
>> /sbin/insmod ircomm >> /sbin/insmod ircomm-ttyWeiter soll hierauf aber nicht eingegangen werden, da ich diese Funktion aus Kostengründen nie verwende. Wer nähere Informationen hierzu sucht, findet diese in der Infrared-HowTo.
Gnokii
Unterstützt werden eine Vielzahl an Nokia-Mobiltelefonen (http://www.gnokii.org/faq.shtml#models) und
sämtliche Modelle, die mit dem AT-Modus kompatibel sind
(z.B. Ericsson T39, Sony-Ericsson T68i, Siemens S25/SL45i/C55/M55/S55,
Motorola Timeport P7389i (L series), C350, Bosch 908/909).
Die graphische Oberfläche startet man mit xgnokii. Beim offiziell nicht
unterstütztem Sagem MyV-55 funktioniert zumindest das Auslesen des Adressbuchs
und das Herunterladen der gespeicherten SMS-Nachrichten.
Einen kleinen Hinweis noch am Schluß zum AMR-Format (Adaptive Multi-Rate),
das von vielen Handys für
Klingeltöne benutzt wird. AMR ist ein lizenzbelastetes Audioformat, welches anscheinend
von 3GPP patentiert ist. Es gibt jedoch auf deren
Webseiten C-Code zum kompilieren eines Decoders und Encoders. Die Weiterverarbeitung
von ARM-Dateien unter Linux ist bisher aber noch sehr schlecht unterstützt,
es existiert nur ein Perl-Skript http://www.xa.bi/mms/,
welches bestehende Programme wie timidity, sox, lame und mpg123
miteinander verbindet, um die AMR-Dateien nach WAV, Midi oder MP3 umzuwandeln.
IrDA-Treiberübersicht: http://www.tuxmobil.org/ir_misc.html
Gnokii ist ein Linux-Tool zum
verwalten seines Mobiltelefons. Es bietet direkten Zugriff auf das Adressbuch,
den Kalender und bietet ein kleines Mail-Programm zum Verwalten der
SMS-Nachrichten. Verwaltung der Klngeltöne und Bilder ist bei einigen Modellen
auch möglich.
Zunächst muß in der Konfiguraitonsdatei /etc/gnokiirc eingestellt
werden, wie die Kommunikation aufgebaut werden soll und um welches Handy-Modell
es sich handelt. Weil wir kein serielles Kabel benutzen, sondern über
IrDA kommunizieren, benutzen wird das ircomm Device. Als Modell wird erstmal
testweise AT eingestellt sollte ihr eignes Handy nicht spieziell
unterstützt werden.
AT funktioniert mit vielen Handys, bietet dann aber nicht sämtliche Funktionen.
/etc/gnokiirc
[global]
# Set port to the physical serial port used to connect to your phone.
# Linux version is:
# port = /dev/ttyS0
port = /dev/ircomm0
...
# Set model to the model number of your phone
model = AT
Klingeltöne
Dieses Skript konnte aber von mir nicht zur richtigen Mitarbeit gebracht werden.
Die erstellten Dateien waren zur Unkenntlichkeit verzerrt.
Links
OpenOBEX: http://openobex.sourceforge.net/
SigmaTel Treiber: http://www.sigmatel.com/products/tech-support.htm
HP IrDA Informationen: http://www.hpl.hp.com/personal/Jean_Tourrilhes/IrDA/IrDA.html
USB-IrDA HowTo: http://www.linux.com/howtos/Infrared-HOWTO/infrared-howto-s-irda-usb.shtml
Gnokii Hompage: http://www.gnokii.org/index.shtml
AMR Konverter: http://www.xa.bi/mms/
Talkback Area
Enter Own Comment