Automatische Annahme von Bluetooth-Verbindungen auf einem Pi 3

14

Ich möchte eine Plattform für mein Auto entwickeln, die automatisch alle Geräte verbindet, die versuchen, über Bluetooth eine Verbindung zum Pi herzustellen. Momentan erfordert es ein Pairing, das vom Pi akzeptiert wird. In diesem Fall wird jedoch kein Bildschirm angezeigt, sodass dies automatisch erfolgen muss. Wie kann ich das erreichen?

Oliver Kuchies
quelle
könnten sie bitte erläutern, welches pi-modell sie haben, da nur das pi 3 von bluetooth ohne externe hardware ist?
Mohammad Ali
Raspberry Pi 3 Model B - Eingebaut in Bluetooth
Oliver Kuchies
Sie erwarten also nur, dass der Pi ständig sendet und Pairing-Verbindungen von Ihrem Telefon akzeptiert? Verstehen Sie die Auswirkungen auf die Sicherheit? richtig? Und ist es auch eine akzeptable Lösung, ein kleines Python-Skript zu schreiben, um diese Aufgabe zu erledigen?
Mohammad Ali
Ja, aber um es sicherer zu machen, schlage ich vor, zu zeigen, wie man sich auf eine Verbindung beschränkt, bevor man sie wieder entdeckt. Sie können auch Sicherheitsaspekte hinzufügen, um anderen zu helfen :)
Oliver Kuchies

Antworten:

12

( Beachten Sie, dass diese Antwort ab Raspbian Jessie nicht mehr funktioniert, da bluez den Befehl bluetooth-agent entfernt hat. )

Derzeit geben Sie an, dass Sie eine Verbindung zum Pi herstellen können, für den Pairing-Vorgang jedoch einen Monitor benötigen.

Hinweis: Das Akzeptieren einer Verbindung ist eine unglaublich unsichere Idee. Wenn Sie nur eine begrenzte Anzahl von Geräten verwenden, ist es viel sinnvoller, sie als vertrauenswürdige Geräte einzurichten, da dies die Verbindung zu Ihren Mac-Adressen einschränkt, aber keine neuen zulässt Geräte, die ohne Monitor hinzugefügt werden sollen

Die Befehle, die Sie ausführen müssen, um alle Verbindungen zum Pi zu akzeptieren, es erkennbar zu machen und einen vorhersehbaren Pin festzulegen, sind im Folgenden aufgeführt:

Hinweis: Möglicherweise müssen Sie die Null in hci0 der Bluetooth-Nummer Ihres Geräts ändern .

hciconfig hci0 up
hciconfig hci0 sspmode 1
hciconfig hci0 piscan
sudo bluetooth-agent 1234

Nachdem Sie diese Befehle ausgeführt haben und überprüft haben, ob sie wie erwartet funktionieren, können Sie sie einrichten, um mit dem Booten Ihres Pi zu beginnen.

  1. Zunächst erstellen wir eine Bash-Datei, indem wir den Befehl ausführen sudo nano mohammadIsAmazing.sh
  2. Wir tragen nun folgendes in diese Datei ein:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. Nun speichern und schließen wir unsere Datei mit dem control key and x

  4. Wir öffnen die Datei /etc/rc.localmit dem folgenden Befehl:

    Sudo nano /etc/rc.local
    
  5. Jetzt geben wir den Befehl ein, in dem unser Bash-Skript ausgeführt werden soll /etc/rc.local

    sudo /path/to/script/mohammadIsAmazing.sh &
    

    Hinweis: Sie müssen den Befehl vor die letzte Zeile in /etc/rc.local stellen, die Folgendes enthält: exit 0

  6. Wir speichern und schließen diese Datei und starten den Pi neu.

Nebenbei bemerkt: Wählen Sie einen zufälligen Pin, um die Sicherheit geringfügig zu erhöhen

Ein weiterer Hinweis: Wenn Sie den Bluetooth-Gerätenamen ändern möchten, müssen Sie eine Datei mit /etc/machine-infodem Namen erstellen, die Folgendes enthalten sollte:

PRETTY_HOSTNAME=device-name

Dann lauf service bluetooth restarthinterher

Mohammad Ali
quelle
2
Denken Sie daran , dass &am Ende der Zeile in der rc.localDatei - ohne es RPI nicht Boote als die Schale wartet das Skript beendet die /path/to/script/mohammadIsAmazing.shAusführung zu beenden , bevor es weiter - und wenn es nicht das Boot nicht beenden Sie nicht in der Lage sein, sshin es, um Dinge zu beheben ...!
SlySven
Hallo Mohammad. sudo bluetooth-agent ist ein unbekannter befehl
Oliver Kuchies
@OliverKuchies versuchen apt-get install bluetooth bluezzuerst zu rennen und sagen mir, ob das für Sie funktioniert.
Mohammad Ali
Ich habe versucht zu rennen bluetooth-agentund konnte es auch nicht finden. Das Installieren der Pakete hat das Problem nicht behoben.
Gilad Naaman
@ GiladNaaman gut, was OS, verwenden Sie?
Mohammad Ali
0

Basierend auf dem, was ich verstehe, was Sie benötigen, ist ein Slave-Bluetooth-Modul. Sie können das beliebte HC-06-Modul verwenden und es mit dem Himbeer-Pi über einen Pegelumsetzer mit den TX- und RX-Pins des Pi verbinden. Verwenden Sie ein Python-Skript, um die seriellen Daten zu lesen und nach Bedarf zu verarbeiten

