在Pi 3上自动接受蓝牙连接


14

我正在为我的汽车开发一个平台,该平台可以自动连接任何试图通过蓝牙连接到Pi的设备。当前,它需要Pi接受配对,但是在这种情况下,将没有屏幕,因此它将需要自动进行。我该怎么做?


您能否详细说明一下您拥有的pi模型,因为只有pi 3是没有外部硬件的carib; e蓝牙?
穆罕默德·阿里

覆盆子PI 3-模型B -内置蓝牙
奥利弗Kuchies

因此,您所期望的只是让Pi不断广播并接受手机建立的任何配对连接?您了解安全隐患吗?对?而且编写一个小的Python脚本来完成这项工作是否也是可以接受的解决方案?
Mohammad Ali

是的,但是为了使其更加安全,我建议您展示如何在重新发现之前限制一个连接。也可以随意添加安全隐患来回答他人的问题:)
Oliver Kuchies

Answers:


12

请注意,由于bluez删除了bluetooth-agent命令,因此从Raspbian Jessie开始,此答案不再起作用

因此,当前您声明可以很好地连接到Pi,但需要一个用于配对过程的监视器。

注意:接受任何连接是一个非常不安全的想法,如果您仅使用有限的一组设备,将它们设置为受信任的设备将更加有意义,因为这将限制与Mac地址的连接,但是不允许新的连接。无需监视器即可添加的设备

但是无论如何,下面列出了您需要运行的命令,以接受与Pi进行的所有连接,使其可被发现并设置可预测的引脚:

注意:您可能需要将零输入更改为hci0 设备的蓝牙编号。

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

现在,在运行这些命令并查看它们是否按预期运行后,我们可以继续进行设置,以在您的Pi引导上启动。

  1. 我们首先通过运行以下命令创建bash文件 sudo nano mohammadIsAmazing.sh
  2. 现在,我们在该文件中输入以下内容:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. 现在,我们使用来保存并关闭文件 control key and x

  4. 我们/etc/rc.local使用以下命令打开文件:

    Sudo nano /etc/rc.local
    
  5. 现在我们输入命令以运行我们的bash脚本到 /etc/rc.local

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

    注意:您必须将命令放在/etc/rc.local的最后一行之前,该行包含: exit 0

  6. 现在,我们保存并关闭该文件,然后重新启动Pi。

附带说明:一定要选择一个随机的引脚以略微提高安全性

另一方面:如果您想更改蓝牙设备名称,则需要创建一个名为的文件/etc/machine-info,其中应包含以下内容:

PRETTY_HOSTNAME=device-name

然后运行service bluetooth restart


2
请记住,&rc.local文件行的末尾-如果没有它,则RPi可能无法完成引导,因为外壳程序会/path/to/script/mohammadIsAmazing.sh在继续执行脚本之前等待脚本完成执行-如果未完成引导,您将无法ssh进入为了解决问题...!
SlySven

嗨,穆罕默德。sudo蓝牙代理是无法识别的命令
Oliver Kuchies '16

@OliverKuchies首先尝试运行,apt-get install bluetooth bluez然后告诉我是否适合您。
Mohammad Ali

我尝试运行bluetooth-agent,但也找不到。安装软件包无法修复它。
Gilad Naaman

@GiladNaaman好吧,你在用什么?
穆罕默德·阿里

0

根据我的理解,您需要一个从属蓝牙模块。您可以使用流行的HC-06模块,并通过电平转换器将其连接到树莓派,使其与Pi上的TX和RX引脚连接,并使用python脚本读取串行数据并根据需要进行处理


我假设会有一个python模块,只要蓝牙设备连接而不是连接硬件,就可以运行该模块?我对pi并不太
陌生,

@OliverKuchies我从未在Linux上进行过任何蓝牙编程(或使用!),但您正在寻找某种可以响应此类情况的守护程序。详细说明:python模块本身不会运行,它必须已在运行的进程中使用。那是一个守护进程。搜索“蓝牙linux守护程序”确实会发现一些问题。我想我已经注意到systemd了,您大概必须配置它以特定的方式运行。
goldilocks


0

我不会讨论安全隐含性,但这是我的方法:

  1. 创建一个名为auto_connect.sh的脚本,其内容如下:
#!/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. 使用以下内容创建文件/path/to/python_script.py:
#!/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. 根据所使用的操作系统,确保在引导时运行auto_connect.sh。

这是怎么做的:

  1. 将设备设置为始终可发现。

  2. 当设备与之配对时,它将自动在受信任的设备上标记它并连接到它。

  3. 每次启动时,它将遍历已知设备列表,并尝试连接到它们。

请注意,这种方法直接与任何类型的安全性背道而驰,但是在某些情况下,您可能想要达到此目的。


-1

在Raspberry Pi3 Model B中,蓝牙和wifi很有用。使用OBEX服务器,您可以从其他设备接收文件,而无需每次都询问配对请求。您必须第一次与该设备配对并建立一个目录,因为这些文件一直都在接收。

只需按照以下链接的步骤。

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


1
你看过问题了吗?OP 专门询问如何避免手动配对,因为将没有屏幕,并且您建议他仍然应该进行配对?
德米特里·格里戈里耶夫

您只需要进行一次配对即可,因此第一次可以与显示器连接进行配对。
Mihit Gandhi's

每个设备只需要执行一次。如果有新手想要上它,那就意味着要从任何地方挖掘出来,并将其连接到显示器和键盘上,这就是为什么他正在寻找一种避免这种情况的原因。
不同的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.