Akzeptieren Sie automatisch Bluetooth-Kopplungen

9

Ich verwende einen kopflosen Raspberry PI 3 und möchte, dass er automatisch Pairings von jedem Gerät akzeptiert.

Ich habe diese Antwort in einer identischen Frage gesehen:

Automatische Annahme von Bluetooth-Verbindungen auf einem Pi 3

Aber es scheint ein bisschen veraltet zu sein und einige der verwendeten Befehle scheinen nicht zu existieren.

Ich verwende das 2016-05-27-raspbian-jessie.imgBetriebssystem-Image.

Gilad Naaman
quelle
Was meinst du mit "einige der verwendeten Befehle scheinen nicht zu existieren"? Was genau hat bei dir nicht funktioniert?
Dmitry Grigoryev
1
Wenn ich mich richtig erinnere, bluetooth-agentbin ich mir aber nicht sicher.
Gilad Naaman

Antworten:

7

Da bluetooth-agentes auf Jessie keinen Befehl gibt, besteht die moderne Methode darin, relevante Befehle an weiterzuleiten bluetoothctl. Basierend auf dieser SO-Frage sollte das folgende Skript das automatische Pairing ohne manuelle Pin-Eingabe ermöglichen:

sudo bluetoothctl <<EOF
power on
discoverable on
pairable on
agent NoInputNoOutput
default-agent 
EOF
Dmitry Grigoryev
quelle
1
Dies hat dazu beigetragen, dass mein RPi Zero W beim Booten auffindbar wurde. Ich hatte meine vorher Bluetooth aktualisiert Config über die Schritte hier skizziert und mit diesem Skript .
Charlesneath
Dies funktioniert, aber macht es Ihnen etwas aus, mir zu sagen, wie der Himbeer-Pi dem Gerät nach dem Pairing automatisch vertrauen kann? Danke
Daniele Segato
Es scheint, dass dies das Pairing ermöglicht, aber keine Verbindungen autorisiert, wenn kein Agent vorhanden ist. Ich glaube, der Agententeil dieses Skripts funktioniert nicht richtig. Wenn ich dieses Skript ausführe No agent is registered, scheint es, dass der default-agentBefehl zu schnell ausgeführt wird. Wenn ich die Befehle manuell eingebe, wird dieser Fehler nicht ausgegeben, aber nach dem Beenden bluetoothctlwird die Registrierung des Agenten aufgehoben und der Versuch, eine Verbindung herzustellen, schlägt fehl. Wenn ich bluetoothctllaufe, werde ich gefragt, ob ich der Verbindung vertrauen soll, was nicht so ist, NoInputNoOutputwie Sie hoffen würden ...
Matthijs Kooijman
Ich vermute, dass dies NoInputNoOutputnicht so sehr eine Autorisierungsrichtlinie ist, sondern Teil des Bluetooth-Protokolls, um herauszufinden, welche Art von Autorisierungsmechanismen (z. B. kann eine PIN verwendet werden?) Verfügbar sind.
Matthijs Kooijman
1
Wahrscheinlich, aber dann müssten Sie für alle Pairing-Versuche weiterhin Ja eingeben (und ich bin mir nicht ganz sicher, ob dies von stdin aus funktioniert oder ob das Skript versucht, intelligent zu sein und das Terminal direkt zu öffnen, anstatt stdin (das auch) passiert manchmal) ... Habe das aber nicht versucht, am Ende habe ich das Python-Skript von gist.github.com/mill1000/74c7473ee3b4a5b13f6325e9994ff84c
Matthijs Kooijman
0

Ich habe gerade eine Neuinstallation von verwendet 2016-09-23-raspbian-jessie-lite.img, um es ohne zusätzliche Updates zu versuchen. Nein, apt-get updatenein apt-get install bluez-utilsoder so. Dieser einzelne Befehl macht den Pi erkennbar und koppelbar. Ohne einen Agenten, der steuert, wer eine Verbindung herstellen kann, kann jeder:

sudo hciconfig hci0 piscan
FlippingBinary
quelle
0

Raspbian - Jessie

sudo apt-get install expect

xxxxx.sh

#!/usr/bin/expect -f
set prompt "#"
spawn sudo bluetoothctl
sleep 1
expect -re $prompt
sleep 1
send "agent NoInputNoOutput\r"
sleep 2
expect "Agent registered"
send "default-agent\r"
expect -re $prompt
sleep 3
interact
expect eof
Hyu
quelle
1
Eine Antwort, die nur aus Code besteht, ist nicht sehr explizit. Bitte erläutern Sie Ihre Antwort ausführlicher. Ziehen Sie auch Ihren Codeblock ein, damit er wie Code aussieht. Verwenden Sie nach Belieben 4 Leerzeichen oder einen Tabulator.
0

Ich hatte das gleiche Problem und fand, dass diese Methode funktioniert (RasPi 3, Modell B, Raspbian 9 Stretch).

