Add bluetooth post.
authorW. Trevor King <wking@drexel.edu>
Wed, 11 May 2011 20:23:28 +0000 (16:23 -0400)
committerW. Trevor King <wking@drexel.edu>
Wed, 11 May 2011 20:23:28 +0000 (16:23 -0400)
posts/Bluetooth.mdwn [new file with mode: 0644]

diff --git a/posts/Bluetooth.mdwn b/posts/Bluetooth.mdwn
new file mode 100644 (file)
index 0000000..8af4c5b
--- /dev/null
@@ -0,0 +1,213 @@
+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`.
+
+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