Home   Artikel   Archiv   Forum   Impressum  
Artikel vom 16.03.05
Autor: Ronny Ziegler
Languages: en
Artikel bewerten:

Printer Druckversion
Helfen Sie mit!
 

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/messages
  
mitgehö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=0ms
  
Hier 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.old
  
Die 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/modules
  
kö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 restart
  
Jetzt 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.o
  
Als nächstes das selbstkompilierte IrDA-USB-Modul
  >> /sbin/insmod ./irda4210/irda-usb.o
  
Bevor 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 -s
  
In 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 irda0
  
finden. 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 files
  
Und 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 successful
  
Sollte 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-tty
  
Weiter 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

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.

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).
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
  


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.

Klingeltöne

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.
Dieses Skript konnte aber von mir nicht zur richtigen Mitarbeit gebracht werden. Die erstellten Dateien waren zur Unkenntlichkeit verzerrt.


Links

IrDA-Treiberübersicht: http://www.tuxmobil.org/ir_misc.html
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/




Anmerkungen zu diesem Artikel


[1]  stir4210 Treiber und Kernel 2.6.x J/Psi04-7-2005


Eigene Anmerkung eintragen