自动接受蓝牙配对


9

我正在运行无头Raspberry PI 3,我希望它能够自动接受任何设备的配对。

我在一个相同的问题中看到了这个答案:

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

但这似乎有些过时,并且某些已使用的命令似乎不存在。

我正在运行2016-05-27-raspbian-jessie.img操作系统映像。


“某些已使用的命令似乎不存在”是什么意思?到底什么对您不起作用?
德米特里·格里戈里耶夫

1
如果我没记错的话,bluetooth-agent但我不确定。
吉拉德·纳曼

Answers:


7

由于bluetooth-agentJessie上不存在命令,因此现代方法是将相关命令传递给bluetoothctl。基于此SO问题,以下脚本应启用自动配对而无需手动输入引脚:

sudo bluetoothctl <<EOF
power on
discoverable on
pairable on
agent NoInputNoOutput
default-agent 
EOF

1
这有助于使我的RPi Zero W在启动时可被发现。我以前已经通过此处概述的步骤以及此脚本更新了蓝牙配置。
charliesneath

这可行,但是您介意告诉我如何在配对后使树莓派自动信任该设备吗?谢谢
Daniele Segato

看来这允许配对,但由于缺少代理而无法授权连接。我相信此脚本的代理部分无法正常工作。当我运行此脚本时,我得到了No agent is registered,看来default-agent命令运行很快。当我手动输入命令时,它不会出现此错误,但是一旦退出,bluetoothctl它会注销该代理的注册,并且尝试连接失败。如果我离开bluetoothctl跑步,则会出现提示询问是否信任连接,这不是NoInputNoOutput您希望的那样……
Matthijs Kooijman

我怀疑这NoInputNoOutput不是授权策略,而是蓝牙协议的一部分,用于确定可用的授权机制类型(例如,可以使用引脚吗?)。
Matthijs Kooijman

1
可能是这样,但是随后您必须在所有配对尝试中继续输入“是”(而且我不完全确定这是否可以从stdin起作用,或者脚本是否试图变得聪明并尝试直接打开终端而不是stdin(那也是有时会发生)...虽然还没有尝试过,但是我最终还是使用了来自gist.github.com/mill1000/74c7473ee3b4a5b13f6325e9994ff84c
Matthijs Kooijman

0

我只是使用的全新安装2016-09-23-raspbian-jessie-lite.img进行尝试,没有进行任何其他更新。不,apt-get updateapt-get install bluez-utils。此单个命令使Pi可发现且可配对。没有代理来控制谁可以连接,代理就只能让任何人:

sudo hciconfig hci0 piscan

0

Raspbian-杰西

sudo apt-get install expect

xxxxx.sh

#!/usr/bin/expect -f
set prompt "#"
spawn sudo bluetoothctl
sleep 1
expect -re $prompt
sleep 1
send "agent NoInputNoOutput\r"
sleep 2
expect "Agent registered"
send "default-agent\r"
expect -re $prompt
sleep 3
interact
expect eof

1
仅由代码组成的答案不是很明确,因此请提供一些更详细的解释。同时缩进代码块,使其看起来像代码;根据您的喜好使用4个空格或一个制表符。

0

我遇到了同样的问题,发现此方法有效(RasPi 3,B型,Raspbian 9 Stretch)

我将Raspberry Pi用作IoT EDGE设备,需要它在没有干预的情况下接受蓝牙配对请求。我有一个Android应用程序,可通过蓝牙将文本信息传递给Pi,我的问题陈述需要任何Android设备进行连接。

首先,我没有运行任何单独的蓝牙代理(没有Blueman,实际上我必须将其删除)

在.bashrc文件中进行了编辑

    sudo nano /home/pi/.bashrc

最后添加了两个命令

    sudo hciconfig hci0 piscan 
    sudo hciconfig hci0 sspmode 1

piscan使Raspberry Pi蓝牙可发现

sspmode 1启用“安全简单配对”,这与您的蓝牙耳机或扬声器(基本上没有可确认PIN的显示器的设备)使用的方法类型相同。并且由于这些命令在.bashrc中,因此它们在引导时运行。

运行蓝牙脚本。对。尽管有一个弹出窗口要求我确认,但我可以使用我的应用程序与Pi之间来回传递消息

注意:hci0可能在整个过程中都不相同,可能是hci1,hci2,请通过在CLI上运行hciconfig进行检查

这几乎就像是一种玩笑,我不确定是否有任何未知的后果,但是它可以工作。任何改进表示赞赏


-1

您可能需要在偷看源代码EcoDroidLink。它接受蓝牙连接,而无需登录。

编辑:根据普遍的需求,这是使这种情况发生的模块的代码摘录edl_agent

# - automate the agent for running on a headless Pi - to answer pair and connection requests without a blocking query

import dbus
import dbus.service
import dbus.mainloop.glib
import bluezutils

BUS_NAME = 'org.bluez'
AGENT_INTERFACE = 'org.bluez.Agent1'
AGENT_PATH = "/test/agent"

bus = None
device_obj = None
dev_path = None

def set_trusted(path):
    props = dbus.Interface(bus.get_object("org.bluez", path),
                    "org.freedesktop.DBus.Properties")
    props.Set("org.bluez.Device1", "Trusted", True)

def dev_connect(path):
    dev = dbus.Interface(bus.get_object("org.bluez", path),
                            "org.bluez.Device1")
    dev.Connect()

class Rejected(dbus.DBusException):
    _dbus_error_name = "org.bluez.Error.Rejected"

class Agent(dbus.service.Object):
    exit_on_release = True

    def set_exit_on_release(self, exit_on_release):
        self.exit_on_release = exit_on_release

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Release(self):
        printlog("Release")
        if self.exit_on_release:
            mainloop.quit()

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def AuthorizeService(self, device, uuid):
        printlog("AuthorizeService (%s, %s)" % (device, uuid))
        authorize = "yes" #ask("Authorize connection (yes/no): ")
        if (authorize == "yes"):
            return
        raise Rejected("Connection rejected by user")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="s")
    def RequestPinCode(self, device):
        printlog("RequestPinCode (%s)" % (device))
        set_trusted(device)
        return "0000" #ask("Enter PIN Code: ")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="u")
    def RequestPasskey(self, device):
        printlog("RequestPasskey (%s)" % (device))
        set_trusted(device)
        passkey = "0000" #ask("Enter passkey: ")
        return dbus.UInt32(passkey)

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ouq", out_signature="")
    def DisplayPasskey(self, device, passkey, entered):
        printlog("DisplayPasskey (%s, %06u entered %u)" %
                        (device, passkey, entered))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def DisplayPinCode(self, device, pincode):
        printlog("DisplayPinCode (%s, %s)" % (device, pincode))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ou", out_signature="")
    def RequestConfirmation(self, device, passkey):
        printlog("RequestConfirmation (%s, %06d)" % (device, passkey))
        confirm = "yes" #ask("Confirm passkey (yes/no): ")
        if (confirm == "yes"):
            set_trusted(device)
            return
        raise Rejected("Passkey doesn't match")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="")
    def RequestAuthorization(self, device):
        printlog("RequestAuthorization (%s)" % (device))
        auth = "yes" #ask("Authorize? (yes/no): ")
        if (auth == "yes"):
            return
        raise Rejected("Pairing rejected")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Cancel(self):
        printlog("Cancel")

1
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Jacobm001

@ Jacobm001我添加了代码摘录。现在好点了吗?
Serge Stroobandt
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.