![bluez 中现已弃用的 rfcomm 二进制文件的替代方案](https://linux22.com/image/107850/bluez%20%E4%B8%AD%E7%8E%B0%E5%B7%B2%E5%BC%83%E7%94%A8%E7%9A%84%20rfcomm%20%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E7%9A%84%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%A1%88.png)
自 bluez 5.44 起,bluez-utils(以及 hcitool 等)中包含的 rfcomm 二进制文件被视为已弃用,并且从现在起仅包含在 AUR 提供的 bluez-utils-compat 软件包中。
是否有类似的命令行应用程序可以使用 rfcomm 内核模块将蓝牙设备绑定到串行端口,或者我是否从现在开始必须使用 PyBluez 或类似的库?
如果是后者,您会推荐哪些 Python 3 库?
如果有人知道,请告诉我为什么这么多 bluez-utils 突然被认为已弃用。我找不到任何相关信息。
这建筑维基百科建议使用新的实现 rfcomm 功能D-Bus 配置文件 1 API。
答案1
我找到了另一种可能的解决方案。我通过挖掘某人的 git hub 仓库发现了这一点。这使用 python3 内置的套接字模块。
先决条件:
- 您在地址<适配器地址>处有一个工作适配器。
- 您的目标蓝牙设备位于 <设备地址>。
- 设备已固定。
也就是说,可以使用rfcomm的相同点。
$python3
>>> import socket
>>> sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
>>> adapter = '00:11:22:33:44:55' #<adapter address>
>>> device = '55:44:33:22:11:00' #<device address>
>>> sock.bind((adapter, 1))
>>> sock.connect((device, 1))
## If not pinned it will ask you. You can use/adapt the bluez simple-agent for headless pinning
>>> sock.send(b'hello\n')
>>> sock.recv(100)
>>> sock.close()
答案2
我最近发现了bluez-工具项目,旨在使用 Bluez 当前的 D-Bus API 实现丢失的功能。
Bluez-tools 可在 ArchLinux 上从社区存储库获取。我还没有对此进行测试,并且 github 页面指出它仍处于测试阶段。但根据文档,bt-serial应该能够取代旧的bluez rfcomm,并且bt-adapter+bt-agent+bt-device具有hcitool的功能。
编辑:当查看问题列表和最后提交时,bluez-tools 似乎不再被积极维护。
答案3
我想注意这个问题:
- 那这个github项目包含一些 rfcomm 功能。 (基于 bluez 测试文件)。
bluez 项目本身仍然包含 rfcomm.c 文件,可以使用以下命令轻松编译:
gcc -lbluetooth rfcomm.c -orfcomm -DVERSION=xyz
...只需一个文件,无需编译整个 bluez 项目。其中 xyz 是下载的版本蓝兹 tar.xz源代码(现在是 5.46)。在下载之前,应该先检查自己bluetoothd -v
并下载匹配的源。 bluez-libs 只是编译成功的依赖项。
我需要用于armv7(树莓2)的rfcomm,并且没有用于rfcomm的aur包,这是唯一的方法,但效果很好。
仍然不确定为什么 rfcomm 被弃用,没有好的替代方案,以及如何与蓝牙通信,因为它是串行端口的其他方式。因为即使你是 python 专家加上 DBUS 专家...(就像上面提到的项目所有者可能是)...仍然只以这种方式提供 fifo,而不是 /dev/ 中的真正字符设备...所有其他程序(如 arduino) )可以查看并使用。
答案4
另一种选择是使用“蓝人“它为您提供了一个设备 GUI,可让您打开串行端口 SPP 连接。当您单击“连接”->“串行端口”时,您会得到一个为您创建的 /dev/rfcommN 设备,然后您就可以使用它了。合身。