2017-02-09 487 views
19

我想使用任何移动电话通过串行端口协议(SPP)通过Bluetooth Classic连接到物联网设备。物联网设备没有屏幕也没有键盘,只要连接的电话知道一个秘密PIN码就可以自动接受连接(也就是说,我不希望被强迫每次都进入物联网设备进行配对一部新的手机试图连接)。在Linux上设置蓝牙自动配对

这些是我的物联网设备上运行至今的命令:

# 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的手机进行自动配对,以及如何使发现时间永恒?

+0

您可以使用 “bluetoothctl” 效用,其附带的bluez库。您需要启用代理进行身份验证。由于您的系统是无头的,因此可以使用“NoInputNoOutput”。这避免了用于验证的密码交互(bluetoothctl agen NoInputNoOutput)。但是如果你想接受所有的连接,使用Dbus接口“org.bluez.AgentManager1”以“org.bluez.Agent1”中实现的最小方法“RequestAuthorization”注册你自己的代理。 –

+0

但是,如果我启动bluetoothctl并设置“代理NoInputNoOutput“,它仍然会问我是否接受连接。你是否告诉我,如果它被设置为批处理模式,它会有不同的行为?至于创建我自己的AgentManager1的实现,它似乎是对车轮的再造。 Bluez没有代理经理吗? –

+0

是的,它仍然要求确认(是/否)。但您可以使用Agent1界面编写自己的简单代理程序来回答“是”。是的,BlueZ为代理经理提供了“DisplayOnly”,“DisplayYesNo”,“KeyboardOnly”,“NoInputNoOutput”和“KeyboardDisplay”这些功能。由于您需要特殊情况才能接受,而无需任何干预,您可以使用您自己的Agent1发送“是” –

回答

0

您可以运行一个实现BlueZ DBus API的应用程序。我推荐BlueZ> = 5.42。 使用代理界面并实现您自己的PIN码。 在注册您的代理后,bluez会自动拨打电话并在配对时询问您是否使用您自己的代理。

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

”值为零 表示超时被禁用,它将永远保持在 可发现/限制模式。“

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt(DBUS适配器对象DOC) https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/agent-api.txt(DBUS代理对象DOC) https://kernel.googlesource.com/pub/scm/bluetooth/bluez/+/5.44/test/simple-agent(样品) http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/(底部读取)