Automatyczne przyjmowanie połączeń Bluetooth w Pi 3

14

Chcę opracować platformę dla mojego samochodu, która automatycznie łączy każde urządzenie, które próbuje połączyć się z Pi przez bluetooth. Obecnie wymaga akceptacji parowania przez Pi, ale w tym przypadku nie będzie ekranu, więc będzie musiał to zrobić automatycznie. Jak mogę to osiągnąć?

Oliver Kuchies
źródło
czy mógłbyś rozwinąć model posiadanego pi, ponieważ tylko pi 3 jest carib; e bluetooth bez zewnętrznego sprzętu?
Mohammad Ali
Raspberry Pi 3 Model B - Wbudowany bluetooth
Oliver Kuchies
Więc wszystko, czego oczekujesz, to to, że Pi będzie ciągle nadawać i akceptować wszelkie połączenia parowania tworzone przez Twój telefon? rozumiesz konsekwencje dla bezpieczeństwa? dobrze? A także czy pisanie małego skryptu w języku Python, aby wykonać zadanie, jest akceptowalnym rozwiązaniem?
Mohammad Ali,
Tak, ale aby było bardziej bezpieczne, sugeruję pokazać, jak ograniczyć się do jednego połączenia przed ponownym odkryciem. Dodaj też implikacje dla bezpieczeństwa, aby odpowiedzieć, aby pomóc innym :)
Oliver Kuchies

Odpowiedzi:

12

( Pamiętaj, że ta odpowiedź nie działa już od Raspbian Jessie, ponieważ bluez usunął polecenie bluetooth-agent )

Więc obecnie twierdzisz, że możesz połączyć się z Pi w porządku, ale potrzebujesz monitora do procesu parowania.

Uwaga: zaakceptowanie dowolnego połączenia jest niezwykle niepewnym pomysłem, a jeśli używasz tylko ograniczonego zestawu urządzeń, skonfigurowanie ich jako zaufanych urządzeń miałoby o wiele większy sens, ponieważ ograniczyłoby połączenie z Twoimi adresami Mac, ale nie pozwoliłoby na nowe urządzenia do dodania bez monitora

Ale w każdym razie polecenia, które musisz uruchomić, aby zaakceptować wszystkie połączenia z Pi, aby można je było wykryć i ustawić przewidywalny pin, są wymienione poniżej:

Uwaga: być może trzeba zmienić zero hci0 na numer Bluetooth urządzenia.

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

Teraz po uruchomieniu tych poleceń i sprawdzeniu, czy działają zgodnie z oczekiwaniami, możemy przejść do ich konfiguracji, aby uruchamiała się przy uruchamianiu twojego Pi.

  1. Zaczynamy od utworzenia pliku bash poprzez uruchomienie polecenia sudo nano mohammadIsAmazing.sh
  2. Teraz wprowadzamy do tego pliku:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. Teraz zapisujemy i zamykamy nasz plik za pomocą control key and x

  4. Otwieramy plik /etc/rc.localza pomocą następującego polecenia:

    Sudo nano /etc/rc.local
    
  5. Teraz wpisujemy polecenie uruchomienia naszego skryptu bash /etc/rc.local

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

    Uwaga: musisz umieścić polecenie przed ostatnim wierszem w /etc/rc.local, który zawiera: exit 0

  6. Teraz zapisujemy i zamykamy ten plik, a następnie ponownie uruchamiamy Pi.

Na marginesie: pamiętaj, aby wybrać losowy pin, aby nieznacznie zwiększyć bezpieczeństwo

Z drugiej strony: Jeśli chcesz zmienić nazwę urządzenia Bluetooth, musisz utworzyć plik o nazwie, /etc/machine-infoktóry powinien zawierać następujące elementy:

PRETTY_HOSTNAME=device-name

Potem biegnij service bluetooth restartpo tym

