Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

01.11.2009, 12:26

Anfängerfragen zu python + dbus um Bluetooth Headset automatisch zu suchen und zu verbinden

Hiho alle zusammen,

ich habe mir vor kurzem ein Bluetooth Headset zugelegt. Eigentlich war dies für mein Handy gedacht, aber im Zug oder so währe es natürlich schön, es auch am Laptop zu betreiben. Das Headset ist ein MM100 von Sennheiser und kann gleichzeitig mit 2 Geräten verbunden sein. Eine Verbindung a2dp und die andere hsp/hfp.

Mittlerweile habe ich es mit Hilfe von PulseAudio eigentlich am laufen, aber mich stört ein bischen, dass ich nach aktivieren des Bluetooth Moduls am Laptop immernoch von Hand das Headset verbinden muss. Das habe ich bisher mittels dbus-send auf der Konsole gemacht.

Meine Idee war nun, ich schreibe ein Script, dass nach aktivieren von Bluetooth regelmäßig nach meinem Headset sucht und das so lange, bis es gefunden wurde und dann die Verbindung herstellt. Da ich für Bluetooth sonst keine Verwendung habe, währe dies auch kein größeres Problem, denn sonst ist halt Bluetooth ausgeschaltet.

Im BlueZ Wiki habe ich ein python Script gefunden, dass mittels dbus nach Geräten sucht wiki/HOWTO/DiscoveringDevices. Ich dachte ich könnte das Script nutzen um mir daraus ein Script zu bauen, dass nach aktivieren von Bluetooth nach meinem Headset sucht und es automatisch verbindet. Aber wenn ich das Script so wie es im Wiki steht ausführe kommt immer die Meldung, die Methode DiscoverDevices existiert nicht?!

Quellcode

1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File "bin/bluesdiscover.py", line 29, in <module>
adapter.DiscoverDevices()
  File "/usr/lib64/python2.6/site-packages/dbus/proxies.py", line 68, in __call__
return self._proxy_method(*args, **keywords)
  File "/usr/lib64/python2.6/site-packages/dbus/proxies.py", line 140, in __call__
**keywords)
  File "/usr/lib64/python2.6/site-packages/dbus/connection.py", line 622, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.UnknownMethod: Method "DiscoverDevices" with signature "" on interface "org.bluez.Adapter" doesn't exist


Dann habe ich das Script ein wenig geändert und versucht das Gerät über FindDevice zu finden (so wie ich es über die Konsole mache):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*-
import dbus
import dbus.glib
import gobject

bus = dbus.SystemBus();

obj = bus.get_object('org.bluez', '/org/bluez/hci0')
adapter = dbus.Interface(obj, 'org.bluez.Adapter')

#adapter.DiscoverDevices()
adapter.FindDevice('XX:XX:XX:XX:XX:XX');

gobject.threads_init()
dbus.glib.init_threads()
main_loop = gobject.MainLoop()
main_loop.run()


Aber auch hier wieder nur ein Fehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File "bin/bluesdiscover.py", line 30, in <module>
adapter.FindDevice('00:21:4F:C2:A5:F4');
  File "/usr/lib64/python2.6/site-packages/dbus/proxies.py", line 68, in __call__
return self._proxy_method(*args, **keywords)
  File "/usr/lib64/python2.6/site-packages/dbus/proxies.py", line 140, in __call__
**keywords)
  File "/usr/lib64/python2.6/site-packages/dbus/connection.py", line 622, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.UnknownMethod: Method "FindDevice" with signature "s" on interface "org.bluez.Adapter" doesn't exist


Versuche ich das ganze hingegen auf der Konsole mit dbus-send, funktioniert es, dazu habe ich folgende Script gefunden:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh
BT_BDADDR='XX:XX:XX:XX:XX:XX'

