Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[HOWTO] Bluetooth Keyboard (Apple) and Mouse (Microsoft)
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Kernel & Hardware
View previous topic :: View next topic  
Author Message
Spida
Tux's lil' helper
Tux's lil' helper


Joined: 08 Feb 2003
Posts: 97
Location: Germany

PostPosted: Tue Aug 03, 2004 4:21 pm    Post subject: [HOWTO] Bluetooth Keyboard (Apple) and Mouse (Microsoft) Reply with quote

Goal:
Using Bluetooth-HID-devices like the "Apple Wireless Keyboard" or the "Microsoft Intellimouse Explorer for bluetooth" with a Bluetooth-USB-dongle like the "Anycom BT 220" with Linux

Hardware:
Check this devices-list to see if your bluetooth-adapter is supported and which driver you should use. There is also the Bluetoothdb from the german ct-magazine with a compatibility database. Both are not complete but provide good hints on how much trouble to expect.

Prerequisites:
You should have a fully working linux base-system
(for non-gentooists, that should include:
- compiler and matching tools
- configured kernelsources)
You should have a kernel of (at least) version 2.6.7, and know how to configure and compile it.

Kernel:
These are the things that I believe are the minimum required settings for bluetooth-HID-devices to work:

Code:
General setup  --->
    [*] Support for hot-pluggable devices
Device Drivers  --->
   Networking support  --->
      <*> Bluetooth subsystem support  --->
         <*>   L2CAP protocol support
         Bluetooth device drivers  --->
            <*> HCI USB driver
   Input device support  --->
      <*> Event interface
      [*] Misc
      <*>   User level driver support
   USB support  --->
      <*> Support for Host-side USB
      [*]   USB device filesystem
      # choose your driver here
      <*>   UHCI HCD (most Intel and VIA) support
      <*>   USB Human Interface Device (full HID) support
      [*] HID input layer support


Software:
You need at least bluez-libs bluez-utils bluez-pan and bluez-sdp, all from the net-wireless category. I used the masked version of bluez-libs (2.8 instead of 2.7), and from all other packages the stable versions (bluez-pan-1.1, bluez-sdp-1.5 bluez-utils-2.7)

Code:
ACCEPT_KEYWORDS="~x86" emerge bluez-libs
emerge bluez-utils bluez-pan bluez-sdp


This should get you the relevant programs.
Now we get to the root of all evil: bthid

Lets fetch the fresh source:

Code:
mkdir /usr/src/bluetooth
cd /usr/src/bluetooth

cvs -d :pserver:anonymous@cvs.bluez.sourceforge.net/cvsroot/bluez login
cvs -d :pserver:anonymous@cvs.bluez.sourceforge.net/cvsroot/bluez co utils2
cvs -d :pserver:anonymous@cvs.bluez.sourceforge.net/cvsroot/bluez co libs2


Then compile it

Code:
cd libs2
./bootstrap && ./configure && make && make install
cd ../utils2
./bootstrap && ./configure && make && make install


That should have been all.

Test:
Lets test...

Code:
/etc/init.d/bluetooth start


type
Code:
hciconfig hci0

to check if you bluetooth-controller works. It should give you an output like this:

Code:
hci0:   Type: USB
BD Address: 01:23:45:67:89:AB  ACL MTU: 339:4  SCO MTU: 64:0
UP RUNNING PSCAN ISCAN
RX bytes:317930 acl:6450 sco:0 events:25059 errors:0
TX bytes:130901 acl:2983 sco:0 commands:8859 errors:0


Now switch on some bluetooth-devices and make them visible so that they can be found. Visibility is often limited in time, so after you have switched your device on and visible, you may have to hurry to find it with
Code:
hcitool scan
Scanning ...
11:22:33:44:55:66   Apple Wireless Keyboard
06:05:04:03:02:01   Microsoft Mouse


If you find the devices, your hardware is probably working OK.

Now the software:

Your /etc/bluetooth/hcid.conf should look similar to this. Make sure you have auth and encrypt activated for use with keyboards (when they support
it)

Code:
options {
autoinit yes;
security user;
pairing multi;
pin_helper /etc/bluetooth/pin;
}
device {
name "mybox";
class 0x100;
iscan enable; pscan enable;
lm accept;
lp rswitch,hold,sniff,park;
auth enable;
encrypt enable;
}


if you canged anything in /etc/bluetooth/hcid.conf, restart your bluetooth with /etc/init.d/bluetooth restart

now start bthid in daemon-mode

Code:
bthid --daemon


and take a device to connect to

Code:
bthid --connect  11:22:33:44:55:66


a quick glance into the log should tell if it worked

