树莓派4b板载蓝牙连接其他蓝牙设备时出错的解决方法

当尝试通过蓝牙连接设备时遇到'org.bluez.Error.Failed'错误,日志显示'Protocol not available'。解决方案包括安装相关包,修改pulseaudio配置文件,重启树莓派,并在每次连接前运行特定命令。2.4G Wi-Fi可能会干扰蓝牙连接,导致音乐播放不畅。

按照其他博客进行蓝牙连接,一切都挺顺利的,直到使用以下命令进行连接:

connect AA:BB:CC:11:22:33:

这时,系统会提示连接失败:

Failed to connect: org.bluez.Error.Failed

并且在日志中的错误信息如下:

a2dp-source profile connect failed for AA:BB:CC:11:22:33: Protocol not availab

查看日志信息的命令是:sudo cat /var/log/syslog | grep -i protocol

解决办法如下:

  1. 安装相关包
sudo apt install bluetooth pulseaudio-module-bluetooth
  1. 使用以下命令打开相关的文件:
sudo nano /etc/pulse/default.pa
  1. 将上述文件中的改行进行注释,并保存退出:
#load-module module-bluetooth-discover
  1. 使用以下命令打开新的文件:
sudo nano /usr/bin/start-pulseaudio-x11
  1. 找到下述代码块,并添加新的一行
   if [ x”$SESSION_MANAGER” != x ] ; then
        /usr/bin/pactl load-modu
### 树莓派4B低功耗蓝牙(BLE)配置与使用 树莓派4B内置了Wi-Fi和蓝牙模块,其中蓝牙支持低功耗模式(BLE)。然而,默认的BlueZ Bluetooth stack可能在某些情况下表现不稳定[^1]。以下是关于如何在树莓派4B上配置并使用低功耗蓝牙的具体方法。 #### 安装必要的软件包 为了使BLE功能正常工作,需要安装一些特定的工具和库。可以通过以下命令来完成这些依赖项的安装: ```bash sudo apt update sudo apt install bluez bluez-tools pi-bluetooth python-bluez python3-bluez -y ``` 上述命令会更新系统的软件列表,并安装`bluez`及其相关工具、Python绑定以及针对Raspberry Pi优化的Bluetooth栈。 #### 启动蓝牙服务 确保蓝牙服务已启动并且设置为开机自启: ```bash sudo systemctl start bluetooth sudo systemctl enable bluetooth ``` 通过运行 `bluetoothctl` 命令可以进入交互式的蓝牙控制台,在这里可以进一步管理设备状态,例如扫描附近的BLE设备或连接到指定的目标设备。 #### 配置串口避免冲突 由于UART接口可能会被默认分配给系统日志或其他用途,因此有必要调整其配置以免影响蓝牙通信。对于树莓派4B来说,有即使按照常规方式修改 `/boot/config.txt` 文件中的参数也无法生效,此可尝试其他替代方案[^3]。一种推荐的方法是禁用串行控制台并将GPIO针脚重新映射至用户空间程序可用的状态: 编辑引导加载器配置文件: ```bash sudo raspi-config ``` 导航至 **Interfacing Options -> Serial Port** 并关闭串行控制台选项;接着确认启用物理串行端口供外部应用调用。 #### 测试BLE功能 一旦完成了基础环境搭建之后就可以着手验证实际效果了。下面给出一段简单的 Python 脚本用于演示怎样利用 pybluez 库广播 BLE 数据帧: ```python import time from bluetooth import * server_sock=BluetoothSocket( RFCOMM ) server_sock.bind(("",PORT_ANY)) server_sock.listen(1) port = server_sock.getsockname()[1] uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee" advertise_service( server_sock, "SampleServer", service_id = uuid, service_classes = [ uuid, SERIAL_PORT_CLASS ], profiles = [ SERIAL_PORT_PROFILE ] ) print("Waiting for connection on RFCOMM channel %d" % port) client_sock, client_info = server_sock.accept() print("Accepted connection from ", client_info) try: while True: data = client_sock.recv(1024) if len(data) == 0: break print("received [%s]" % data) except IOError: pass print("disconnected") client_sock.close() server_sock.close() print("all done") ``` 此代码片段展示了如何建立一个基本的服务端监听来自客户端的消息传输过程。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值