Tuesday, January 29, 2008

Running SBS-1 BaseStation on Linux


This is slightly off-topic, but you can probably guess why I'm interested in this stuff. There's been discussion on the forums whether you can run BaseStation on Linux, but I couldn't find the answer on the web, so I'm posting it here after finding out myself.

I bought myself an SBS-1 (by Kinetic Avionic Products) for a Christmas present. I've been running the BaseStation software on Windows so far, but that's not fun if you want to run it remotely.

So, tonight I tried to run it in Linux on top of Wine. It worked. Here's how:

1. Install a recent version of wine, and practically any versions of the old but incredibly useful tools nc and cu. On my Debian system this can be done using the command apt-get update && apt-get install wine nc cu. I'm runnig debian testing (lenny, in January 2008). This probably applies to Ubuntu, too.

2. Run some other Windows software with wine first, get it configured on your account and see that it actually runs something successfully.

3. Download the BaseStation CD which contains the driver DLLs. The driver DLLs are not really used, but they have to be present on the system so that BaseStation.exe will run.

4. Extract the DLLs from the CD in a temporary directory, and copy them to the system32 directory of your wine installation:

mkdir tmp && cd tmp
unzip ../BaseStation-1-1-1-119-CD.ZIP '*.dll'
mv *.dll ~/.wine/drive_c/windows/system32/
cd .. && rm -rf tmp

5. Download the latest version of BaseStation (I tried 1.1.1.125).

When wine is properly configured on your system, Firefox will run the wine-safe installer for the EXE file automatically, and basestation will be installed. If this doesn't happen, you might have to run the installer by hand (wine-safe setup.exe). After the installation, the installer will quit. Don't run BaseStation yet.

6. The application apparently cannot talk to the USB bus under wine, so we'll have to do a trick here. Connect the SBS-1 to the USB port of your Linux system, and observe the output of the dmesg command - it should notify you that an USB serial port has been found. On my system it looks like this:

usb 2-2: new full speed USB device using uhci_hcd and address 5
usb 2-2: configuration #1 chosen from 1 choice
ftdi_sio 2-2:1.0: FTDI USB Serial Device converter detected
drivers/usb/serial/ftdi_sio.c: Detected FT232RL
usb 2-2: FTDI USB Serial Device converter now attached to ttyUSB0

Now, the SBS-1 hardware can be reached behind /dev/ttyUSB0 at 921600 bits per second. We could connect to it using the very simple Unix "call up" program cu --nostop -s 921600 -l /dev/ttyUSB0, but we cannot talk the proprietary binary protocol used by the SBS-1 and the BaseStation software. Yet.

7. So, we run cu under another very simple and extremely useful Unix tool, nc, which is the swiss army knife of TCP/IP. We tell nc tolisten on TCP port 19251 using the localhost IP address of 127.0.0.1 (so that it cannot be connected by anyone from the Internet), and to start up the cu program when a connection arrives:

nc -l -s 127.0.0.1 -p 19251 -c "cu --nostop -s 921600 -l
/dev/ttyUSB0"


8. Now, while we have nc waiting for the connection, we can start up BaseStation in another window:

wine .wine/drive_c/Program\ Files/Kinetic/BaseStation/BaseStation.exe

Tell it to connect over the network, the address is 127.0.0.1, and the port is 19251.

There's no reason why you couldn't do this over the Internet, either. You might want to run cu under inetd instead of nc, though, since nc will quit when the connection closes. Remember to set up your firewall / tcp wrappers properly!

5 comments:

  1. Very nice job! I already knew of nc, but I never heard of cu. Maybe we are a little bit closer to a real linux solution for the SBS-1. In the end I bought the SBSnet adapter because I did not want to run a pc on top of our aerial mast. Did you try to run the sbsnetpro proxy software, so that more than one BaseStation can connect to the same receiver? BTW: If you want to access the SBS-1 from remote it is probably much better to connect to the socket from remote because the data rate is only around 30-40 kbytes/s which is much less then a remote desktop connection.

    ReplyDelete
  2. Cute... I've monitored ACARS (using a VHF aviation radio, and sound card decoding software on Windows). But ACARS wouldn't show as complete a picture as SBS-1 likely would.

    Mark (N4CMB)

    ReplyDelete
  3. I didn't try the sbsnetpro proxy yet, but I don't see why it wouldn't work. I was thinking of writing my own code to do the same on Linux, so that the remote server wouldn't need to run wine / X.

    ReplyDelete
  4. Hi there

    I'm trying to achieve the same thing as you, but Basestation doesn't detect any aircraft and cu returns an error in terminal after a few seconds:

    cu: End of file on terminal

    Any ideas why it would do this? I'm out of ideas!

    Thanks,
    Ian

    ReplyDelete
  5. I've not been able to get this to work. I think it should be -e not -c in front of "cu --nostop -s 921600 -l /dev/ttyUSB0".

    -c isn't a nc option. Also it complains about running nc with both -l and -s options.

    I'll try to correct the OP's code when I get time and post a working version on here.

    ReplyDelete