我正在尝试让GATT客户端在运行BlueZ 5.19的Linux系统上运行。不幸的是,这个系统上既没有Python也没有glib,所以我唯一的选择就是使用libdbus。我是否曾提到我以前从未使用过D-Bus?我在另一个系统上有一个GATT服务器,它通过16字节的UUID提供和通告自定义服务。我正在尝试让我的基于BlueZ的系统访问此服务。我已经验证我可以通过它宣传的UUID发现服务器,我可以让BlueZ连接到它。我的客户端应用程序已成功调用Bluez的RegisterProfile方法,传递服务器公布的UUID,但BlueZ从不调用我的NewConnection方法。在RegisterProfile调用的选项中,我将“Role”设置为“client”,将“AutoConnect”设置为TRUE,将“RequireAuthorization”和“RequireAuthentication”设置为FALSE。我正在使用-E(实验性)选项运行bluetoothd。
如果我使用-E和debug选项在前台运行bluetoothd,这就是我在启动客户端应用程序时看到的内容:
bluetoothd[2126]: src/profile.c:register_profile() sender :1.20
bluetoothd[2126]: src/profile.c:create_ext() Created "myRemoteControlProfile"
bluetoothd[2126]: src/profile.c:ext_device_probe() myRemoteControlProfile probed with UUID 119649b6-b656-22ae-e611-ba85a04effc5
bluetoothd[2126]: src/service.c:change_state() 0x950d0: device 24:71:89:09:AD:09 profile myRemoteControlProfile state changed: unavailable -> disconnected (0)
“myRemoteControlProfile”是我在Bluez注册的个人资料的名称,“119649b6-b656-22ae-e611-ba85a04effc5”是我在RegisterProfile调用中传递的UUID和24:71:89:09:AD:09是我正在尝试与之交互的GATT服务器,所以BlueZ似乎知道这个远程设备提供我正在寻找的服务。当我在服务器设备上观看时,我从未看到BlueZ连接到它。当BlueZ看到设备提供我在RegisterProfile中传递的服务时,是不是应该连接到设备?为什么我没有得到NewConnection方法调用?我的注册个人资料永远不会超过“断开连接”的状态是什么意思?我知道GATT API在BlueZ 5.19中仍然被认为是实验性的;我应该期待这个吗?谢谢!
顺便说一下,这个问题几乎与https://stackoverflow.com/questions/36480516/bluez5-37-org-bluez-profilemanager1-registerprofile-cant-detect-green-throttle中描述的问题相同。不幸的是,那里没有答案。答案 0 :(得分:0)
我已经能够通过升级到BlueZ 5.43来解决这个问题。我仍然没有得到NewConnection方法调用,但是如果我通过它所通告的服务的UUID检测到远程设备并手动连接到它,那么当我在org.bluez上执行GetManagedObjects时,该服务的所有特性现在都出现了,这在BlueZ 5.19中没有发生。