在Linux上设置蓝牙自动配对

33

我希望能够使用任何移动电话通过蓝牙经典模式和串口协议(SPP)连接到IoT设备。该IoT设备没有屏幕和键盘,并且只要连接的手机知道秘密PIN,它就应该自动接受连接(即,我不想每次新的移动电话尝试连接时都被迫通过ssh进入IoT设备来设置配对)。

这些是我在IoT设备上运行的命令:

# Make the device discoverable:
hciconfig hci0 piscan

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

# Start rfcomm:
rfcomm -r watch /dev/rfcomm0 22

很遗憾,我找不到任何设置PIN码的方法,当我尝试使用手机连接时,配对失败。此外,设备仅在短时间内可被发现。

我该如何配置IoT设备的蓝牙堆栈(运行最新的Bluez),使其自动与任何知道给定PIN码的手机配对,并如何使发现期无限长?


您可以使用随 bluez 库一起提供的 "bluetoothctl" 实用程序。 您需要启用代理以进行身份验证。 由于您的系统是无头的,因此可以使用 "NoInputNoOutput"。 这避免了身份验证的 passkey 交互(bluetoothctl agen NoInputNoOutput)。 但是,如果您想接受所有连接,请使用 Dbus 接口 "org.bluez.AgentManager1" 在 "org.bluez.Agent1" 中实现最小方法 "RequestAuthorization" 注册自己的代理。 - Parthiban
1
是的,它仍然需要确认(是/否)。但是您可以使用Agent1接口编写自己的简单代理来回答“是”。是的,BlueZ提供了代理管理器,具有“DisplayOnly”、“DisplayYesNo”、“KeyboardOnly”、“NoInputNoOutput”和“KeyboardDisplay”这些功能。由于您需要特殊情况下无需干预即可接受,因此您可以通过自己的Agent1发送“Yes”来实现。 - Parthiban
2个回答

1
如果有人看到这个问题,想要直接从bash中使用(大部分的)BlueZ“蓝牙管理套接字”C API,请尝试:
btmgmt --help

btmgmt add-devicebtmgmt findbtmgmt discov等。


0

您可以运行实现BlueZ DBus API的应用程序。我建议使用BlueZ >= 5.42。 使用代理接口并实现自己的PIN码。 在注册代理后,当需要配对时,蓝牙将自动调用并使用您自己的代理。

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

"零的值意味着超时已禁用,并且它将永远保持可发现/有限模式。"

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt(dbus适配器对象文档) https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/agent-api.txt(dbus代理对象文档) https://kernel.googlesource.com/pub/scm/bluetooth/bluez/+/5.44/test/simple-agent(示例) http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/(请在底部阅读)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接