Code:
Jul 21 02:15:21 mybox hcid[6768]: Bluetooth HCI daemon
Jul 21 02:15:21 mybox hcid[6768]: Starting security manager 0
Jul 21 02:15:21 mybox sdpd[6772]: sdpd v1.5 started
Jul 21 02:15:34 mybox bthid[6779]: Bluetooth HID service started
Jul 21 02:15:36 mybox hcid[6768]: link_key_request (sba=01:23:45:67:89:AB, dba=11:22:33:44:55:66)
Jul 21 02:15:36 mybox hcid[6768]: pin_code_request (sba=01:23:45:67:89:AB, dba=11:22:33:44:55:66)
Jul 21 02:15:42 mybox hcid[6768]: link_key_notify (sba=01:23:45:67:89:AB) Jul 21 02:15:42 mybox hcid[6768]: Replacing link key 01:23:45:67:89:AB 00:0A:95:3A:01:C0
Jul 21 02:15:43 mybox bthid[6779]: Connected: Apple Computer, Inc. Apple Wireless Keyboard (05ac:0209)


Here you see that bthid wants a pin on the keyboard ("pin_code_request"). Just enter the pin like it is set in /etc/bluetooth/pin.

Code:
#!/bin/sh
echo "PIN:1234"


On the apple keyboard, use the num-block for this. You will not be prompted for the pin, and it won't show up on the display.

For a mouse, diable auth and enc, at least the ms-mouse doesn't seem to support auth.

Putting it all together:
I have written a small init-script to start bthid

Use
Code:
/etc/init.d/bthid start

to start bthid. You will be asked to run

/etc/init-d/bthid firsttime, that will run a bluetooth-scan (make sure all devices you want to use are switched on and visible) and write the results to /etc/conf.d/bluetooth_devices the resulting file will have 4 tab-seperated-colums, the first will contain a nickname (to later access the device with that nickname), then the Bluetooth-address, the name the device uses to announce itself, and (if necessary) options like noauth or noenc (comma-seperated). Copy all lines of devices you want to use to /etc/conf.d/bthid_devices

Code:
/etc/init.d/bthid start


will start bluetooth and bthid anytime and connect to all configured
devices

Code:
/etc/init.d/bthid firsttime


will scan for bluetooth-devices and add them to /etc/conf.d/bluetooth_devices

Code:
/etc/init.d/bthid connect


will connect to all configured devices from /etc/conf.d/bthid_devices


my script and the software from bluez-cvs are experimental, use at your own risk and write bug-reports if anything breaks.










The Script
Code:

#!/sbin/runscript

opts="${opts} firsttime connect"

DEV="hci0"

depend() {
   need bluetooth
}

start() {
   local RETVAL
      ebegin "Starting BtHID"
   [ -x /usr/sbin/bthid ] && \
      /usr/sbin/bthid -i "$DEV" --daemon
   RETVAL=$?
   eend ${RETVAL}
   connect
}

connect() {
   PREVIOUSAUTH=`/usr/sbin/hciconfig "$DEV" | /bin/grep "AUTH" | /bin/wc -l`
   PREVIOUSENC=`/usr/sbin/hciconfig "$DEV" | /bin/grep "ENCRYPT" | /bin/wc -l`

   KNOWNCOUNT=`/bin/wc -l /etc/conf.d/bthid_devices  | /bin/cut -f 1 -d " "`
   if [ 0$KNOWNCOUNT -ge 1 ]; then
      for i in `/bin/seq 1 1 $KNOWNCOUNT`;
      do
         LINE=`/bin/head -n $i /etc/conf.d/bthid_devices | /usr/bin/tail -n 1  | /bin/sed -e "s/#.*//" | /bin/tr -s "\t" `
         if [ "$LINE" ]; then
            ADDRESS=`echo "$LINE" | /bin/cut -f 2`
            DEVICE=`echo "$LINE" | /bin/cut -f 3`
            NICKNAME=`echo "$LINE" | /bin/cut -f 1`
            OPTIONS=`echo "$LINE" | /bin/cut -f 4`

            NOAUTH=0;
            NOENC=0;
            if [ "$OPTIONS" ]; then
               NOAUTH=`echo "$OPTIONS" | grep -i "noauth" | wc -l`
               NOENC=`echo "$OPTIONS" | grep -i "noenc" | wc -l`
            fi
            if [ $NOAUTH -eq 1 ]; then
               if [ $NOENC -eq 1 ]; then
                  ebegin "connecting to $NICKNAME ($DEVICE) on $ADDRESS without auth and enc..."
                  /usr/sbin/hciconfig "$DEV" auth disable
                  /usr/sbin/hciconfig "$DEV" encrypt disable
                         /usr/sbin/bthid -i "$DEV" -c "$ADDRESS$"
                  /usr/sbin/hciconfig "$DEV" encrypt enable
                  /usr/sbin/hciconfig "$DEV" auth enable
               else
                  ebegin "connecting to $NICKNAME ($DEVICE) on $ADDRESS without auth..."
                  /usr/sbin/hciconfig "$DEV" auth disable
                         /usr/sbin/bthid -i "$DEV" -c "$ADDRESS$"
                  /usr/sbin/hciconfig "$DEV" auth enable
               fi
            else
               if [ $NOENC -eq 1 ]; then
                  ebegin "connecting to $NICKNAME ($DEVICE) on $ADDRESS without encrypt..."
                  /usr/sbin/hciconfig "$DEV" auth enable
                  /usr/sbin/hciconfig "$DEV" encrypt disable
                         /usr/sbin/bthid -i "$DEV" -c "$ADDRESS$"
                  /usr/sbin/hciconfig "$DEV" encrypt enable
               else
                  ebegin "connecting to $NICKNAME ($DEVICE) on $ADDRESS..."
                  /usr/sbin/hciconfig "$DEV" auth enable
                  /usr/sbin/hciconfig "$DEV" encrypt enable
                         /usr/sbin/bthid -i "$DEV" -c "$ADDRESS$"
               fi
            fi

                 RETVAL=$?
                 eend ${RETVAL}
   
            sleep 1
         fi
      done
   else
      ewarn "There are no bluetooth devices in"
      ewarn "/etc/conf.d/bthid_devices"
      ewarn "run /etc/init/bthid firstime for instructions on how to add them"
   fi
}

