Linux-IRDA II: manejo de dispositivos infrarrojos

Autor: Juan Antonio Martínez Castaño
E-mail: jantonio@dit.upm.es
Web: http://www.dit.upm.es/~jantonio

Copyright

Este artículo es Copyright 2000 de Juan Antonio Martínez Castaño y se distribuye bajo las siguientes condiciones:

Indice


Entradilla

Como última entrega de la serie dedicada a los dispositivos Infrarrojos, describimos en éste artículo las diversas aplicaciones y utilidades de alto nivel de que dispone linux para manejo de dispositivos IrDA


Introducción

En anteriores entregas de esta serie dedicada al uso y configuración de dispositivos infrarrojos, hemos visto cómo configurar nuestro sistema para que sea capaz de identificar y configurar los diversos dispositivos, desde mandos a distancia hasta los basados en el protocolo IrDA. En esta tercera y última entrega de la serie, procederemos a explicar cómo utilizar estos dispositivos y el software de que se dispone

Aquellos lectores que hayan echado un vistazo al IR-Howto, podrán comprobar que dicho manual está realmente desfasado. Ni los dispositivos ni su funcionamiento coinciden con los de las versiones del núcleo actuales. Muchos de estos dispositivos tenían versión cliente y servidor, como el caso del soporte del protocolo IrLPT o el de IrLAN. La versión 2.2.14 y posteriores del núcleo unifican muchos de estos módulos, de manera que el usuario no tiene que preocuparse de cómo iniciar la conexión.

Desgraciadamente el Infrarrojos-Como está muy desfasado

Del mismo modo, el soporte de conexiones en modo socket de los puertos IrDA no está descrito en ningún manual. El autor ha tenido que dedicar horas de ingeniería inversa en los fuentes del núcleo y de las aplicaciones para identificar su funcionamiento.
Hace un mes ha sido editada una nueva revisión del IR-HOWTO. Esta edición, si bien corrige y actualiza bastantes errores, no está suficientemente actualizada. En este artículo se mencionarán las diferencias.
A menos que se especifique lo contrario, las opciones, ficheros e instrucciones citadas se aplican a la distribución RedHat 6.1 con núcleo 2.2.14 con el parche descrito en el número anterior. Se asume que el lector ha leído éste y que tiene el núcleo y ficheros de configuración correctamente establecidos

Se ha dividido el artículo en diversos apartados, de menor a mayor nivel de complejidad. El lector interesado puede saltar directamente al tema correspondiente, si bien se recomienda una lectura completa antes de proceder a las pruebas.

Del mismo modo, se ha obviado la descripción del modo FIR del protocolo: muchos dispositivos no disponen de dicho modo, no se soportan todos los dispositivos, y su uso está restringido al funcionamiento con impresoras y en red local


Emulación de terminales

El primer paso, y el más sencillo es comprobar que el puerto IrDA es capaz de emular un puerto serie. El método más simple es el de poner dos equipos linux en conexión infrarroja. Comprobaremos mediante el examen del fichero /proc/net/irda/discovery que ambos equipos se conectan y reconocen mutuamente.

El paso más sencillo es la comunicación entre equipos mediante la emulación de puerto serie

Acto seguido invocaremos el programa "minicom", y ajustaremos los parámetros de velocidad y de puerto, seleccionando /dev/ircomm0 como interfaz de comunicaciones. Lo que se teclee en cada terminal deberá ser visto en el terminal opuesto, y viceversa. En caso de que esto no ocurra, verificaremos que el módulo ircomm e ircomm-tty estén cargados. En caso negativo, verificar la conexión y la configuración. Cuando éste dispositivo se carga correctamente, aparece en el proc filesystem la entrada /proc/net/irda/ircom

El siguiente paso obvio consiste en hacer que el sistema sea capaz de lanzar un "login" sobre el terminal conectado al puerto IrDA. Para ello no tenemos sino que editar el fichero /etc/inittab tal y como ilustra el listado 1. Una vez editado, procedemos a releer el fichero de configuración del proceso init mediante el comando "init q". El sistema nos responderá con el familiar prompt de login.


# inittab       This file describes how the INIT process should set up
# the system in a certain run-level.

# Author:       Miquel van Smoorenburg, 
# Modified for RHS Linux by Marc Ewing and Donnie Barnes


# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)