_BT_ADAPTER=`dbus-send --system --print-reply --dest=org.bluez / \
org.bluez.Manager.DefaultAdapter|awk '/object path/ {print $3}'`
BT_ADAPTER=${_BT_ADAPTER//"/}

echo "Adapter: $BT_ADAPTER"

_BT_DEVICE=`dbus-send --system --print-reply --dest=org.bluez $BT_ADAPTER \
org.bluez.Adapter.FindDevice string:$BT_BDADDR |awk '/object path/ {print $3}'`
BT_DEVICE=${_BT_DEVICE//"/}

echo "Headset: $BT_DEVICE"

dbus-send --system --print-reply --dest=org.bluez $BT_DEVICE \
org.bluez.AudioSink.Connect


Diese Befehle habe ich equivalent vorher auf der Konsole von Hand ausgeführt, von daher währe mit dem Shell Script mein Problem eigentlich gelöst, aber ich würde gerne wissen, was ich in dem python Script falsch gemacht habe?!
Google war mir diesmal auch keine sonderlich große Hilfe :(
Einfach ein paar Tips, wie ich überhaupt solche Probleme in python analysieren kann währe schon eine Hilfe, bin in python nämlich noch ein blutiger Anfänger ;)

mfg pyjo

2

02.11.2009, 19:21

hi, mal ne kurze Zwischenfrage :)
Bist du mit dem Bluetooth Headset zufrieden? Ich spiele zur Zeit auch mit dem Gedanken mir ein Bluetoothe Headset zu kaufen.
UNd, wie hast du pulseaudio zum Laufen bekommen, das wollte bei mir nie, also hab ich es wieder unmerged.
Sorry, dass ich deinen Thread hier für die Fragen "missbrauche".
Danke im vorraus,
fab

3

02.11.2009, 22:34

hi, mal ne kurze Zwischenfrage :)
Bist du mit dem Bluetooth Headset zufrieden? Ich spiele zur Zeit auch mit dem Gedanken mir ein Bluetoothe Headset zu kaufen.
UNd, wie hast du pulseaudio zum Laufen bekommen, das wollte bei mir nie, also hab ich es wieder unmerged.
Sorry, dass ich deinen Thread hier für die Fragen "missbrauche".
Danke im vorraus,
fab
Naja, dann wird der Thread wenigstens ein bischen gepuscht, ich bin nämlich mit dem python Problem immer noch nicht weiter gekommen ^^

Also das Sennheiser MM100 ist echt ein feines Gerät, der Klang ist einfach fantastisch. Dadurch dass es sich bei dem Kopfhörer um Ohraufliegende Kopfhörer handelt, kann man auch voll aufdrehen, ohne dass die Ohren schmerzen. Aber wass dann um einen herum passiert, hört man dann nicht mehr wirklich ;) genau genommen garnicht :D
Überzeugen können die Kopfhörer aber nicht nur durch ihre Klangqualität (Sennheiser eben ;)), sondern auch, weil es gleichzeitig mit 2 Geräten kommunizieren kann, einmal auf dem a2dp (Audio Stream & Control) Kanal und einmal auf dem hsp/hfp (Telephon) Kanal. D.h. ich habe es gleichzeitig mit dem Laptop und Handy verbunden, höre Musik über den Laptop und kann ohne Verzögerung auf ein Telefongespräch am Handy rüber schalten. Das entscheidet das MM100 automatisch, kommt also ein Gespräch am Handy an, höre ich das Klingeln im Kopfhörer, drücke ich auf abnehmen, wird der Audio Stream unterdrückt und ich höre nur noch das Gespräch. Ziemlich geile Sache :)

Zum Thema pulseaudio, also das geht eigentlich ziemlich einfach, hier eine kurze Zusammenfassung, ausführlich kannste das im Wiki nachlesen:
  1. use Flag pulseaudio aktivieren: euse -E pulseaudio
  2. World updaten: emerge -uDNav @system @world
    pulseaudio sollte dann schon automatisch mit installiert werden
  3. (optional, aber ich empfehle es) Die pulseaudio Steuerungsanwendungen installieren, am einfachsten geht das über ein Set (siehe Wiki): emerge @pulseaudio
  4. Alsa anpassen, so dass es mit pulseaudio arbeitet: /etc/asound.conf

    Quellcode

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    pcm.pulse {
        	type pulse
    }
    
    ctl.pulse {
        	type pulse
    }
    
    pcm.!default {
        	type pulse
    }
    
    ctl.!default {
        	type pulse
    }
  5. (empfohlen) Rechner neu starten, damit auch alle Anwendungen (und Alsa) die neuen Einstellungen übernehmen
  6. (alternative) Neu anmelden, sollte eigentlich auch ausreichen, bei mir war aber Alsa dann irgentwie durcheinander gekommen.
  7. pulseaudio sollte automatisch als User starten
  8. Musik abspielen lassen und Spaß haben ^^
