Wie Befehl von python an raspbian-programme (bluetoothctl) weitergeben?

  • Hallo,
    - mein Raspberry Pi B läuft auf Raspbian 8 Jessie Lite , Linux raspberrypi 4.1.19+ -

    ich bin ein python-Einsteiger und möchte folgendes realisieren:
    Ich bin dabei mit meinem Raspberry ein kleines Web-/Bluetoothradio zu bauen. Soweit klappt auch alles. In der Unix-Umgebung klappt das Bluetooth-Pairing auch, allerdings möchte ich dieses nun durch einen Taster über ein python-script starten und weiß nicht, wie ich per python das bluetoothctl-Programm bediene.
    Folgende Befehle gebe ich bei meinem Raspberry ein, um das Bluetooth-Pairing durchzuführen:

    Code
    bluetoothctl
    power on
    agent on
    scan on
    pair MAC-Adresse
    trust MAC-Adresse
    connect MAC-Adresse
    exit

    In dem python-script öffne ich bluetoothctl über
    os.system("bluetoothctl").
    Dadurch öffnet sich bluetoothctl auch ganz normal. Allerdings weiß ich nun nicht, wie ich die weiteren Befehle an das Programm weitergebe. Probiert habe ich nach langem Suchen bereits
    os.system("echo -e 'power on' | bluetoothctl")
    und
    print >> os.system('bluetoothctl'), 'power on' ohne Erfolg. Es öffnet sich das Programm zwar, aber 'power on' wird nicht weitergegeben (den Fehler habe ich leider gerade nicht zur Hand, aber bei dem ersten Befehl beschwerte er sich, dass -e 'power on' kein gültiger Befehl sei.

    Könnt ihr mir sagen, wie ich per python Befehle an bluetoothctl weitergebe?

    Vielen Dank schonmal,
    >Dev<

    Edited once, last by Dev (May 9, 2016 at 10:47 AM).

  • Wie Befehl von python an raspbian-programme (bluetoothctl) weitergeben?? Schau mal ob du hier fündig wirst!

  • Bitte nicht os.system verwenden, sondern das deutlich bessere subprocess-Modul.

    Damit *kann* das hier funktionieren:

    Ob das wirklich klappt haengt von bluetoothctl ab - wenn es ein Terminal zur Eingabe erwartet, wirst du mit subprocess nicht gluecklich werden. Dann kannst du das ueber das Python-Modul pexpect probieren, das aber extra installiert werden muss.

  • Vielen Dank für die schnelle Antwort!
    Wenn ich deinen code in mein script einsetze kommt folgende Meldung:
    (bluetoothctl:1423): GLib-CRITICAL **: Source ID 27 was not found when attempting to remove it
    Soweit ich das sehe, erwartet bluetoothctl allerdings auch ein Terminal-Input. Folgendes habe ich mit pexpect versucht:

    Code
    import pexpect
    child = pexpect.spawn('bluetoothctl')
    child.expect ('*')             #bluetoothctl zeigt # und ein Leerzeichen an in Erwartung von Input. 
    child.sendline ('power on')
    child.sendline ('quit')

    Als Fehler bekomme ich:

    Kann es sein, dass er mit dem #-Zeichen nicht klar kommt?
    Automatisch zusammengefügt:

    So, nach etwas einarbeiten in pexpect habe ich es hinbekommen. Danke nochmal für die Hilfe. Falls jemand anders ein ähnliches Problem hat (oder noch Verbesserungsvorschläge hat, zum Beispiel wie man es kürzer und schöner gestalten kann) hier meine Lösung:

    Edited once, last by Dev (May 8, 2016 at 6:17 PM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!