蓝牙 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 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章