Das einbinden des BT Headset geht out of the box mit dem Verbindungsscript (Shell Script), danach kann man im Device Manager von pulseaudio das BT Headset als Ausgabegerät festlegen.

mfg pyjo

4

04.11.2009, 00:49

danke für die ausführiche Antwort :)
kann man denn ohne bluetooth headset irgendwie nachvollziehen was du gerade machst? Ich hab nämlich keins, aber kann etwas python :)

5

05.11.2009, 16:38

Also wenn du einen Bluetooth Empfänger eingerichtet hast, sollte man das nachvollziehen können.

Im Bluez Wiki habe ich folgendes Script gefunden:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import dbus
import dbus.glib
import gobject

def disc_started_signal():
        print 'Signal: DiscoveryStarted()'

def rem_dev_found_signal(address, cls, rssi):
        print 'Signal: RemoteDeviceFound(%s, %s, %s)' % (address, cls, rssi)

def rem_dev_name_signal(address, name):
        print 'Signal: RemoteNameUpdated(%s, %s)' % (address, name)

def disc_completed_signal():
        print 'Signal: DiscoveryCompleted()'
        main_loop.quit()

bus = dbus.SystemBus();

bus.add_signal_receiver(disc_started_signal, 'DiscoveryStarted', 'org.bluez.Adapter', 'org.bluez', '/org/bluez/hci0')
bus.add_signal_receiver(rem_dev_found_signal, 'RemoteDeviceFound', 'org.bluez.Adapter', 'org.bluez', '/org/bluez/hci0')
bus.add_signal_receiver(rem_dev_name_signal, 'RemoteNameUpdated', 'org.bluez.Adapter', 'org.bluez', '/org/bluez/hci0')
bus.add_signal_receiver(disc_completed_signal, 'DiscoveryCompleted', 'org.bluez.Adapter', 'org.bluez', '/org/bluez/hci0')

obj = bus.get_object('org.bluez', '/org/bluez/hci0')
adapter = dbus.Interface(obj, 'org.bluez.Adapter')

adapter.DiscoverDevices()

gobject.threads_init()
dbus.glib.init_threads()
main_loop = gobject.MainLoop()
main_loop.run()

Das Script sollte nach Bluetooth Geräten suchen und Informationen zu diesen ausgeben.
Aber wenn ich es ausführe, erhalte ich folgende Fehlermeldung:

Quellcode

1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File "bin/bluesdiscover.py", line 29, in <module>
adapter.DiscoverDevices()
  File "/usr/lib64/python2.6/site-packages/dbus/proxies.py", line 68, in __call__
return self._proxy_method(*args, **keywords)
  File "/usr/lib64/python2.6/site-packages/dbus/proxies.py", line 140, in __call__
**keywords)
  File "/usr/lib64/python2.6/site-packages/dbus/connection.py", line 622, in call_blocking
message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.UnknownMethod: Method "DiscoverDevices" with signature "" on interface "org.bluez.Adapter" doesn't exist

und ich weis nicht warum :(

mfg pyjo

6

05.11.2009, 20:51

hmmm naja anscheinend existiert org.bluez.Adapter nicht.
hast du net-wireless/bluez-utils mit useflag dbus installiert?
Ich müsste mir erst noch pulse installieren bevor ichs probieren kann, mal gucken ob ichs zum Laufen bekomme :)
EDIT: eix sagt bluez-utils hat das useflag dbus, aber wenn ich es installiere dann erscheint das flag nicht, komisch, jedoch funktioniert das skript bei mir auch nicht

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »fab« (06.11.2009, 01:09)


7

06.11.2009, 01:28