firsttime() {
   ebegin "Scanning for bluetooth devices..."
   DEVICESFILEHASHEADER=`/bin/grep -i "Nickname" /etc/conf.d/bluetooth_devices | /bin/grep -i "BTAddress" | /bin/grep -i "Name" | /bin/grep -i "Options" | /bin/wc -l | /bin/cut -f 1 -d " "`
   /bin/mv /etc/conf.d/bluetooth_devices /etc/conf.d/bluetooth_devices.old
   if [ $DEVICESFILEHASHEADER -eq 0 ]; then
      echo "#Nickname   BTAddress      Name         Options" >  /etc/conf.d/bluetooth_devices
   fi
   /bin/cat /etc/conf.d/bluetooth_devices.old >> /etc/conf.d/bluetooth_devices   

   /usr/bin/hcitool scan | /bin/grep -v "Scanning" | /bin/sed -e "s/^\t/Device\t\t/"  >> /etc/conf.d/bluetooth_devices
   FOUNDCOUNT=`/bin/wc -l /etc/conf.d/bluetooth_devices | /bin/cut -f 1 -d " "`
   if [ 0$FOUNDCOUNT -ge 1 ]; then
      einfo "Found $FOUNDCOUNT Bluetooth devices."
      einfo "Now put the lines from /etc/conf.d/bluetooth_devices"
      einfo "that contain devices you want to use to use into"
      einfo "/etc/conf.d/bthid_devices"
      einfo "You may add options like noauth or noenc, seperated with a \",\""
   else
      ewarn "No bluetooth devices found."
      ewarn "Are you sure you have bluetooth devices nearby that are"
      ewarn "visible for bluetooth scanning?"
   fi
}

status() {
   [ -x /usr/sbin/bthid ] && \
      /usr/sbin/bthid --show
}

stop() {
   local RETVAL
   ebegin "Shutting down BtHID"
   [ -x /usr/sbin/bthid ] && \
      /usr/sbin/bthid --kill
   RETVAL=$?   
   eend ${RETVAL}
}



My Config
Code:
#Nickname   BTAddress      Name         Options
Keyboard   11:22:33:44:55:66   Apple Wireless Keyboard
Mouse   06:05:04:03:02:01   Microsoft Mouse      noauth
Back to top
View user's profile Send private message
cf1
n00b
n00b


Joined: 11 Sep 2004
Posts: 5
Location: /etc/localtime

PostPosted: Wed Dec 29, 2004 11:35 pm    Post subject: Reply with quote

Thanks for the great guide, however Im stuck.

All good up til connecting to the keyboard via bthid

USB dongle working
Code:

cfworks ~ # hciconfig
hci0:   Type: USB
        BD Address: 00:xx:xx:xx:xx:01  ACL MTU: 192:8  SCO MTU: 64:8
        UP RUNNING PSCAN ISCAN
        RX bytes:1143 acl:0 sco:0 events:56 errors:0
        TX bytes:1469 acl:0 sco:0 commands:43 errors:0


HCID finds keyboard
Code:

cfworks ~ # hcitool scan
Scanning ...
        00:xx:xx:xx:xx:02       Apple Wireless Keyboard


BTHID starts up ok
Code:

cfworks ~ # cat /var/log/messages
<snip>
Dec 29 23:29:00 cfworks hcid[11286]: Bluetooth HCI daemon
Dec 29 23:29:00 cfworks hcid[11286]: Starting security manager 0
Dec 29 23:29:00 cfworks sdpd[11291]: Bluetooth SDP daemon
Dec 29 23:29:00 cfworks hidd[11294]: Bluetooth HID daemon
Dec 29 23:29:24 cfworks bthid[11301]: Bluetooth HID service started
<snip>


BUT... BTHID connection refuses at atempted connection (no extra output in /var/log/messages)
Code:

cfworks ~ # bthid --connect 00:xx:xx:xx:02
Can't connect to HID service: Connection refused


I imagine this is just some thing simply blocking access to the HCID process, however Ive tried nearly everything I can think of but still cant get it to work.

Please help :P

~cf1
_________________
http://cyberfish.org
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Kernel & Hardware All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum