玩转树莓派蓝牙(2)——构建手机与树莓派4B的无线数据通道

张开发
2026/5/12 22:23:57 15 分钟阅读
玩转树莓派蓝牙(2)——构建手机与树莓派4B的无线数据通道
1. 为什么选择蓝牙作为无线数据通道当你想要在手机和树莓派之间建立无线通信时Wi-Fi可能是第一个想到的方案。但实际操作过的人都知道Wi-Fi配置起来有多麻烦——需要路由器、IP地址分配、端口转发还得处理各种网络权限问题。相比之下蓝牙就像两个设备之间的悄悄话通道不需要任何中间设备配对就能直接用。我在开发智能家居原型时曾经被Wi-Fi配置折磨得够呛。后来改用蓝牙方案从配对到数据传输成功只用了不到10分钟。树莓派4B自带的蓝牙5.0模块理论传输距离可达100米实际室内环境约20-30米完全能满足大多数物联网项目的需求。更重要的是蓝牙的功耗只有Wi-Fi的1/3左右这对需要长时间运行的设备特别友好。蓝牙协议中有个特别适合数据传输的SPP串口协议它模拟了传统的串口通信让开发者可以用类似操作串口的方式收发数据。这意味着你之前写的串口通信代码几乎不用修改就能跑在蓝牙上。下面我们就从最基础的蓝牙配置开始一步步搭建这个无线数据通道。2. 树莓派蓝牙基础配置2.1 硬件检查与驱动安装首先确认你的树莓派4B蓝牙模块正常工作。在终端输入hciconfig -a你应该看到类似这样的输出hci0: Type: Primary Bus: UART BD Address: B8:27:EB:XX:XX:XX ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING PSCAN ISCAN RX bytes:1234 acl:0 sco:0 events:123 errors:0 TX bytes:1234 acl:0 sco:0 commands:123 errors:0如果状态不是UP RUNNING可能需要先启动蓝牙服务sudo systemctl start bluetooth sudo systemctl enable bluetooth接下来安装必要的蓝牙工具包sudo apt update sudo apt install -y pi-bluetooth bluez bluez-firmware blueman这里有个坑我踩过——安装完成后一定要重启树莓派否则可能出现权限问题sudo reboot2.2 用户权限配置很多新手会遇到Operation not permitted错误这是因为默认情况下普通用户没有蓝牙操作权限。解决方法很简单sudo usermod -aG bluetooth $USER这条命令把你的用户加入蓝牙用户组。注意修改不会立即生效你需要注销重新登录或者直接重启sudo reboot重启后可以用这个命令验证是否生效groups | grep bluetooth如果看到输出中包含bluetooth说明配置成功了。3. 手机与树莓派蓝牙配对3.1 图形界面配对推荐新手树莓派桌面右上角有个蓝牙图标右键点击选择Make Discoverable。这时你的手机蓝牙搜索应该能看到树莓派默认名称类似raspberrypi。在手机上点击配对树莓派会弹出配对确认对话框点击确认后两者就建立了信任关系。这种方式的优点是简单直观适合快速验证蓝牙功能是否正常。3.2 命令行配对适合无界面环境如果你用的是树莓派Lite版或者通过SSH连接可以用命令行完成配对。首先启动蓝牙控制台bluetoothctl在交互界面中依次输入以下命令power on discoverable on pairable on agent on这时用手机搜索并尝试配对在树莓派上会收到授权请求输入yes确认即可。配对成功后可以用devices命令查看已配对设备devices记下你手机的MAC地址格式如AA:BB:CC:DD:EE:FF后面建立数据连接时会用到。4. 配置SPP串口协议4.1 启用SPP服务蓝牙配对只是建立了设备间的信任关系要传输数据还需要配置具体的协议。我们需要启用Serial Port Profile(SPP)它会在系统里创建一个虚拟串口/dev/rfcommX。编辑蓝牙服务配置文件sudo nano /etc/systemd/system/dbus-org.bluez.service找到ExecStart开头的行修改为ExecStart/usr/lib/bluetooth/bluetoothd -C ExecStartPost/usr/bin/sdptool add SP保存退出后重启蓝牙服务sudo systemctl daemon-reload sudo systemctl restart bluetooth4.2 创建虚拟串口现在我们可以把蓝牙连接映射到一个虚拟串口。首先查看你的蓝牙设备名称hciconfig假设设备名是hci0执行以下命令创建串口sudo rfcomm watch hci0这个命令会让树莓派持续监听蓝牙连接并在连接建立时自动创建/dev/rfcomm0设备文件。你可以另开一个终端窗口用以下命令检查串口是否创建成功ls /dev/rfcomm*5. Python实现双向数据传输5.1 接收手机发来的数据先安装Python串口库pip install pyserial创建receive.py文件import serial ser serial.Serial(/dev/rfcomm0, 9600, timeout1) print(等待数据...) while True: data ser.readline().decode().strip() if data: print(f收到数据: {data})这个脚本会持续监听串口当手机发送数据时会实时打印出来。你可以用手机上的蓝牙调试APP如蓝牙串行发送测试消息。5.2 向手机发送数据创建send.py文件import serial import time ser serial.Serial(/dev/rfcomm0, 9600) while True: message input(输入要发送的消息: ) ser.write(message.encode()) time.sleep(0.1) # 避免发送过快运行后在终端输入任意内容手机端应该能立即收到。我在智能灯项目中就用这种方式发送开关指令实测延迟在50ms以内完全能满足控制需求。5.3 数据格式建议实际项目中建议定义简单的通信协议。比如我用JSON格式传输传感器数据# 发送端 import json data {temp: 25.6, humi: 60} ser.write(json.dumps(data).encode()) # 接收端 import json raw ser.readline().decode() data json.loads(raw) print(f温度: {data[temp]}℃, 湿度: {data[humi]}%)这种结构化数据方便后续处理也避免了字符串解析的麻烦。6. 常见问题排查6.1 连接不稳定问题如果发现蓝牙频繁断开可以尝试以下方法确保设备间距离在10米内避开微波炉、Wi-Fi路由器等干扰源调整蓝牙传输功率需要编辑配置文件有一定风险使用高质量蓝牙适配器树莓派内置模块性能一般6.2 权限问题处理遇到/dev/rfcomm0: Permission denied错误时检查用户是否在bluetooth组临时解决方案sudo chmod 666 /dev/rfcomm0永久解决方案创建udev规则6.3 多设备连接方案如果需要连接多个手机可以创建多个虚拟串口sudo rfcomm listen /dev/rfcomm1 1 sudo rfcomm listen /dev/rfcomm2 1 每个端口对应一个手机连接在Python代码中指定不同的设备文件即可。我在展厅项目中就用这种方式实现了三台平板同时控制树莓派。7. 进阶应用场景7.1 物联网传感器网关把树莓派作为蓝牙中心节点收集多个蓝牙传感器的数据如温湿度、光照等然后通过Wi-Fi上传到服务器。这种架构既省电又灵活特别适合没有Wi-Fi模块的低功耗传感器。7.2 智能家居控制中心用手机APP通过蓝牙控制树莓派连接的继电器、电机等设备。相比Wi-Fi方案蓝牙控制响应更快而且断网也能正常工作。我在自家鱼缸自动喂食器上就用的这个方案。7.3 移动数据采集系统配合手机GPS功能可以实现移动环境下的数据采集。比如把树莓派和空气质量传感器放在背包里边走边采集数据通过蓝牙实时传输到手机APP显示轨迹和数值。

更多文章