id:5:initdefault:  

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# spawn a login shell into irda device
T1:2345:respawn:/sbin/mgetty -r ircomm0

# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon
Listado 1: Fichero de configuración /etc/inittab

En caso de problemas es casi seguro que el conflicto se deba a una errónea negociación del protocolo ( La versión probada no era capaz de manejar la línea DSR ) o bien en el desajuste de velocidades de cada puerto.


Conexión a Internet

Los lectores del número anterior de Linux Actual recordarán que el protocolo IrCOMM es, junto con el IrLPT el único que el estandard IrDA obliga a que toda implementación incorpore. Por ello, en muchos casos la conexión vía emulación de puerto serie será la única opción que nos permita la comunicación con otros equipos. Este caso es sensiblemente cierto cuando deseamos interactuar con sistemas Windows 9X.

Para la conexión mediante pppd será preciso ajustar los timeouts

En estos casos se suelen utilizar programas del tipo "laplink" para efectuar las transferencias de ficheros.

Una alternativa es la utilización del protocolo PPP para emular una red local a través del puerto serie. En otros artículos de Linux Actual se ha explicado cómo establecer conexiones a través de PPP, tanto en modo cliente como en modo servidor, por lo que no nos extenderemos al respecto. Simplemente indicar que en función del núcleo y de la versión de pppd puede ser necesario establecer en el fichero /etc/ppp/ppp.options la opción -rtscts

Muchos teléfonos móviles poseen emulación de modem incorporada, no siendo necesario para su conexión a internet más que el cable adaptador. A su vez, los teléfonos de gama alta soportan conexión por puerto de infrarrojos. Este es el caso del Nokia 9110, Siemens S25 o Motorola TimePort ( Estos son los modelos que el autor ha testeado. Para una lista completa consultar la página web citada en las referencias). Desde estos teléfonos móviles y mediante el puerto de infrarrojos, es perfectamente posible efectuar conexiones a la Red de Redes.

No obstante, no debemos olvidar que debido a la naturaleza intrínseca del sistema GSM no se pueden obtener velocidades de transferencia superiores a 9600 baudios. A este respecto, es preciso hacer constar que para hacer llamadas de datos desde móvil no es preciso contratar un nuevo número, sino sólo en el caso de querer recibir llamadas de datos provenientes de un teléfono fijo. Este es un típico caso de publicidad confusa -cuando no engañosa-

En cualquier caso y debido a la lentitud del sistema, es posible que en el periodo de negociación del PPP se pierda el enlace debido a fallos de timeout. El lector deberá hacer pruebas y ajustar el valor de timeout al que juzgue más conveniente.

Por último, para los usuarios de MoviStar, informar de que telefónica posee dos números de teléfono para acceso a InterNet desde móvil: el 550 para llamadas a infovía con proveedor propio, y el 551 para navegación web (login y password "infovia" ). A ambas se aplica la tarifa estandard de llamada de móvil a móvil en la franja horaria correspondiente


Conexión con dispositivos de impresión

Leyendo el IR-HOWTO encontramos que el funcionamiento del soporte IrLPT en linux está basado en tres módulos: irlpt.o para gestión, irlpt_server.o para servidor de impresión (simulación de impresora) e irlpt_client.o para el cliente
En los nuevos núcleos, esto ya no es así: Linux agrupa ahora todas las funcionalidades de IrCOMM e IrLPT en un único módulo. De hecho la única diferencia entre los dispositivos es el minor number asignado al dispositivo. La razón es muy sencilla: los dos protocolos son prácticamente idénticos, difiriendo nada más que en la forma de gestionar las líneas de datos auxiliares. Salvo en la creación de dispositivos especiales, todas las descripciones del manejo de impresoras en el IR-HOWTO son válidas. Resumimos los pasos:

El núcleo 2.2.14 integra en uno solo los protocolos IrCOMM e IrLPT

El uso de IrDA como simulador de impresoras, permite hacer creer al resto de los sistemas de que se dispone de una impresora de estas características, y redirigir convenientemente los diversos trabajos de impresión que en ésta se originen.


Emulación de red Local

Otro punto importante en el que difiere el HOWTO de las últimas implementaciones IrDA del núcleo es el tema de la gestión de red local: El manual describe una conexión punto a punto, basada en un módulo servidor y otro cliente, cada uno ejecutandose en una máquina. La nueva implementación permite no sólo la conexión punto a punto, sino también la multipunto, pudiendo establecer diversas combinaciones. No obstante, la experiencia del autor indica que es preferible usar un enlace punto a punto.

