You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Node.js在Raspberry Pi上搭建蓝牙音箱接收手机音乐?

当然可以用Node.js实现这个功能!我自己之前也折腾过类似的项目,其实核心是让树莓派扮演A2DP蓝牙音频接收器的角色,再配合Node.js来简化蓝牙连接的管理逻辑。下面是我亲测有效的一步步操作指南:

前期准备
  • 一台树莓派(推荐3B+及以上型号,内置蓝牙模块稳定性更好)
  • 外接音箱(通过3.5mm音频接口或USB连接树莓派均可)
  • 预装Raspberry Pi OS的SD卡(用Lite版本更节省系统资源)
第一步:配置树莓派的蓝牙与音频基础环境

首先得把树莓派的蓝牙和音频基础服务搭好,这是后续Node.js脚本运行的前提:

  1. 更新系统包:
    sudo apt update && sudo apt upgrade -y
    
  2. 安装蓝牙与音频处理工具:
    sudo apt install bluez pulseaudio pulseaudio-module-bluetooth -y
    
  3. 配置Pulseaudio自动加载蓝牙模块:
    编辑/etc/pulse/default.pa文件,确保添加以下两行(没有就补上):
    load-module module-bluetooth-discover
    load-module module-switch-on-connect
    
  4. 配置蓝牙控制器模式为经典蓝牙(A2DP依赖经典蓝牙协议):
    编辑/etc/bluetooth/main.conf,找到#ControllerMode = dual这一行,去掉注释并修改为:
    ControllerMode = bredr
    
  5. 重启蓝牙服务生效:
    sudo systemctl restart bluetooth
    
  6. 确认音频输出设备:
    可以通过raspi-configSystem Options > Audio选项设置默认输出为你的音箱,或者用alsamixer调整音量。
第二步:用Node.js实现蓝牙连接管理

我们用Node.js来监听蓝牙连接事件、自动设置设备可配对/可发现,这里推荐用dbus-next包直接调用BlueZ的DBus接口(BlueZ是Linux官方蓝牙栈,稳定性拉满):

  1. 安装Node.js:
    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs
    
  2. 创建项目并安装依赖:
    mkdir pi-bluetooth-speaker && cd pi-bluetooth-speaker
    npm init -y
    npm install dbus-next
    
  3. 编写核心脚本speaker-server.js
    这个脚本会自动把树莓派蓝牙设为可发现/可配对状态,监听设备连接/断开事件,还能自动切换音频输出到音箱:
    const { MessageBus, Variant } = require('dbus-next');
    const { exec } = require('child_process');
    
    // 连接系统DBus,与BlueZ交互
    const bus = new MessageBus({ type: 'system' });
    
    async function setupBluetoothSpeaker() {
        try {
            await bus.connect();
    
            // 获取蓝牙适配器接口(默认是hci0)
            const adapterPath = '/org/bluez/hci0';
            const adapterProxy = await bus.getProxyObject('org.bluez', adapterPath);
            const adapter = adapterProxy.getInterface('org.bluez.Adapter1');
    
            // 设置蓝牙为可发现、可配对
            await adapter.SetDiscoveryFilter({ Transport: new Variant('s', 'bredr') });
            await adapter.SetProperty('Discoverable', new Variant('b', true));
            await adapter.SetProperty('Pairable', new Variant('b', true));
            console.log('✅ 蓝牙已设置为可发现&可配对状态');
    
            // 监听设备连接事件
            bus.addMatch('type="signal",interface="org.bluez.Device1",member="Connected"');
            bus.on('message', (msg) => {
                if (msg.member === 'Connected') {
                    console.log(`📱 设备已连接: ${msg.path}`);
                    // 自动切换音频输出到音箱(根据你的设备名调整)
                    exec('pactl set-default-sink alsa_output.platform-soc_audio.analog-stereo', (err) => {
                        if (err) console.error('⚠️ 切换音频输出失败:', err);
                        else console.log('🔊 音频输出已切换到音箱');
                    });
                }
            });
    
            // 监听设备断开事件
            bus.addMatch('type="signal",interface="org.bluez.Device1",member="Disconnected"');
            bus.on('message', (msg) => {
                if (msg.member === 'Disconnected') {
                    console.log('❌ 设备已断开连接');
                }
            });
    
        } catch (err) {
            console.error('❌ 初始化失败:', err);
            process.exit(1);
        }
    }
    
    setupBluetoothSpeaker();
    
    注意:如果你的音箱是USB接口,需要把pactl命令里的输出设备名换成对应的(可以用pactl list sinks查看所有可用输出设备)。
第三步:测试与设置开机自启
  1. 测试脚本:
    运行node speaker-server.js,然后打开手机蓝牙,搜索树莓派的默认名称(raspberrypi),配对后播放音乐,应该就能听到音箱出声了。
  2. 设置开机自启:
    为了让树莓派一开机就自动运行这个服务,我们用systemd创建一个服务文件:
    创建/etc/systemd/system/pi-bluetooth-speaker.service,内容如下:
    [Unit]
    Description=Node.js Bluetooth Speaker Service
    After=bluetooth.target pulseaudio.target
    
    [Service]
    User=pi
    WorkingDirectory=/home/pi/pi-bluetooth-speaker
    ExecStart=/usr/bin/node speaker-server.js
    Restart=always
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
    
    然后启用并启动服务:
    sudo systemctl enable pi-bluetooth-speaker.service
    sudo systemctl start pi-bluetooth-speaker.service
    
    可以用sudo systemctl status pi-bluetooth-speaker.service查看服务运行状态。
常见问题排查
  • 连接后无声音:用pactl list modules检查是否加载了module-bluetooth-discovermodule-switch-on-connect模块,或者手动运行pactl load-module module-bluetooth-discover加载。
  • Node.js包安装失败:安装编译依赖sudo apt install build-essential libbluetooth-dev后重试。
  • 蓝牙搜索不到:检查蓝牙是否开启,或者重启蓝牙服务sudo systemctl restart bluetooth

内容的提问来源于stack exchange,提问作者Jake

火山引擎 最新活动