Hi
EDIT: eix sagt bluez-utils hat das useflag dbus, aber wenn ich es installiere dann erscheint das flag nicht, komisch,[....]
Die USE=dbus" gibt es bei diesem Paket wohl nur bis Version
<=net-wireless/bluez-utils-2.25-r1

Die verfügbaren Flags kann man sich zb recht bequem mit "equery" anschauen
zb

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
$ equery uses =net-wireless/bluez-utils-2.25-r1

 * Searching for =net-wireless/bluez-utils-2.25-r1 ...
[ Legend : U - flag is set in make.conf       ]
[        : I - package is installed with flag ]
[ Colors : set, unset                         ]
 * Found these USE flags for net-wireless/bluez-utils-2.25-r1:
 U I
 + + alsa   : Adds support for media-libs/alsa-lib (Advanced Linux Sound Architecture)
 + + cups   : Add support for CUPS (Common Unix Printing System)
 + + dbus   : Enable dbus support for anything that needs it (gpsd, gnomemeeting, etc)
 - - gtk    : Adds support for x11-libs/gtk+ (The GIMP Toolkit)
 - - pcmcia : Adds support for PCMCIA slots/devices found on laptop computers
("equery" ist im Paket "gentoolkit" enthalten)

MfG

8

06.11.2009, 03:47

hmmm naja anscheinend existiert org.bluez.Adapter nicht.
hast du net-wireless/bluez-utils mit useflag dbus installiert?
Ich müsste mir erst noch pulse installieren bevor ichs probieren kann, mal gucken ob ichs zum Laufen bekomme :)
EDIT: eix sagt bluez-utils hat das useflag dbus, aber wenn ich es installiere dann erscheint das flag nicht, komisch, jedoch funktioniert das skript bei mir auch nicht
Pulseaudio brauchst du dafür eigentlich nicht, weil es hierbei um eine reine Bluetooth Sache geht (finden und erkennen von Geräten) und Pulseaudio erst später kommt.

Aber über die Konsole mit dbus-send (siehe 1. Post) funktioniert es über genau diese Interfaces und Methoden, dass ist es ja, was ich nicht verstehe. Warum funktioniert es mit dbus-send, aber mit python nicht?

Eines ist mir aufgefallen, bei dbus-send nutze ich den System bus (mit --system). Muss ich das vielleicht auch python sagen, dass er den Systembus nehmen soll? (Google konnte mir hier auf die schnell nicht weiter helfen).
Hi
EDIT: eix sagt bluez-utils hat das useflag dbus, aber wenn ich es installiere dann erscheint das flag nicht, komisch,[....]
Die USE=dbus" gibt es bei diesem Paket wohl nur bis Version
<=net-wireless/bluez-utils-2.25-r1

Die verfügbaren Flags kann man sich zb recht bequem mit "equery" anschauen
zb

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
$ equery uses =net-wireless/bluez-utils-2.25-r1

 * Searching for =net-wireless/bluez-utils-2.25-r1 ...
[ Legend : U - flag is set in make.conf       ]
[        : I - package is installed with flag ]
[ Colors : set, unset                         ]
 * Found these USE flags for net-wireless/bluez-utils-2.25-r1:
 U I
 + + alsa   : Adds support for media-libs/alsa-lib (Advanced Linux Sound Architecture)
 + + cups   : Add support for CUPS (Common Unix Printing System)
 + + dbus   : Enable dbus support for anything that needs it (gpsd, gnomemeeting, etc)
 - - gtk    : Adds support for x11-libs/gtk+ (The GIMP Toolkit)
 - - pcmcia : Adds support for PCMCIA slots/devices found on laptop computers
("equery" ist im Paket "gentoolkit" enthalten)

MfG
Ok, aber 1. funktioniert es bei mir ja mittels dbus-send (also muss der dbus Support ja vorhanden sein) und 2. ist dbus global bei mir aktiviert:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ euse -i dbus
global use flags (searching: dbus)
************************************************************
[+  D ] dbus - Enable dbus support for anything that needs it (gpsd, gnomemeeting, etc)

local use flags (searching: dbus)
************************************************************
[+  D ] dbus (mail-client/evolution):
Allow the Mail Notification plugin to notify you about new messages via an icon in the tray using sys-apps/dbus