Ich verwende Raspberry Pi als IoT EDGE-Gerät und benötige es, um Bluetooth-Paaranfragen ohne Intervention zu akzeptieren. Ich habe eine Android-App, die Textinformationen über Bluetooth an den Pi übermittelt, und für meine Problemstellung war ein Android-Gerät erforderlich , um eine Verbindung herzustellen.

Erstens verwende ich keine separaten Bluetooth-Agenten (kein Blueman, tatsächlich musste ich ihn entfernen)

Die .bashrc-Datei wurde unter bearbeitet

    sudo nano /home/pi/.bashrc

Am Ende wurden zwei Befehle hinzugefügt

    sudo hciconfig hci0 piscan 
    sudo hciconfig hci0 sspmode 1

piscan macht Raspberry Pi Bluetooth auffindbar

sspmode 1 aktiviert "Secure Simple Pairing" (sicheres einfaches Pairing). Dies ist die gleiche Methode, die auch von Ihren Bluetooth-Kopfhörern oder -Lautsprechern verwendet wird (im Grunde Geräte, die kein Display haben, auf dem Sie die PIN bestätigen können). Und da sich diese Befehle in .bashrc befinden, werden sie beim Booten ausgeführt.

Führen Sie das Bluetooth-Skript aus. Paar. Obwohl ich in einem Popup aufgefordert werde, dies zu bestätigen, kann ich mit meiner App Nachrichten zum und vom Pi senden

Hinweis: hci0 ist möglicherweise nicht durchgehend identisch. Es kann sich um hci1 oder hci2 handeln. Überprüfen Sie dies, indem Sie hciconfig auf Ihrer CLI ausführen

Dies ist fast wie eine Erfindung, und ich bin nicht sicher, ob es unbekannte Auswirkungen gibt, aber es funktioniert. Verbesserungen sind willkommen

Solanki vertiefen
quelle
-1

Sie können einen Blick auf den Quellcode von EcoDroidLink werfen . Es akzeptiert Bluetooth-Verbindungen, ohne dass Sie sich anmelden müssen.

BEARBEITEN: Auf vielfachen Wunsch finden Sie hier Code-Auszüge des edl_agent Moduls, das dies ermöglicht.

# - automate the agent for running on a headless Pi - to answer pair and connection requests without a blocking query

import dbus
import dbus.service
import dbus.mainloop.glib
import bluezutils

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

bus = None
device_obj = None
dev_path = None

def set_trusted(path):
    props = dbus.Interface(bus.get_object("org.bluez", path),
                    "org.freedesktop.DBus.Properties")
    props.Set("org.bluez.Device1", "Trusted", True)

def dev_connect(path):
    dev = dbus.Interface(bus.get_object("org.bluez", path),
                            "org.bluez.Device1")
    dev.Connect()

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

class Agent(dbus.service.Object):
    exit_on_release = True

    def set_exit_on_release(self, exit_on_release):
        self.exit_on_release = exit_on_release

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

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def AuthorizeService(self, device, uuid):
        printlog("AuthorizeService (%s, %s)" % (device, uuid))
        authorize = "yes" #ask("Authorize connection (yes/no): ")
        if (authorize == "yes"):
            return
        raise Rejected("Connection rejected by user")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="s")
    def RequestPinCode(self, device):
        printlog("RequestPinCode (%s)" % (device))
        set_trusted(device)
        return "0000" #ask("Enter PIN Code: ")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="u")
    def RequestPasskey(self, device):
        printlog("RequestPasskey (%s)" % (device))
        set_trusted(device)
        passkey = "0000" #ask("Enter passkey: ")
        return dbus.UInt32(passkey)

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ouq", out_signature="")
    def DisplayPasskey(self, device, passkey, entered):
        printlog("DisplayPasskey (%s, %06u entered %u)" %
                        (device, passkey, entered))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def DisplayPinCode(self, device, pincode):
        printlog("DisplayPinCode (%s, %s)" % (device, pincode))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ou", out_signature="")
    def RequestConfirmation(self, device, passkey):
        printlog("RequestConfirmation (%s, %06d)" % (device, passkey))
        confirm = "yes" #ask("Confirm passkey (yes/no): ")
        if (confirm == "yes"):
            set_trusted(device)
            return
        raise Rejected("Passkey doesn't match")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="")
    def RequestAuthorization(self, device):
        printlog("RequestAuthorization (%s)" % (device))
        auth = "yes" #ask("Authorize? (yes/no): ")
        if (auth == "yes"):
            return
        raise Rejected("Pairing rejected")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Cancel(self):
        printlog("Cancel")
Serge Stroobandt
quelle
1
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Jacobm001
@ Jacobm001 Ich habe Code-Auszüge hinzugefügt. Ist das jetzt besser
Serge Stroobandt