14 January 2015

101 on setting up Bluetooth from command line under Debian GNU Linux

Over the passed days I had the pleasure to set up an Raspberry Pi with Raspbian and some Bluetooth devices. Since maintaining the device over SSH is crucial, I connected the devices via command line. So here are some of the things I learned about Bluetooth from the command line.

Install the packages

Bluetooth under Linux is typically provided by bluez, which can be installed easily from the Debian repositories.

sudo apt-get install bluetooth bluez-utils bluez-firmware

Once installed you should find a service called bluetooth on your machine and you should check if it is running.

service bluetooth status

You should also check your Bluetooth dongle.

lsusb | grep Bluetooth

This will result in something like Bus 001 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode), which describes your local device.

Connect a device as serial port

First you need to scan for Bluetooth devices to connect to.

hcitool scan

The scanning result should be a list of all found Bluetooth devices. Each listed with its MAC address and a vendor name.

Next set the PIN for the device. Many devices use 0000 or 1234 as PIN.

sudo bluetooth-agent <PIN of the device> <MAC address of the device>

The command is only required once for pairing the device. Once paired, it automatically reconnects.

To connect via serial port you need to now, on which channel a serial port can be opened. Bluetooth devices can be asked for this.

sdptool browse --l2cap <MAC address of the device>

This might result in multiple entries like this, describing the capabilities available on each channel.

Service Name: GNS GPS
Service RecHandle: 0x10000
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100

Choose a channel, that offers RFCOMM.

Serial ports are configured under /etc/bluetooth/rfcomm.conf. Open the file in a text editor and fill it with the following content.

rfcomm0 {
  bind yes;
  device <MAC address of the device>;
  channel <channel for RFCOMM>;
  comment "GNS 2000 (GPS & GLONAS)";
}

Restart the Bluetooth service and you are done.

sudo service bluetooth restart

Test the connection

The easies way to test the Bluetooth connection is via Screen. If you have configured a device rfcomm0 as above, the Bluetooth service will create the device under /dev/rfcomm0.

screen /dev/rfcomm0

Screen gives you access to the device. If /dev/rfcomm0 is a Bluetooth GPS tracker, you should now see the logged data line by line.