[Studienarbeiten: Kommunikation zwischen PDAs]

2.2 Implementierung der IrDA-Protokolle unter WindowsCE

Unter WindowsCE kann man die Infrarotschnittstelle entweder als serielle Schnittstelle über IrCOMM ansteuern oder mit Hilfe der IrSock Erweiterung des vorhandenen WinSock2-Standards. Im Rahmen dieser Studienarbeit wurde nur die Kommunikation über IrSockets implementiert. Bei Benutzung von IrCOMM genügt es aber, eine Schnittstelle des Rechners für den Betrieb als IrCOMM-Schnittstelle zu konfigurieren und diese in der Applikation wie eine normale Schnittstelle (seriell oder parallel) anzusteuern.

Ansteuerung über Sockets: IrSock

IrSock ist genaugenommen keine Erweiterung des bestehenden WinSock2 Standards für Windows, sondern eigentlich nur die Unterstützung für TinyTP/IrLMP als weiteres Transportprotokoll , das neben TCP/IP und anderen als Transport Service Provider über diese Sockets angesteuert werden kann. Allerdings mußten, um auf die speziellen Eigenschaften der Infrarotkommunikation (keine festen Adressen, kurzfristig bestehende Verbindungswege) viele Funktionen angepaßt werden. Viele üblichen Socket-Funktionen (wie z.B. gethostbyname) werden deshalb nicht unterstützt.
Verglichen mit den normalen WinSocks gibt es außerdem noch folgende weitere Einschränkungen bzw. Änderungen: IrSockets können nur als Stream-Sockets geöffnet werden, nicht als Datagramm-Sockets, und IrSockets benutzen ein eigenes speziell auf die Natur der Infrarotverbindung zugeschnittenes Addressierungsschema, das sich an den  IrDA-Standards orientiert.
IrSockets bieten eine Schnittstelle zu den IrDA-Protokollschichten TinyTP oder IrLMP.
 

Wie programmiert man einen Server?

Um einen Server zu starten sind folgende Schritte notwendig:

  1. Erzeugen der Listener-Socket mit der Funktion socket.
  2. Binden der Listener-Socket an die lokale Adressemit bind. Im Fall von IrDA heißt das entweder einen gewünschten LSAP-Selector (vergleichbar mit einem TCP Port) selbst auswählen oder einen Service-Namen angeben. Gibt man einen Service-Namen an, so wird automatisch ein freier LSAP-Selector gewählt und dessen Nummer als Attribut "LSapSel" mit dem Service-Namen als Klassennamen in der IAS-Datanbank eingetragen.
  3. Listener-Socket anweisen auf eingehende Verbindungswünsche zu warten mit der listen Funktion.
  4. Akzeptieren eingehender Verbindungen und erzeugen neuer Sockets für diese Verbindungen mit accept.
  5. Die Verbindungen sind nun hergestellt. Es kann mit send Daten übertragen und mit recv Daten empfangen werden.
  6. Verbindungen und Listener-Socket mit closesocket schließen.

Wie programmiert man einen Client?

Um eine Verbindung zu einem Server aufzubauen, sind folgende Schritte notwendig:

  1. Erzeugen einer Socket, über die die Verbindung laufen soll mit socket
  2. Binden der Listener-Socket an die lokale Adresse mit bind. Im Fall von IrDA heißt das entweder einen gewünschten LSAP-Selector (vergleichbar mit einem TCP Port) selbst auswählen oder einen Service-Namen angeben. Gibt man einen Service-Namen an, so wird automatisch ein freier LSAP-Selector gewählt und dessen Nummer als Attribut "LSapSel" mit dem Service-Namen als Klassennamen in der IAS-Datanbank eingetragen.
  3. Verbindung zum Server initiieren mit connect. Wie schon bei Schritt 2, kann man entweder direkt den LSAP-Selector des Servers angeben, sofern dieser bekannt ist oder den gewünschten Service-Namen des Servers. 
    Im zweiten Fall wird die Funktion connect zunächst in der IAS-Datenbank des Servers nach dem Attribut LsapSel in der Klasse mit dem im Service-Name angegebenen Namen suchen und dann zu diesem verbinden.
  4. Die Verbindungen sind hergestellt, sobald die connect Funktion zurückkehrt. Es können mit send Daten übertragen und mit recv Daten empfangen werden.
  5. Verbindungen und Listener-Socket mit closesocket schließen.

Wie funktionieren IAS-Abfragen?

Es gibt zwei Möglichkeiten IAS-Abfragen zu benutzen. Zum einen geschieht dies implizit wenn bei den Funktionen bind oder connect ein Service-Name statt eines LSAP-Selectors angegeben wird. Zum anderen kann man auch selbst mit den Funktionen setsockopt IAS-Attribute setzten und mit getsockopt IAS-Attribute der Gegenstelle abfragen.

IrSock-Strukturen

SOCKADDR_IRDA
DEVICELIST
IAS_QUERY und IAS_SET

IrSock-Funktionen

accept
bind
closesocket
connect
getsockopt
listen
recv
send
setsockopt
socket

Was funktioniert nicht so wie es eigentlich sollte...

Bei der folgenden Auflistung von nicht unterstützten Funktionen aus der IrLMP/TinyTP-Spezifikation sollte man beachten, daß die IrSockets keine Implementierung dieser Protokolle darstellt, sondern eine Schnittstelle, mit deren Hilfe man auf diese Protokolle zugreifen kann. Da es aber keine (dokumentierte) Möglichkeit gibt, diese Implementierung der Protokolle direkt anzusprechen, ist diese Auflistung durchaus berechtigt.

Beim Testen der im Rahmen dieser Studienarbeit geschriebenen Programme gelang kein Connect-Versuch des WindowsCE-Geräts an den Psion. Die andere Richtung funktionierte problemlos. Woran und auf welcher Seite dieser Fehler liegt, konnte mangels weiterer Psion-Geräte nicht festgestellt werden. Der Verbindungsaufbau zwischen zwei CE-Geräten funktionierte problemlos.
Ebensowenig funktionierten IAS-Abfragen an den Psion, bzw. vom Psion auf dem CE-Rechner, obwohl diese theoretisch richtig definiert und vorgesehen sind. Auch hier konnte die Ursache für den Fehler nicht endgültig geklärt werden.
 

[Studienarbeiten: Kommunikation zwischen PDAs]