蓝牙SDP - sdpd在哪里?

4

蓝牙服务发现协议(SDP)守护程序在哪里?

我正在使用bluez在Debian V8.0上注册蓝牙服务。我使用https://people.csail.mit.edu/albert/bluez-intro/上的示例代码。一切顺利,直到我尝试……

sdp_connect( BDADDR_ANY, BDADDR_LOCAL, 0 );

出现故障。经过一番探索,我发现需要连接的sdp守护进程(sdpd)并未运行,实际上在我的系统中甚至不存在。

我尝试过:

  1. 我已安装(使用apt-get)所有似乎与蓝牙或bluez有关的软件包,但仍然没有sdpd。
  2. 我尝试使用我的Android手机的地址进行连接(使用相同的代码)。那个可以正常工作,但当然毫无用处。
  3. 我在Google上进行了详尽的搜索,但没有找到明确的答案。有很多关于hcid、pand等内容的讨论,但没有明确说明这些内容与问题的相关性。

我的目标:

我正在尝试在我的Debian系统上注册我的服务,以便可以从另一个蓝牙设备(特别是我的Android设备)连接到它。该服务运行良好,只是没有SDP注册就无法找到它。

我希望能够直接连接到它,使用它的(已知的)通道号码,但Android只能通过注册的服务UUID连接(即使用BluetoothDevice.createRfcommSocketToServiceRecord(uuid)),但我看不到连接到通道的API。

有趣的是,我可以通过通道号码连接到Android上的服务,但反过来却不行。我认为sdpd可能已经过时了-所有与它有关的参考都是几年前的。

3个回答

5

来自Bluez项目官网

与BlueZ 4相比,BlueZ 5 D-Bus API发生了重大变化。大部分变化是由于BlueZ 5中的以下功能:

  • 转换为使用标准D-Bus属性和ObjectManager接口(在D-Bus规范文档中可用)
  • 引入接口版本(例如org.bluez.Adapter1)。当引入新版本时,我们将尝试同时支持至少两个最新版本。
  • 简化或删除每个配置文件接口,并添加一个通用的org.bluez.Device1.Connect方法来连接配置文件。
  • 删除org.bluez.Service接口(用于注册SDP记录和授权),并引入一个新的org.bluez.Profile1接口
  • 在设备发现期间动态创建设备对象
  • 引入AgentManager1接口
  • 基本路径移动到“/org/bluez”。虽然这不会有太大影响,因为通过D-Bus进行任何交互的主要入口点是ObjectManager.GetManagedObjects调用。
简而言之,从Bluez5开始,您不能使用类似的函数。您必须使用D-Bus。在上面链接的页面中,您还可以找到以下内容:

BlueZ 5引入了一个新的通用D-Bus接口以实现外部配置文件。配置文件(驻留在单独的进程中)实现了org.bluez.Profile1接口,并通过ProfileManager1接口在BlueZ侧注册实现它的对象。在RegisterProfile方法(在ProfileManager1界面上),配置文件需要至少提供要注册的配置文件的UUID。 BlueZ在内部具有常见配置文件的默认表,因此不一定需要其他信息。但是,如果配置文件希望,它可以提供诸如完整的SDP记录(XML编码),所需的安全级别,启用/禁用授权,版本,功能,角色,名称等信息。

...以及许多宝贵的信息。

请不要使用兼容模式(我的意思是“--compat”选项)。您应该仅在测试和开发中使用它:

commit 83b21cc152186f12f8bc76b7aec3107e220d5219    
Author: Marcel Holtmann <marcel@holtmann.org>   
Date:   Mon Dec 17 14:02:59 2012 +0100

    core: Hide /var/run/sdp support behind command line option

    By default /var/run/sdp support has been disabled from now on. It is not
    the preferred way of handling SDP records. For testing and development
    purposes it can be switched back on via --compat command line option.

最后,这里是一些有用的链接,可以帮助新用户/开发人员使用Bluez5:


4
[SOLVED] 显然,sdpd已经不存在了。它的功能已被bluetoothd所取代。要使其工作,请使用--compat标志,例如:
bluetoothd --compat

这应该添加到 "/etc/init.d/bluetooth" 中。有了这个,我就能成功连接并注册我的服务。
我在一篇博客文章中找到了这个提示。为什么发行说明或者其他任何地方都没有宣布这一点,我不知道。

1

我不确定这是否能帮到你,但值得一试。我也曾在Debian 8上遇到蓝牙问题;通过启用Debian后端并下载最新的blueman后端版本,我解决了我的问题。要做到这一点,首先卸载当前的蓝牙软件包(主要的,如bluez),然后将以下行(或类似行)添加到您的/etc/apt/sources.list

deb http://ftp.debian.org/debian jessie-backports main contrib non-free
deb-src http://ftp.debian.org/debian jessie-backports main contrib non-free

接着运行apt-get update命令,安装后备版本。我建议使用以下代码来确保配置文件更新到最新版本:

apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -qy -o DPkg::options::="--force-confnew" -t jessie-backports install blueman

重新启动您的计算机,看看现在是否正常工作。注意:在Debian上启用后备库不会安装所有可用的后备版本软件(您也不希望如此)。只有在您专门请求后备版本时(就像我们上面所做的那样),它才会被安装。所有其他软件包将保持不变(稳定)。更新时,您的后备软件包将与最新的后备版本一起更新,您的稳定软件包将与最新的稳定版本一起更新。

编辑:此答案已进行编辑以添加一些增强功能和信息。


谢谢您的建议。我在使用新源时遇到了一个小问题(我认为是小问题),apt-get update出现了一个警告:“以下签名无法验证,因为公钥不可用:...”。我认为这只是一个警告。我尝试使用apt-cache搜索任何类似于“jessie”、“backports”、“bluez”等的内容,但没有看到任何相关的内容,这些内容已经安装好了。我也对“DEBIAN_FRONTEND=…”这一行感到困惑。它应该放在哪里? - DontPanic
我建议您在安装新的蓝牙软件包之前先卸载您的蓝牙软件包(我已将此添加到我的答案中)。通过apt-get安装blueman的后备版本应该会为您提供所有所需的依赖项(无论是否是后备版本)-请参阅:https://packages.debian.org/jessie-backports/blueman。关于您的“...公钥不可用:...”警告,我不确定它是否会发生。在将后备版本添加到您的`/etc/apt/sources.list`之后,您应该运行apt-get update(我已将此添加到我的答案中)。DEBIAN_FRONTEND=noninteractive部分是可选的,以使其无需人工干预运行。 - Jamil Said
请注意,我相信 Debian 8 已经 "淘汰" 了通过蓝牙连接并将外部设备挂载为卷,并从设备/计算机复制和粘贴文件/文件夹的功能。现在他们强制使用“推”系统(或者叫其他名字),所以您可以在计算机/设备上选择一个文件/文件夹并将其“推”到另一个文件。在 Debian 8 上,我永远无法同时显示设备和计算机的文件窗口并在这些窗口之间复制和粘贴(遗憾)。即使是推送功能也只能在后续包中使用。 - Jamil Said
【已解决】请查看下面的答案。 - DontPanic

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