[+  D ] dbus (net-news/liferea):
Enables the DBUS connector for liferea, so feeds can be managed from external programs

[+  D ] dbus (net-print/hplip):
Add support for sys-apps/dbus which enables better communications with your device (recommended)


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ equery uses net-wireless/bluez-utils
 * Searching for net-wireless/bluez-utils ...
[ Legend : U - flag is set in make.conf   	]
[    	: I - package is installed with flag ]
[ Colors : set, unset                     	]
 * Found these USE flags for net-wireless/bluez-utils-3.36:
 U I
 + + alsa      	: Adds support for media-libs/alsa-lib (Advanced Linux Sound Architecture)
 + + cups      	: Add support for CUPS (Common Unix Printing System)
 - - debug     	: Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see http://www.gentoo.org/proj/en/qa/backtraces.xml
 - - examples  	: Install examples, usually source code
 + + gstreamer 	: Adds support for media-libs/gstreamer (Streaming media)
 + - old-daemons   : Install old daemons like hidd and sdpd that are deprecated by the new Service framework
 - - test-programs : Install l2test and rctest
 + + usb       	: Adds USB support to applications that have optional USB support (e.g. cups)


Echt merkwürdiges Verhalten was python da an den Tag legt ?(

mfg pyjo

9

06.11.2009, 12:07

achso, dachte ich benötige pulse dafür.
Hmm hab eben auch gelesen, dass man wohl nur noch bluez verwenden sollte, da bluez-libs und bluez-utils in diesem nun in diesem einen paket vorhanden sind, deshalb hatte ich da auch einen block.
Was ich aber komisch finde ist, dass dbus-send bei mir nciht funktioniert ?(
Naja ich muss jetzt leider erstmal in die Uni.

10

06.11.2009, 15:46

ok, ich bin weitergekommen. Und zwar hab ich mal /etc/init.d/dbus restart durchgeführt. Hatte ja bluetooth gerade erst frisch installiert.
Nun scheint das Interface Adapter wenigstens zu existieren:
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.AccessDenied: A security policy in place prevents this sender from sending this message to this recipient, see message bus configuration file (rejected message had interface "org.bluez.Adapter" member "DiscoverDevices" error name "(unset)" destination ":1.0")

11

06.11.2009, 17:01

hm okay, habe jetzt herausgefunden warum es nicht funkioniert.
1. An blueZ wird wohl sehr viel geändert. Laut API dokumenation existiert DiscoverDevices() gar nicht mehr.
Siehe: http://git.kernel.org/?p=bluetooth/bluez…api.txt;h=1e03b
2. Auch die Signale wurden umbenannt.
3. /org/bluez/hci0 funktioniert so nicht mehr. Du brauchst die pid von bluetoothd für den Objektpfad, die kann man soweit ich weiß auch über dbus erhalten:

Quellcode

1
2
3
4
golden fab # dbus-send --system --print-reply --dest=org.bluez / org.bluez.Manager.ListAdaptersmethod return sender=:1.2 -> dest=:1.57 reply_serial=2 
array [ 
object path "/org/bluez/9455/hci0" 
]


oder mit

Quellcode

1
2
golden fab # pidof bluetoothd
9455




Dann ist der Objektpfad: /org/bluez/9455/hci0
4. d-feet ist super um dbus Sachen zu debuggen :)
5. Damit du mit d-feet vergleichen kannst was ich gemacht habe: hier mein verändertes programm(achtung, die parameter für die Callbacks hab ich bis auf DeviceFound nicht geänadert)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# -*- coding: utf-8 -*-
import dbus
import dbus.glib
import gobject

def DeviceCreated():
        print 'Signal: DeviceCreated()'

def DeviceFound(address, cls):
        print 'Signal: DeviceFound(%s, %s)' % (address, cls)

def DeviceDisappeared(address, name):
        print 'Signal: DeviceDisappeared(%s, %s)' % (address, name)

def DeviceRemoved():
        print 'Signal: DeviceRemoved()'
        main_loop.quit()

bus = dbus.SystemBus();

bus.add_signal_receiver(DeviceCreated, 'DeviceCreated', 'org.bluez.Adapter', 'org.bluez', '/org/bluez/9455/hci0')
bus.add_signal_receiver(DeviceFound, 'DeviceFound', 'org.bluez.Adapter', 'org.bluez', '/org/bluez/9455/hci0')
bus.add_signal_receiver(DeviceDisappeared, 'DeviceDisappeared', 'org.bluez.Adapter', 'org.bluez', '/org/bluez/9455/hci0')
bus.add_signal_receiver(DeviceRemoved, 'DeviceRemoved', 'org.bluez.Adapter', 'org.bluez', '/org/bluez/9455/hci0')

obj = bus.get_object('org.bluez', '/org/bluez/9455/hci0')
adapter = dbus.Interface(obj, 'org.bluez.Adapter')

adapter.StartDiscovery()

gobject.threads_init()
dbus.glib.init_threads()
main_loop = gobject.MainLoop()
main_loop.run()

mfg,
fab

EDIT: /etc/asound.conf existiert auf meinem system komischerweise nicht.
Ok. pulse scheint soweit zu funktionieren, nur wenn ich z.b. auf youtube flash abspielen will, dann nicht. Laut wiki soll das mit flashplayer 10 out of the box gehen, wenn man die alsa settings korrekt gesetzt hat.
EDIT2: Hatte von früherem pulse gefrickel ausversehen pulse als system weiten sound server gesetzt, wovon ja ausdrücklich abgeraten wird :)
Jetzt funktioniert flash danke :)

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »fab« (06.11.2009, 18:52)


