当前位置:网站首页>bluez5.50蓝牙文件传输
bluez5.50蓝牙文件传输
2022-08-02 03:30:00 【跑不了的你】
蓝牙文件传输主要用到 bluez 下 obex 协议支持,需要在启动 bluetoothd 蓝牙守护进程后再启动 obexd 文件传输服务进程,关于蓝牙协议栈可以参考以下图片:

bluez 5.50 蓝牙协议栈体系结构
蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和应用层
1、底层硬件模块
蓝牙的 GIG 规定了四种与硬件连接的物理总线方式 USB、RS232、UART、PC卡
2、bluezcore 核心层包含各种 profile
- GAP:设备连接
- SDAP:查询相关信息
- SPP:虚拟串口连接
- GOEP:数据传输
3、中间协议层
- HCI接口:设备扫描、配对
- L2CAP协议:蓝牙适配
4、应用层及 bluez 各种工具集
- hciconfig:配置蓝牙设备,用于打印设备信息和配置设备
- hcitool:配置蓝牙连接,执行扫描等命令
- gatttool:直接使用参数对蓝牙设备进行控制,使用 -l 参数进入 interactive 模式对蓝牙设备进行控制
- sdptool:搜索并管理设备服务
buildroot 配置添加
这里使用的 bluez 5.50,在 buildroot 配置中能够看到 bluez 分为 bluez 和 bluez5.x ,这是因为 bluez(3.xx-4.xx) 版本与 bluez5.xx 版本相差很大,之前旧版本的 bluez 会包含很多上层 a2dp、obex 等应用服务,而在新版本的 bluez 中为了方便应用配置和简化代码将上层应用进行了剥离。
由于我们使用的是 bluez5.50 ,所以在添加配置时注意要选择我们所需要的 bluez 协议:

文件传输启动流程
在 bluetoothd 蓝牙守护进程启动之前需要确保 dbus 服务已经正常启动了,具体启动流程可以参考以下脚本:
【bluetooth_init.sh】
#!/bin/sh
btmgmt -i hci0 name "blueztest"
btmgmt -i hci0 connectable on
btmgmt -i hci0 le on
btmgmt -i hci0 advertising on
btmgmt -i hci0 power on
export $(dbus-launch)
sdptool add --channel=1 GATT SP A2SNK A2DP
btgatt-server &
/usr/libexec/bluetooth/bluetoothd -d -C -n &
pulseaudio -D --exit-idle-time=-1 --start --log-target=file:/tmp/pulse.log
/usr/libexec/bluetooth/obexd -a -n -r /home/ &
注意 export $(dbus-launch) 操作是为了添加 dbus session 环境变量 DBUS_SESSION_BUS_ADDRESS ,如果启动 obexd 服务发现有以下报错肯定是这个环境变量没有配置:
# /usr/libexec/bluetooth/obexd
Using X11 for dbus-daemon autolaunch was disabled at compile time, set your DBUS_SESSION_BUS_ADDRESS instead
在启动 bluetoothd 时可以将 -d 选项去掉,这里添加是为了方便进行调试,-d 选项是 debug 使能操作。
同理,obexd 启动时也可以将 -n 选项去掉,-n 选项是为了将 log 信息显示到前台。
服务启动后的文件传输操作
1、先确定蓝牙设备是否挂载成功并且使能,hciconfig -a 查看,如下:

2、顺利执行 bluetooth_init.sh 脚本,脚本内容如前一小节所示,启动成功后,能够进入 bluetoothd 并执行 show 操作:
3、在 bluetoothctl 交互对话中执行 scan on 搜索设备,如下所示:

4、devices 查看搜索到的设备,这时候就可以通过 connect 连接我们的手机或者蓝牙设备:

5、连接操作:
连接成功后,当前标签就会变成连接后的设备名称,并且能够通过help查看支持的操作,如下所示:

此时可以输入 quit 退出 bluetoothctl 操作,蓝牙会继续保持连接,如果需要使得该设备每次启动后自动连接,需要执行 trust <设备addr> 操作即可。

6、前面已经在启用 obexd 时添加了 -a 自动接收文件操作,这时候可以操作手机完成文件上传,如下图所示:
这里的接收路径是在启用 obexd 时的 -r 参数配置的,我这里配置成 /home 路径,所以自动接收的文件会存放到这里。如果这一步报错有编码问题,需要重新编译 builroot ,具体参考后面的【问题及解决方法】
7、蓝牙文件发送操作
文件发送操作在板子上需要借助 obexctl 工具,这个工具 buildroot 不会自动拷贝过来,它存在 bluez 的 tools 下,在编译过程中应该已经编译完成,我们拷贝到板子上使用即可。
启用 obexctl 进入界面:

遇到的问题及解决方法
1、在从手机端向设备进行文件传输请求时:
failed: Conversion from character set “UTF-16BE” to “UTF-8” is not supported
https://blog.csdn.net/qq_32017483/article/details/124304238
buildroot 中要添加 libiconv 库支持,就需要在 Toolchain 中选择如下:(注意在添加选项后,需要重新编译 glibc、dbus、bluez才能有效)

2、启动 obexctl 失败
obexctl 启动 arguments to dbus_connection_unref() were incorrect, assertion "connection != NULL" failed in file dbus-connection.c
这里还是 dbus 环境问题,重启后调用dbus-launch 后,export 设置环境变量DBUS_SESSION_BUS_ADDRESS 再次尝试即可正常
边栏推荐
猜你喜欢
随机推荐
R语言 —— 多元线性回归
联阳(ITE)IT66021FN:HDMI转RGB芯片 3D 资料
物联网方案
【霍尔效应传感器模块与 Arduino】
字符串匹配(蛮力法+KMP)
n皇后问题(回溯法)
【Arduino连接GPS 模块 (NEO-6M)读取定位数据】
Temporal Segment Networks:Towards Good Practices for Deep TSN论文精读笔记
TQP3M9009电路设计
Spark MLlib特征处理 之 StringIndexer、IndexToString使用说明以及源码剖析
USB_ID介绍
目标检测(一):R-CNN系列
为什么D类音频功放可以免输出滤波器
Out of memory error on GPU 0. Cannot allocate xxxGB memory on GPU 0, available memory is only xxx
Modify hosts file using batch script
Industry where edge gateway strong?
如何在 Scala 中科学地操作 collection(一):集合类型与操作
AD8307对数检波器
无向图的连通分支数(并查集)
Anaconda(Jupyter)里发现不能识别自己的GPU该怎么办?









