Accepter automatiquement les connexions Bluetooth sur un Pi 3


14

Je cherche à développer une plate-forme pour ma voiture qui connecte automatiquement tout appareil qui tente de se connecter au Pi via Bluetooth. Actuellement, il nécessite un appariement accepté par le Pi, mais dans ce cas, il n'y aura pas d'écran, il devra donc le faire automatiquement. Comment puis-je accomplir cela?


pourriez-vous s'il vous plaît nous dire sur quel modèle pi vous disposez, car seul le pi 3 est carib; e de bluetooth sans matériel externe?
Mohammad Ali

Raspberry Pi 3 Model B - Bluetooth intégré
Oliver Kuchies

Donc, tout ce que vous attendez, c'est que le Pi diffuse constamment et accepte toutes les connexions de couplage établies par votre téléphone? vous comprenez les implications pour la sécurité? droite? Et l'écriture d'un petit script Python pour faire le travail est-elle également une solution acceptable?
Mohammad Ali

Oui, mais pour le rendre plus sécurisé, je suggère de montrer comment limiter à une connexion avant de redécouvrir.
N'hésitez

Réponses:


12

( Notez que cette réponse ne fonctionne plus depuis Raspbian Jessie, car bluez a supprimé la commande bluetooth-agent )

Donc, actuellement, vous déclarez que vous pouvez très bien vous connecter au Pi, mais que vous avez besoin d'un moniteur pour le processus de couplage.

Remarque: accepter une connexion est une idée incroyablement peu sûre, et si vous n'utilisez qu'un nombre limité d'appareils, les configurer en tant qu'appareils de confiance aurait beaucoup plus de sens car cela limiterait la connexion à vos adresses Mac mais ne permettrait pas de nouvelles appareils à ajouter sans moniteur

Mais de toute façon, les commandes que vous devrez exécuter pour accepter toutes les connexions établies avec le Pi, pour le rendre détectable et pour définir une broche prévisible sont répertoriées ci-dessous:

Remarque: vous devrez peut-être modifier le zéro hci0 pour le numéro Bluetooth de votre appareil.

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

Maintenant, après avoir exécuté ces commandes et voir si elles fonctionnent comme prévu, nous pouvons passer à leur configuration pour démarrer au démarrage de votre Pi.

  1. Nous commençons par créer un fichier bash en exécutant la commande sudo nano mohammadIsAmazing.sh
  2. Nous entrons maintenant ce qui suit dans ce fichier:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. Maintenant, nous enregistrons et fermons notre fichier en utilisant le control key and x

  4. Nous ouvrons le fichier /etc/rc.localà l'aide de la commande suivante:

    Sudo nano /etc/rc.local
    
  5. Maintenant, nous entrons la commande pour exécuter notre script bash dans /etc/rc.local

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

    Remarque: vous devez mettre la commande avant la dernière ligne dans /etc/rc.local qui contient: exit 0

  6. Nous enregistrons et fermons maintenant ce fichier, puis redémarrons le Pi.

Sur une note latérale: assurez-vous de choisir une épingle aléatoire pour augmenter légèrement la sécurité

Sur une autre note latérale: Si vous souhaitez modifier le nom du périphérique Bluetooth, vous devez créer un fichier appelé /etc/machine-infoqui devrait contenir les éléments suivants:

PRETTY_HOSTNAME=device-name

Ensuite, courez service bluetooth restartaprès


2
Rappelez - vous que &sur la fin de la ligne dans le rc.localfichier - sans elle le RPI ne peut pas finir de démarrer les attend shell pour votre script /path/to/script/mohammadIsAmazing.shpour terminer l' exécution avant de continuer - et si elle ne se termine pas le démarrage , vous ne pourrez sshen pour régler les choses ...!
SlySven

Salut Mohammad. sudo bluetooth-agent est une commande non reconnue
Oliver Kuchies

@OliverKuchies essaie d' apt-get install bluetooth bluezabord de courir et dis-moi si cela fonctionne pour toi.
Mohammad Ali

J'ai essayé de courir bluetooth-agentet je n'ai pas pu le trouver aussi. L'installation des packages ne l'a pas corrigé.
Gilad Naaman

@GiladNaaman bien quel os, utilisez-vous?
Mohammad Ali

0

Sur la base de ce que je comprends, vous avez besoin d'un module Bluetooth esclave. Vous pouvez utiliser le populaire module HC-06 et le connecter au raspberry pi via un levier de niveau aux broches TX et RX du Pi et utiliser un script python pour lire les données série et les traiter selon les besoins


Je suppose qu'il y aurait un module python qui pourrait être exécuté dès qu'un périphérique Bluetooth se connecte plutôt que de connecter du matériel? Je ne suis pas trop minable avec le pi, toujours un débutant mais il semble que ce serait une approche logique
Oliver Kuchies

@OliverKuchies Je n'ai jamais fait de programmation (ou d'utilisation!) Bluetooth sur Linux mais vous cherchez une sorte de service démon qui répondra à de telles choses. Pour élaborer: un module python ne s'exécutera pas lui-même, il doit être utilisé par un processus déjà en cours d'exécution. C'est un démon. La recherche de "démon bluetooth linux" fait apparaître certaines choses. Je pense que j'en ai remarqué systemdun, vous devez probablement le configurer pour qu'il se comporte de manière spécifique.
goldilocks

@OliverKuchies jetez un œil à blog.miguelgrinberg.com/post/…
évolutionniste

0

Je ne vais pas discuter des implications de sécurité ou non, mais voici comment je le fais:

  1. Créez un script appelé auto_connect.sh avec le contenu suivant:
#!/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. Créez le fichier /path/to/python_script.py avec le contenu suivant:
#!/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. Selon le système d'exploitation que vous utilisez, assurez-vous d'exécuter le fichier auto_connect.sh sur votre démarrage.

Ce que tout cela fait:

  1. Règle l'appareil pour qu'il soit toujours détectable.

  2. Lorsqu'un appareil s'y connecte, il le marque automatiquement sur l'appareil de confiance et s'y connecte.

  3. À chaque démarrage, il parcourra la liste des périphériques connus et essaiera de s'y connecter.

N'oubliez pas que cette approche va directement à l'encontre de tout type de sécurité, mais il peut y avoir des cas d'utilisation lorsque vous souhaitez y parvenir.


-1

Dans Raspberry Pi3 Model B, il y a un bulit en bluetooth et wifi. En utilisant le serveur OBEX, vous pouvez recevoir les fichiers d'autres appareils sans vous renseigner à chaque fois sur la demande d'association. Vous devez faire l'appairage la première fois avec cet appareil et créer un répertoire, en ce sens que les fichiers sont reçus tout le temps.

Suivez simplement l'étape du lien ci-dessous.

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


1
Avez-vous lu la question? L'OP demande spécifiquement comment éviter l'appairage manuel car il n'y aura pas d'écran, et vous suggérez qu'il devrait faire l'appairage de toute façon?
Dmitry Grigoryev

Vous ne devez effectuer le couplage qu'une seule fois dans cette opération, donc pour la première fois, vous pouvez vous connecter à l'écran pour le couplage.
Mihit Gandhi

Vous ne devez le faire qu'une seule fois par appareil . Et si quelqu'un de nouveau veut y accéder, cela signifie le déterrer d'où qu'il se trouve et le brancher sur un moniteur et un clavier, c'est pourquoi il cherche un moyen d'éviter cela.
Different55
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.