Accettazione automatica delle connessioni Bluetooth su un Pi 3


14

Sto cercando di sviluppare una piattaforma per la mia auto che colleghi automaticamente qualsiasi dispositivo che tenti di connettersi al Pi tramite bluetooth. Attualmente richiede un accoppiamento accettato dal Pi ma in questo caso non ci sarà schermo quindi dovrà farlo automaticamente. Come posso farlo?


potresti per favore approfondire quale modello di pi hai, poiché solo il pi 3 è carib; e di bluetooth senza hardware esterno?
Mohammad Ali,

Raspberry Pi 3 Modello B - Bluetooth integrato
Oliver Kuchies,

Quindi tutto ciò che ti aspetti è che il Pi trasmetta costantemente e accetti qualsiasi connessione di accoppiamento stabilita dal tuo telefono? capisci le implicazioni sulla sicurezza? giusto? E anche scrivere un piccolo script Python per fare il lavoro una soluzione accettabile?
Mohammad Ali,

Sì, ma per renderlo più sicuro suggerisco di mostrare come limitare a una connessione prima di riscoprire. Inoltre, sentiti libero di aggiungere implicazioni sulla sicurezza per rispondere per aiutare gli altri :)
Oliver Kuchies,

Risposte:


12

( Nota che questa risposta non funziona più a partire da Raspbian Jessie, poiché bluez ha rimosso il comando bluetooth-agent )

Quindi attualmente affermi che puoi collegarti al Pi bene, ma hai bisogno di un monitor per il processo di accoppiamento.

Nota: accettare qualsiasi connessione è un'idea incredibilmente insicura e, se si utilizza solo un set limitato di dispositivi, configurarli come dispositivi attendibili avrebbe molto più senso in quanto limiterebbe la connessione ai propri indirizzi Mac ma non consentirebbe di nuovi dispositivi da aggiungere senza monitor

Ma comunque, i comandi che dovrai eseguire per accettare tutte le connessioni fatte al Pi, per renderlo rilevabile e impostare un pin prevedibile sono elencati di seguito:

Nota: potrebbe essere necessario modificare lo zero nel hci0 numero Bluetooth dei dispositivi.

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

Ora dopo aver eseguito questi comandi e vedere se funzionano come previsto, possiamo passare a configurarli per avviare il boot del tuo Pi.

  1. Iniziamo creando un file bash eseguendo il comando sudo nano mohammadIsAmazing.sh
  2. Ora inseriamo quanto segue in quel file:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. Ora salviamo e chiudiamo il nostro file usando il control key and x

  4. Apriamo il file /etc/rc.localusando il seguente comando:

    Sudo nano /etc/rc.local
    
  5. Ora inseriamo il comando per eseguire il nostro script bash /etc/rc.local

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

    Nota: devi inserire il comando prima dell'ultima riga in /etc/rc.local che contiene: exit 0

  6. Ora salviamo e chiudiamo quel file, quindi riavviamo il Pi.

Nota a margine: assicurati di scegliere un pin casuale per aumentare marginalmente la sicurezza

In un'altra nota a margine: se si desidera modificare il nome del dispositivo bluetooth, è necessario creare un file chiamato /etc/machine-infoche dovrebbe contenere quanto segue:

PRETTY_HOSTNAME=device-name

Quindi corri service bluetooth restartdopo


2
Ricordate che &alla fine della riga nel rc.localfile di - senza di essa l'RPI non può finire l'avvio come la shell aspetta lo script /path/to/script/mohammadIsAmazing.shper terminare l'esecuzione prima che prosegue - e se non termina il caricamento del sistema non sarà in grado di sshin per riparare le cose ...!
SlySven,

Ciao Mohammad. sudo bluetooth-agent è un comando non riconosciuto
Oliver Kuchies

@OliverKuchies prova a correre per apt-get install bluetooth bluezprimo e dimmi se funziona per te.
Mohammad Ali,

Ho provato a correre bluetooth-agente non sono riuscito a trovarlo. L'installazione dei pacchetti non ha risolto il problema.
Gilad Naaman,

@GiladNaaman bene cosa stai usando?
Mohammad Ali,

0

In base a ciò che ho capito, è necessario un modulo Bluetooth slave. È possibile utilizzare il famoso modulo HC-06 e collegarlo al raspberry pi tramite un cambio di livello ai pin TX e RX sul Pi e utilizzare uno script Python per leggere i dati seriali ed elaborarli come richiesto


Suppongo che ci sarebbe un modulo Python che potrebbe essere eseguito non appena un dispositivo Bluetooth si collega anziché collegare l'hardware? Non sono troppo squallido con il pi, ancora un principiante, ma sembra che sarebbe un approccio logico
Oliver Kuchies,

@OliverKuchies Non ho mai fatto alcuna programmazione bluetooth (o utilizzo!) Su Linux, ma stai cercando un tipo di servizio demone che risponderà a queste cose. Per elaborare: un modulo Python non si eseguirà da solo, deve essere utilizzato da un processo che è già in esecuzione. Questo è un demone. La ricerca di "demone bluetooth linux" fa emergere alcune cose. Penso di averne notato systemduno, presumibilmente devi configurarlo per comportarti in modi specifici.
riccioli d'oro

@OliverKuchies dai un'occhiata a blog.miguelgrinberg.com/post/…
evolutionizer

0

Non ho intenzione di discutere dell'implicazione sulla sicurezza o no, ma è così che lo faccio:

  1. Crea uno script chiamato auto_connect.sh con il seguente contenuto:
#!/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. Crea il file /path/to/python_script.py con il seguente contenuto:
#!/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. A seconda del sistema operativo in uso, assicurarsi di eseguire auto_connect.sh all'avvio.

Cosa fa tutto questo:

  1. Imposta il dispositivo in modo che sia sempre rilevabile.

  2. Quando un dispositivo si accoppia ad esso, lo contrassegnerà automaticamente su un dispositivo attendibile e si connetterà ad esso.

  3. Ad ogni avvio viaggerà attraverso l'elenco dei dispositivi noti e proverà a connettersi a essi.

Si prega di essere consapevoli del fatto che questo approccio va direttamente contro qualsiasi tipo di sicurezza, ma potrebbero esserci casi utente quando si desidera ottenere proprio questo.


-1

In Raspberry Pi3 Model B c'è un ingombro in bluetooth e wifi. Utilizzando il server OBEX è possibile ricevere i file da altri dispositivi senza chiedere ogni volta la richiesta di associazione. Devi fare l'associazione per la prima volta con quel dispositivo e creare una directory, in quanto i file vengono ricevuti continuamente.

Basta seguire il passaggio del seguente link.

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


1
Hai letto la domanda? L'OP chiede specificamente come evitare l'associazione manuale perché non ci sarà schermo e suggerisci che dovrebbe comunque eseguire l'associazione?
Dmitry Grigoryev,

È necessario eseguire l'associazione solo una volta in questo, quindi per la prima volta è possibile connettersi con il display per l'associazione.
Mihit Gandhi,

Devi farlo solo una volta per dispositivo . E se qualcuno di nuovo vuole raggiungerlo, significa scavarlo da qualsiasi luogo e collegarlo a un monitor e una tastiera, motivo per cui sta cercando un modo per evitarlo.
Diverso55
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.