Archivo por días: 1 octubre, 2006

Programando para Windows Mobile 5 con Mono

La política no es la única que hace extraños compañeros de cama: en estos momentos estoy compartiendo mi vida con una PDA con Windows Mobile 5.

La razón es que, por motivos laborales, tengo que escribir un programa para dicho sistema operativo, y aunque los entornos de desarrollo de Micro$oft son conocidos por su gran calidad, la idea de cambiar mi escritorio del trabajo a Windows (con todo lo que ello conlleva: configurar de nuevo el programa de correo, enlaces del navegador, etc) me tiraba mucho para atrás. Por eso decidí realizar el programa con .NET, para lo cual podría usar Mono y MonoDevelop desde GNU/Linux. Además podría vender la moto de que el mismo programa también les funcionará en GNU/Linux…

Por supuesto, las cosas no fueron sencillas. El primer problema era conseguir comunicar la PDA con Linux, problema que parecía resuelto con SynCe (y su Wiki de documentación). Tras un par de pruebas confirmé que el driver ipaq no reconocía a la PDA, así que me puse a bucear en la página de documentación para Windows Mobile 5 y descubrí que los procesadores Intel PXA27x todavía no están soportados por un fallo en su controlador USB.

Como no podía ser de otra manera, mi PDA tenía un procesador de esa familia, lo que reducía mis opciones a una: usar BlueTooth. Afortunadamente, en la documentación anterior se explica muy bien como configurarlo, aunque hay un par de detalles que no comentan bien y que hay que tener en cuenta:

  • Para establecer la conexión no sirve el comando triggerconnection, sino que hay que lanzar ActiveSync y escoger Conectar por BlueTooth en el menú.
  • Una vez conectado toda la comunicación se realiza a través del puerto 990 de TCP/IP, por lo que es necesario abrir en el firewall el acceso a nuestro equipo a través de la interfaz ppp0.
  • De las dos direcciones IP especificadas en el fichero /etc/ppp/peers/dun, la primera es la que se le asigna a nuestro ordenador y la segunda la de la PDA.
  • La misma conexión TCP/IP está disponible para otros programas, aunque en mi caso no puedo usar Internet Explorer para navegar porque se empeña en conectar de nuevo mediante alguno de los otros perfiles disponibles.
  • Parece que no basta con añadir el servicio SP (serial port) para que aparezca el ActiveSync en la PDA, sino que también tiene que estar el servicio LAN y el DUN.
  • Al contrario de lo que dice en la documentación para BlueTooth, hay que lanzar vdccm y no dccm. Además no hay que olvidarse de los parámetros que aparecen en Iniciando la conexión.

Añadir que hay un bug en la pila BlueTooth actual (la que traen Ubuntu Edgy y Debian testing/inestable) que desactiva el ISCAN nada más lanzar el servicio, por lo que el ordenador no aparecerá en la lista de dispositivos BlueTooth de la PDA. Para solucionarlo hay que añadir el comando discovto 0; en la sección device del fichero hcid.conf, y cada vez que se inicie la pila BlueTooth (al arrancar el ordenador o hacer un /etc/init.d/bluetooth restart) ejecutar el comando:

dbus-send --system --dest=org.bluez /org/bluez/hci0
org.bluez.Adapter.SetMode string:discoverable

para activar el ISCAN de nuevo. Podemos comprobar el estado con

hciconfig -a

Por último, para los usuarios de Ubuntu Dapper, añadir que la versión de SynCe que trae es demasiado antigua y no soporta Windows Mobile 5, así que es necesario bajarse los fuentes desde la página y recompilar.

La parte de como escribir programas para la PDA la dejo para una segunda entrada, que esta ya es demasiado larga.