根据 Bluez API 文档(设备 API),该Connect()
方法的返回表示一个或多个配置文件的成功连接:
无效连接()
(跳过)
如果成功连接了至少一个配置文件,则此方法将指示成功。
同时还有一个Connected
属性,描述为:
布尔连接 [只读]
指示远程设备当前是否已连接。PropertiesChanged 信号指示此状态的更改。
在实践中,方法的返回和通知属性设置Connect()
的信号的到达似乎相隔几秒钟。PropertiesChanged
Connected
true
运行 bluetoothctl 时:
[bluetooth]# connect XX:XX:XX:XX:XX:XX
Attempting to connect to XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
Connection successful
在 D-Bus 上捕获了以下消息:
方法调用时间=1646854334.904791 发件人=:1.521 -> 目的地=org.bluez 串行=50 路径=/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX;接口=org.bluez.Device1;成员=连接 信号时间=1646854336.902736 发件人=:1.128 -> 目的地=(空目的地)串行=10521 路径=/org/bluez/hci0/dev_XX_XX_XX_XX_XX_XX;接口=org.freedesktop.DBus.Properties;成员=属性已更改 字符串“org.bluez.Device1” 大批 [ 字典条目( 字符串“已连接” 变体布尔真 ) ] 大批 [ ] 方法返回时间=1646854339.349113 发件人=:1.128 -> 目的地=:1.521 串行=10522 回复串行=50
这告诉我们:
- 当属性更改为信号所报告的 ( )
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
时,屏幕上会出现。Connected
true
time=1646854336.902736
- 当方法返回 ( ) 时会出现该
Connection successful
消息。Connect()
time=1646854339.349113
- 这些事件相隔 2.4 秒发生。
问题是这两个事件之间有什么区别,哪一个实际上表示蓝牙设备已连接?
(断开设备连接时,Disconnect()
方法返回和信号到达0.003
相隔数秒)。
环境:Linux内核:5.4-179
,Bluez:5.62-r3
,Systemd 249.9
:。
信号的到来
Connected
表明低级链路(ACL)的建立。该
Connect()
方法的返回表明至少一个配置文件已成功连接(更高级别的连接)。