蓝牙 SDP - sdpd 在哪里?

Posted

技术标签:

【中文标题】蓝牙 SDP - sdpd 在哪里?【英文标题】:Bluetooth SDP - where is sdpd? 【发布时间】:2017-05-08 11:46:29 【问题描述】:

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

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

sdp_connect( BDADDR_ANY, BDADDR_LOCAL, 0 );

失败了。经过一番挖掘,我发现 sdp 守护程序 (sdpd)(它需要连接到的)没有运行,实际上我的系统上甚至不存在。

我尝试了什么:

    我已安装 (apt-get) 每个蓝牙或 bluez 软件包,这些软件包似乎与远程相关,但仍然没有 sdpd。 我尝试使用我的 android 手机地址进行连接(使用相同的代码)。这很好用,但当然没有用。 对该问题进行了详尽的 Google 搜索,但没有找到明确的答案。很多关于 hcid、pand 等的讨论,但没有关于这些如何相关的明确答案。

我的目标:

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

我很乐意直接连接到它,使用它的(已知)通道号,但 Android 只能通过注册的服务 UUID 连接(即,使用 BluetoothDevice.createRfcommSocketToServiceRecord(uuid)),但我看不到 API 连接到频道

有趣的是,我可以通过频道号连接到 Android 上的服务,但反之则不行。我认为 sdpd 可能已经过时了——所有对它的引用都是几年前的。

【问题讨论】:

【参考方案1】:

来自官方bluez project site:

与 BlueZ 相比,BlueZ 5 D-Bus API 包含重大变化 4. 大部分变化是由于 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 开始,您不能使用 sdp_connect() 之类的函数。 您必须使用 D-Bus。在上面链接的页面中,您还可以找到以下内容:

BlueZ 5 引入了一个新的通用 D-Bus 接口,用于实现 外部配置文件。配置文件(位于单独的进程中) 实现一个 org.bluez.Profile1 接口并注册一个对象 通过 BlueZ 上的新 ProfileManager1 接口实现它 边。在 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 的新用户/开发人员:

Profile API Bluez APIs doc Bluez examples in python 另一个有趣的sample code

【讨论】:

【参考方案2】:

[已解决] 显然,sdpd 早已不复存在。它的功能已被蓝牙所包含。要使其工作,请使用 --compat 标志,例如

bluetoothd --compat

这应该被添加到“/etc/init.d/bluetooth”。 有了这个,我可以成功连接并注册我的服务。

我在一篇博客文章中发现了一个提示。为什么发行说明或地球上的其他任何东西从未宣布过这一点,我不知道。

【讨论】:

【参考方案3】:

不确定这是否会对您有所帮助,但可能值得一试。 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 并安装 backport 版本。我建议使用以下代码确保配置文件更新到最新版本:

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

重新启动您的计算机,看看它现在是否正常工作。注意:在 Debian 上启用反向移植不会安装所有可用软件的反向移植版本(您也不想这样)。只有当您特别请求反向移植版本时(就像我们上面所做的那样),它才会被安装。所有其他软件包将保持原样(稳定)。更新时,您的 backport 包将更新为最新的 backport 版本,您的稳定包将更新为最新的稳定版本。

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

【讨论】:

感谢您的建议。 apt-get update 使用新来源时,我遇到了一个小问题(我认为)。收到似乎是警告“由于公钥不可用,无法验证以下签名:...”。我认为这只是一个警告。我尝试了 apt-cache 搜索“jessie”、“backports”、“bluez”等任何内容,但没有看到任何尚未安装的相关内容。我也对“DEBIAN_FRONTEND=...”这一行感到困惑。去哪儿了? 我建议您在安装新的蓝牙包之前先卸载蓝牙包(我将其添加到我的答案中)。通过 apt-get 安装 blueman 的 backport 版本应该会为您提供所需的所有(无论是否向后移植)依赖项 - 请参阅:packages.debian.org/jessie-backports/blueman。不确定您的“...公钥不可用:...”警告,它不应该发生。将反向端口添加到 /etc/apt/sources.list 后,您应该运行 apt-get update (我将其添加到我的答案中)。 DEBIAN_FRONTEND=noninteractive 位是可选的,以使其独立运行。 还请注意,我相信通过蓝牙连接和将外部设备安装为卷以及将文件/文件夹复制和粘贴到设备/计算机的功能已在 Debian 上“逐步淘汰” 8. 现在他们强迫您使用“推送”系统(或任何所谓的),因此您可以选择计算机/设备上的一个文件/文件夹并将其“推送”到另一个。在 Debian 8 上,我永远不可能有 2 个窗口显示设备和计算机的文件,并在窗口之间进行复制和粘贴(遗憾的是)。甚至推送功能也只适用于反向移植包。 [已解决] 请参阅下面的答案。

以上是关于蓝牙 SDP - sdpd 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

华为手机蓝牙传输的文件在哪里 手机蓝牙传输接收的数据保存在哪里

蓝牙接收的文件在哪里呢

手机连接蓝牙监听在哪里查看记录

用蓝牙接收到的文件在哪里

三星手机蓝牙接收的东西存在哪里了?

BLE蓝牙想比传统蓝牙区别在哪里