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 `hcitool` and `hciconfig`. 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 Pairing ======= 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 where `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 bluetooth daemon. $ 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 `simple-agent`. 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, so create/edit `/var/lib/bluetooth/00:01:02:03:04:05/trusts` $ 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 installation. 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` (`net-wireless/ussp-push`) $ ussp-push 00:0A:0B:0C:0D:0E@3 LFILE RFILE which pushes the local `LFILE` to the remote `RFILE`. 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 `.jpeg` extension). 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 (`.mp4`, `.m4a`), WAV (`.wav`). * It does accept JPGs with a `.jpg` extension. * It does accept VCARDs (with a `.vcf` extension), but they must have DOS endlines (e.g. via `unix2dos`). * 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. obexfs ====== Note: my phone doesn't support the Bluetooth's File Transfer Profile (FTP), so I haven't been able to test the following commands. With `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 device with $ sudo mount -t fuse "obexfs#-b00:0A:0B:0C:0D:0E -B3" /tmp/mnt Depending on your kernel, you may need to load the `fuse` module before doing all of that: $ sudo modprobe fuse Debugging ========= Use `hcidump` (`net-wireless/bluez-hcidump`) to trace the bluetooth stack for debugging. References ========== A good deal of this information came from the more detailed [Gentoo Bluetooth Guide][guide] and [Bluetooth Network Aggregation Point Howto][nap]. [BlueZ]: http://www.bluez.org/ [ObexPushD]: http://www.gitorious.org/obexpushd [guide]: http://www.gentoo.org/doc/en/bluetooth-guide.xml [nap]: http://en.gentoo-wiki.com/wiki/Bluetooth_Network_Aggregation_Point