在Linux上设置蓝牙自动配对

在Linux上设置蓝牙自动配对,linux,bluetooth,bluez,rfcomm,Linux,Bluetooth,Bluez,Rfcomm,我想使用任何移动电话通过蓝牙经典串行端口协议(SPP)连接到物联网设备。IoT设备没有屏幕和键盘,只要连接的手机知道一个秘密PIN,它就应该自动接受连接(也就是说,我不想每次新手机尝试连接时都被迫通过ssh连接到IoT设备来建立配对) 以下是迄今为止我在物联网设备上运行的命令: # Make the device discoverable: hciconfig hci0 piscan # Register SPP: sdptool add --channel=22 SP # Start rf

我想使用任何移动电话通过蓝牙经典串行端口协议(SPP)连接到物联网设备。IoT设备没有屏幕和键盘,只要连接的手机知道一个秘密PIN,它就应该自动接受连接(也就是说,我不想每次新手机尝试连接时都被迫通过ssh连接到IoT设备来建立配对)

以下是迄今为止我在物联网设备上运行的命令:

# Make the device discoverable:
hciconfig hci0 piscan

# Register SPP:
sdptool add --channel=22 SP

# Start rfcomm:
rfcomm -r watch /dev/rfcomm0 22
不幸的是,我找不到任何方法设置PIN,当我尝试连接手机时,配对失败。此外,该设备只能在短时间内被发现


如何配置物联网设备的蓝牙堆栈(运行最新的Bluez)以与任何知道给定PIN的手机自动配对,以及如何使发现周期永久化?

您可以运行实现Bluez DBus API的应用程序。我建议BlueZ>=5.42。 使用代理接口并实现您自己的PIN码。 注册您的代理后,bluez将在请求配对时自动呼叫并使用您自己的代理

此外,您可以使用org.bluez.Adapter1接口通过DBus将DiscoverableTimeout设置为0

“零的值 意味着超时被禁用,并将保持不变 可发现/有限模式永久。”

(dbus适配器对象文档) (dbus代理对象文档) (样本)
(阅读底部)

如果有人遇到这个问题,要直接从bash使用(大部分)BlueZ“BT管理套接字”C API,请尝试:

btmgmt --help

btmgmt add device
btmgmt find
btmgmt discov
,等等。

您可以使用bluez库附带的“bluetoothctl”实用程序。您需要启用代理进行身份验证。由于您的系统是无头的,use可以使用“NoInputNoOutput”。这避免了用于身份验证的密钥交互(bluetoothctl代理NoInputOutput)。但如果您想接受所有连接,请使用Dbus接口“org.bluez.agentManager 1”使用在“org.bluez.Agent1”中实现的最小方法“RequestAuthorization”注册您自己的代理,但如果我启动bluetoothctl并设置“agent NoInputNoOutput”,它仍会询问我是否接受连接。你是说如果设置为批处理模式,它会有不同的行为吗?至于创建自己的AgentManager实现,这似乎是对轮子的重新发明。Bluez不是与代理经理一起发货吗?是的,它仍然要求确认(是/否)。但您可以通过使用Agent1接口编写自己的简单代理来回答“是”。是的,BlueZ为代理管理器提供了“DisplayOnly”、“DisplayYesNo”、“KeyboardOnly”、“NoInputNoOutput”和“KeyboardDisplay”这些功能。由于您需要在不进行任何干预的情况下接受特殊情况,您可以通过自己的代理1发送“是”来实现