12

08.11.2009, 15:54

Ok, verdammtes Wiki, sollte mal aktualisiert werden ;)

Langsam verstehe ich wie das ganze mit python funktioniert, hier eine angepasste Version, mit der sich das Script den Adapter selbst sucht:
[edit]siehe nächster Post[/edit]

Ich probier mal weiter, mal schauen ob ichs noch hin bekomme ;)

thx, mfg pyjo

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »pyjo« (08.11.2009, 21:47)


13

08.11.2009, 21:48

So, mit dem Script funktioniert das Discover, aber dummerweise findet er alle anderen Geräte, nur mein Headset nicht.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# -*- coding: utf-8 -*-
import dbus
import dbus.glib
import gobject

def DeviceFound(address, values):
    	print 'Signal: DeviceFound(%s, %s)' % (address, values)

def DeviceDisappeared(address):
    	print 'Signal: DeviceDisappeared(%s)' % (address)

def DeviceCreated(device):
    	print 'Signal: DeviceCreated(%s)' % (device)

def DeviceRemoved(device):
    	print 'Signal: DeviceRemoved(%s)' % (device)
    	main_loop.quit()

bus = dbus.SystemBus();

root = bus.get_object('org.bluez', '/')
manager = dbus.Interface(root, 'org.bluez.Manager')
defaultAdapter = manager.DefaultAdapter()

bus.add_signal_receiver(DeviceCreated, 'DeviceCreated', 'org.bluez.Adapter', 'org.bluez', defaultAdapter)
bus.add_signal_receiver(DeviceFound, 'DeviceFound', 'org.bluez.Adapter', 'org.bluez', defaultAdapter)
bus.add_signal_receiver(DeviceDisappeared, 'DeviceDisappeared', 'org.bluez.Adapter', 'org.bluez', defaultAdapter)
bus.add_signal_receiver(DeviceRemoved, 'DeviceRemoved', 'org.bluez.Adapter', 'org.bluez', defaultAdapter)

obj = bus.get_object('org.bluez', defaultAdapter)
adapter = dbus.Interface(obj, 'org.bluez.Adapter')

print 'Start discovery ...'
adapter.StartDiscovery()

#devicePath = adapter.FindDevice('...')
#device = bus.get_object('org.bluez', devicePath)
#audioSink = dbus.Interface(device, 'org.bluez.AudioSink')
#audioSink.Connect()

gobject.threads_init()
dbus.glib.init_threads()
main_loop = gobject.MainLoop()
main_loop.run()

Ich melde mich, wenn ich es hin bekommen habe ;)

mfg pyjo

14