evolutionizer
quelle
Ich würde annehmen, dass es ein Python-Modul geben würde, das ausgeführt werden könnte, sobald ein Bluetooth-Gerät eine Verbindung herstellt, anstatt Hardware anzuschließen. Ich bin mit dem Pi nicht allzu schäbig, noch ein Anfänger, aber es scheint, als wäre es ein logischer Ansatz
Oliver Kuchies
@OliverKuchies Ich habe unter Linux noch nie Bluetooth programmiert (oder verwendet!), Aber Sie suchen nach einer Art Daemon-Dienst, der auf solche Dinge reagiert. Um es näher zu erläutern: Ein Python-Modul wird nicht von selbst ausgeführt, sondern muss von einem Prozess verwendet werden, der bereits ausgeführt wird. Das ist ein Daemon. Die Suche nach "bluetooth linux daemon" bringt einige Dinge zum Vorschein. Ich glaube, ich habe bemerkt, dass systemdes eines gibt, vermutlich müssen Sie es so konfigurieren, dass es sich auf bestimmte Arten verhält.
Goldlöckchen
@OliverKuchies werfen Sie einen Blick auf blog.miguelgrinberg.com/post/…
evolutionizer
0

Ich werde die Auswirkungen auf die Sicherheit nicht diskutieren oder nicht, aber so mache ich es:

  1. Erstellen Sie ein Skript mit dem Namen auto_connect.sh mit dem folgenden Inhalt:
#!/bin/bash
bt-adapter --set Powered 1
bt-adapter --set DiscoverableTimeout 0
bt-adapter --set Discoverable 1
bt-adapter --set PairableTimeout 0
bt-adapter --set Pairable 1
/path/to/python_script.py >/dev/nul 2>dev/nul &
list=""
bt-device -l | grep -E -o '[[:xdigit:]]{2}(:[[:xdigit:]]{2}){5}' | { while read line
do
       list="$list connect $line
"
done
bluetoothctl << EOF
$list
EOF
}
  1. Erstellen Sie die Datei /path/to/python_script.py mit folgendem Inhalt:
#!/usr/bin/python3

from __future__ import absolute_import, print_function, unicode_literals

#import gobject
from gi.repository import GObject as gobject

import re
import dbus
import dbus.mainloop.glib
import subprocess

relevant_ifaces = [ "org.bluez.Adapter1", "org.bluez.Device1" ]

def property_changed(interface, changed, invalidated, path):
    iface = interface[interface.rfind(".") + 1:]
    for name, value in changed.iteritems():
        val = str(value)
        print("{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name, val))

def interfaces_added(path, interfaces):
    for iface in interfaces:
        if not(iface in relevant_ifaces):
            continue
        try:
            found = re.search('dev\_(..\_..\_..\_..\_..\_..)', path).group(1)
        except AttributeError:
            found = '' # apply your error handling
            mac=found.replace("_",":")
            cmd='echo -e "trust '+mac+' \\nconnect '+mac+' \\nquit" | bluetoothctl'
            subprocess.call(cmd, shell=True)

def interfaces_removed(path, interfaces):
    for iface in interfaces:
        if not(iface in relevant_ifaces):
            continue
        print("{Removed %s} [%s]" % (iface, path))

if __name__ == '__main__':
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

    bus = dbus.SystemBus()

    bus.add_signal_receiver(interfaces_added, bus_name="org.bluez", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesAdded")

    bus.add_signal_receiver(interfaces_removed, bus_name="org.bluez", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesRemoved")

    mainloop = gobject.MainLoop()
    mainloop.run()
  1. Stellen Sie je nach verwendetem Betriebssystem sicher, dass Sie die Datei auto_connect.sh beim Booten ausführen.

Was das alles bewirkt:

  1. Legt fest, dass das Gerät immer erkennbar ist.

  2. Wenn ein Gerät mit ihm gekoppelt wird, markiert es es automatisch als vertrauenswürdiges Gerät und stellt eine Verbindung zu ihm her.

  3. Bei jedem Start wird die Liste der bekannten Geräte durchlaufen und versucht, eine Verbindung zu ihnen herzustellen.

Bitte beachten Sie, dass dieser Ansatz direkt gegen jede Art von Sicherheit verstößt. Es kann jedoch Fälle geben, in denen Sie genau das erreichen möchten.

Emil Borconi
quelle
-1

In Raspberry Pi3 Model B gibt es eine Bulit in Bluetooth und WiFi. Mit OBEX Server können Sie die Dateien von anderen Geräten empfangen, ohne jedes Mal nach einer Pairing-Anfrage zu fragen. Sie müssen das erste Mal ein Pairing mit diesem Gerät durchführen und ein Verzeichnis erstellen, in dem die Dateien die ganze Zeit empfangen werden.

Folgen Sie einfach dem unten stehenden Link.

https://www.raspberrypi.org/forums/viewtopic.php?p=963751#p963751

Mihit Gandhi
quelle
1
Hast du die Frage gelesen? Das OP fragt speziell, wie das manuelle Pairing vermieden werden soll, da kein Bildschirm angezeigt wird. Sie schlagen vor, dass er das Pairing trotzdem durchführen soll.
Dmitry Grigoryev
Sie müssen das Pairing nur einmal durchführen, damit Sie zum ersten Mal eine Verbindung zum Display herstellen können.
Mihit Gandhi
Sie müssen es nur einmal pro Gerät tun . Und wenn jemand neu darauf zugreifen möchte, bedeutet dies, dass er es von jedem Ort aus ausgräbt und an einen Monitor und eine Tastatur anschließt. Deshalb sucht er nach einer Möglichkeit, dies zu vermeiden.
Different55