Linux-IrDA puede manejar tanto redes multipunto como punto-a-punto

De lo descrito anteriormente, se deduce que los módulos irlan_server e irlan_client, ya no existen. En su lugar, un único módulo irlan gestiona todo lo relacionado con la red

Para la conexión multipunto, no es necesario sino asignarle al dispositivo irda0 una dirección IP y una máscara de red. No obstante, esta configuración da bastantes problemas de compatibilidad. Por ello, en el código fuente del núcleo se recomienda usar conexiones punto-punto múltiples. Para hacerlo basta con incluir el módulo irlan en el fichero /etc/irda/drivers, tal y como se indica en el listado 2


#! /bin/sh
#
# drivers
#
# Initialize and shutdown IrDA device drivers.
#
# This script should be invoked with two arguments.  The first is the
# action to be taken, either "start", "stop", or "restart".
#

action=$1
device=$2

case "${action:?}" in
'start')
	irattach /dev/ttyS1          # The second serial port is an IrDA port
	# irattach /dev/ttyS0 -d actisys+ # Attach an ActiSys 220L+ dongle to the first serial port
	# irattach /dev/ttyS0 -d tekram
	# insmod pc87108             # If your machine as a pc87108 FIR chipset
	# modprobe uircc             # Sharp UIRCC chipset
	
	# start irda lan manager
	modprobe irlan
    ;;
'stop')
	killall irattach             # ... or something. Currently not used
    ;;
'restart')
	/sbin/ifconfig ${device:?} down up
    ;;
esac
Listado 2: Fichero de configuración IrDA con soporte de IrLAN

Cada vez que un nuevo interfaz de red IrDA es detectado por el puerto de infrarrojos, se crea al vuelo un dispositivo irlanX, donde X varía de 0 a 15 ( recordemos que IrDA soporta hasta 16 dispositivos interconectados ).
A su vez, el demonio irmanager detecta la nueva conexión y realiza una llamada al comando /etc/irda/network pasando como parámetro el nombre del dispositivo detectado. Recordemos que cada dispositivo de conexión irlanX es del tipo punto-a-punto.

En el listado 3 se encuentra el contenido que debe tener el fichero /etc/irda/network para ser compatible con la distribución RedHat 6.1. Otras distribuciones deberán modificar y personalizar dicho script


#! /bin/sh
#
# network
#
# Initialize or shutdown IrLAN ethernet device drivers
#
# This script should be invoked with two arguments.  The first is the
# action to be taken, either "start", "stop", or "restart".  The
# second is the network interface name.

action=$1
device=$2

cd /etc/sysconfig/network-scripts

case "${action:?}" in
'start')
	/sbin/ifup ${device}
    ;;
'stop')
	/sbin/ifdown ${device}
    ;;
'restart')
    /sbin/ifconfig ${device:?} down up
    ;;
esac
Listado 3: Fichero /etc/irda/network

Evidentemente, en el directorio /etc/sysconfig/network-scripts, debe existir el correspondiente fichero ifcfg-irlanX con los datos de configuracion del interfaz.

Nada impide que el puerto de red utilice DHCP para la configuración. Es más: desde el núcleo 2.2.14, la emulación de red sobre dispositivos IrDA es programable mediante sockets, y cumple con todos los requerimientos que una red local necesita. Unicamente hacer constar, que -salvo que se utilice el modo FIR- la velocidad de transferencia será ligeramente menor que la velocidad teórica a la que esté ajustado el dispositivo IrDA.
No obstante, y debido a que IrDA está en constante evolución, es recomendable no intentar mezclar conexiones y funcionalidades: En ocasiones los diversos servicios IrDA colisionan entre sí, lo que puede llegar en casos extremos ( al autor le ocurrió al interconexionar por infrarrojos 6 dispositivos ) a bloquear el sistema.

Linux incorpora la posibilidad de añadir a IrLAN protocolos de compresión de datos

Una característica específica de Linux y la emulación de red es la posibilidad de incluír un protocolo de compresión de datos en línea, sin más que cargar el módulo irda_deflate.o. No obstante, y como hemos dicho, dicha opción sólo es soportada por Linux