09.11.2009, 10:08

kennst du denn schon diese Seite? http://wiki.bluez.org/wiki/HOWTO/AudioDevices
Da gibts unten eine kleine Anleitung wie man zu einem a2dp device per python aufbauen kann.

Aber eigentlich steht auf der Seite auch, dass "For A2DP there is no need to specifically request a "playing" state. The bluetooth alsa plugin will automatically do this when some application tries to use it. If no device is connected, the default device will be connected to, otherwise the first found connected device will be used."

D.h. eigentlich sollte automatisch eine Verbindung aufgebaut werden.

15

09.11.2009, 22:38

Eigentlich ja, aber wenn ich das Headset bei Alsa eintrage (was ich atm nicht gemacht habe), dann startet pulseaudio nicht mehr, wenn die entsprechenden "load-module module-alsa-sink/source" Einträge in der Konfiguration stehen.

Und da pulseaudio auch einen eingebauten Bluetooth Support hat, währe das zwar eine Lösung, die aber bei mir nicht funktioniert ^^Außerdem wird in Verbindung mit pulseaudio die automatische Erkennung mit dem Modul "module-bluetooth-discover" empfohlen. Weil es dabei egal ist, ob das Gerät vielleicht auch mal aus geht oder außer Reichweite gerät. Denn bluez stellt, einmal aufgebaut, die Verbindung ja automatisch wieder her. So dass ich mich darum dann nicht kümmern muss. :D
Aber dass nach dem aktivieren von bluetooth, das erste mal eine Verbindung aufgebaut wird, dass wollte ich gerne automatisieren. Dann währe das alles nämlich voll automatisiert ;) Mal schaun, ob ich das noch hin bekomme.

mfg pyjo

16

09.11.2009, 22:45

achso. Also ich glaube ich würde versuchen das pulse bluetooth problem zu lösen. KOmmt mir als die sauberste Lösung vor hier eine kleine anleitung aus einem fedoraforum: http://www.fedoraforum.org/forum/showthread.php?t=190468

Ansonsten musst du wohl warten bis ich mir das Headset auch gekauft hab ;)

17

10.11.2009, 00:52

achso. Also ich glaube ich würde versuchen das pulse bluetooth problem zu lösen. KOmmt mir als die sauberste Lösung vor hier eine kleine anleitung aus einem fedoraforum: http://www.fedoraforum.org/forum/showthread.php?t=190468

Mh, also da muss ich den Befehl pactl ausführen, immer dann, wenn ich das Headset verwenden will (und zwar nachdem ich es aktiviert habe), bei meiner jetzigen Lösung muss ich mit Hilfe meines Scriptes mein Headset pair'en und danach läuft alles automatisch.
Es läuft mehr oder weniger aufs gleiche Hinaus, außer das bei der Lösung in dem Thread das Headset irgentwo Systemweit in der Konfiguration steht und bei mir halt nicht.
Wenn es in dieser Lösung möglich währe, dass ich die ALSA Einstellung UND die pulseaudio Einstellung "load-module module-alsa-sink device=bluetooth" (in der default.pa, so wird es in dem Thread aber NICHT gemacht) fix festlegen könnte. Dann währe mein Problem gelöst, aber das geht NICHT und auch in dem Thread wird darüber geredet, dass man das Headset erst aktivieren muss, bevor man das alsa-sink Modul mit pactl lädt. Aber ich habe ja mein Headset nicht immer von vorne herein aktiviert, sondern nur manchmal.
Also ist diese Lösung nicht besser, aber auch nicht schlechter als meine. Ich persönlich finde meine aktuell besser, weil ich nicht noch ALSA benötige, sondern direkt über Pulseaudio gehen kann.

Ansonsten musst du wohl warten bis ich mir das Headset auch gekauft hab ;)

Ich kann es nur empfehlen :)

18

10.11.2009, 19:14

verdammt, das hab ich überlesen.

Das python skript soll dann alle paar Sekunden ausgeführt werden oder wie stellst du dir das vor, damit er das Headset automatisch findet.

Naja, wenn dus hinbekommst, dann vergiss bitte nicht das skript hier zu posten =)

mfg,
fab