Python Skript um Bluetooth Verbindung herzustellen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich möchte mein Bluetooth Gamepad (idroid:con) beim starten des Pi's automatisch verbinden lassen. Auf meinem Pi ist Retropie mit automatischem boot in die Emulationstation installiert.

    Wer nicht viel lesen will, einfach ab "--Frage--" anfangen mit lesen :)

    --Hintergrund--
    Das Gamepad lässt sich über diverse Bash-Kommandos welche ich über SSH eingebe verbinden, allerdings funktioniert nur bei einem bestimmten Kommando anschließend auch die Steuerung der Emulationstation und der Spiele.
    Das Kommando ist "bluez-test-input connect 00:11:22:33:44:55" wobei "00:11:22:33:44:55" die MAC-Adresse des Gamepads ist.
    Die Verbindung entspricht derselben wie wenn ich im Bluetooth Manager (in der grafischen Ansicht) das Bluetooth Device mit "Connect to input service" verbinde. Es wird also kein Pin zum pairing benötigt.
    So weit so gut.
    Um die Verbindung zu automatisieren habe ich eine startup.sh geschrieben welche genau den oben erwähnten Befehl ausführt. Wenn ich die startup.sh per SSH ausführe funktioniert die Verbindung. Um die startup.sh während des bootens auszuführen, lasse ich diese in der Datei rc.local aufrufen. Wenn ich nun den Pi boote (Strom aus -> Strom ein) sehe ich zwar das die startup.sh ausgeführt wird, aber ich bekomme eine Fehlermeldung, dass die Verbindung nicht hergestellt werden konnte (Connection reset by Peer 104). Bei einem reboot per Bash-Kommando hat es ab und zu funktioniert.
    Nun denke ich, ok kann sein, vielleicht ist irgendwas während dem booten nicht geladen oder so deshalb der Ansatz mit dem Python-Skript.

    --Frage--
    Ich habe nun die Idee anstatt dem einmaligen Bash-Kommando während dem Boot, ein Python-Skript im Hintergrund ausführen zu lassen. Das Skript soll nun solange versuchen eine Verbindung mit dem Gamepad herzustellen, bis eine hergestellt ist.
    Mein Ansatz (habe überhaupt keine Erfahrung mit Python):

    #/usr/bin/env python
    import bluez
    import subprocess
    import time

    while not input.connected:
    subprocess.call(["bluez-test-input","connect","00:11:22:33:44:55"])
    print "connecting .."
    time.sleep(5)

    Nun bin ich mir bei der Einbindung der Bibliotheken überhaupt nicht sicher, da auch kein bluez gefunden wird wenn ich das Skript ausführe.
    Zudem ist die Abfrage der Verbindung nur geraten :) Habe versucht das zu benutzen: http://maemo.org/api_refs/5.0/5.0-final/bluez/input-api.txt
    Da steht ganz unten was von Propreties boolean connected [readonly].
    Aber ich weiß nicht mal ob ich auf dem richtigen Weg bin.

    Ich wäre euch sehr dankbar für Hinweise und Ideen wie das Python-Skript geschrieben werden kann!

  • Python Skript um Bluetooth Verbindung herzustellen? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    Hallo, na da wollen wir doch mal versuchen etwas Licht ins Dunkel zu bringen.
    Das bluez modul für python heisst python-bluez und müsste über apt-get oder pip installierbar sein.

    Da du aber einen shell befehl per subprocess aufrufst brauchst du das python bluez modul nicht.
    Ich geh mal davon aus "bluez-test-input" bei erfolgreicher Verbindung auch ne Meldung a la "Device connected" auf der Konsole ausgibt, auf die ich abprüfen würde.
    Hier mal ein Anfang

  • Danke für die Antwort!
    bluez-input-test gibt bei erfolgreicher Verbindung keine Meldung aus. Nur bei Misserfolg gibt es eine Meldung wie beispielsweise "Connection reset by Peer" oder "Already connected".

    Ich habe deinen Code ausprobiert jedoch bekomme ich einen Syntax-Fehler beim Funktionsaufruf, also bei while not bluetooth_check...
    Ohne die Deklaration der Funktion geht das Skript bis zu "blue.communicate()". Da gibts dann die Meldung, dass blue nicht definiert ist. Habe "blue" zu "bt" geändert dann hats funktioniert aber "out.find" hat mir nie was gefunden.

    Kann es sein, dass da der Befehl "bluez-input-test" nur Fehlermeldungen ausgibt nichts in stdout steht? "error.find" habe ich noch nicht ausprobiert, versuche ich dann morgen. Meine vorübergehende Lösung ist einfach eine Dauerschleife die immer wieder den Befehl zum Verbinden ausführt. Ich hoffe nur das das nicht zu sehr den Prozessor beansprucht.

    Hast du eventuell eine gute Quelle wo der Umgang mit den Ausgaben stdout und stderr beschrieben wird? Sind ja wahrscheinlich keine einfachen Strings oder?

  • Danke für die Hilfe!
    Jetzt funktionierts :)

    Einmal editiert, zuletzt von wu-shu (8. Oktober 2013 um 14:35)

  • Hallo wu-shu,

    ich möchte mit dem an meinem Pi angesteckten
    BT-Dongle mein Smartphone erkennen.
    ALso nur ob es da ist oder nicht.
    Leider komme ich mit deinem Script nicht weiter.Was ist sonst noch zu tun
    damit es funzt.

    Für Hilfe wäre ich dankbar!

    GJo

  • Hallo dbv

    Folgendes habe ich:
    sudo apt-get install bluetooth bluez-utils blueman
    reboot
    lsusb mit der Antwort:
    Bus 001 Device 006: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)

    /etc/init.d/bluetooth status mit der Antwort:
    "[ ok ] bluetooth is running"

    hcitool scan....
    findet keine Geräte!

    Auf dem Pi Desktop finde ich nichts mit Bluetooth um ein Gerät
    zu koppeln.
    Wenn ich unter Einstellungen den BT-Manager anklicke geschieht gar nichts.

    Hm, komme da nicht weiter.

    Gruß

  • hallo zusammen

    Ich würde gerne meinen RP3 über BT mit meinem BT Lautsprecher über ein Python Skript verbinden.

    Kann ich dazu einfach folgendes Skript verwenden? (00:11:22:33:44:55 muss ich durch die MAC Adresse der Lautsprecher ersetzen)

    #/usr/bin/env python
    import subprocess

    while 1:
    bt = subprocess.Popen(["bluez-test-input","connect","00:11:22:33:44:55"],
    stdout = subprocess.PIPE,
    stderr = subprocess.PIPE
    )
    out, error = bt.communicate()
    if error.find("org.bluez.Error") == -1:
    break

    Würde das funken? Muss ich sonst noch etwas vorab installieren?
    Od wie würde der Code aussehen damit das funkt?

    Danke
    VG Zacki

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!