Bluetooth eigener Agent

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mothome
User
Beiträge: 17
Registriert: Donnerstag 20. Oktober 2016, 13:56

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?
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
mothome
User
Beiträge: 17
Registriert: Donnerstag 20. Oktober 2016, 13:56

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
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und den registrierten zu entfernen?
mothome
User
Beiträge: 17
Registriert: Donnerstag 20. Oktober 2016, 13:56

Wie soll das gehen? Hab leider keine unregister Methode gefunden.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Steht in dem Dokument das ich verlinkt habe.
mothome
User
Beiträge: 17
Registriert: Donnerstag 20. Oktober 2016, 13:56

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.
mothome
User
Beiträge: 17
Registriert: Donnerstag 20. Oktober 2016, 13:56

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.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst auch einen mainloop laufen lassen, sonst kann da natuerlich nix aufgerufen werden
Antworten