Mohammad Ali
źródło
2
Pamiętaj, że &na końcu linii w rc.localpliku - bez niej nie może zakończyć RPI uruchamianie jako czeka na skrypt powłoki /path/to/script/mohammadIsAmazing.sh, aby zakończyć przed wykonaniem nadal - a jeśli nie ukończy rozruch nie będzie w stanie sshw to w celu naprawy rzeczy ...!
SlySven
Cześć Mohammad. sudo bluetooth-agent to nierozpoznane polecenie
Oliver Kuchies
@OliverKuchies spróbuj uruchomić apt-get install bluetooth blueznajpierw i powiedz mi, czy to działa dla Ciebie.
Mohammad Ali
Próbowałem biegać bluetooth-agenti też nie mogłem go znaleźć. Zainstalowanie pakietów nie naprawiło tego.
Gilad Naaman
@GiladNaaman oraz jakiego systemu operacyjnego używasz?
Mohammad Ali,
0

W oparciu o to, co rozumiem, wymagany jest moduł bluetooth slave. Możesz użyć popularnego modułu HC-06 i podłączyć go do Raspberry Pi za pomocą manetki poziomu do pinów TX i RX na Pi oraz użyć skryptu pythonowego do odczytu danych szeregowych i przetworzenia ich w razie potrzeby

ewolucjoner
źródło
Zakładam, że istnieje moduł python, który można uruchomić, gdy tylko urządzenie Bluetooth się połączy, a nie sprzęt. Nie jestem zbyt obskurny z pi, wciąż jestem początkujący, ale wydaje się, że byłoby to logiczne podejście
Oliver Kuchies
@OliverKuchies Nigdy nie programowałem (ani nie używałem!) Bluetooth na Linuksie, ale szukasz jakiejś usługi demona, która zareaguje na takie rzeczy. Aby rozwinąć: moduł python nie uruchomi się sam, musi być używany przez proces, który już działa. To jest demon. Wyszukanie „demona linuxa bluetooth” powoduje pewne problemy. Myślę, że zauważyłem systemd, że masz taki, prawdopodobnie musisz go skonfigurować, aby zachowywał się w określony sposób.
Złotowłosa
@OliverKuchies zajrzyj na blog.miguelgrinberg.com/post/…
evolutionizer
0

Nie zamierzam omawiać wpływu na bezpieczeństwo, czy nie, ale tak to robię:

  1. Utwórz skrypt o nazwie auto_connect.sh o następującej treści:
#!/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. Utwórz plik /path/to/python_script.py o następującej treści:
#!/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. W zależności od używanego systemu operacyjnego uruchom auto_connect.sh przy starcie systemu.

Co to wszystko robi:

  1. Ustawia urządzenie tak, aby zawsze było możliwe do wykrycia.

  2. Gdy urządzenie się z nim sparuje, automatycznie oznaczy je jako zaufane urządzenie i połączy się z nim.

  3. Przy każdym rozruchu będzie wędrował po liście znanych urządzeń i spróbuje się z nimi połączyć.

Należy pamiętać, że takie podejście jest sprzeczne z jakimkolwiek rodzajem bezpieczeństwa, ale mogą zdarzyć się przypadki, w których użytkownik chce to osiągnąć.

Emil Borconi
źródło
-1

W Raspberry Pi3 Model B jest bulit w bluetooth i wifi. Za pomocą serwera OBEX możesz odbierać pliki z innych urządzeń bez pytania o żądanie parowania za każdym razem. Musisz wykonać parowanie po raz pierwszy z tym urządzeniem i utworzyć jeden katalog, w którym pliki będą odbierane cały czas.

Po prostu wykonaj krok poniżej linku.

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

Mihit Gandhi
źródło
1
Czy przeczytałeś pytanie? OP dokładnie pyta, jak uniknąć ręcznego parowania, ponieważ nie będzie ekranu, a ty sugerujesz, że powinien on przeprowadzić parowanie?
Dmitry Grigoryev
W tym celu musisz wykonać parowanie tylko raz, więc po raz pierwszy możesz połączyć się z wyświetlaczem w celu parowania.
Mihit Gandhi
Musisz to zrobić tylko raz na urządzenie . A jeśli ktoś nowy chce się na nim dostać, oznacza to wykopanie go z dowolnego miejsca i podłączenie go do monitora i klawiatury, dlatego szuka sposobu, aby tego uniknąć.
Different55