Apr 062009

For some time now i have been searching for a way to use the GPS on my Windows Mobile HTC Touch Diamond on Linux.

I tried several solutions to make it communicate and send raw NMEA output to the Linux gps-daemon.
Even wrote some small programs to read directly from the raw serial port on the HTC, but that was just crashing.
Then i found gps2blue which is a small program running under Windows Mobile and reading raw data from the GPS, and sending the data either over TCP/IP or Bluetooth.
Since my main laptop doesn’t have Bluetooth i use the TCP/IP options. Here, there are several choices how to connect the phone to your computer. Either by using RNDIS and a USB cable, or WIFI network.
You can even create a AD HOC network on Linux and have the phone and computer communicate where there are no other available WIFI network.

But then again i had the problem of getting gpsd to read that data, since gpsd mainlyread its data from a serial device.
I searched a bit around and found a tool called socat
Description: multipurpose relay for bidirectional data transfer
Socat (for SOcket CAT) establishes two bidirectional byte streams
and transfers data between them. Data channels may be files, pipes,
devices (terminal or modem, etc.), or sockets (Unix, IPv4, IPv6, raw,
UDP, TCP, SSL). It provides forking, logging and tracing, different
modes for interprocess communication and many more options.
It can be used, for example, as a TCP relay (one-shot or daemon),
as an external socksifier, as a shell interface to Unix sockets,
as an IPv6 relay, as a netcat and rinetd replacement, to redirect
TCP-oriented programs to a serial line, or to establish a relatively
secure environment (su and chroot) for running client or server shell
scripts inside network connections.

So to use this with gps2blue i ran the following command socat tcp4-listen:31873 pty This will create a new device in /dev/pts/.
Atleast with my udev enabled ubuntu.

Then i could fine run gpsd /dev/pts/3 and use what client i wanted.

The same principle also works on Windows, but there you need to use HW VSP instead of socat.