蓝牙:如何使用 Bluez 创建一个套接字以连接到具有特定 UUID 的服务?

Posted

技术标签:

【中文标题】蓝牙:如何使用 Bluez 创建一个套接字以连接到具有特定 UUID 的服务?【英文标题】:Bluetooth: how to create a socket for connecting to a service with specific UUID with Bluez? 【发布时间】:2012-06-05 11:22:27 【问题描述】:

我正在使用 BlueZ 库来管理 linux 下的蓝牙堆栈。我正在尝试打开一个应该与已知 UUID 的特定服务连接的套接字。我已成功尝试按照此处的示例打开服务器和客户端之间的套接字:

http://people.csail.mit.edu/albert/bluez-intro/c404.html

其中还描述了如何探索远程主机中的服务;但是,我无法弄清楚如何在连接套接字时指定 UUID。这在其他情况下非常简单,因为它在使用 android 库时会发生;但是,对于 BlueZ,我还没有在网上找到示例。

感谢您的帮助!

斯特凡诺

--在回复中补充了一些细节……不知道对不对;如果没有,对不起


感谢您的帮助!

在我的帖子中,我说我想连接一个具有指定 UUID 的套接字,因为我想到了一个像 createRfcommSocketToServiceRecord 这样的函数,可以在以下位置找到:

http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createRfcommSocketToServiceRecord%28java.util.UUID%29

返回给定特定 UUID 的套接字。我正在开发两个软件,一个是客户端,另一个是服务器,因此这是我正在创建的服务,而不是标准服务。我使用指定的 UUID 在服务器上发布此类服务,并且我想从客户端连接到它。服务器运行良好,因为在 android 平台上,利用上面提到的 createRfcommSocketToServiceRecord 方法,我能够使用正确的服务连接到服务器。

您发布的示例也很清楚,但不幸的是它是用 Python 编写的,而(我忘了指出)我使用 Bluez 作为 C 库。我能够利用 SDP 并检查远程服务器上的服务;但是,在设置套接字时,我看不到如何指定端口。我想到了 rc_channel,但据我了解,它是蓝牙通道(范围从 1 到 11 或类似的东西)。您能否指出在客户端创建套接字时我应该能够在哪里指定端口?在 sdp 处理的复杂结构中,我在哪里可以找到正确的端口? -- 参考:

http://people.csail.mit.edu/albert/bluez-intro/x604.html

再次感谢您的帮助!

【问题讨论】:

您尝试连接到什么服务?换个方式问这个,你用的是什么类型的socket? 【参考方案1】:

您不通过 UUID 连接套接字。您使用套接字连接到远程设备并浏览其 SDP 以发现它提供的 UUID,并将其映射到套接字端口。这是一个使用 PyBluez 的过程示例,BlueZ 之上的 python 包装器 http://people.csail.mit.edu/albert/bluez-intro/x290.html

【讨论】:

以上是关于蓝牙:如何使用 Bluez 创建一个套接字以连接到具有特定 UUID 的服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bluez Profile1 DBus API 注册连接回调

(Bluez) 如何获取蓝牙耳机按键输入?

Bluez/Python 缓冲导致蓝牙连接延迟

蓝牙:使用 Bluez 检测事件

Bluez 架构:解释这个架构

如何通过 BlueZ C 库执行蓝牙低功耗扫描