我正在运行无头Raspberry PI 3,我希望它能够自动接受任何设备的配对。
我在一个相同的问题中看到了这个答案:
但这似乎有些过时,并且某些已使用的命令似乎不存在。
我正在运行2016-05-27-raspbian-jessie.img
操作系统映像。
bluetooth-agent
但我不确定。
我正在运行无头Raspberry PI 3,我希望它能够自动接受任何设备的配对。
我在一个相同的问题中看到了这个答案:
但这似乎有些过时,并且某些已使用的命令似乎不存在。
我正在运行2016-05-27-raspbian-jessie.img
操作系统映像。
bluetooth-agent
但我不确定。
Answers:
由于bluetooth-agent
Jessie上不存在命令,因此现代方法是将相关命令传递给bluetoothctl
。基于此SO问题,以下脚本应启用自动配对而无需手动输入引脚:
sudo bluetoothctl <<EOF
power on
discoverable on
pairable on
agent NoInputNoOutput
default-agent
EOF
No agent is registered
,看来default-agent
命令运行很快。当我手动输入命令时,它不会出现此错误,但是一旦退出,bluetoothctl
它会注销该代理的注册,并且尝试连接失败。如果我离开bluetoothctl
跑步,则会出现提示询问是否信任连接,这不是NoInputNoOutput
您希望的那样……
NoInputNoOutput
不是授权策略,而是蓝牙协议的一部分,用于确定可用的授权机制类型(例如,可以使用引脚吗?)。
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
我遇到了同样的问题,发现此方法有效(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进行检查
这几乎就像是一种玩笑,我不确定是否有任何未知的后果,但是它可以工作。任何改进表示赞赏
您可能需要在偷看源代码的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")