我正在尝试使用bluez 存储库中提供的 python 测试代码建立 HFP(免提配置文件)服务级别连接。
为了运行,该示例需要进行一些修改:
- 修复不推荐使用的导入语句:
import glib
try:
from gi.repository import GObject
except ImportError:
import gobject as GObject
=>
from gi.repository import GLib as glib
- 更改主循环对象:
mainloop = GObject.MainLoop()
=>
mainloop = glib.MainLoop()
- 禁用音频,因为它与此测试无关:
audio_supported = False
- 编码发送到字节的命令:
os.write(self.fd, cmd + "\r\n")
=>
os.write(self.fd, f"{cmd}\r\n".encode())
- 解码从缓冲区接收到的字节:
buf = buf.strip()
=>
buf = buf.decode('utf8').strip()
- 将 BDADDR_ANY 更改为手机的地址:
此时示例运行,为了实际尝试连接,我添加了以下代码:
fd = os.open("test.log", os.O_RDWR)
profile.NewConnection(options.path, fd, opts)
此时,我在以下行从 NewConnection() 收到错误:fd = fd.take()
查看代码,fd 似乎是一个简单的文件描述符,因此注释掉这一行有助于我继续前进。我现在面临的实际问题是在发送初始 AT 命令后我没有收到设备的回复(来自上面链接的第 78 行)。根据蓝牙 HFP 1.8 规范,这应该启动服务级别连接过程。我什至不确定我的命令是否正在发送到设备。
我还尝试了另一个更新的示例。这个能够通过套接字 (BluetoothSocket) 打开 RFCOMM 连接,但连接不断被重置。这是因为 _read_at() 函数(第 181 行)没有从设备接收到任何内容并超时。