Linux Guide/Linux and Bluetooth

Forewords edit

The following is just a simple example on how to connect a Bluetooth device, in this case a Nokia phone, in a Linux environment.

For the purpose of this article we assume to have installed Linux Mandrake 10.0 (Kernel 2.6.13, X86) on our computer.

Configuration and Connection edit

First we need the Bluez protocol, usually available as a RPM package on your distribution, then we have to start bluetooth service:

[user@domain.org user]# service bluetooth start

now it's necessary to setup the PIN code and (if you want) the local device name link, for that purpose we edit (e.g. using JOE) the file /etc/bluetooth/hcid.conf:

[user@domain.org user]# joe /etc/bluetooth/hcid.conf

modify the following excerpts:

excerpt for PIN:

# PIN helper 
pin_helper /etc/bluetooth/mypin.sh;  

where mypin.sh is a file created ad-hoc.

Excerpt for name:

# Local device name
# %d - device id 
# %h - host name
name "userdomain (%d)";

N.B.: file mypin.sh contains:

#!/bin/bash
echo "PIN:XXX"

where XXXX means your PIN.

Now it's time to search for devices:

[user@domain.org user]# hcitool scan

that should returns something like:

12:34:56:78:90:12 user1

in other words bdaddr (BT address) and device name, please take note of bdaddr, now it's time to discover available services an the remote device and on which channels:

[utente@dominio.org utente]# sdptool records 12:34:56:78:90:12

depending on the type of device we are analysing the request returns a long list of profiles, in this case we are interested in the dialup one, so let see it available on channel 1:

Service Name: Dial-Up Networking
Service RecHandle: 0x10007
Service Class ID List:
  "Dialup Networking" (0x1103)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x454e
  encoding: 0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Dialup Networking" (0x1103)
    Version: 0x0100

then:

[user@domain.org user]# rfcomm bind 0 12:34:56:78:90:12 1

in other words I bind a virtual serial port, rfcomm0 (/dev/bluetooth/rfcomm/0), by means of the tool rfcomm to the remote device modem, not connected yet but ready for software's requests, let see:

[user@domain.org user]# rfcomm show 0

that results in:

rfcomm0: 12:34:56:78:90:12 channel 1 clean

BT modem ready as serial peripheral at /dev/bluetooth/rfcomm/0

No need to mention that you in the meantime have already accepted the connection on your remote device.

Or to connect from the linux side, prepare an agent to respond properly to a pin request, then connect:

[user@domain.org user]# bluetooth-agent 1234 12:34:56:78:90:12
[user@domain.org user]# rfcomm connect 0 12:34:56:78:90:12

Then, in another terminal, you can for example open a terminal on /dev/rfcomm0:

[user@domain.org user]# minicom /dev/rfcomm0


Bluetooth device as a modem edit

To use this ready to use device as a modem I suggest as dialer the program wvdial, for this purpose we need to edit it's configuration file /etc/wvdial.conf, like this:

[Dialer Defaults]
Modem = /dev/bluetooth/rfcomm/0
Baud = 460800
Dial Attempts = 1
Init1 = ATZ
Init3 = AT+CGDCONT=1,"IP","web.omnitel.it"
Phone = *99#
Carrier Check = no
Stupid Mode = yes
Username = ""
Password = ""

N.B.: this example is from a working configuration for Vodafone Italy on a Nokia phone, for different countries/operators/brand configuration, please google with keyword +CGDCONT and operator's name, mostly you need to modify just the string

Init3 = AT+CGDCONT=1,"IP","web.omnitel.it"

according to your operator's specifications, and

Phone = *99# 

according to your phone's brand.

Dialup and connect...:

[user@domain.org utente]# wvdial

Good Luck!!!

Other useful commands edit

  • hciconfig
  • hcitool scan
  • hcitool info BT_ADDRESS

BT_ADDRESS may be like, 00:89:34:62:67:52

  • l2ping BT_ADDRESS
  • sdptool browse BT_ADDRESS
  • sdptool search DUN
  • hciattach -l

external links edit