Seite 1 von 1

Bluetooth eigener Agent

Verfasst: Dienstag 27. April 2021, 11:35
von mothome
Hallo zusammen,

ich wollte von einem Raspberry per Bluetooth einen HC06 kontaktieren. Je nach Aufruf auf verschiedene HC06. Angeben wollte ich Bluetooth-Adresse und Pincode und damit automatisiert die Verbindung aufbauen.

Zu diesem Zweck hab ich ein Simple-Agent-Beispiel angepasst. Jedoch als Neuling bei Sockets und DBus unter Python.

Code: Alles auswählen

from bluetool import Bluetooth
import bluetooth
import sys
from gi.repository import GObject
import dbus
import dbus.service
import dbus.mainloop.glib
from optparse import OptionParser

BUS_NAME = 'org.bluez'
AGENT_INTERFACE = 'org.bluez.Agent1'
AGENT_PATH = "/test/agent"

bus = None
device_obj = None
dev_path = None

bd_addr = "12:34:56:78:90:AB"
bd_pin = "1234"

class Rejected(dbus.DBusException):
    _dbus_error_name = "org.bluez.Error.Rejected"

class Agent(dbus.service.Object):
    pin = "1234"

    def setPin(self, pin):
        self.pin = pin

    @dbus.service.method(AGENT_INTERFACE, in_signature="", out_signature="")
    def Release(self):
        print("Release")
        mainloop.quit()

    @dbus.service.method(AGENT_INTERFACE, in_signature="o", out_signature="s")
    def RequestPinCode(self, device):
        print("RequestPinCode (%s)" % (device))
        return(self.pin)
        
        
if __name__ == '__main__':
    bt = Bluetooth()

    devices = bt.get_paired_devices()
    print(devices)

    bd_addrb = bytes(bd_addr, 'utf-8')
    if(next((item for item in devices if item["mac_address"] == bd_addrb), False)):
        print("paired")
        port = 1

        sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
        sock.bind(("", port))
        try:
            sock.connect((bd_addr, port))
            sock.send("hello!!")
            sock.close()
        except(bluetooth.BluetoothError):
            print("bt-error")
        except:
            print("Fehler")
    else:
        print("not paired")

        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
        
        bus = dbus.SystemBus()
        path = "/test/agent"
        agent = Agent(bus, path)

        agent.setPin(bd_pin)

        obj = bus.get_object(BUS_NAME, "/org/bluez");
        manager = dbus.Interface(obj, "org.bluez.AgentManager1")
        manager.RegisterAgent(path, "KeyboardDisplay")

        print("Agent registered")

        port = 1
        sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
        sock.bind(("", port))
        try:
            sock.connect((bd_addr, port))
            sock.send("hello!!")
            sock.close()
        except(bluetooth.BluetoothError):
            print("bt-error")
        except:
            print("Fehler")
        manager.RequestDefaultAgent(path)
Wenn ich starte kommt der Standard-Agent mit dem Pin-Eingabe-Fenster. Mein Agent scheint nicht angesprochen zu werden. Wo liegt der Fehler?

Re: Bluetooth eigener Agent

Verfasst: Dienstag 27. April 2021, 14:12
von __deets__
Ich sehe hier https://github.com/pauloborges/bluez/bl ... nt-api.txt eine ganze Reihe von anderen Methoden, die so ein Agent auch anbietet. Vielleicht liegt es daran. Und dann kann man wohl auch bestehende Agenten de-registrieren. Keine Ahnung, ob das vielleicht notwendig ist.

Re: Bluetooth eigener Agent

Verfasst: Dienstag 27. April 2021, 18:14
von mothome
Ich hab jetzt mal wieder alle Methoden aus dem Beispiel eingebaut. Alle mit print versehen, dass ich eventuelle Aktivität sehen kann. Jedoch kein Unterschied. Keine Funktion meines Agents

Re: Bluetooth eigener Agent

Verfasst: Dienstag 27. April 2021, 18:18
von __deets__
Und den registrierten zu entfernen?

Re: Bluetooth eigener Agent

Verfasst: Mittwoch 28. April 2021, 05:35
von mothome
Wie soll das gehen? Hab leider keine unregister Methode gefunden.

Re: Bluetooth eigener Agent

Verfasst: Mittwoch 28. April 2021, 07:50
von __deets__
Steht in dem Dokument das ich verlinkt habe.

Re: Bluetooth eigener Agent

Verfasst: Mittwoch 28. April 2021, 18:34
von mothome
Wer lesen kann...

Aber entscheidender ist die RequestDefaultAgent Methode. Die soll doch den Default Agent durch meinen Agent ersetzen.

Nur kommt jetzt ein 115 - Operation now in progress als Bluetooth-Fehler nach einem Connection Timeout. Mein Agent wird immer noch nicht angesprungen.

Re: Bluetooth eigener Agent

Verfasst: Sonntag 2. Mai 2021, 17:24
von mothome
Ich glaube, mir ist das Problem jetzt klar.
Es wird kein unabhängiger Deamon erzeugt. Also ist der Code noch in Ausführung und wartet auf die Freigabe der Verbindung während die Anfrage an den Agent kommt. Hier muss der Agent in einen eigenen Task.

Re: Bluetooth eigener Agent

Verfasst: Sonntag 2. Mai 2021, 17:34
von __deets__
Du musst auch einen mainloop laufen lassen, sonst kann da natuerlich nix aufgerufen werden