Ich mochte den Umfrageansatz nicht und grub ein bisschen in Bluez und DBus. Am Ende habe ich folgendes Skript geschrieben:
#!/usr/bin/python
import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
import subprocess
# ID of the device we care about
DEV_ID = '00_1D_54_AB_DC_72'
dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)
# Figure out the path to the headset
man = bus.get_object('org.bluez', '/')
iface = dbus.Interface(man, 'org.bluez.Manager')
adapterPath = iface.DefaultAdapter()
headset = bus.get_object('org.bluez', adapterPath + '/dev_' + DEV_ID)
# ^^^ I'm not sure if that's kosher. But it works.
def cb(iface=None, mbr=None, path=None):
if ("org.bluez.Headset" == iface and path.find(DEV_ID) > -1):
print 'iface: %s' % iface
print 'mbr: %s' % mbr
print 'path: %s' % path
print "\n"
print "matched"
if mbr == "Connected":
subprocess.call(["clementine", "--play"])
print 'conn'
elif mbr == "Disconnected":
subprocess.call(["clementine", "--stop"])
print 'dconn'
headset.connect_to_signal("Connected", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')
headset.connect_to_signal("Disconnected", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')
loop = gobject.MainLoop()
loop.run()
DEV_ID
vor der Verbindung Bescheid wissen . Aber was ist, wenn Sie über alle Verbindungsereignisse informiert werden möchten?Um eine erfolgreich eingerichtete Bluetooth-Verbindung zu finden, können wir ausführen
Dadurch wird die SDB-Verbindung auf eine Verbindung zu der angegebenen MAC-Adresse getestet. Es kann einige Zeit dauern, bis das Browsen mit einem Fehler wie z. B. abläuft
Wir kennen den genauen Zweck Ihres Skripts nicht, aber höchstwahrscheinlich möchten Sie Audio über Clementine wiedergeben, wenn ein Headset angeschlossen wurde.
Dann könnten wir nur sehen, ob es eine Bluetooth-Audio-Senke mit gibt
Wo
xx_xx_xx_xx_xx_xx
ist die MAC-Adresse (:
muss durch ersetzt werden_
). Der Ausgang zeigt Ihnen dann an, ob eine Bluetooth-Audio-Senke verfügbar ist oder nichts, wenn dies nicht der Fall ist.In dieser Antwort erfahren Sie, wie Sie Audio auf diese Senke umschalten.
Stream2ip
Mit stream2ip können wir einen Shell-Befehl oder ein Skript definieren, das ausgeführt wird, nachdem eine Verbindung hergestellt wurde. Es gibt auch eine Option, um einen unterstützten Media Player automatisch zu starten, nachdem eine Verbindung hergestellt wurde:
Stream2ip versucht außerdem, den aktuell ausgeführten Wiedergabestream erneut mit dem Bluetooth-Audiogerät zu verbinden, falls die Verbindung unterbrochen wurde.
quelle
sdptool browse <device-id>
bis ich einen Rückkehrcode 0 erhalte und dann mein Skript starte, oder? Gibt es eine Möglichkeit, dies ohne Umfragen zu tun?@Erigami Deine Antwort hat mir sehr geholfen, aber damit es funktioniert, müsste ich ein paar Änderungen vornehmen. Ich benutze Ubuntu 14.04.
Wenn dies immer noch nicht funktioniert, verwenden und überwachen Sie den System-Dbus.
d-feet
kann weiter verwendet werden. Es ist ein GUI-Tool zum Beobachten von Dbus-Objekten.quelle
Hier ist ein weiteres Beispiel für die Überwachung aller Bluetooth-Geräte. Es muss keine bestimmte MAC-Adresse angegeben werden. Dieser Ansatz sorgt dafür, dass die Einstellung für den X-Eingang auch dann erhalten bleibt, wenn Sie sich an- oder abmelden, aussetzen / aufwecken und Ihr Bluetooth-Gerät verbinden / trennen.
Ich habe eine Thinkpad-Bluetooth-Kompakttastatur und möchte jedes Mal, wenn die Tastatur angeschlossen ist, einen Befehl xinput ausführen, um die Geschwindigkeit des Trackpoints anzupassen. Hier sind die Schritte.
Laden Sie den Code von Github bluetooth-ruunner herunter . Danksagung an diejenigen , die dies zum ersten Mal für Raspberry Pi geschrieben haben. Ändern Sie den folgenden Abschnitt des Codes, um Ihre benutzerdefinierten Befehle auszuführen.
In meinem Fall entspricht dies einem Anruf vom Terminal.
Speichern Sie die Änderung. Versuchen Sie, Ihre Skripte nach auszuführen
Verbinden und trennen Sie Ihr Bluethooth-Gerät. Sie sollten die entsprechende Meldung auf dem Bildschirm sehen.
Nun machen Sie Ihre Datei ausführbar und kopieren Sie sie in einem Verzeichnis in Ihrem
$PATH
sagen~/bin/
.Stellen Sie nun sicher, dass Sie das Skript von einer beliebigen Stelle im Terminal ausführen können (stellen Sie sicher, dass es sich in Ihrem Suchpfad befindet).
Starten Sie die
Startup Applications
aus dem Ubuntu-Menü. Fügen Sie dem Start Ihre Skripte hinzu.Jetzt gibt es nur noch ein Problem. Wenn Sie sich anmelden, fangen die Skripte möglicherweise nicht das erste Bluetooth-Ereignis ab. Dies liegt daran, dass Ihr Bluetooth-Gerät möglicherweise verbunden ist, bevor Ihr Skript im Hintergrund initialisiert wird.
Um dies zu lösen, fügen Sie Ihren benutzerdefinierten Befehl direkt in ein
Startup Applications
. In meinem Fall ist es der folgende Befehl:Und jetzt können Sie Ihr Bluetooth-Gerät mit Ubuntu genießen.
quelle
Sie schreiben "Wenn Ihr Headset mit Ihrem Computer verbunden ist". Wie macht es das automatisch? Wenn Sie es manuell auslösen müssen, können Sie es auch zu einem Skript machen und dann das Skript ausführen, nachdem die Verbindung hergestellt wurde. So habe ich das Standardausgabegerät für meinen Bluetooth-Empfänger festgelegt (damit ich die Lautstärke mit den Hardwaretasten ändern kann):
Wo
bluetooth-connect
sieht das so aus: https://github.com/sblask/dotfiles/blob/c39d37ad67947b358b4a079cb41ae6f9e4a081d8/.bin/bluetooth-connect.symlink Es wird vorausgesetzt, dass alles gepaart und bereit ist, eine Verbindung herzustellen. Sie finden die MAC-Adresse in blueman oder indem Sie ausführen,pacmd list-sinks | grep -e 'name:' -e 'index'
wenn das Bluetooth-Gerät verbunden ist. Du würdest laufen wollenbluetooth-connect && your-script
.your-script
wird nur ausgeführt, wenn die Verbindung erfolgreich hergestellt wurde.quelle