Otra característica de la emulación de red es la forma en que Linux gestiona los sockets IrDA. A las ya habituales familias AF_INET y AF_UNIX, el núcleo Linux añade la AF_IRDA. A su vez, en lugar de puertos de conexión, tenemos servicios, entre los que se incluyen los ya citados, junto con OBEX, el protocolo de intercambio estándard de IrDA


Transferencias de datos con dispositivos móviles

Todo lo descrito hasta ahora nos permite utilizar el puerto IrDA a un nivel bajo: puertos serie, impresoras, interfaces de red.... falta algo en el protocolo, y no es sino la posibilidad de añadir una capa de abstracción que permita olvidarse del mecanismo subyacente a la comunicación y centrar el problema en los datos en sí

OBEX ( OBject EXange Protocol ) es un mecanismo por el que diversos sistemas pueden compartir datos entre sí. Al igual que en sus protocolos hermanos de red, como el HTTP, está basado en la declaración de mimetypes y una sintaxis tipo XML para la definición de los datos. El lector recordará que en el número anterior de Linux Actual se dijo que OBEX no formaba parte del núcleo Linux, sino que se realizaba mediante bibliotecas. Si bien esto es cierto, las últimas revisiones del núcleo incorporan cambios para el manejo del protocolo. El más espectacular es la inclusión de los sockets tipo AF_IRDA para su manejo mediante la biblioteca estandard de manejo de red local

OBEX es utilizado por la mayor parte de dispositivos palmtop y teléfonos móviles, para la transmisión de ficheros, tarjetas de visita, entradas de agenda y calendario, etc. No obstante nunca se diseño pensando en la comunicación con móviles, sino que para este cometido se diseñó un protocolo especial, denominado IrMC ( Infrared for Mobile Communication ). No obstante, ante las ventajas evidentes de interoperabilidad, IrMC sólo ha tenido reflejo en algunos teléfonos móviles de Nokia, como el 5110 y el 6110. Todos los demás han dejado IrMC para utilizar IrOBEX en su lugar.

IrOBEX es el estandard de facto de intercambio de objetos entre equipos portátiles

El Manual de la descripción del protocolo es bastante complejo, pues sigue la estructura típica de una descripción de un DTD de XML. Vamos a estudiar los casos más frecuentes de tipos de datos que son utilizados en las comunicaciones entre portátiles y teléfonos móviles o palmtops

La especificación de objetos OBEX recuerda mucho al protocolo XML

En las referencias se cita página principal del proyecto IrOBEX. En sus subdirectorios encontraremos las referencias a dos trabajos sobre este protocolo. ( recuerdese, que IrOBEX no está implementado como demonio o como módulo del núcleo, sino que es una aplicación autónoma

El CD-Rom incluye las últimas versiones de irobex y pyobex. En función de la versión del núcleo es posible que sea preciso retocar alguno de los fuentes proporcionados. En particular, será preciso disponer de una versión actualizada de Pyton, que soporte conexiones mediante sockets IrDA. En caso de no disponer de dicha versión, en la página web citada en las referencias se dispone del código fuente de python, convenientemente parcheado.

Una última salvedad: El programa pyobex está compilado con GTK, y en su fichero de configuración por defecto, presupone que el usuario utiliza GNOME como escritorio... aunque es posible reconfigurarlo para los usuarios de KDE. Como siempre, remitimos a la documentación sobre los programas


Conclusiones

Como el lector habrá podido deducir Linux-IrDA es un proyecto actualmente en fase de reelaboración. Esta serie de artículos han intentado incluír los aspectos más relevantes de la versión actual del núcleo Linux. Los trabajos actuales pasan por los siguientes puntos:

No obstante, sólo la lectura de este artículo hace ver hasta al más renuente, que la implementación IrDA de Linux va muy por delante de la de otros sistemas, que la red local multipunto y el Socket API son palabras desconocidas en otros entornos donde -a duras penas- sólo funciona la emulación de terminal

Linux-IrDA constituye la implementación más completa de este protocolo

Para empezar a experimentar, lo mejor es una pareja PalmPilot + ordenador portátil con IrDA. Existen suficientes herramientas -y muy probadas- para ambas plataformas. La conexión sin hilos entre ordenador de sobremesa, portatil, agenda y teléfono móvil, actuando de forma conjunta a las órdenes del "Maestro Tux" es un espectáculo digno de verse


Referencias