bluez 5.50 与 obexctl 实战:从手机接收与发送文件的2种完整操作流程
BlueZ 5.50与OBEX实战:手机与Linux设备间文件传输的完整指南
1. 环境准备与基础配置
在开始文件传输操作前,确保你的Linux系统已正确安装并配置了BlueZ 5.50及相关组件。以下是基础环境检查清单:
BlueZ版本验证:
bluetoothd --version确认输出显示版本为5.50或更高
必要组件安装:
sudo apt-get install bluez bluez-obexd obexftp服务状态检查:
systemctl status bluetooth确保蓝牙服务处于active (running)状态
关键配置文件位置:
| 组件 | 路径 | 说明 |
|---|---|---|
| bluetoothd | /usr/lib/bluetooth/bluetoothd | 蓝牙守护进程 |
| obexd | /usr/lib/bluetooth/obexd | OBEX文件传输服务 |
| obexctl | /usr/bin/obexctl | 交互式OBEX控制工具 |
提示:如果使用Buildroot等嵌入式系统,需确认已启用以下配置选项:
- BR2_PACKAGE_BLUEZ5_UTILS
- BR2_PACKAGE_BLUEZ5_UTILS_OBEX
2. 服务启动与设备连接
2.1 初始化蓝牙服务
创建启动脚本/usr/local/bin/bluetooth_init.sh:
#!/bin/bash # 设置设备名称 btmgmt -i hci0 name "BlueZ_File_Transfer" # 启用基本功能 btmgmt -i hci0 connectable on btmgmt -i hci0 le on btmgmt -i hci0 advertising on btmgmt -i hci0 power on # 启动DBUS会话 export $(dbus-launch) # 添加基础服务 sdptool add --channel=1 OPUSH # 启动蓝牙守护进程 /usr/lib/bluetooth/bluetoothd -n & # 启动OBEX服务(自动接收模式) /usr/lib/bluetooth/obexd -a -r /var/bluetooth/received &赋予执行权限并启动:
chmod +x /usr/local/bin/bluetooth_init.sh sudo /usr/local/bin/bluetooth_init.sh2.2 设备配对流程
进入bluetoothctl交互界面:
bluetoothctl执行扫描与配对:
[bluetooth]# power on [bluetooth]# scan on [bluetooth]# pair <手机MAC地址> [bluetooth]# trust <手机MAC地址> [bluetooth]# connect <手机MAC地址>验证连接状态:
[bluetooth]# info <手机MAC地址>确认输出中包含"Connected: yes"
3. 从手机接收文件
3.1 自动接收模式配置
启动obexd时使用以下参数组合:
-a:启用自动接收-r <路径>:设置接收文件存储目录-d:调试模式(可选)
推荐命令:
/usr/lib/bluetooth/obexd -a -r /var/bluetooth/received -d3.2 手机端操作步骤
- 在手机蓝牙设置中连接到你的Linux设备
- 选择要发送的文件,使用"通过蓝牙分享"功能
- 选择已配对的Linux设备作为接收方
- 等待传输完成提示
文件验证:
ls -lh /var/bluetooth/received确认收到的文件大小与手机端一致
3.3 常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 传输中断 | 编码不支持 | 安装libiconv库并重新编译BlueZ |
| 找不到接收目录 | 路径权限不足 | chmod 777 /var/bluetooth/received |
| 手机无法发现OBEX服务 | 服务未正确注册 | 检查sdptool add OPUSH执行情况 |
| 连接成功但传输失败 | 防火墙阻止 | sudo ufw allow 6500:6505/tcp |
4. 使用obexctl发送文件到手机
4.1 obexctl交互式操作
启动obexctl:
obexctl连接目标设备:
[obex]# connect <手机MAC地址>发送文件:
[设备MAC地址]# send /path/to/local/file.txt监控传输状态:
[设备MAC地址]# list
4.2 自动化脚本实现
创建发送脚本send_file.sh:
#!/bin/bash DEVICE_MAC="00:11:22:33:44:55" # 替换为实际手机MAC FILE_PATH="$1" obexftp --nopath --noconn --uuid none --bluetooth $DEVICE_MAC --channel 12 --put "$FILE_PATH"使用示例:
chmod +x send_file.sh ./send_file.sh ~/Documents/test.pdf4.3 高级参数调优
RFCOMM通道发现:
sdptool search --bdaddr <手机MAC> OPUSH输出示例:
Service Name: OBEX Object Push Service RecHandle: 0x1000d Protocol Descriptor List: "RFCOMM" (0x0003) Channel: 12传输性能优化:
obexftp --bluetooth <手机MAC> --channel 12 \ --tcp-window 65535 \ # 增大TCP窗口 --timeout 60 \ # 延长超时时间 --put large_file.zip5. 安全与权限管理
5.1 文件系统权限配置
推荐目录结构:
/var/bluetooth/ ├── received/ # 接收目录(777) ├── sent/ # 发送缓存(755) └── logs/ # 操作日志(755)ACL设置示例:
sudo setfacl -R -m u:bluetooth:rwx /var/bluetooth/received sudo setfacl -d -m u:bluetooth:rwx /var/bluetooth/received5.2 DBUS策略配置
创建/etc/dbus-1/system.d/bluetooth.conf:
<policy user="bluetooth"> <allow own="org.bluez.obex"/> <allow send_destination="org.bluez.obex"/> </policy> <policy context="default"> <allow send_interface="org.bluez.obex.Agent1"/> </policy>5.3 传输加密验证
检查安全连接状态:
[bluetoothctl]# info <设备MAC>确认输出中包含:
Secure: Yes6. 实战技巧与性能优化
6.1 批量传输处理
使用shell脚本实现目录批量发送:
#!/bin/bash DEVICE_MAC="00:11:22:33:44:55" TARGET_DIR="/mnt/share" find "$1" -type f | while read file; do obexftp --bluetooth $DEVICE_MAC --channel 12 --put "$file" --path "$TARGET_DIR" echo "Transferred: $file → $TARGET_DIR/$(basename "$file")" done6.2 传输监控看板
实时监控命令:
watch -n 1 'df -h /var/bluetooth; ls -l /var/bluetooth/received | wc -l'6.3 日志分析技巧
启用详细日志:
/usr/lib/bluetooth/obexd -d -n -a -r /var/bluetooth/received > /var/log/obexd.log 2>&1关键日志模式:
- 成功传输:
"Transfer complete" - 失败传输:
"Error occurred" - 连接问题:
"Connection refused"
7. 系统集成与自动化
7.1 systemd服务配置
创建/etc/systemd/system/obex.service:
[Unit] Description=OBEX File Transfer Service After=bluetooth.target [Service] ExecStart=/usr/lib/bluetooth/obexd -a -r /var/bluetooth/received Restart=on-failure User=bluetooth [Install] WantedBy=multi-user.target启用服务:
sudo systemctl daemon-reload sudo systemctl enable --now obex.service7.2 udev自动触发规则
创建/etc/udev/rules.d/99-bluetooth-transfer.rules:
ACTION=="add", SUBSYSTEM=="bluetooth", \ RUN+="/usr/bin/systemctl start obex.service"7.3 传输完成通知
集成桌面通知示例:
inotifywait -m /var/bluetooth/received -e create | while read path action file; do notify-send "蓝牙传输完成" "收到文件: $file" done