I've been setting up a USB-bluetooth adapter so I can transfer files
between my phone and computer. You'll need kernel support (in
menuconfig look in
Networking ---> Bluetooth subsystem support).
With a proper kernel, after plugging in your adapter you should see something like
$ lsmod Module Size Used by sco 6484 2 bnep 7889 2 rfcomm 25356 4 l2cap 27398 16 bnep,rfcomm btusb 8762 2 bluetooth 42079 9 sco,bnep,rfcomm,l2cap,btusb ... $ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 010: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth) Bus 003 Device 011: ID 0a5c:4502 Broadcom Corp. Keyboard (Boot Interface Subclass) Bus 003 Device 012: ID 0a5c:4503 Broadcom Corp. Mouse (Boot Interface Subclass) Bus 003 Device 013: ID 0a5c:2154 Broadcom Corp.
Once you've got the kernel working, you should install BlueZ, the
userspace Bluetooth stack. On Gentoo, you'll want to enable the
test-programs USE flag (which brings in additional stuff like
simple-agent). Then run
$ sudo emerge -av net-wireless/bluez
This brings in a bunch of tools, among them
Check that BlueZ finds your adapter with:
$ hcitool dev Devices: hci0 00:01:02:03:04:05
Put your phone in "discovery mode", and then detect it from the computer with:
$ hcitool scan Scanning ... 00:0A:0B:0C:0D:0E Grayhat
Verify communication with:
$ sudo l2ping 00:0A:0B:0C:0D:0E Ping: 00:0A:0B:0C:0D:0E from 00:01:02:03:04:05 (data size 20) ... 20 bytes from 00:0A:0B:0C:0D:0E id 200 time 69.85ms 20 bytes from 00:0A:0B:0C:0D:0E id 201 time 9.97ms 20 bytes from 00:0A:0B:0C:0D:0E id 202 time 56.86ms 20 bytes from 00:0A:0B:0C:0D:0E id 203 time 39.92ms 4 sent, 4 received, 0% loss
Make computer discoverable with:
$ sudo hciconfig hci0 piscan
which adds ISCAN to hciconfig's output.
To setup pairing, you should setup a pair pin by editing
$ cat /var/lib/bluetooth/00:01:02:03:04:05/pincodes 00:0A:0B:0C:0D:0E 12345 AA:AA:AA:AA:AA:AA 67890 $ /etc/init.d/bluetooth restart
00:01:02:03:04:05 is the address for your adapter (from
hcitool dev) and the file contains
addr pin lines. You can get the
addresses of the pair devices with
hcitool scan (discussed above).
After you edit the
pincodes file, you'll have to restart the
$ sudo /etc/init.d/bluetooth restart
If you want to use
simple-agent instead of mucking about in
/var/lib/bluetooth, usage looks something like
$ simple-agent Agent registered RequestPinCode (/org/bluez/16306/hci0/dev_00_0A_0B_0C_0D_0E) Enter PIN Code: 12345
where you start
simple-agent and then initiate pairing from the
phone. After entering a pin on the phone, you will be prompted to
re-enter the pin by
You can also initiate pairing from your computer with
$ simple-agent hci0 00:0A:0B:0C:0D:0E
Gentoo may need to be told that the cell phone is allowed to connect,
$ cat /var/lib/bluetooth/00:01:02:03:04:05/trusts 00:0A:0B:0C:0D:0E [all]
which allows the phone to use any Bluetooth service provided by your computer. It's possible that you can accomplish the same result with something like
$ sudo bluez-test-device trusted 00:0A:0B:0C:0D:0E yes
but I haven't been able to figure out the right syntax yet.
Pushing files from the phone
There are a number of OBEX push servers you can run on your box. My
favorite so far is ObexPushD, which is easy to use, GPLv2
licensed, and Git versioned. Can't beat that. I've added an ebuild
app-mobilephone/obexpushd) to my Gentoo overlay for easier
Pushing files to the phone
Check for an OBEX Push service on the phone:
$ sdptool search --bdaddr 00:0A:0B:0C:0D:0E OPUSH Searching for OPUSH on 00:0A:0B:0C:0D:0E ... Service Name: Object Exchange Service RecHandle: 0x10003 Service Class ID List: "OBEX Object Push" (0x1105) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 3 "OBEX" (0x0008) Profile Descriptor List: "OBEX Object Push" (0x1105) Version: 0x0100
Push a file to the phone using
$ ussp-push 00:0A:0B:0C:0D:0E@3 LFILE RFILE
which pushes the local
LFILE to the remote
Note that phone's can be finicky about what they accept. For example, my Casio C721 is running BREW 3.x (see my Java ME post), and has a number of issues:
- It attempts to detect file type by file extension (so you can't send
over a JPG with a
.jpegextension). It pops up an "Unsupported Media" warning if you try.
- It does not accept music in any of the following formats: (AAC
.aac), MP3 (
.mp3), MP4/AAC (
.m4a), WAV (
- It does accept JPGs with a
- It does accept VCARDs (with a
.vcfextension), but they must have DOS endlines (e.g. via
- If you include multiple VCARDs in a single file, it enters all the information under the name from the first VCARD.
- If you send a VCARD whos name matches an already existing contact, it leaves the first contact unaltered and creates a new contact storing the VCARD information.
Both images and VCARDs should get pushed in without directory names. Once the phone guesses the file type from the extension, it seems to save the information in the appropriate place automatically.
Note: my phone doesn't support the Bluetooth's File Transfer Profile (FTP), so I haven't been able to test the following commands.
sys-fs/obexfs you can mount a phone with
$ sudo mount -t fuse obexautofs /tmp/mnt
When you're done, unmount with
$ sudo umount /tmp/mnt
obexautofs scans for available devices, so your device must be
visible (discoverable). If that's a pain, you can mount a specific
$ sudo mount -t fuse "obexfs#-b00:0A:0B:0C:0D:0E -B3" /tmp/mnt
Depending on your kernel, you may need to load the
before doing all of that:
$ sudo modprobe fuse
net-wireless/bluez-hcidump) to trace the bluetooth
stack for debugging.