View source for Manually using Bluetooth
From Openmoko
You do not have permission to edit this page, for the following reasons:
You can view and copy the source of this page:
Templates used on this page:
Return to Manually using Bluetooth.
You do not have permission to edit this page, for the following reasons:
You can view and copy the source of this page:
Templates used on this page:
Return to Manually using Bluetooth.
In progress: This article or section documents one or more features whose implementation are in progress. |
Bluetooth is one of the core functions of the Neo1973, however it is basically unimplemented on the software side at the moment. Hardware problems in the P1 phone mean that the CPU has to be active in order to wake on external bluetooth events, which will reduce the battery life to some 2 days at best in standby.
This page details how to use bluetooth from the command line. We have quite a lot of plans about what exactly Bluetooth should be used for.
Power up the adapter by clicking on the bluetooth icon in the top bar and selecting power on.
The old way to do it is a shell command (for kernels before 2.6.24):
root@fic-gta01:~$ echo "1" > /sys/bus/platform/devices/gta01-pm-bt.0/power_on
For kernel 2.6.24 (or later) use
root@om-gta02:~# echo 1 > /sys/bus/platform/devices/neo1973-pm-bt.0/power_on
and on the GTA02 *only* (i.e. not on the GTA01) also use
root@om-gta02:~# echo 0 > /sys/bus/platform/devices/neo1973-pm-bt.0/reset
At the shell, "hciconfig" should print information about the adapter if it powered up properly:
hciconfig
The devices should show as UP. If not you can use
hciconfig <device> up
In file /etc/bluetooth/hcid.conf you should change the passkey from BlueZ to something numeric. For testing you may use "0000". Also, you can set the name to "Neo (%d)".
hcitool scan
This will list the addresses of any discoverable bluetooth devices in the vicinity
There should be a passkey agent built into openmoko, but for now you can start up the example passkey agent and set the pin code there. This will allow for new pairings to be made when you attempt a connection.
passkey-agent --default 0000 &
Note: the passkey-agent is not required in Openmoko 2007.2 with kernel 2.6.21.6 as of at least since August 27 (maybe earlier).
Using a bluetooth keyboard with the built-in terminal is a little funky... I can only type into the console using the bt keyboard if the onscreen keyboard is visible. Also, pressing "p" twice on the bt keyboard actually gives you a "q".
We want to be able to use a bluetooth keyboard to type into the various applications of our Neo1973. To use a Bluetooth Keyboard type: (11:22:33:44:55:66 is the Address of your BT-Keyboard)
hidd --connect 11:22:33:44:55:66
and press "Connect" on your BT-KB. Alternately, if you know that only one BT-Keyboard is within range, you can just:
hidd --search
to find and connect to any BT-Keyboard.
Tested on:
We want to be able to use the Neo1973 as a HID device, being able to use it as controller for presentations. See Software_Bluetooth_HID_Keyboard
Here's how to connect to an external Bluetooth GPS and read NMEA data (Tested with a Holux GPSSlim236 and a Nokia LD-3W ).
First, switch on the GPS and identify the BT address:
hcitool scan
Then, edit /etc/bluetooth/rfcomm.conf, which by default has all settings commented out, to something like this:
rfcomm0 { # Automatically bind the device at startup bind no; # Bluetooth address of the device device 00:11:22:33:44:55; # RFCOMM channel for the connection (check your GPS docs for details) channel 1; # Description of the connection comment "Bluetooth GPS"; }
Restart the BT services:
root@neo:~$ /etc/init.d/bluetooth stop root@neo:~$ /etc/init.d/bluetooth start
You should now be able to bind the GPS to /dev/rfcomm0, like this:
root@neo:~$ rfcomm bind 0
Confirm the connect:
root@neo:~$ rfcomm rfcomm0: 00:11:22:33:44:55 channel 1 clean
... and watch the NMEA strings coming from your GPS:
root@neo:~$ cat /dev/rfcomm0 $GPGGA,111748.000,5907.6964,N,01121.1787,E,1,06,1.2,57.7,M,40.1,M,,0000*6F $GPRMC,111748.000,A,5907.6964,N,01121.1787,E,0.00,94.94,160807,,,A*50 $GPVTG,94.94,T,,M,0.00,N,0.0,K,A*3D
If you have nothing better to do, you can now pinpoint my office :-).
Bluetooth should behave just like our usbnet and provide full TCP/IP access to the phone. BNEP has to be used.
On the laptop
/etc/init.d/bluetooth start
pand -s
ip a add 10.0.0.1/24 dev bnep0 ip l set bnep0 up
On the Neo
root@fic-gta01:~$ hcitool scan Scanning ... 00:0E:6D:C0:0l:6A Sho 00:20:E0:5A:FE:C8 BlueZ (0)
root@fic-gta01:~$ pand -c 00:20:E0:5A:FE:C8
ip a add 10.0.0.2/24 dev bnep0 ip r add default via 10.0.0.1
ip l set bnep0 up
Please refer to MacOS_X#Bluetooth_2
For using the Neo as a dialup Bluetooth server and the Mac as the client, please see below at Manually_using_Bluetooth#PPP_Networking
This was tested with a Windows XP SP2 on a IBM Thinkpad T41 with the Widcomm BT stack
On the Neo
root@fic-gta01:~$ hcitool scan Scanning ... <laptop_bt_address> Thinkpad ...
pand -c <laptop_bt_address> -r PANU -d NAP -e bnep0 -A -E -S
(add '-n' to see the pand status messages until you get it right)
For some reason, I was not able to initiate PAN connections from the Neo, I got 'Permission denied (13)' even when I had explicitly allowed the Neo to connect (right click on Neo icon, set properties, on Authorization tab). But initiating 'PAN User' from Windows worked when executing on Neo:
pand -l -r PANU -d NAP -e bnep0 -A -E -S
(add '-n' to see the pand status messages until you get it right)
ip a add 10.0.0.2/24 dev bnep0 ip r add default via 10.0.0.1
If this does not work, the IP stacks may have auto-assigned network addresses to themselves. You can look this up with 'ifconfig' on the Neo and with 'ipconfig' on Windows.
By setting up the Windows Bluetooth connection properly, it should also be possible to share the Internet Connection of the Windows box with the Neo.
If you are unable to use the 'BNEP' method described above, you may be able to use PPP and a DUN (dialup-networking) emulation mode. On the Neo:
RFCOMM_ENABLE=true DUND_ENABLE=true DUND_OPTIONS="--listen --persist call dun"
115200 192.168.2.202:192.168.2.200 passive local noipdefault noauth nodefaultroute
To connect from a MacOS 10.3 client:
Check this, probably needs some corrections
Bluetooth should behave just like our usbnet and provide full TCP/IP access to the phone. BNEP has to be used.
On the laptop
security auto; passkey "your pin"; lm master;
# /etc/init.d/bluetooth start
pand --listen --role NAP --encrypt
auto bnep0 iface bnep0 inet static address 192.168.1.1 netmask 255.255.255.0 network 192.168.1.0 post-up iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.1.0/24 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -P FORWARD ACCEPT
On the Neo
root@fic-gta01:~$ hcitool scan Scanning ... 00:20:E0:5A:FE:C8 laptop
root@fic-gta01:~$ passkey-agent 'your pin' 00:20:E0:5A:FE:C8 &
root@fic-gta01:~$ pand -c 00:20:E0:5A:FE:C8
root@fic-gta01:~$ ifconfig bnep0 192.168.1.2 root@fic-gta01:~$ route add default gateway 192.168.1.1
This section not written yet. Has someone set it up?
In this mode, Neo would behave like any other phone which can be used from a PC to get a network connection.
In this mode, Neo would already have a network connection (GPRS, WLAN, ...), and it should get shared to the PC.
It's now possible (if a little hackish) to stream mp3 to a bluetooth headset. It's a known problem that the playback rate changes (pitch varies). Timing issues are also likely the reason for gaps in playback.
If the bluez packages are recent enough, you can use a shortcut. I'll document it here and leave the longer version below (the long version also demonstrates the API used by the GUI to manage headsets)
Create /etc/asound.conf with your bluetooth headset's address filled in:
pcm.!default { type bluetooth device "xx:xx:xx:xx:xx:xx" }
then play a song
madplay /media/card/song.mp3 --sample-rate=44100 --output=wave:- | aplay
or for smoother results...
madplay /media/card/song.mp3 --sample-rate=44100 --output=wave:song.wav aplay song.wav
If that doesn't work... all the more hackish... install required packages:
echo "src/gz python http://www.angstrom-distribution.org/unstable/feed/armv4t/python/" >> /etc/ipkg/angstrom-python.conf echo "src/gz base http://www.angstrom-distribution.org/unstable/feed/armv4t/base/" >> /etc/ipkg/angstrom-base.conf ipkg update ; ipkg install python-core python-xml python-dbus bluez-utils bluez-utils-alsa
Create /etc/asound.conf:
pcm.!default { type bluetooth } ctl.!default { type bluetooth } pcm.bluetooth { type bluetooth } ctl.bluetooth { type bluetooth }
Run the passkey agent (see above in this page)
Fill in your bluetooth headset address below and execute the python script (with your headset turned on)
#!/usr/bin/python import dbus bus = dbus.SystemBus() manager = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager') conn = manager.ActivateService('audio') audio = dbus.Interface(bus.get_object(conn, '/org/bluez/audio'), 'org.bluez.audio.Manager') path = audio.CreateDevice('00:0D:3C:44:33:22') audio.ChangeDefaultDevice(path) sink = dbus.Interface(bus.get_object(conn, path), 'org.bluez.audio.Sink') sink.Connect()
FINALLY: play a song
madplay /media/card/song.mp3 --sample-rate=44100 --output=wave:- | aplay
Neo1973_Audio_Subsystem has detail about alsa settings and a proposal for audio scenario management.
To try this out, follow the instructions in the a2dp section to install software and run the passkey agent.
Remove or disable the stuff you put in asound.conf. When using a voice headset, the application uses the regular system audio device and it gets routed to bluetooth in the codec.
Put the headset in pairing mode. Replace the bluetooth address below with your headset's and run the python script:
#!/usr/bin/python import dbus bus = dbus.SystemBus() manager = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager') conn = manager.ActivateService('audio') audio = dbus.Interface(bus.get_object(conn, '/org/bluez/audio'), 'org.bluez.audio.Manager') path = audio.CreateHeadset('00:0B:2E:39:33:22') audio.ChangeDefaultHeadset(path) headset = dbus.Interface (bus.get_object(conn, path), 'org.bluez.audio.Headset') headset.Connect() headset.Play()
Now place a call and try to route it to bluetooth (after it's in progress):
alsactl -f /etc/gsmbluetooth.state restore
You may also be able to listen to system audio given the right state file:
alsactl -f /etc/systembluetooth.state restore madplay song.mp3
==Bluetooth on Freerunner == ( Debian, ASU, and probably the framework too )
NOTE: work in progress |
This thread suggests the following:
BtHeadset.py <headset mac address> &
alsactl restore 0 -f gsm_headset.txt bluetooth_pcm
BtHeadsetDisconnect.py <headset mac address> &
You should now hear the call in your headset. I have not tried to see if the mic is working yet. This was all done with the 2008-updates image from sept 4.
http://www.holtmann.org/papers/bluetooth/ols2006_slides.pdf http://wiki.bluez.org/wiki/Audio#org.bluez.Audio
Languages: |
English • العربية • Български • Česky • Dansk • Deutsch • Esperanto • Eesti • Español • فارسی • Suomi • Français • עברית • Magyar • Italiano • 한국어 • Nederlands • Norsk (bokmål) • Polski • Português • Română • Русский • Svenska • Slovenčina • Українська • 中文(中国大陆) • 中文(台灣) • Euskara • Català |