Aceptar automáticamente conexiones Bluetooth en un Pi 3

14

Estoy buscando desarrollar una plataforma para mi automóvil que conecte automáticamente cualquier dispositivo que intente conectarse al Pi a través de Bluetooth. Actualmente requiere un emparejamiento aceptado por el Pi, pero en este caso no habrá pantalla, por lo que deberá hacerlo automáticamente. ¿Cómo puedo lograr esto?

Oliver Kuchies
fuente
¿podría explicar qué modelo de pi tiene, ya que solo el pi 3 es carib; e de bluetooth sin hardware externo?
Mohammad Ali
Raspberry Pi 3 Modelo B - Construido en bluetooth
Oliver Kuchies
Entonces, ¿todo lo que espera es que el Pi emita constantemente y acepte cualquier conexión de emparejamiento que realice su teléfono? ¿Entiendes las implicaciones de seguridad? ¿Derecha? ¿Y también es escribir una pequeña secuencia de comandos de Python para hacer el trabajo una solución aceptable?
Mohammad Ali
Sí, pero para hacerlo más seguro, sugiero mostrar cómo limitar a una conexión antes de redescubrir. También siéntase libre de agregar implicaciones de seguridad para responder para ayudar a otros :)
Oliver Kuchies

Respuestas:

12

( Tenga en cuenta que esta respuesta ya no funciona a partir de Raspbian Jessie, ya que bluez eliminó el comando bluetooth-agent )

Por lo tanto, actualmente declaras que puedes conectarte al Pi muy bien, pero que necesitas un monitor para el proceso de emparejamiento.

Nota: aceptar cualquier conexión es una idea increíblemente insegura, y si solo está usando un conjunto limitado de dispositivos, configurarlos como dispositivos confiables tendría mucho más sentido ya que limitaría la conexión a sus direcciones Mac pero no permitiría nuevas dispositivos que se agregarán sin monitor

Pero de todos modos, los comandos que necesitará ejecutar para aceptar todas las conexiones que se realizan con el Pi, para que sea reconocible y para establecer un pin predecible se enumeran a continuación:

Nota: puede que necesite cambiar el cero en hci0 el número de Bluetooth de sus dispositivos.

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

Ahora, después de ejecutar estos comandos y ver si funcionan como se espera, podemos pasar a configurarlos para que comiencen en el arranque de su Pi.

  1. Comenzamos creando un archivo bash ejecutando el comando sudo nano mohammadIsAmazing.sh
  2. Ahora ingresamos lo siguiente en ese archivo:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. Ahora guardamos y cerramos nuestro archivo usando el control key and x

  4. Abrimos el archivo /etc/rc.localusando el siguiente comando:

    Sudo nano /etc/rc.local
    
  5. Ahora ingresamos el comando para ejecutar nuestro script bash en /etc/rc.local

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

    Nota: debe colocar el comando antes de la última línea en /etc/rc.local que contiene: exit 0

  6. Ahora guardamos y cerramos ese archivo, luego reiniciamos el Pi.

En una nota al margen: asegúrese de elegir un pin aleatorio para aumentar marginalmente la seguridad

En otra nota al margen: si desea cambiar el nombre del dispositivo bluetooth, debe crear un archivo llamado /etc/machine-infoque debe contener lo siguiente:

PRETTY_HOSTNAME=device-name

Luego corre service bluetooth restartdespués de eso

Mohammad Ali
fuente
2
Recuerde que &al final de la línea en el rc.localarchivo, sin él, el RPi puede no finalizar el arranque ya que el shell espera a que su script /path/to/script/mohammadIsAmazing.shtermine de ejecutarse antes de continuar, y si no termina el arranque, no podrá sshingresar para arreglar las cosas ...!
SlySven
Hola mohammad sudo bluetooth-agent es un comando no reconocido
Oliver Kuchies
@OliverKuchies intenta correr apt-get install bluetooth bluezprimero y dime si eso funciona para ti.
Mohammad Ali
He intentado correr bluetooth-agenty no pude encontrarlo también. La instalación de los paquetes no lo solucionó.
Gilad Naaman
@GiladNaaman bien, ¿qué estás usando?
Mohammad Ali
0

Según lo que entiendo, lo que necesita es un módulo esclavo bluetooth. Puede usar el popular módulo HC-06 y conectarlo a la frambuesa pi a través de una palanca de cambio de nivel a los pines TX y RX en la Pi y usar un script de python para leer los datos en serie y procesarlos según sea necesario

evolucionista
fuente
Supongo que habría un módulo de Python que podría ejecutarse tan pronto como se conecte un dispositivo Bluetooth en lugar de conectar hardware. No estoy demasiado mal con el pi, todavía soy un principiante, pero parece que sería un enfoque lógico
Oliver Kuchies
@OliverKuchies Nunca he hecho ninguna programación de bluetooth (¡o uso!) En Linux pero estás buscando algún tipo de servicio de demonio que responda a tales cosas. Para elaborar: un módulo de Python no se ejecutará solo, debe ser utilizado por un proceso que ya se está ejecutando. Eso es un demonio. Al buscar "bluetooth linux daemon" aparecen algunas cosas. Creo que he notado que systemdtiene uno, presumiblemente tienes que configurarlo para que se comporte de maneras específicas.
Ricitos de oro
@OliverKuchies eche un vistazo a blog.miguelgrinberg.com/post/…
evolutionizer
0

No voy a discutir la implicación de seguridad o no, pero así es como lo hago:

  1. Cree un script llamado auto_connect.sh con el siguiente contenido:
#!/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. Cree el archivo /path/to/python_script.py con el siguiente contenido:
#!/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. Dependiendo del sistema operativo que esté utilizando, asegúrese de ejecutar auto_connect.sh en su arranque.

Lo que todo esto hace:

  1. Configura el dispositivo para que sea siempre reconocible.

  2. Cuando un dispositivo se empareja con él, lo marcará automáticamente en un dispositivo confiable y se conectará a él.

  3. En cada arranque, recorrerá la lista de dispositivos conocidos e intentará conectarse a ellos.

Tenga en cuenta que este enfoque va directamente en contra de cualquier tipo de seguridad, pero puede haber casos de usuarios cuando desee lograr eso.

Emil Borconi
fuente
-1

En Raspberry Pi3 Modelo B hay un bulit en bluetooth y wifi. Con el servidor OBEX, puede recibir los archivos de otros dispositivos sin tener que preguntar por la solicitud de emparejamiento cada vez. Tienes que hacer el emparejamiento por primera vez con ese dispositivo y hacer un directorio, en el que los archivos recibidos todo el tiempo.

Simplemente siga el paso del siguiente enlace.

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

Mihit Gandhi
fuente
1
¿Has leído la pregunta? El OP pregunta específicamente cómo evitar el emparejamiento manual porque no habrá pantalla, y usted sugiere que de todos modos debería hacerlo.
Dmitry Grigoryev
Debe realizar el emparejamiento solo una vez, por lo que por primera vez puede conectarse con la pantalla para el emparejamiento.
Mihit Gandhi
Solo tienes que hacerlo una vez por dispositivo . Y si alguien nuevo quiere subirse a él, eso significa desenterrarlo desde cualquier lugar y conectarlo a un monitor y teclado, por lo que está buscando una manera de evitarlo.
Diferente55